apache ofbiz CVE-2021-26295 RMI反序列化分析

共 1968字,需浏览 4分钟

 ·

2021-03-31 11:11

作者:Jambolt  编辑:白帽子社区运营团队




    "白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)

"    





分析环境搭建
gradle 部署好apache ofbiz 17.12.05 
OFBIZ启动调试方法

启动调试


漏洞原理分析
通过漏洞访问路径 /webtools/control/SOAPsService 进行寻找

定位路径处理的类 org.apache.ofbiz.webapp.control.ControlServlet 查看init()

跟入getRequestHandler()

接收请求来自 RequestHandler类
断点于 doGet()

userLogin == null 未登陆状态

    对请求路径进行判断 保存在 webappName 和 rname 变量

经过了一串的参数设定进入 requestHandler.doRequest

先获取 ControllerConfig 处理路径的xml位置

statusCode为空时 设置为302

获取当前请求路径

跟入 org/apache/ofbiz/webapp/control/RequestHandler.java runEvent()

跟入 org/apache/ofbiz/webapp/control/RequestHandler.java invoke()

在 org/apache/ofbiz/webapp/event/SOAPEventHandler.java 中 校验wsdl 失败后进入校验 text/xml 获取了请求中的xml字段

在 ModelService model = dispatcher.getDispatchContext().getModelService(serviceName); 触发了dnslog请求的执行

之后 deserialize()

获取到dnslog的url

跟入 org/apache/ofbiz/service/GenericDispatcherFactory.java runSync()

步入多步后到达 org/apache/ofbiz/service/ServiceDispatcher.java runSync()

跟入 org/apache/ofbiz/entity/serialize/XmlSerializer.java deserializeCustom() tag-name cusobj 通过校验

获取到 hex 字节码 转化为 byte[] valueBytes 之后被 UtilObject.getObject()调用

第一次dnslog请求 触发点

org/apache/ofbiz/base/util/UtilObject.java 中 序列化字符串通过SafeObjectInputStream()处理 后进行 readobject()触发反序列化

org/apache/ofbiz/base/util/SafeObjectInputStream.java 中 whitelist 数组

跟入readobject()在 java/io/ObjectInputStream.java 触发执行

diff 结果

断点于 org/apache/ofbiz/base/util/SafeObjectInputStream.java resolveClass() 在下面的调用链 后进入 类过滤

此POC 依次对 java.util.HashMap -> java.net.URL 过滤 

ysoserial 中的 URLDNS 类

测试POC的反序列化类型


后续探索
目前网上所使用的POC并不是patch补丁所防御的反序列化调用 目前apache ofbiz最新版 17.12.06 一样可以执行目前网上公开的 URLDNS gadget POC 尝试使用 patch中防御的 java.rmi.server 来构造 POC


往期精彩文章




回顾2020,我们是如何挖掘漏洞的
【护网行动专题】红队攻击指南
护网蓝队前期准备详述
Glibc2.31下Tcache机制攻击总结




技术支持:白帽子社区团队
— 扫码关注我们 



浏览 49
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报