本文主要是介绍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,对应着客户端发送的 header
(StreamRemoteCall#<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
中:
这篇关于Yso-JRMPListener模块学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!