ysoserial JRMP相关模块分析(三)- exploit/JRMPClient
字数 1081 2025-08-27 12:33:22
ysoserial JRMP相关模块分析(三)- exploit/JRMPClient 教学文档
一、模块概述
exploit/JRMPClient是ysoserial工具中针对Java RMI中DGC(Distributed Garbage Collection)模块的利用工具。与RMIRegistryExploit不同,它主要针对RMI中的DGC模块而非Registry模块。
主要特点:
- 仅作为JRMP客户端存在,只发送数据不接收数据
- 不会反序列化任何来自服务端的数据,避免被反打
- 适用于任何启动了DGC的RMI服务
二、使用方式
基本命令格式:
java -cp ysoserial.jar ysoserial.exploit.JRMPClient <host> <port> <payload_type> <command>
示例:
java -cp ysoserial.jar ysoserial.exploit.JRMPClient vps_ip port CommonsCollections1 'calc.exe'
三、技术原理分析
1. 工作流程
- 生成payload对象
- 调用
makeDGCCall函数 - 与目标服务端进行协议通信
2. 协议通信过程
通信过程由DGCImpl_Skel.dispatch函数处理,关键点:
- 通信开始时,客户端会发送一个特定的long值:
-66919625358661813 - 服务端处理流程:
UnicastServerRef.dispatch→UnicastServerRef.oldDispatch→DGCImpl_Skel.dispatch
3. 反序列化触发点
在DGCImpl_Skel.dispatch中:
- 首先读取var3(值为1)
- 然后读取var4(长整型数值)
- 最后读取payload对象进行反序列化
当var3的值为1时,会进入以下处理分支:
case 1:
// 这里会触发反序列化
var5 = var1.readObject();
// ...其他处理...
break;
四、典型利用场景
1. 与payloads/JRMPListener配合使用
- 先使用
payloads/JRMPListener在目标服务器上开启JRMP监听 - 再使用
exploit/JRMPClient向目标发送恶意payload
注意:payloads/JRMPListener可能存在稳定性问题,监听端口有时会失败。
2. 直接攻击RMI服务
由于所有启动了监听的RMI服务都包含DGC模块,因此可以直接攻击:
java -cp ysoserial.jar ysoserial.exploit.JRMPClient target_ip rmi_port payload_type command
五、防御建议
- 限制RMI服务的网络访问
- 更新Java版本,修复已知反序列化漏洞
- 使用安全管理器限制反序列化操作
- 监控异常的网络连接和反序列化操作
六、总结
exploit/JRMPClient是一个专门针对RMI DGC模块的利用工具,相比Registry利用工具具有以下优势:
- 适用范围更广(所有RMI服务都包含DGC)
- 更安全(只发送不接收数据)
- 利用条件相对宽松
理解其工作原理有助于更好地防御此类攻击,同时也能在渗透测试中更有效地利用该工具。