
针对Oracle WebLogic ADF Faces(CVE-2022-21445,CVSS 9.8)的预认证远程代码执行利用。包含详细的环境搭建、载荷生成和远程调试说明,用于渗透测试。
CVE-2022-21445(CVSS 评分 9.8),该漏洞是对不可信数据的反序列化,被确认存在于 ADF Faces 组件中,可被攻击者在无需身份验证(pre-authentication)的情况下远程利用,以执行 RCE。
该漏洞由 VNG Corporation 的网络安全专家 PeterJson 和 VNPT 的 Nguyen Jang 发现。Oracle 于 2021 年 10 月收到此报告,但花了长达 6 个月的时间,即到 2022 年 4 月才发布补丁。
本文中的漏洞利用主要针对 Oracle Business Intelligence 12.2.1.4.0 版本。
条件:安装 Windows 10+ Pro 或 Windows Home (x64) 并已激活许可证,或使用 Windows Server(优先使用 Oracle 的产品)
步骤 1:安装 Java,版本为 jdk 8u112 或更高(8Ux),下载链接:JDKv8U112

步骤 2:安装 Oracle Database 19c,下载链接:Oracle 19c
准备一个用于安装数据库的文件夹,创建如下路径,并将刚下载的数据库 zip 文件解压到此处 C:\app\oracle\product\19c\db_home1
以管理员权限运行 setup.application 文件

按照 数据库安装指南 中的说明逐步执行
务必注意:
在步骤 8/17,记得勾选 Create as Container database,以创建一个可插拔数据库,供接下来的 Fusion Middleware 安装过程使用。

在步骤 9/17,选择字符集为 Unicode (AL32UTF8)



步骤 3:安装 SQL Developer,no-jre 版本,下载链接:SQLDev-NoJRE

以管理员权限运行 sqldeveloper.application 文件

按下图设置新连接的各参数,注意修改 Username 和 Password(如上文示例为 hr)、Hostname(默认为 localhost)、Port(默认为 1521)、SID(即步骤 2 中安装的全局数据库名)

如果点击 Test 时提示 Success,则连接成功,点击 Connect
步骤 4:安装 Fusion Middleware Infrastructure (FMW) 12.2.1.3.0 版本,下载链接 FMW_ver_12.2.1.3.0

步骤 5:安装 Oracle Business Intelligence (OBIEE) 12.2.1.4.0 版本,下载链接:OBIEE_ver_12.2.1.4.0
以管理员权限运行 setup_bi_platform-12.2.1.4.0_win64.exe 文件

按照 OBIEE 安装指南 逐步安装
注意:BI 的路径必须与已安装 FMW 的路径一致,例如这里是 Oracle/Middleware/Oracle_Home

步骤 6:使用 Repository Creation Utility (RCU) 工具设置 BI Schema
在路径 C:\Oracle\Middleware\Oracle_Home\oracle_common\bin 下,以管理员权限运行 rcu.bat 文件
依次执行以下步骤




步骤 7:为 OBIEE 设置环境变量

步骤 8:创建 BI Domain





在步骤 4,如果系统提示 fail to logon,请重新检查 domain 密码是否正确
在步骤 8,如果系统报错如下图,请检查你是否已激活 Windows 许可证,以及你的 Windows 是否符合前文“条件”部分的描述。
![]()
步骤 9:设置完成后,访问刚创建的 BI domain,路径为 $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao
将这里所有的 jar 文件复制到一个单独的文件夹中,并共享到攻击机(在搭建实验环境时这样做;实际攻击时,攻击机上也需要像目标机一样安装,才能获取源码)
同时将路径 $Oracle_Home\coherence\lib 下的 coherence.jar 库添加到该文件夹中。
这是决定 payload 能否成功的重要目录,因为每个 FMW 或 BI 版本、以及每台机器的安装环境通常会有所不同,因此需要版本精确,以降低在传输 payload 时出现风险或异常(exception)的可能性。
步骤 10(仅当需要远程调试时执行;再次强调,如果在真实环境之外测试,由于无法随意设置受害者机器,因此攻击者需要在自己的机器上也完成目标机的设置,以便能够远程调试并检查错误)
安装 mozilla,添加端口为 8181 的 Burp 代理
在 BI 服务器端启用远程调试
访问 localhost:9500/console
在 Domain Structure -> 选择 bi -> Environment -> Servers

将显示两个服务器,即 Weblogic 的 AdminServer 和 BI 的 bi_server1
图 10.2:显示的服务器列表
选择左上角的 Lock & Edit,勾选 bi_server1 以编辑配置。接着点击 Configuration -> Server start -> 向下滚动到底部,选择 Advance(如果有)-> 选择并输入 Arguments -> 输入调试参数:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(如果之后出现无法重启的错误,可以尝试使用 0.0.0.0:5005 重启 bi_server1)
输入 weblogic 密码(之前在 Config BI Domain 部分设置的)-> Apply change & Restart
启动管理员终端 -> 导航到路径 $Oracle_Home\user_projects\domains\bi\bitools\bin,运行 ./stop.cmd 和 ./start.cmd 以重启 bi_server1。如果在重启过程中没有出现错误,则说明调试已开启,并监听上述 5005 端口。如果出现错误,请重新检查上面的调试参数,看是否有多余的空格或 address 部分填错。
步骤 1:下载 IntelliJ IDEA Ultimate,并使用从 GitHub 上找到的激活码激活。
步骤 2(仅当攻击过程中出现类似 500 Server Error, ... 的错误时才执行此步骤,这是因为 payload 中存在异常)
将项目的 jdk – sdk 版本调整为与目标机相同的版本(安装方法见 目标机部分 - 步骤 1)
创建一个空项目,用于分析源代码,服务远程调试,3. 然后将从目标机收到的文件夹中的所有 jar 文件添加到该项目中
Project Structure -> Modules -> 点击 + 号 -> 1 JARS or Directories -> 添加整个 jar 文件夹


