ysoserial exploit/JRMPClient

ysoserial exploit/JRMPClient

上一篇文章讲到,当服务器反序列化payloads/JRMPListener,即会开启端口监听。再使用exploit/JRMPClient模块发送payload,服务器就会把payload进行反序列化,从而完成进行攻击。

调用链分析

设置payloads/JRMPListener参数,端口号为1299,debug模式启动payloads/JRMPListener模块。

ysoserial exploit/JRMPClient

设置exploit/JRMPClient模块设置参数为127.0.0.1 1299 CommonsCollections7 "calc"

ysoserial exploit/JRMPClient

启动exploit/JRMPClient模块后,服务端的接收到请求,会用TCPTransport的handleMessages来处理请求

ysoserial exploit/JRMPClient

往下看,第277行,把连接对象传入了StreamRemoteCall对象中。

ysoserial exploit/JRMPClient

第278行把StreamRemoteCall对象传入了serviceCall方法中

ysoserial exploit/JRMPClient

跟进this.serviceCall方法

ysoserial exploit/JRMPClient

前面获取了ObjID对象,生成Target对象等操作,直接看到101行

ysoserial exploit/JRMPClient

此时的var6是UnicastServerRef,把Target对象(此时的Target对象是DGCImpl类型)和远程连接对象传入了dispatch方法

ysoserial exploit/JRMPClient

跟进UnicastServerRef的dispatch

ysoserial exploit/JRMPClient

继续跟进this.oldDispatch

ysoserial exploit/JRMPClient

此时的this.skel是DGCImpl_Skel类型

跟进DGCImpl_Skel的dispatch

ysoserial exploit/JRMPClient

对var3的值做了一个switch判断,而在case0或者1中都会进行反序列化,从而触发漏洞调用链

ysoserial exploit/JRMPClient

解读exploit

main方法中拿到传入的参数,构造出payload,并且传入了makeDGCCall方法中

ysoserial exploit/JRMPClient

makeDGCCall方法中,objOut.writeInt写入的值就是前面的var3的值,0或1都行

ysoserial exploit/JRMPClient

最后进行了writeObject序列化,flush发送数据到服务端

其实这个payload是在构造DGC请求,然后让服务端的DGCImpl_Skel处理请求,导致的反序列化

详细可以看看这个师傅写的文章:

https://www.anquanke.com/post/id/225137#h3-3

此篇参考:

https://blog.csdn.net/whatday/article/details/106971531

上一篇:C结构体指针访问结构成员


下一篇:HCTF2018-admin