本文主要是介绍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模块学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!