Loading

ysoserial exploit/JRMPClient

ysoserial exploit/JRMPClient

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

调用链分析

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

image-20210724215211737

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

image-20210724222429002

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

image-20210724220348066

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

image-20210724220451097

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

image-20210724220757377

跟进this.serviceCall方法

image-20210724220842364

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

image-20210724221139854

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

image-20210724221235996

跟进UnicastServerRef的dispatch

image-20210724221636874

继续跟进this.oldDispatch

image-20210724221850583

此时的this.skel是DGCImpl_Skel类型

跟进DGCImpl_Skel的dispatch

image-20210724222020532

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

image-20210724222714149

解读exploit

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

image-20210724222910062

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

image-20210724223144438

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

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

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

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

此篇参考:

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

posted @ 2021-07-28 10:54  Atomovo  阅读(459)  评论(0编辑  收藏  举报