目录导航
Web-Chains简介
Web 版 Java Payload 生成与漏洞利用工具,提供 Java 反序列化、Hessian 1/2 反序列化等 Payload 生成,以及 JNDI Exploit、Fake Mysql Exploit、JRMPListener 等相关利用
web-chains功能
web-chains 包含但不限于以下功能:
- Java 反序列化Payload生成
- 支持的混淆:随机集合混淆、垃圾类插入、TC_RESET 填充、utf8 overlong encoding 混淆
- Hessian 1/2 反序列化Payload生成
- Hessian1 支持生成 HessianServlet 格式反序列化数据
- 支持的混淆:随机集合混淆、垃圾类插入、utf8 overlong encoding 混淆
- 字节码生成
- 支持自定义类名
- 支持自定义字节码版本
- 支持生成TemplatesImpl格式 Payload:实现 AbstractTranslet 接口
- 支持生成SnakeYaml Jar 格式 Payload:实现 javax.script.ScriptEngineFactory 接口
- 支持生成Fastjson Groovy 格式 Payload:实现 ASTTransformation 接口
- 支持生成 JavaWrapper 格式 Payload:添加
public static void _main(String[] argv) {}
方法 - 支持生成 charsets.jar 格式 Payload
- 内置 java echo generator(Jeg)、java memshell generator(Jmg),并根据实战进行魔改
- …
- Exploit 模块
- JNDI Exploit
- Fake Mysql
- JRMPListener
- Tcp Server(Derby RCE)
- HTTP Server
下载地址
文档地址
https://www.yuque.com/shenjingwa-leuvd/wpqdhf/eekyvau9fcblzzt0?singleDoc
使用说明
web-chians 启动
由于某些JDK高版本不存在 BCEL 相关类,影响某些链的使用,建议使用 jdk<8u251 或 zulu8 来启动。作者的jdk环境是zulu8,Mac 可直接通过 brew 安装。
java -jar web-chains-1.0.0-SNAPSHOT.jar
默认情况下监听 0.0.0.0 端口,并随机生成一个安全路径,只有访问该路径才可以获取session并进入web管理页面

模块
Payload Generate 模块
Payload生成模块
举一个栗子🌰,简单生成一个Java原生反序列化Payload,CB链:

Java反序列化生成(JavaNativePayload)
部分常用链展示:
CB链:CommonsBeanutils 19.x、CommonsBeanutils 18.x、CommonsBeanutils 1.6 版本
CC链:ommonCollection K1、CommonCollection K2、CommonCollection K3、CommonCollection K4
JSON相关链:Fastjson1、Fastjson2、Jackson
二次反序列化相关:SignedObject 二次反序列化、RMIConnector 二次反序列化、C3p0 二次反序列化
DataSource 相关链:共计 13 个不同版本以及不同类的 getter 利用
C3p0:JNDI链、二次反序列化链、原生类加载链,支持两个不同的SUID版本
FindClass dnslog 探测类,搜集网上大部分gadget类,可探测100+个类。探测payload中间隔插入canary,可辅助判断哪些类被拉入黑名单导致探测失败。支持手动设置、文件读取,可自定义批量探测类
Hessian反序列化生成(HessianPayload)
支持Hessian1、Hessian2版本的Payload
部分Hessian链展示如下:
SwingLazyValue:JDK原生链加载BCEL
SwingLazyValue2:JDK原生链触发JNDI
SwingLazyValue3 + MethodUtil:JDK原生链执行任意字节码
UnixPrintService:JDK原生链,Linux命令注入
UnixPrintServiceLookup:JDK原生链,Linux命令注入
ProxyLazyValue + SerializationUtils:依赖spring,可实现二次反序列化
SpringAbstractBeanFactoryPointcutAdvisor:公开的spring jndi链
SpringPartiallyComparableAdvisorHolder:公开的spring jndi链
Xslt:本链做了整合,文件写入并加载Xslt文件实现字节码执行
字节码生成(BytecodePayload)
支持常见渗透场景中,以下常用字节码生成:
内置 Jmg 内存马注入工具
内置 Jeg 回显利用工具
命令执行字节码
http/dnslog 探测字节码
Sleep 探测字节码
远程文件下载字节码
远程文件下载并执行字节码
反弹shell字节码
写入文件字节码
写入大文件字节码
自定义字节码
其他 Payload 生成(OtherPayload)
10+ 种 Jdbc url漏洞利用Payload,例如h2 js执行字节码、h2 groovy 执行命令、PostgreSQL jdbc的利用、mysql jdbc的利用等等
10+ 种表达式注入Payload,例如Bcel执行字节码、JS执行字节码、EL执行字节码、Groovy执行字节码、Mvel执行字节码、Beanshell执行字节码
支持 Snakeyaml 漏洞利用jar包生成、以及常见字符串解析payload生成
支持 postgresql jdbc利用其中的 bean.xml 文件内容生成
支持 Springboot下 charset.jar 包注内存马

