Java Payload生成与利用平台

admin 2024年11月6日23:00:22评论4 views字数 6752阅读22分30秒阅读模式

亲爱的读者,我们诚挚地提醒您,黑熊安全公众号的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失,均由使用者自行承担责任。黑熊安全团队及作者对此概不负责。如有侵权,请立即告知,我们将立即删除并致歉。感谢您的理解与支持!

原文链接: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 Payload生成与利用平台

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 相关端口默认为关闭状态

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

点击【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了):

Java Payload生成与利用平台

Java Payload生成与利用平台

如果存在 WebLog 说明 HTTP 出网

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

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

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

Java Payload生成与利用平台

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

Java Payload生成与利用平台

由于部分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

Java 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 同步服务端日志

Java Payload生成与利用平台

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

Java Payload生成与利用平台

加密请求执行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 等链。

Java Payload生成与利用平台

自定义配置文件例如更改启动端口为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生成与利用平台

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月6日23:00:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java Payload生成与利用平台http://cn-sec.com/archives/3355490.html

发表评论

匿名网友 填写信息