WebLogic CVE-2020-2551漏洞

预备知识

主要是利用IIOP协议进行的攻击。该漏洞原理上类似于RMI反序列化漏洞(CVE-2017-3241),和之前的T3协议所引发的一系列反序列化漏洞也很相似,都是由于调用远程对象的实现存在缺陷,导致序列化对象可以任意构造,并没有进行安全检查所导致的。

从0开始学习复现这个洞不免又会设计到Java反序列化漏洞中那些老生常谈的名词理解,涉及到Java反序列化中的一些协议、行为、结构。

RMI、JRMP

Remote Method Invocation,远程方法调用:Java中的一个RPC服务实现,底层的协议是JRMP协议,功能也好理解,让你可以远程调用对象就像在本地调用一样,你可以参照点外卖,把外卖(对象)叫到你家里(本地客户)使用。

Java Remote Method Protocol,Java远程方法协议:Java远程方法协议 JRMP是一个协议,是用于Java RMI过程中的协议,只有使用这个协议,方法调用双方才能正常的进行数据交流。

LDAP

Lightweight Directory Access Protocol ,轻型目录访问协议,主要充当目录服务的协议,这个在后面测试中也常会看到LDAP服务和RMI服务起的接收端,LDAP主要充当目录服务的协议,用来保存一些属性信息的,但要和RMI区别开来,LDAP是用于对一个存在的目录数据库进行访问,而RMI提供访问远程对象和调用

RMI反序列化原理:

RMI即Java RMI(Java Remote Method Invocation),Java远程方法调用,说白了就是实现让你可以远程调用服务器上对象的一种接口。(例如不同JVM虚拟机之间的Java对象相互调用)。
客户端和服务端在调用对象时候互相都有个代理,客户端的代理叫Stub(存根),服务端的代理叫Skeleton(骨架),代理都是从服务端产生的。
在RMI中客户端和服务端通过代理传入远程对象时候客户端负责编码,服务器负责解码,而这个过程中我们的对象是 使用序列化操作进行编码的。

RMI模式(或行为)中,说简单点我们只需要关注三个部分

  • 客户端(使用远程对象)
  • 服务端(提供远程对象给客户端使用
  • Registry(用来提供注册对象的地方)

下面的RMI简单Demo中也可以比较简易体现出三者之间的关系和功能的分工。

更多

安全客---Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)

7001端口

weblogic 的 7001 端口,正常情况下我们通过 7001 端口发送 HTTP 协议时会响应 HTTP 协议的内容,发送 T3 协议的数据包时响应 T3 的响应数据包,发送 IIOP 协议的数据包时响应 IIOP 的数据包。该端口非常的神奇,我们通过什么协议访问该端口该端口会响应对应的协议包内容。

漏洞利用

该漏洞主要是因为 Webloigc 默认开放 IIOP 协议,并且 JtaTransactionManager 并未做黑名单过滤导致漏洞发生,以下为整个测试 POC(该 POC 来自互联网),后续代码调试也是基于该代码进行调试。

 

WebLogic CVE-2020-2551漏洞_第1张图片

 

RMI中调用过程

首先服务器端:

服务端中createRegistry(1099);的时候,返回的registry对象类是sun.rmi.registry.RegistryImpl

WebLogic CVE-2020-2551漏洞_第2张图片

RegistryImpl中会设置接口实现类的ref变量,类型为sun.rmi.server.UnicastServerRef,其中含有LiveRef类型的对象变量ref与TCPEndpoint的ep变量

WebLogic CVE-2020-2551漏洞_第3张图片

 

参考链接:安全客---漫谈WebLogic CVE-2020-2551

你可能感兴趣的:(漏洞复现)