配置远程调试
Run -> Edit Configurations -> + -> Remote JVM Debug

运行 Remote Debug,如果控制台显示:Connected … 则说明成功。

步骤 3:
将此仓库中的代码克隆到本机,删除 lib 目录中旧的 coherence.jar 文件,并用前面步骤中从目标机获取的文件替换。
接着,将其添加到一个由 IntelliJ 运行的项目中,将 lib 中的 jar 文件以 Add as library 方式添加。
再次检查 LambdaIdentity$.... 类的名称是否与 Weblogic 版本对应,如有变化,请对该文件进行重构并调整该文件的名称。
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
修改 Main.java 文件中指向 LambdaIdentity$....class 文件的路径。要获得准确路径,有两种方法:一种是对 jar 文件运行 javac,使其生成 .class 文件;另一种是注释掉 main 函数的代码,然后正常运行该项目,class 文件的路径可以在 target 目录中找到。
再次检查项目的 jdk 和 sdk,使其与目标机一致。
可以看到 web.xml 文件,该文件描述了与 servlet-mapping 相关的映射关系。"resources" 是与系统资源相关的 servlet,其中包含重要的数据和信息,因此这通常是攻击者针对的位置。






分析 RemoteApplicationResourceLoader.class 中的 findResource() 函数

该函数返回一个包含自定义协议 RAStreamHandler() 的 method。RAStreamHandler 将创建一个 URLConnection 对象,其值为 new RAURLConnection

RAURLConnection 函数调用 _getPathBean 函数

_getPathBean 函数包含一个 bean 对象,该对象通过调用 getInstanceFromString() 函数创建,其任务是处理接收到的字符串,以取出相应的 key(filter)。

输入的 bean 字符串将通过 SerializationUtils 类从 URL encoded 形式转换为一个 URLEncoderPathBean 对象。如果一切正常,后面的 input 将继续被传入 fromURLEncodeString() 函数。


当输入字符串出错时会抛出异常。异常主要来自 payload 中使用的 lib,可能是由于版本不匹配或 Lambda 文件路径错误。
在 fromURLEncodedString() 函数中,返回一个参数为 url 的 fromString 函数,其代码如下:

在 fromString 函数中,数据经过 readObject() 后被返回。可以看到,输入完全没有被过滤,流经多个函数后最终在 fromString() 中被反序列化。这正是用于漏洞利用的 sink。有了 sink,接下来只需找到 source 即可。
因此,要调用上述类,我们需要一个形如 “/.*/remote/(.*)” 的正则表达式。所以,当路由器或输入路径的格式为 /em/afr/foo/remote/payload 时,它将满足此文件中定义的结构,此时 RemoteApplicationResourceLoader 将在 doGet 中被用作 loader,并且相应的类文件 oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader 将调用在其中重写的 findResource() 函数。因此,如果我们将 payload 传递到正确的地址,数据就可以轻松传输而不会受到过滤器的影响。
以下是用于利用的最终 URL:
__hostname:port/contextApp/afr/foo/remote/payload/__
其中 contextApp 是刚安装完 OBIEE 后就会存在的路径之一,如 /em;/bicomposer;……。
Foo 是任意字符串
Payload 是在运行已准备好的攻击项目的 Main 函数时生成的字符串。
### 用于生成 payload 的代码分析
该项目遵循 CVE-2020-14644 的 gadget chain

Class LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A 继承自 AbstractRemotable,用于与远程系统交互。
借助 Java Reflection API,攻击者可以轻松地从当前执行线程中获取 WorkAdapter。
接下来,继续获取 WorkAdapter 的 connectionHandler 字段,并
通过查询从 connectionHandler 中获取 ServletRequest 和 ServletResponse。
然后,从请求(ServletRequest)中获取 "cmd" 头的值,并检查如果 "cmd" 不为空,则执行与当前运行操作系统(Windows 或 Linux/Unix)相对应的 shell 命令。
读取 shell 命令的输出,并将结果发送到响应(ServletResponse)中。
如果在执行过程中发生任何错误,都将通过 printStackTrace() 方法打印到控制台。
LamdaIdentity 类名后面的 Id 取决于 weblogic server 的版本,它是一个根据 com.tangosol.internal.util.invoke.ClassIdentity 类的 MD5 哈希值编码的字符串,而由于每个版本的该类都不同,因此如上所述,为了确保 payload 不会出错,必须仔细检查这一点。
在这里,cmd 变量从输入请求的请求头中获取,然后被添加到下面的 Runtime.getRumtime.exec() 语句中,以 MD5 十六进制代码的形式进行编码和解码,在传递到 OBIEE 系统后,将返回反序列化后的值。
最后,在 Main 函数中,创建一个 RemoteConstructor 对象,通过 SerializationUtils 库将其转换为 URL 编码字符串。该字符串将直接传递到 URL source 中,从而为攻击者提供了插入任意 __cmd__ 命令的机会。

## 复现利用


## 参考
1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2
2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316
## 漏洞作者:Jang Nguyen & Duc PeterJson