解决了一天gradle的报错,最后发现vulhub本身开了调试端口的…..
最后还是没搭建成功,就远程调试吧(gradle项目搭建真的报错太多了)
漏洞描述
Apache OFBiz是一个非常著名的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。 OFBiz最主要的特点是OFBiz提供了一整套的开发基于Java的web应用程序的组件和工具。包括实体引擎, 服务引擎, 消息引擎, 工作流引擎, 规则引擎等。
其17.12.04版本之前的XMLRPC接口存在一处反序列化漏洞,攻击者利用这个漏洞可以在目标服务器上执行任意命令。
环境搭建
1 | cd vulhub-master/ofbiz/ofbiz/CVE-2020-9496 |
访问https://192.168.248.129:8443/accounting/control/main
漏洞复现
使用yso生成payload
1 | java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" | base64 | tr -d "\n" |
发送如下数据包
1 | POST /webtools/control/xmlrpc HTTP/1.1 |
进入容器,查看文件
漏洞分析
每个XML-RPC请求都以
1 | POST /RPC2 HTTP/1.0 |
几种常见的数据类型
1 | <!-- array --> |
根据路由 /webtools/control/xmlrpc
,首先定位到framework/webtools/webapp/webtools/WEB-INF/web.xml
跟进到framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlServlet.java中,由于该路由对应的是ControlServlet.java文件,那么在发起相应请求时必然会调用其中的doPost方法
跟进doGet,来到关键点
跟进doRequest方法
调用了controller.xml文件配置,里面定义了很多路由,包括xmlrpc
随后来到此处
调用了runEvent方法来处理,跟进
查找对应event到handler然后进行invoke方法调用,经过几次调用之后就会对XmlRpc进行调用,跟进invoke方法
判断是否传入了echo参数,没有传入,进入else
跟进execute方法
看一下getRequest方法
调用了parse方法对我们的输入流进行了处理
这里需要加一个 xmlrpc-common-3.1.3.jar 文件,经过一系列调用
来到startElement方法
对xml参数进行了规范,然后默认步入如下代码
继续跟进父类的startElement方法
可以看到对pURI进行了判断,这也是为什么我们的payload要设置xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions"
接着会调用ByteArrayParser的startElement进行一个base64解码
然后又经过一系列调用
调用了getResult方法
对我们传入的数据进行反序列化
漏洞修复
后续修复是在该处路由增加了鉴权