Apache OFBiz RMI反序列化远程代码执行漏洞(CVE-2021-26295)

Author: 析安实验室(ZionLab)

漏洞分析

官网获取最新版本 https://ofbiz.apache.org/download.html

发现新版本对 .\framework\base\src\main\java\org\apache\ofbiz\base\util\SafeObjectInputStream.java
的 65行 进行了修改,添加了java.rmi.server 黑名单,说明此处应该存在 RMI 的利用链

寻找 SafeObjectInputStream 类的利用链

framework/base/src/main/java/org/apache/ofbiz/base/util/UtilObject.java 的114行

发现 SafeObjectInputStream类被初始化使用

并且直接 return wois.readObject(); 很明显是个反序列化点

继续反向跟踪 UtilObjectgetObjectException方法的利用链

发现自身 92行 getObject() 方法调用了该方法

寻找 UtilObject.getObject() 的调用链

framework/entity/src/main/java/org/apache/ofbiz/entity/serialize/XmlSerializer.java 468行

deserializeCustom方法中有调用过UtilObject.getObject(),从名字上看是个自定义的反序列化方法

继续跟踪直到跳出本类

在94行的 deserialize 方法后没有自身调用了

继续反向跟踪调用链

framework/service/src/main/java/org/apache/ofbiz/service/engine/SoapSerializer.java:45

framework/webapp/src/main/java/org/apache/ofbiz/webapp/event/SOAPEventHandler.java:177SOAPEventHandler类调用,并且在前面出现了SOAPBody等类型,说明这个类很有可能接收了request body,后面可以验证

接着在这个方法invoke()的最开始可以确定这个方法接收了request请求的内容

调用链梳理

request -> SOAPEventHandler:invoke() -> SoapSerializer:deserialize() -> XmlSerializer:多层调用-> deserializeCustom() -> UtilObject.getObject()-> getObjectException() -> SafeObjectInputStream:return wois.readObject(); -> 反序列化完成

正向梳理利用链

1. 通过 SOAPEventHandler:invoke() 获取请求

可以看到获取了 wsdl 参数,这里要跳过if判断向下执行,所以不能带上wsdl 参数

在173行

SOAPBody reqBody = reqEnv.getBody();

2. 获取到请求的 SOAPBody 内容,进入 SoapSerializer.deserialize()

3. 继续跟进 XmlSerializer.deserialize()

多次调用后来到 org.apache.ofbiz.entity.serialize.XmlSerializer#deserializeSingle

deserializeSingle方法中开始判断xml中的标签名

这里需要将恶意代码带入到反序列化中,需要经过 value.put() 将key和value添加到map中。

4. 接着构造map,判断为map-开头的标签应该就行

简单构造

<map-HashMap>
    <map-Entry>
        <map-Key>
        </map-Key>  
        <map-Value>  
        </map-Value>
    </map-Entry>
</map-HashMap>

接着从465行来到了468行

判断了子标签存在 cus-obj 才会进入逻辑,进入逻辑后

传入的 value 为Hex编码过的字节流

5. 接着跟进 UtilObject.getObject(valueBytes); 利用链

在 116行,恶意代码的字节流进入了存在漏洞的 SafeObjectInputStream

6. 跟进 SafeObjectInputStream

先进行了白名单的初始化,不过白名单限制不多

最后进行readObject()进行反序列化

7. 调试 UtilObject.getObject() 的利用链是否成功

首先 利用 ysoserial 生成RMI字节流

跟推理的一样来到了 SafeObjectInputStream

继续调试进入 readObject() 方法反序列化

从调试参数看这里的类名为 java.rmi.server.RemoteObjectInvocationHandler,而白名单里刚好有 java..*,在白名单内

因此直接跳到最后 将恶意的字节流反序列化触发RCE漏洞。

漏洞复现

完整构造POC

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ofbiz.apache.org/service/">  
  <soapenv:Header/>  
  <soapenv:Body>
    <ser>
      <map-Map>
        <map-Entry>
          <map-Key>
            <cus-obj>ACED0005737D00...00000000000078</cus-obj>
          </map-Key>  
          <map-Value>  
            <std-String value=""/>
          </map-Value>
        </map-Entry>
      </map-Map>
    </ser>
  </soapenv:Body>