JNDI Chains Exploit 模块
关于 JNDI Chains Exploit,由于是web端直接传入参数,根据当前时间戳生成一个简短的token,避免了在jndi payload中插入gadget参数的情况。同时提供了容错性,若没有匹配到任何token,默认返回最新生成的token,这样适用于 ldap 参数不可控的情况。
基于ObjectFactory的BeanFactory的一些利用:
class | description | remark |
javax.el.ELProcessor#eval | el表达式执行 | tomcat自带,最常见的利用 |
groovy.lang.GroovyShell#evaluate | Groovy表达式执行 | |
org.mvel2.sh.ShellSession#exec | mvel表达式执行 | |
bsh.Interpreter#eval | Beanshell表达式执行 | |
org.yaml.snakeyaml.Yaml#load | snakeyaml反序列化 | springboot环境下测试成功 |
com.thoughtworks.xstream.XStream#fromXML | xstream反序列化 | xstream依赖需要在漏洞版本内 |
com.sun.glass.utils.NativeLibLoader | 本地加载动态链接库 | jdk自带类 |
适用于 BeanFactory 无法使用的场景,可替代的ObjectFactory的一些数据源工厂,可加载本地jdbc url,转为jdbc利用:
DataSource className | description | remark |
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory | 加载本地jdbc url | |
org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory | 加载本地jdbc url | |
org.apache.commons.dbcp.BasicDataSourceFactory | 加载本地jdbc url | |
org.apache.commons.dbcp2.BasicDataSourceFactory | 加载本地jdbc url | |
org.apache.tomcat.jdbc.pool.DataSourceFactory | 加载本地jdbc url | |
com.alibaba.druid.pool.DruidDataSourceFactory | 加载本地jdbc url | 与 BasicDataSourceFactory 格式稍微不同;本地测试发现无限执行Payload |
com.zaxxer.hikari.HikariJNDIFactory | 加载本地jdbc url | 与 BasicDataSourceFactory 格式稍微不同 |
利用步骤
一、开启 JNDI 相关端口
默认为关闭状态

如果想自动化获取外网IP,请开启【Auto Fetch IP】选项
这里的 IP Address 是回连的IP,一般为公网IP
点击【Start】开启LDAP、HTTP服务

二、通过 DNSLog 探测链
该 Payload 适用于目标环境已配置DNS服务器,且DNS协议出网。
使用梭哈链,批量生成几十种 LDAP Payload URL,可以进行批量尝试
选择 JndiShowHandPayload -> DNSLogAndHttp,并配置好 DNSLog 地址

点击【Run】按钮,稍等片刻即可批量生成LDAP URL Payload地址

以Log4j漏洞为例,通过 Burpsuite 的 Intruder 模块批量发包

配置 Payload,以及根据实际情况取消URL编码

推荐使用单线程,并设置发包间隔至少为 3 秒

