ysoserial exploit/JRMPClient
上一篇文章讲到,当服务器反序列化payloads/JRMPListener,即会开启端口监听。再使用exploit/JRMPClient模块发送payload,服务器就会把payload进行反序列化,从而完成进行攻击。
调用链分析
设置payloads/JRMPListener参数,端口号为1299,debug模式启动payloads/JRMPListener模块。
设置exploit/JRMPClient模块设置参数为127.0.0.1 1299 CommonsCollections7 "calc"
启动exploit/JRMPClient模块后,服务端的接收到请求,会用TCPTransport的handleMessages来处理请求
往下看,第277行,把连接对象传入了StreamRemoteCall对象中。
第278行把StreamRemoteCall对象传入了serviceCall方法中
跟进this.serviceCall方法
前面获取了ObjID对象,生成Target对象等操作,直接看到101行
此时的var6是UnicastServerRef,把Target对象(此时的Target对象是DGCImpl类型)和远程连接对象传入了dispatch方法
跟进UnicastServerRef的dispatch
继续跟进this.oldDispatch
此时的this.skel是DGCImpl_Skel类型
跟进DGCImpl_Skel的dispatch
对var3的值做了一个switch判断,而在case0或者1中都会进行反序列化,从而触发漏洞调用链
解读exploit
main方法中拿到传入的参数,构造出payload,并且传入了makeDGCCall方法中
makeDGCCall方法中,objOut.writeInt写入的值就是前面的var3的值,0或1都行
最后进行了writeObject序列化,flush发送数据到服务端
其实这个payload是在构造DGC请求,然后让服务端的DGCImpl_Skel处理请求,导致的反序列化
详细可以看看这个师傅写的文章:
https://www.anquanke.com/post/id/225137#h3-3
此篇参考:
https://blog.csdn.net/whatday/article/details/106971531