</soapenv:Envelope>

本文来源于: https://xz.aliyun.com/t/9345

相关推荐

【漏洞预警】ntopng 权限绕过与任意代码执行漏洞(CVE-2021-28073/CVE-2021-28074)

2021年3月24日,阿里云应急响应中心监测到国内某安全团队公开披露 ntopng 权限绕过与任意代码执行漏洞,其CVE号为 CVE-2021-28073、CVE-2021-28074。 漏洞描述 ntopng是一款基于Web的流量分析

【漏洞预警】Apache Druid 远程代码执行漏洞(CVE-2021-26919)

2021年3月30日,Apache Druid官方发布安全更新,修复了由蚂蚁安全非攻实验室 @fantasyC4t 上报的 CVE-2021-26919 Apache Druid 远程代码执行漏洞。 漏洞描述 Apache Druid

【漏洞预警】VMware vRealize Operations Manager SSRF与文件写入漏洞

2021年3月31日,阿里云应急响应中心监测到 VMware 官方发布安全公告,披露了CVE-2021-21975 VMware vRealize Operations Manager API SSRF 和 CVE-2021-21983 V

Internet Explorer漏洞分析(四)——CVE-2016-0199

0x01 漏洞信息 0x01.1 漏洞简述 编号:CVE-2016-0199 类型:类型混淆(Type Confusion) 漏洞影响:远程代码执行(RCE)/拒绝服务攻击 (DoS) CVSS 2.0:9.3 mshtml.dll组件在将

Jackson-databind漏洞两则分析

文章前言 本篇文章将对CVE-2020-36189(Jackson-databind SSRF&RCE)漏洞和CVE-2020-36186(jackson-databind RCE)漏洞进行浅析,同时将在文末给出两则新的Gadget !!!

fofa爬虫 + 源码泄露PoC之梦幻联动(有福利)

写在前面 相信大家一定对源码泄露并不陌生,这里也不赘述这个漏洞的原理和危害了,网上一搜也都有好多好多,看都看不完~~~ 那今天这里我们讲啥呢?那就直入主题吧~今天这里我就贴出我自己参考的加上自己写的fofa爬虫 + 源码泄露PoC之梦幻联动

PHP的无参数RCE

PHP无参数RCE 因为先前只是参照大佬的payload解题,从未自己本地复现过,索性借复习的机会,在本地搭建并尝试。 题目: GXYCTF2019—禁止套娃 [极客大挑战 2020]Roamphp4-Rceme 限制条件: /[^\W]+

记某CMS漏洞getshell

记极致CMS漏洞getshell 今天下午比较空闲,就去搜索一些cms,突然对极致CMS感兴趣,而网上已经有一些文章对它进行分析利用,sql注入,xss,后台修改上传后缀名前台getshell等等。 于是就引起了我的兴趣想去测试一下。 信息

CVE-2016-0165 Win32k漏洞分析笔记

CVE-2016-0165 是一个典型的整数上溢漏洞,由于在 win32k!RGNMEMOBJ::vCreate 函数中分配内核池内存块前没有对计算的内存块大小参数进行溢出校验,导致函数有分配到远小于所期望大小的内存块的可能性。而函数本身并

记一次无意的渗透测试

由于最近再写一个web漏洞扫描器,准备在fofa上找网站测试的时候,无意间看到了个标题,xx系统, 点进去一看,好家伙,这不就是我很收悉的,那个xxcms嘛(具体的忘记了) 正好通过这个网站的cms漏洞,测试下我的扫描器,结果,好家伙,

ThinkPHP5.x RCE 复现

ThinkPHP5.x RCE 复现 其实去年开始是复现过这个漏洞的,但是总觉得并没有吃透,分析写得漏洞百出,于是再来审计一遍。 漏洞影响范围 5.x < 5.1.31 5.x < 5.0.23 复现环境 php7.3 thinkphp5.