点击【Start attack】开始爆破
三、分析 DNSLog 结果
查看 DNSLog 平台,如果存在 DNSLog,说明一定存在字节码执行;如果没有任何DNSLog,存在以下可能性,需要自行排查:
- 发送的 Payload 被 WAF/RASP 拦截
- 解决办法:绕 WAF/RASP
- 目标服务器没有配置 DNS,或 DNS 协议不出网
- 解决办法:使用 Sleep 字节码,通过延迟判断利用链是否存在,或换用 HTTPReq gadget 进行判断,不使用 DNS 解析IP,直接通过IP发起请求,看 HTTP 协议是否出网
- 目标不存在常用链,或环境较为极端
- 解决办法:可根据 FindClass 等手段综合判断JDK版本、依赖,进行针对性利用或绕过。
如果进展顺利,会有很多 DNSLog 请求(只要出现一个 DNSLog 就可以直接R了):


如果存在 WebLog 说明 HTTP 出网

dnslog结果形如:
basic.dnslogandhttp.macos.bzz0e16c.eyes.sh
deser.jackson.templatesimpl.macos.bzz0e16c.eyes.sh
resourceref.tomcatelref.elconvert.macos.bzz0e16c.eyes.sh
reference.tomcatdbcp2jdbcattack.pgsql-jdbc-jndi.bean-xml.macos.bzz0e16c.eyes.sh
第一个字段含义
- basic:代表 JDK < 8u191的利用
- deser:代表使用的是 LDAP 反序列化,紧接着后面代表着是使用的反序列化链,例如cb1使用的是 CommonsBeanUtils1 链,jackson 代表使用的是 jackson 链
- resourceref:代表使用的是 Tomcat 下 BeanFactory 的利用,最常见的是 tomcatelref ,也就是EL表达式执行。
- reference:代表使用的是利用其他工厂类,用于对 BeanFactory 的绕过
四、选择可用链深入利用
basic.dnslogandhttp.macos.bzz0e16c.eyes.sh
该DNSLog结果对应的利用方式为如下(字节码列表可任意选择):

示例,在basic利用链下,使用 Jeg 进行回显:

deser.jackson.templatesimpl.macos.bzz0e16c.eyes.sh
该DNSLog结果对应的利用方式为如下(字节码列表可任意选择):

resourceref.tomcatelref.elconvert.macos.bzz0e16c.eyes.sh
该DNSLog结果对应的利用方式为如下(字节码列表可任意选择):

reference.tomcatdbcp2jdbcattack.pgsql-jdbc-jndi.bean-xml.macos.bzz0e16c.eyes.sh
该DNSLog结果对应的利用方式为如下(字节码列表可任意选择):

由于部分gadget名称过长,可能在某些dnslog平台上无法回显,部分gadget做了alias别名操作,别名会在dnslog中出现,gadget与alias的对应列表如下:
Gadget 名称 | 别名 |
JndiBasicPayload | basic |
JndiReferencePayload | reference |
JndiResourceRefPayload | ResourceRef |
CommonsBeanutils1 | cb1 |
CommonsBeanutils2 | cb2 |
CommonsBeanutils3 | cb3 |
CommonsBeanutils4 | cb4 |
CommonsCollectionsK1 | K1 |
CommonsCollectionsK2 | K2 |
CommonsCollectionsK3 | K3 |
CommonsCollectionsK4 | K4 |
PostgreSqlJdbc4Jndi | pgsql-jdbc-jndi |
SnakeyamlJarConvert | snake_convert |
SnakeyamlJarSpi4JNDI | snake_jar_jndi |
SpringBeanXmlClassLoader | bean-xml |
Fake Mysql Chains Exploit 模块
通过 mysql 用户名进行传参,具体利用与 JNDI Chains Exploit 类似
批量生成几十种反序列化 Payload

放入burp中进行利用


JRMP Chains Exploit 模块
利用模块同 ysoserial 的 JRMPListener 模块
可配合 JRMPClient 链、JNDI 中的 RMI 反序列化注入使用,具体平台使用方法与 JNDI Chains Exploit 类似,不支持传参。
TCP Server 模块
将生成的 Payload 挂载到一个 TCP 端口上,主要用于Derby 反序列化RCE场景。
HTTP Server 模块
将生成的 Payload 挂载到HTTP端口上,方便某些 http url 的反连场合,用的较少,主要为了方便。
其他
WebSocket 日志同步
点击【Websocket Server Logs】即可通过 websocket 同步服务端日志

