前言

在java的学习过程中,少不了对 ysoserial 的使用和学习,这里记录了整个 JRMP 相关的分析,分享出来,有什么地方不对的请大哥们直接喷就对了 ; )

简介

这个 JRMPListener 是 ysoserial 工具里的其中一个利用模块,作用是通过反序列化,开启当前主机的一个 JRMP Server ,具体的利用过程是,将 反序列化数据 发送到 Server 中,然后 Server 中进行反序列化操作,并开启指定端口,然后在通过 JRMPClient 去发送攻击 payload

流程

其实触发流程已经在 playloads/JRMPListener 里写出来了,如下:

被序列化的类是 ActivationGroupImpl ,反序列化的也是他,里面包括了RemoteObject(构造函数) 、 RemoteRef(构造函数的参数类型) 、 UnicastServerRef(构造函数的具体参数)

RemoteObject 的构造函数(paramType为RemoteRef)是最先被创建的,UnicastServerRef 是最后在返回 ActivationGroupImpl 实例的时候被使用的 sc.newInstance( UnicastServerRef )

平日里接触到的反序列化利用不都是,要么重写了 readObject ,要么像是 RMI 的利用那样,利用 Proxy 类中一个 InvocationHandler 成员的反序列化过程来实施攻击( invacationHandler 其实可以指定为那个 AnnotationInvocationHandler 的),那么这里的 JRMP 又是咋回事的.....感觉完全没有以上两者的影子

他用 ActivitionGroupImpl 来当做想要得到的对象,原因是为了得到一个 UnicastRemoteObject,跟踪了一下, UnicastRemoteObject 只有几个子类:

最合适的当然是 ActivationGroupImpl,其次,真正关键的流程在于 UnicastRemoteObject 的 readObject 函数和 reexport 函数,他会把接收到的序列化的 UnicastRemoteObject 类进行反序列化,