简介
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
模块介绍
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文件实现字节码执行
例:xxl-job-admin/api hessian反序列化
字节码生成(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 包注内存马
例:生成becl调用jeg加载字节码实现不出网rce回显
PostgresQL (CVE-2022-21724)配合SpringBean加载字节码回显
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结果对应的利用方式为如下(字节码列表可任意选择):
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 的反连场合,用的较少,主要为了方便。
当前版本更新(v1.1.0)
-
[重要] 前端重构优化 @Ar3h -
[重要] 提供 docker
启动脚本 @Ar3h @4ra1n -
[重要] 提供了从 Jar
文件加载的插件系统 @Ar3h -
[重要] 新增 h2 without js
全版本通杀链 @unam4 -
[功能] 基于 spring security
的登录功能 @springkill @4ra1n -
[功能] 新增两种 equals
和c3p0 jndi/jdbc
链 @unam4 -
[功能] hessian
新增groovy
利用链 @Ar3h -
[功能] 字节码可添加 main
静态入口函数 @Ar3h -
[BUG] 无法正确显示 favicon.ico
图标问题 @xcxmiku -
[优化] server
探测新增netty
框架探测 @Ar3h -
[优化] 高版本 Oralce JDK
可以使用BCEL
相关 @4ra1n -
[优化] 优化某些仅 unix
类型的gadget
提示信息 @4ra1n -
[优化] 格式化输出日志,为日志附加颜色 @springkill -
[优化] 启动时候检测 java
版本给出警告 @4ra1n -
[优化] 优化拦截器逻辑 @ssrsec -
[优化] 优化base64通用性 @ssrsec
工具地址
https://github.com/Java-Chains/web-chains
原文始发于微信公众号(台下言书):web-chians:一款全新的Java Payload生成框架
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论