Jeg魔改模块说明
使用示例:

加密请求执行ls
命令,红色部分为加密的命令:
X-Authorization: eyJeXA10TbkhnteAiS0PtwRFQKqp5EYIIWXXXLKXDf5NPTs2M1FykATDU0w=.eyJ82Df13d=
命令加密工具:
加密后的响应为如下格式:
/9j/4AXVBQS0xLTV5PEVVeTTVcXkteU1ZRXhJLXkxUTBFHUlM1XF5LXlNWUV4RXV5LNVxeS15TVlFeEUxXNVxWT1daTUwRXV5LNVxWT1daTUwRTFc1XFBSUlBRTBJbXlpSUFESUV5LVklaEUteTRFYRTVcUFJSUFFMElteWlJQURFVXk01XFBRWVZYS1pMSxFdXks1XFBRWVZYS1pMSxFMVzVbXlpSUFERTFc1W1ZYWkxLEV1eSzVbVlhaTEsRTFc1U1BYNVJeVFpdXkxaEV1eSzVSXlRaXV5MWhFMVzVMWktcU15MTE9eS1cRXV5LNUxaS1xTXkxMT15LVxFMVzVMV0pLW1BIURFdXks1TFdKS1tQSFERTFc1TEteTUtKTxFdXks1TEteTUtKTxFMVzVLUFJcXksSVUpTVhFVXk01S1BSXF5LElFeS1ZJWhFLXk0RWEU1S1BQUxJITV5PT1pNEV1eSzVLUFBTEkhNXk9PWk0RTFc1SVpNTFZQURFdXks1SVpNTFZQURFMVzU=/9k==
额外依赖和插件
这里用类加载简单实现了“插件”,目前还不太完善。
web-chians 启动时默认读取 chains-config 目录下的字节码文件和依赖jar包目录,没有这个目录也不影响启动,只会导致一些冷门链无法正常使用,例如 hibernate、aspectjweaver 等链。

自定义配置文件
例如更改启动端口为18011端口,以及关闭安全路径
将以下内容保存为 application.yml 文件
spring:
profiles:
active: ${profile.active}
server:
port: ${PORT:18011}
address: 0.0.0.0
servlet:
session:
timeout: 360h # session超时时间为360小时(15天)
web-chains:
security:
enable: false
# path: 8HEp8k9EMixP # 安全路径, 为空则生成随机路径
saveFileMode: true # 是否允许保存文件到本地
limitSize: true # 是否限制返回的文件大小
size: 100 # 限制返回的payload大小, 单位 MB
autoSaveSize: 100 # 自动写入文件的大小阈值, 单位 MB, 如果超过这个大小会自动保存到本地
gadgets:
disable: true # 是否禁用一些gadget
display: false
disableList: # 禁用的gadget列表
logging:
level:
com.ar3h.chains: INFO
使用如下命令加载配置文件命令
java -jar web-chains-1.0.0-SNAPSHOT.jar --spring.config.location=file:application.yml
项目地址
GitHub:
https://github.com/Ar3h/web-chains
框架设计
对于工具的实现有兴趣可以看一下这篇文章
https://mp.weixin.qq.com/s/mc5u4RFDHohSzyg56eK7xw
参考
https://github.com/wh1t3p1g/ysomap
https://github.com/qi4L/JYso
https://github.com/X1r0z/JNDIMap
https://github.com/Whoopsunix/PPPYSO
https://github.com/4ra1n/mysql-fake-server
https://github.dev/LxxxSec/CTF-Java-Gadget
https://github.com/mbechler/marshalsec
https://github.com/frohoff/ysoserial
https://github.com/H4cking2theGate/ysogate
https://github.com/Bl0omZ/JNDIEXP
https://github.com/kezibei/Urldns
https://github.com/rebeyond/JNDInjector
Java Unmarshaller Security (将您的数据转化为代码执行) – 先知社区
转载请注明出处及链接