内网渗透体系建设——权限维持
权限维持当获取到服务器的控制权后,为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失,测试人员往往需要采取一些手段来实现对目标服务器的持久化访问
权限持久化(Persistence, 权限维持)技术就是包括任何可以被测试人员用来在系统重启、更改用户凭据或其他可能造成访问中断的情况发生时保持对系统的访问的技术,如创建系统服务、利用计划任务、滥用系统启动项或注册表、映像劫持、替换或劫持合法代码等
常见系统后门技术创建影子账户影子账户,就是隐藏的账户,无论通过”计算机管理”还是命令行查询都无法看到,只能在注册表中找到其信息。通过创建具有管理员权限的影子账户,在目标主机上实现权限维持,不过需要拥有管理员级别的权限通过创建影子账户,测试人员可以随时随地通过远程桌面或其他方法登录目标系统,并执行管理员权限的操作
系统服务后门对于启动类型为“自动”的系统服务,测试人员可以将服务运行的二进制文件路径设置为后门程序或其他攻击载荷,当系统或服务重启时,可以重新获取对目标主机的控制权。不过需要拥有目标主机的管理员权限
计划任务后门通过创建计划任务让目标主机在特定的时间点或规定的周期内重复运行测试 ...
内网渗透体系建设——横向移动
横向移动本章所有关于横向移动的攻击技术都以如图所示的网络拓扑进行测试
Kali Linux为测试人员的主机,其对测试人员是可控的,也被称为”可控主机”或”可控服务器”。Initial Victim为测试人员最初攻陷的机器,也被称为”跳板机” “所控主机”或”当前所控主机”。内网中的其他三台机器分别是本次实践的横向移动目标,需要从Initial Victim迁移到这三台目标机器。它们也被称为”远程主机”或”内网其他主机”
横向移动中的文件传输测试人员往往需要预先制订文件传输方案,以便在后续操作过程中向攻击目标部署攻击载荷或其他文件
通过网络共享
Windows系统中的网络共享功能可以实现局域网之间的文件共享。通过提供有效的用户凭据,用户可以很轻松地将文件从一台机器传输到另一台机器。执行”net share”命令,获得Windows系统默认开启的网络共享,其中C$为C盘共享,ADMIN$为系统目录共享,还有一个是IPC$共享。IPC (Internet Process Connection) 是共享”命名管道”的资源,为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接 ...
内网渗透体系建设——权限提升
权限提升系统内核漏洞提权查找系统潜在漏洞
手动寻找可用漏洞
1systeminfo
执行命令后可以根据系统版本和系统的补丁程序,将两者结合通过相关辅助网站找到没打补丁的可能存在的系统漏洞,如
MS18-8129与KB4131188对应、CVE-2020-0787与KB4540673对应
借助WES-NG查找可用漏洞
Windows Exploit Suggester(WEG)项目于2014年发布, 项目根据操作系统版本结合systeminfo输出的信息, 结合Microsoft安全公告数据Excel文件找到可能存在且未打补丁的系统漏洞, 该工具在Windows XP/Vista上运行良好, 但是工具自2017第一季度之后就不再更新(意味着只能匹配2017第一季度之前的系统漏洞)
Windows Exploit Suggester-Next generation(WEG-NG)项目就是基于WEG创建的新一代系统提权辅助工具, 项目当前仍在维护当中
123python3 wes.py --update #更新漏洞数据库tyaepython3 wes.py sysinfo.tx ...
内网渗透体系建设——端口转发与代理
端口转发与内网代理端口转发与代理端口转发
端口转发(Port Forwarding)是网络地址转换(NAT)的一种应用。通过端口转发,一个网络端口上收到的数据可以被转发给另一个网络端口。转发的端口可以是本机的端口,也可以是其他主机的端口。在现实环境中,内网部署的各种防火墙和入侵检测设备会检查敏感端口上的连接情况,如果发现连接存在异样就会立即阻断通信。通过端口转发,将这个被检测的敏感端口的数据转发到防火墙允许的端口上,建立起一个通信隧道,可以绕过防火墙的检测,并与指定端口进行通信
端口映射(Port Mapping)也是网络地址转换(NAT)的一种应用,用于把公网的地址翻译成私有地址。端口映射可以将外网主机收到的请求映射到内网主机上,使得没有公网P地址的内网主机能够对外提供相应的服务
SOCKS代理
SOCKS全称为Protocol For Sessions Traversal Across Firewall Securely,是一种代理协议,标准端口为1080。SOCKS代理有SOCKS4和SOCKS5两个版本,SOCKS4只支持TCP,SOCKS5在SOCKS4的基础上进一步扩 ...
内网渗透体系建设——内网信息收集
内网信息收集本机基础信息收集查看当前用户以及当前用户所处的用户组,所拥有的特权等信息,综合判断是否需要提权
1whoami /all
查看当前主机的网络配置情况,包括主机的IP地址、主机名、各网络适配器的信息等,判断当前主机所处的内网网段
1ipconfig /all
图中当前主机有两个以太网适配器Ethernet0和Ethernet1,分别连通10.10.10.0/24和192.168.2.0/24这两个网段。在后面的横向渗透过程中,测试人员可以通过扫描这两个网段来探测内网中存活的主机
还有一个值得注意的就是Ethernet0中DNS服务器的IP地址。在域环境中,DNS服务器的IP地址通常为域控制器地址
查看当前主机的路由表
1route print
“网络目标”都是直接可以访问到的,里面包含的重要ip段在后续的横向渗透中可以尝试探测其中的存活主机
查看操作系统信息
123systeminfosysteminfo | findstr /B /C:"OS name" /C:"OS Version" #查看操作 ...
内网渗透体系建设——基础知识
内网渗透建设基础知识内网工作环境
工作组 (work group)
组(Group)是用户账号的集合。通过向一组用户分配权限,就可以不必向每个用户分别分配权限了。按照用途分类,域组分为通讯组和安全组
对于通讯组,我们接触的比较多的就是邮件组,将若干个人划分到一个通讯组,给这个通讯组发件,组内用户都能收到
安全组则是用户权限的集合。举个例子,管理员在日常的网络管理中,不必向每个单个用户账号都设置单独的访问权限,只需要创建一个组,对这个组配置访问权限,然后将需要配置该访问权限的用户账号拉进这个组中即可。并且如果管理员在网络运维中需要一些特殊的管理权限时,只需将自己的运维账号拉进该组中就行了
工作组适用于网络中计算机不多、资产规模较小、对安全管理控制要求不严格的情况。当组织中的网络规模越来越大,需要统一的管理和集中的身份认证,并且能够为用户提供更加方便的网络资源搜索和使用方式是,就要放弃工作组而使用域
域
域与工作组概念类似,但是域的计算机集合更大,适用于计算机数量众多的大型网络环境
域用户需要访问域中资源时,必须通过域控制器集中进行身份验证获取相应访问权限
域管理员用户是域中最 ...
XXE外部实体注入
介绍 XXE 之前,先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞
XML基础XML 指可扩展标记语言(Extensible Markup Language),是一种用于标记电子文件使其具有结构性的标记语言,被设计用来传输和存储数据。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。目前,XML文件作为配置文件(Spring、Struts2等)、文档结构说明文件(PDF、RSS等)、图片格式文件(SVG header)应用比较广泛
XML 的语法规范由 DTD (Document Type Definition)来进行控制
123456789101112131415<?xml version="1.0" encoding="ISO-8859-1"> //xml声明<!DOCTYPE note [<!ELEMENT note (to, from, heading, body)><!ELEMENT to (#PCDATA)> ...
MySQL注入写shell
SQL注入写shellinto outfile写shell条件:
1、知道web绝对路径
2、有文件写入权限(一般情况只有root用户有)
3、数据库开启了secure_file_priv设置
secure_file_priv 查询语句:show global variables like "secure%";
123NULL 禁止限制操作 C:\ 值为某一目录,则只能操作该目录下的文件 '' 为空,则表示不对读写文件进行限制,即可以写入任意磁盘文件(区分NULL)
secure_file_priv只能通过设置my.ini来配置,不能通过SQL语言来修改,因为它是只读变量
1show variables like "%secure%";
找网站根目录
根据SQL语句报错,看看有无路径爆出
读网站的配置文件
1select @@datadir #查找Mysql配置路径
这里的路径是
1D:\xampp\\mysql\\data\\
然后上网上搜索一下xampp网站的配置 ...
hw蓝队总结
红蓝对抗蓝队组成根据演习中角色和分工,有如下情况:
目标系统运营单位:参演单位,负责蓝队整体的组织和指挥。
安全运营团队:负责整体防护工作和攻击监控工作。
攻防专家:负责对监控过程中发现的可疑攻击进行分析研判,指导安全运营团队、软件开发等一些 列相关部门对漏洞进行整改
安全厂商:负责对自身的安全产品的可用性、可靠性和防护监控策略是否合理,进行随时调整。 软件开发商:负责对自身系统安全加固、监控和配合攻防专家对发现的安全问题进行整改。
网络运维团队:负责配合安全专家对网络建构安全、出口整体优化、网络监控、溯源等一些列工作。
云(如有)提供商,负责对自身云系统安全加固,以及对云上系统的安全进行监控同时协助攻防专 家对发现问题进行整改
决战阶段避免不必要减分情况,提前进行攻击拦截,主动获得各种加分项,及时控制风险。
工作内容:通告处置,封堵封禁,预警监控,分析研判,应急响应,事件上报,策略优化,整改加固
主要的4个团队:
安全运营中心(监控和处置团队):对每个安全警报分类、快速收集关键信息,并根据研判结果进行处 置 研判管理团队:向利益相关者提供证据、建议和意见,确定处理事件的节 ...
java反序列化——CC3链
CC3前面链子都是命令执行,但很多时候服务器的黑名单会选择禁用 Runtime,因此CC3用到动态类加载实现自动执行恶意类代码
回顾一下类的动态加载这块的东西
这里我们可以正向看,首先是 loadClass(),它的作用是从已加载的类缓存、父加载器等位置寻找类(这里实际上是双亲委派机制),在前面没有找到的情况下,执行 findClass()
对于 findClass() 方法:
根据名称或位置加载 .class 字节码,然后使用 defineClass,代码实例如下
通常由子类去实现
1234protected Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(name);}// findClass 方法的源代码
1234567891011121314class NetworkClassLoader extends ClassLoader { String host; ...
java反序列化——CC6链
CC6在Java高版本,因为官方修改了AnnotationInvocationHandler的readObject方法,导致CC1无法在高版本的使用,cc6的出现就是为了解决高版本的利用问题。CC6不受 jdk 版本制约,用一句话介绍一下就是 CC6 = CC1 + URLDNS 即LazyMap版CC1的后半部分加上URLDNS的前半部分(HashMap)
找到TiedMapEntry类中的getValue()方法调用了LazyMap的get()方法
接下来寻找调用getValue的地方,寻找的方法也略提一嘴,因为getValue()这一个方法是相当相当常见的,所以我们一般会优先找同一类下是否存在调用情况 。这里寻找到同名函数下的hashCode()方法调用了getValue()方法
如果在实战里面,在链子中找到了hashCode()方法,说明我们的构造已经可以提前庆祝了
我们去找谁调用了hashCode()方法,在 Java 反序列化当中,找到hashCode()之后的链子用的基本都是这一条
123xxx.readObject() HashMap.put() ...
java反序列化——CC1链
Common-Collections 相关介绍
Apache Commons是Apache软件基金会的项目,曾经隶属于Jakarta项目。Commons的目的是提供可重用的、解决各种实际的通用问题且开源的Java代码。Commons由三部分组成:Proper(是一些已发布的项目)、Sandbox(是一些正在开发的项目)和Dormant(是一些刚启动或者已经停止维护的项目)
Common-Collections 这个项目开发出来是为了给 Java 标准的Collections API提供了相当好的补充,在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。在开发应用程序的过程中,既保证了性能,同时也能大大简化代码
包结构介绍
org.apache.commons.collections– CommonsCollections自定义的一组公用的接口和工具类
org.apache.commons.collections.bag– 实现Bag接口的一组类
org.apache.commons.collections.bidimap– 实现BidiMap系列接口的一组类
org.apa ...
类的动态加载
类的动态加载类加载器 ClassLoader
加载 Class 文件
以这段简单代码为例
1Student student = new Student();
我们知道,Student 本身其实是一个抽象类,是通过 new 这个操作,将其实例化的,类加载器做的便是这个工作
ClassLoader 的工作如图所示
几种加载器
引导类加载器
引导类加载器(BootstrapClassLoader),底层原生代码是 C++ 语言编写,属于 JVM 一部分
不继承java.lang.ClassLoader类,也没有父加载器,主要负责加载核心 java 库(即 JVM 本身),存储在/jre/lib/rt.jar目录当中。(同时处于安全考虑,BootstrapClassLoader只加载包名为java、javax、sun等开头的类)
扩展类加载器(ExtensionsClassLoader)
扩展类加载器(ExtensionsClassLoader) 由sun.misc.Launcher$ExtClassLoader 类实现,用来在/jre/lib/ext或者java.ex ...
java反序列化——URLDNS链
序列化和反序列化
URLDNS利用链原理
java.util.HashMap 实现了 Serializable 接口,重写了 readObject,在反序列化时会调用 hash 函数计算 key 的 hashCode ,而 java.net.URL 的 hashCode 在计算时会调用 getHostAddress 来解析域名,从而发出 DNS 请求
该利用链具有如下特点
不限制 jdk 版本,使用 Java 内置的 URL 类,不依赖于任何的第三方库
只对指定的 URL 发送 DNS 查询,不做其他操作
在目标没有回显的时候,能够通过 DNS 请求得知是否存在反序列列化漏洞
序列化
123456789101112131415161718192021222324252627import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.lang.reflect.Field;import java.net.URL;import ja ...
JDK动态代理
JDK动态代理代理模式是一种设计模式,能够使得在不修改源目标的前提下,额外扩展源目标的功能。即通过访问源目标的代理类,再由代理类去访问源目标。这样一来,要扩展功能,就无需修改源目标的代码了,只需要在代理类上增加就可以了
一个最简单的动态代理实现如下:
123456789101112131415161718192021222324252627import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class Main { public static void main(String[] args) { InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, ...
加密文章
04dcc9f4ed3dc94a2f5aca30f556a6630307a56c22e4cb85bce127aee18f989ea4aac793681c9a6cfa2c62b3ca4c9a331db8ce8663631123ea4b13c3d29030295b51a5f5deca6aacce87079f5bf1c9d764e2a9d909a15880990d0e206c3eb36050c51ff1448466156563904ab02ec61ece8f70f9924c5f15f985a5ca94729a2c3b17d2d7b432dc15be9fc4d281a52d5f24dd8817ccd0a3fead9cdc1717fe033cc41c0fdc200a83a59f53cbb0eb561348de6a4024fd477c2e575cda8b7b349c32435de0cc734462d688d7aa650372a6f5062a779ab4fce4b7b337eba43363cd9392c62d493e633e2c5fb8943a9a04e0c308179c51f8fcd77b4 ...
Log4j漏洞分析
原理Log4j的lookup功能——本次漏洞是因为Log4j2组件中 lookup功能的实现类 JndiLookup 的设计缺陷导致,这个类存在于log4j-core-xxx.jar中
在使用RMI之前,我们需要把被调用的类,注册到一个叫做RMI Registry的地方,只有把类注册到这个地方,调用者就能通过RMI Registry找到类所在 JVM 的 ip 和 port,才能跨越JVM完成远程方法的调用
调用者,我们称之为客户端,被调用者,我们则称之为服务端
RMI Registry,我们又叫它为RMI注册中心,它是一个独立的服务,但是,它又可以与服务端存在于同一个JVM内,而RMI Registry服务的创建非常的简单,仅需 LocateRegistry.createRegistry(12345); 一行代码即可完成
在服务器启动的时候,就启动了一个RMI的注册中心,接着把main主类暴露并注册到RMI注册中心,其中存储着主类的stub数据,包含有其所在服务器的ip和port。在客户端启动之后,通过连接RMI注册中心,并从其中根据名称查询到了对应的对象(JNDI),并把其数据 ...
burp插件
Collaborator我们在做渗透测试的时候,经常会遇到这种情况,测试跨站可能有些功能插入恶意脚本后无法立即触发,程序也不返回任何信息和引用文件的内容,而只提示输入的是否有误,那么也无法直接判断程序是否存在漏洞
这个时候我们需要一个外部的独立的服务器,可以通过域名 url 进行访问。然后在测试漏洞是否存在的时候带上这个服务器的地址,如果存在上述的这些问题,那么目标服务器就会去访问我们自己的服务器,我们自己服务器可以记录别人访问自己的信息,记录其发送内容相应内容等,从而有利于我们判断漏洞是否存在
明白原理后,Burp 给我们提供了这个外部服务器,叫 Collaborator
当使用 burp 的 collaborator 时,burp 会提供一个 url 地址,这个地址是 burp 的一个二级域名
轮询:burp 发送 payload 后会不断的问 collaborator 是否收到我发生的 payload 交互信息,例如 10s 问一次
在插件商店搜Collaborator,发现无法下载,得先配个jython环境
配好后可以测试一下
可能是要代理
再次测试成功
...
struts2系列漏洞复现
S2-001(CVE-2007-4556)该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value} 进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value} 对提交的数据执行了一次 OGNL 表达式解析,所以可以直接构造 Payload 进行命令执行
先来测试一下是否真的存在远程代码执行
发现都把password中括号里的值返回来了
这样构造如下payload
1%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
语句被执行,查看返回的语句是/user/local/tomcat即使tomcat的执行语句;
然后获取web路径,构造如下语句
1234567%{#req=@org.apache.struts2.Ser ...
java基础
路线 IDEA Maven Java Web 反射 ASM/Javassist JNDI:8u191低版本和高版本怎么打(反序列化/本地工厂),以及如何审计 RMI是什么 Java Agent:启动原理和RASP的实现原理 JMX/JDWP 反序列化基础:gadget链、JEP290是什么 FastJson反序列化 WebLogic:二次反序列化、XML Decoder、IIOP/T3 Xstream反序列化 Hessian反序列化:dubbo SnakeYAML反序列化 Shiro:Shiro经典漏洞、Padding Oracle漏洞形成原理、如何通过Shiro注入内存马 Struts2 Spring:Spring4Shell、Spring EL、SpringBoot Actuator利用 Tomcat:Tomcat AJP RCE 内存马原理:原理是什么、有哪些内存马 (动手实践调试每一种内存马) 内存马如何查杀 Log4J 其他组件漏洞:Apache Solr、Flink 进阶:tabby、 ...