Registry与DGC的攻击利用

0x01 Registry

Registry指的是RMI的注册表,攻击的目标是注册表所在的机器,一般注册表和RMI Server在同一个机器上,特殊情况下也会在不同机器上。

在我们通过LocateRegistry#getRegistry获取到目标开启的注册表之后,可以通过Registry#bind方法绑定一个对象到注册表上,而我们绑定的对象传送到目标机器上之后会对其进行一个反序列化。

反序列化触发点在RegistryImpl_Skel#dispatch方法上。

在这里插入图片描述
同样的,在获取到开启的注册表之后,可以通过rebind/lookup方法触发反序列化链,因为rebind/lookup方法传递对象过去之后目标也会对其进行反序列化。

漏洞点同样发生在RegistryImpl_Skel#dispatch方法上,其实dispatch这个方法就是通过一个switch来判断是bind/lookup/rebind等操作中的哪个,对应的case为如下。

在这里插入图片描述0

可以看到rebind/lookup操作都会触发反序列化

在这里插入图片描述

0x02 Registry修复

在JDK8u232_b09版本之前对Registry被攻击有两处修复,第一处修复是在JDK8u121之后对注册表可以反序列化的类进行了一个限制,是一个白名单的限制。实现限制的方法为RegistryImpl#registryFilter。(这里是 JEP290的防御操作

return String.class != var2 && !Number.class.isAssignableFrom(var2) && !Remote.class.isAssignableFrom(var2) && !Proxy.class.isAssignableFrom(var2) && !UnicastRef.class.isAssignableFrom(var2) && !RMIClientSocketFactory.class.isAssignableFrom(var2) && !RMIServerSocketFactory.class.isAssignableFrom(var2) && !ActivationID.class.isAssignableFrom(var2) && !UID.class.isAssignableFrom(var2) ? Status.REJECTED : Status.ALLOWED;

第二处修复是在JDK8u141之后,在JDK8u141之前bind/rebind/lookup都可以触发反序列化,但在此版本之后对bind/rebind的case语句块进行了修改,在反序列化前增加了一个检查,检查调用bind/rebind的机器是否为本地,限制了调用源只能是本地。

在这里插入图片描述<

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值