ysoserial之JRMP源码分析(payloads.JRMPClient/exploit.JRMPListener)

本文介绍了Java RMI中的JRMP协议,以及ysoserial库如何利用JRMPListener和JRMPClient进行远程方法调用攻击。通过分析ysoserial的payloads.JRMPClient和exploit.JRMPListener,揭示了如何通过DGC机制触发反序列化,从而执行任意命令。在JRMPListener中设置监听,JRMPClient发起请求,利用反序列化漏洞执行恶意payload。
摘要由CSDN通过智能技术生成

前言

本来是想复现weblogicCVE-2017-3248漏洞的,这个漏洞使用了ysoserial的jrmp模块,开启rmi监听进行通信的,达到执行任意反序列化 payload。下文有些概念比较晦涩难懂,建议查阅其他资料配合使用。(此案例是受害机充当客户端payloads.JRMPClient 请求我们的注册端exploit.JRMPListener)

JRMP协议是什么

JRMP全称为Java Remote Method Protocol,也就是Java远程方法协议。
一个RMI的过程,是用到JRMP这个协议去组织数据格式然后通过TCP进行传输,从而达到RMI,也就是远程方法调用。
JRMP是一个协议,是用于Java RMI过程中的协议,只有使用这个协议,方法调用双方才能正常的进行数据交流。

分布式垃圾收集(DGC)

在Java虚拟机中,对于一个本地对象,只要不被本地Java虚拟机中的任何变量引用,它就可以被垃圾回收器回收了。

而对于一个远程对象,不仅会被本地Java虚拟机中的变量引用还会被远程引用。如将远程对象注册到Rregistry时,Registry注册表就会持有它的远程引用。

RMI框架采用分布式垃圾收集机制(DGC,Distributed Garbage Collection)来管理远程对象的生命周期。DGC的主要规则是,只有当一个远程对象不受任何本地引用和远程引用,这个远程对象才会结束生命周期。

当客户端获得了一个服务器端的远程对象存根时,就会向服务器发送一条租约通知,告诉服务器自己持有这个远程对象的引用了。此租约有一个租约期限,租约期限可通过系统属性java.rmi.dgc.leaseValue来设置,以毫秒为单位,其默认值为600 000毫秒。如果租约到期后服务器端没有继续收到客户端新的租约通知,服务器端就会认为这个客户已经不再持有远程对象的引用。

因此可以通过与DGC通信的方式发送恶意payload让服务端进行反序列化,从而执行任意命令。
具体来讲,这里利用RMI,让受害机反序列化UnicastRef这个类,使该类发起一个JRMP连接到恶意服务端上,从而在DGC层造成一个反序列化,因为DGC层是在反序列化之后进行设置的,所以之前设置的黑名单过滤没有作用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值