亲爱的读者,我们诚挚地提醒您,黑熊安全公众号的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失,均由使用者自行承担责任。黑熊安全团队及作者对此概不负责。如有侵权,请立即告知,我们将立即删除并致歉。感谢您的理解与支持!
原文链接:https://www.yuque.com/shenjingwa-leuvd/wpqdhf/eekyvau9fcblzzt0?singleDoc#
原github地址:https://github.com/Ar3h/web-chains
web-chians 使用文档
一个简单的、可拓展的 Java Payload 生成框架。
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 K4JSON相关链: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原生链加载BCELSwingLazyValue2:JDK原生链触发JNDISwingLazyValue3 + 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:代表 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命令,红色部分为加密的命令:命令加密工具:https://gchq.github.io/CyberChef/#recipe=XOR(%7B'option':'UTF8','string':'?????'%7D,'Standard',false)To_Base64('A-Za-z0-9%2B/%3D')&input=bHM&oeol=CR加密后的响应为如下格式:前后会被前缀/9j/4A和后缀/9k==包裹,响应可以通过以下工具来解密:解密工具:https://gchq.github.io/CyberChef/#recipe=Find_/_Replace(%7B'option':'Simple%20string','string':'/9j/4A'%7D,'',true,false,true,false)Find_/_Replace(%7B'option':'Simple%20string','string':'/9k%3D%3D'%7D,'',true,false,true,false)From_Base64('A-Za-z0-9%2B/%3D',true,false)XOR(%7B'option':'UTF8','string':'??'%7D,'Standard',false)额外依赖和插件这里用类加载简单实现了“插件”,目前还不太完善。web-chians 启动时默认读取 chains-config 目录下的字节码文件和依赖jar包目录,没有这个目录也不影响启动,只会导致一些冷门链无法正常使用,例如 hibernate、aspectjweaver 等链。
自定义配置文件例如更改启动端口为18011端口,以及关闭安全路径将以下内容保存为 application.yml 文件
application.yml
YAML
复制代码
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
框架设计
对于工具的实现有兴趣可以看一下这篇文章
https://mp.weixin.qq.com/s/mc5u4RFDHohSzyg56eK7xw
文件下载地址:https://pan.quark.cn/s/638c3c8c12a3
已发布文章所有下载工具连接:https://pan.quark.cn/s/0c1cbe67aec4
原文始发于微信公众号(黑熊安全):Java Payload生成与利用平台
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论