Ysomap is A helpful Java Deserialization exploit framework based on ysoserial
- CommonsCollections系列,可达成远程jar载入、命令执行、代码执行、发起jndi效果
- RMIRegistryExploit 包括最初的和绕过方式,(支持到JDK8u232_b09版本),原理
- RMIListener 原JRMPListener
- RMIRefListener 配合jndi使用,利用原理
- SimpleHTTPServer 挂载恶意的class文件或jar文件,填写具体代码或需执行的命令即可
- URLDNS
- LDAPRefListener、LDAPLocalChainListener 前者使用reference的方式,后者使用目标环境下的反序列化利用链,原理
- RMIConnectWithUnicastRemoteObject 增加JRMP反连Payload,这部分暂时没有在攻击RMI Registry的时候成功?虽然原理上为绕过方法之一,但在测试时并未成功,原因第0x07部分
- JMXInvokeMBean 增加对JMX Server的攻击,原理
- JMXMLetExploit 利用MLet的形式动态加载远程MBean.jar文件
- JMXEvilMLetServer 挂载恶意MLet.xml文件和jmxmletpayload.jar文件,jar文件可执行任意命令,任意代码执行暂时没写
- 支持fastjson JdbcRowSetImpl、TemplatesImpl gadget,原理
- 支持XStream EventHandler、ImageIO、LazyIterator、Groovy gadget,原理
在实际分析ysoserial的利用链时,有时候会觉得框架写的太死,有以下几个缺点:
- 同一个利用链如果想改变一下最后的利用效果,如命令执行改成代码执行,我们需要改写这个利用链或者是重新增加一个利用链。这时,我们其实可以看到利用链的前半部分是不变的,变的只是后续的利用效果。
- ysoserial仅实现了常规的序列化利用链,对于类似JSON格式的序列化利用链,以当前的这个框架扩展起来会比较麻烦
所以萌生了开发一个更加灵活的框架来扩展反序列化利用链,也就是当前这个试验品ysomap。
我将利用链切分成了两个部分payload和bullet:
- payload:指代利用链的前序部分
- bullet:指代最终利用链可达成的效果
CommonsCollection1和3,在分析时我们可以看到实际1和3的区别在于1使用的是InvokerTransformer
,而3使用的是templatesImpl
的方式。那么提取相同的前序payload部分,我们只需写两个不同的bullet即可。而且这两个bullet也同样能被用在其他的payload上。
实际还有就是我在写RMIRegistryExploit时,也有这种可将不变部分重用的地方,而无需2,3之类的出现。
使用mvn clean package -DskipTests
生成的jar位于cli/target/ysomap-cli-0.0.1-SNAPSHOT-all.jar
执行java -jar ysomap-0.0.1-SNAPSHOT-all.jar
payload默认生成obj.ser文件在当前目录,为序列化后的数据。
框架采用方式跟msf类似
总体的workflow:
调用一个exploit
use exploit xxxx
设置一个exploitshow options
获得当前exploit需要配置的信息,如果需要设置一个gadget则use payload xxx
- 设置完成后
run
调用一个payload
use payload xxxx
设置一个payloadshow options
获得当前payload的配置信息,会提示可以选择的bullet信息use bullet xxxx
给当前的payload装上子弹show options
可以看到包括payload和bullet的配置信息- 配置完成后
run
,payload模式会自动在当前目录下生成一个obj.ser
文件
可使用的命令
list [exploits|payloads|bullets]
use [bullet|payload|exploit] name
show options
set key value
run
sessions
删除所有kill all
删除指定kill 0
@ysoserial:https://github.com/frohoff/ysoserial