Yso-JRMPListener模块学习

JRMP 服务端

ysoserial 中的 exploit/JRMPListener 会在指定端口开启一个 JRMP Server,其实现了对任意 RMI Client 的应答请求,会向任何连接其的客户端发送反序列化 payload。

注意:区别这里的 JRMP Client 指的是发起 JRMP 请求的一方(下文以 Client 或者 客户端 称呼),既可能是 RMI Server,也可能是 RMI Client(两者都可以向 RMI Registry 发起 JRMP 请求)。


先来看入口的 main 方法:

获取用户的输入,生成对应的 payload,然后和指定的端口传入构造方法,接着调用 run 方法。

生成 payloadObject 的过程省略,看 JRMPListener 的构造方法:

构造方法中还额外创建了一个 ServerSocket 接收来自 JRMPClient 的连接。

run 方法中会对接收的请求进行协议的限制,如果是 JRMP 协议就进入 doMessage 方法:

deMessage 里会根据读取到的 op 进行不同的操作:

TransportConstants.Call 的值是 80,对应着客户端发送的 headerStreamRemoteCall#<init>):

doCall 方法里会生成一个 BadAttributeValueExpException 对象,然后通过反射把其 val 变量设置为 payload,最后序列化向客户端发送:

JRMP 客户端

再来看客户端,以 list 方法为例,客户端执行这个方法的时候会来到 UnicastRef#invoke 方法里,调用栈如下:

invoke:379, UnicastRef (sun.rmi.server)

list:-1, RegistryImpl_Stub (sun.rmi.registry)

main:9, RMIClient (RAC2S)

"UnicastRef#invoke",向 JRMP 服务端发起连接请求,重点是 StreamRemoteCall#executeCall 方法:

在这个方法里客户端会将服务端发送的异常进行序列化读取,然后抛出,导致了自身被 RCE。

因为 JRMPListener 中向客户端发送的就是 2,所以一定会进入 case 2 中:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值