Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2022-21445-for-12.2.1.3.0-Weblogic — 针对Oracle WebLogic ADF Faces(CVE-2022-21445,CVSS 9.8)的预认证远程代码执行利用。包含详细的环境搭建、载荷生成和远程调试说明,用于渗透测试。 | Kitploit
工具/GitHubGitHub/hienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic
漏洞分析代码分析漏洞利用Web应用程序漏洞利用渗透测试远程访问工具Payload 开发
GitHubhienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic

CVE-2022-21445-for-12.2.1.3.0-Weblogic

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

针对Oracle WebLogic ADF Faces(CVE-2022-21445,CVSS 9.8)的预认证远程代码执行利用。包含详细的环境搭建、载荷生成和远程调试说明,用于渗透测试。

查看仓库
53472年前尚未审核
分享

概述

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

  • 添加 JAVA_HOME,路径指向 jdk 目录(不是 jre) 图 1.1:安装 Java

步骤 2:安装 Oracle Database 19c,下载链接:Oracle 19c

  1. 准备一个用于安装数据库的文件夹,创建如下路径,并将刚下载的数据库 zip 文件解压到此处 C:\app\oracle\product\19c\db_home1

  2. 以管理员权限运行 setup.application 文件 图 2.1:运行 DB 安装程序

  3. 按照 数据库安装指南 中的说明逐步执行

  • 务必注意: 在步骤 8/17,记得勾选 Create as Container database,以创建一个可插拔数据库,供接下来的 Fusion Middleware 安装过程使用。 图 2.2:初始化 Pluggable Database

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

    1. 安装过程完成后,请在 Windows 的 Services 中仔细检查,确保如下图中 4 个主要服务处于 RUNNING 状态 图 2.4:安装成功

    图 2.5:检查服务

    1. 按照以下步骤创建一个新的 Oracle 数据库账户:
    • 管理员终端 -> sqlplus / as sysdba
    • 创建 system 系统用户:alter user system identified by system_password account unlock;
    • 检查 system 用户是否存在:select username from dba_users;
    • 设置环境:alter session set “_oracle_script”=true;
    • 创建普通用户 hr:create user hr identified by user_password;
    • 授权:grant all privileges to hr;
    • 解锁账户 – 修改密码:alter user hr identified by hr_pass account unlock;
    • 创建新的系统账户:alter user sys identified by sys_pass account unlock;

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

    • 以管理员权限运行 sqldeveloper.application 文件 图 3.2:启动 SQL Developer

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

    • 如果点击 Test 时提示 Success,则连接成功,点击 Connect

    步骤 4:安装 Fusion Middleware Infrastructure (FMW) 12.2.1.3.0 版本,下载链接 FMW_ver_12.2.1.3.0 图 4.1:下载 FMW

    • 为 FMW 安装目录创建形如 C:\Oracle\Middleware\Oracle_Home 的路径
    • 按照指南依次执行各步骤:FMW 安装指南

    步骤 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 文件 图 5.1:运行 OBIEE 安装文件

    • 按照 OBIEE 安装指南 逐步安装

    • 注意:BI 的路径必须与已安装 FMW 的路径一致,例如这里是 Oracle/Middleware/Oracle_Home 图 5.2:BI 的路径必须与 FMW 相同

    步骤 6:使用 Repository Creation Utility (RCU) 工具设置 BI Schema

    • 在路径 C:\Oracle\Middleware\Oracle_Home\oracle_common\bin 下,以管理员权限运行 rcu.bat 文件

    • 依次执行以下步骤

    图 6.1:创建 Repository

    图 6.2:数据库连接详细信息

    图 6.3:选择组件

    图 6.4:Schema 密码

    • 最后,点击 Create 让系统创建 BI Schema

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

    • 进入 控制面板 > 系统 > 高级系统设置 > 高级 > 环境变量 > 新建系统变量 图 7.1:环境变量

    步骤 8:创建 BI Domain

    1. 在路径 C:\Oracle\Middleware\Oracle_Home\bi\bin 下,以管理员权限运行 config.cmd 文件

    图 8.1:运行 config 文件

    1. 在步骤 1:选择全部 3 个组件,其中 Essbase 是 OLAP 服务器,Business Intelligence Enterprise Edition 是 BI Analytics,Business Intelligence Publisher 是 BI Publisher

    图 8.2:选择组件

    1. 在步骤 3:按下图设置新的 domain,!!请记住 domain 的密码,因为之后很难找回。 并将 domain 设置为 bi,因为这是默认值。

    图 8.3:domain 账户

    1. 在步骤 4:为数据库更新 domain 信息

    图 8.4:更新信息

    1. 在步骤 8:如果过程顺利,将得到如下图的结果

    图 8.5:配置成功

    1. 如果所有步骤均为 Done,则保存 OBIEE 的信息文件,供下一步使用,并登录打开以下 URL:
    • http://localhost:9500/console*
    • http://localhost:9500/em*
    • http://localhost:9502/xmlpserver*
    • http://localhost:9502/analytics*
    1. 一些可能出现的错误
    • 在步骤 4,如果系统提示 fail to logon,请重新检查 domain 密码是否正确

    • 在步骤 8,如果系统报错如下图,请检查你是否已激活 Windows 许可证,以及你的 Windows 是否符合前文“条件”部分的描述。

    图 8.6:许可证错误

    • 错误:尚未添加 BI_HOME_PRODUCT,请查看 步骤 7
    • 更新错误 ...

    步骤 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

    图 10.1:Domain Structure

    将显示两个服务器,即 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 中存在异常)

    1. 将项目的 jdk – sdk 版本调整为与目标机相同的版本(安装方法见 目标机部分 - 步骤 1)

    2. 创建一个空项目,用于分析源代码,服务远程调试,3. 然后将从目标机收到的文件夹中的所有 jar 文件添加到该项目中

      Project Structure -> Modules -> 点击 + 号 -> 1 JARS or Directories -> 添加整个 jar 文件夹

    图 11.1:添加 jar 文件

    图 11.2:结果

    1. 配置远程调试

      Run -> Edit Configurations -> + -> Remote JVM Debug

    图 12.1:配置远程调试

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

    图 12.2:运行 Remote Debug

    步骤 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,使其与目标机一致。

    分析 BI 代码和生成 payload 的代码

    分析 BI 代码

    1. 在路径 $Oracle\Middleware\Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\em\fw8wi5\war\WEB-INF

    可以看到 web.xml 文件,该文件描述了与 servlet-mapping 相关的映射关系。"resources" 是与系统资源相关的 servlet,其中包含重要的数据和信息,因此这通常是攻击者针对的位置。

    图 13.1:servlet-mapping 映射关系

    1. 深入研究 ResourceServlet 类,具体是 org.apache.myfaces.trinidad.webapp.ResourceServlet,可以看到 doGet 函数,其职责是处理发送到服务器的 get 请求。

    图 13.2:doGet 函数

    • 在这里,通过 method _getResourceLoader(),从输入的 request 创建一个新的 loader。同时,一个 resourcePath 也被初始化,并通过 method getResourcePath(参数为 request)获取 servletPath 和 servletInfo 的值。该 loader 会调用函数 getResource(resourcePath),尝试从输入的请求加载资源,并通过函数 org.apache.myfaces.trinidad.resource.ResourceLoader.getResource.findResource() 查找它,最后找到的值会被传递给 URL.class 的一个 url 实例。

    图 13.3:getResource 函数

    • _getResourceLoader 维护了一个 ConcurrentMap,用于存储 servletPath 与 loaders 之间的映射关系。该关系在 oracle.adfinternal.view.resource.rich.RenderKitResourceLoader 中有明确定义。

    图 13.3:RenderKitResourceLoader 类

    • 在 RenderKitResourceLoader() 函数中,method _register 被调用,并传入相应的 regex + loader,然后返回其父函数 super.register。该函数会将 pattern 和相应的 loader 添加到 concurrentmap_loaders 中。因此,当 loader 在 doGet() 函数中初始化并接收输入 request 参数时,会从发送的 url request 中获取 servletPath 值,并传入 _loader.get() 以取出对应的 servlet。

    图 13.4:method _register

    图 13.5:method register(父方法)

    • 漏洞作者认为,在包含重写 findResource() 方法的类中,oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader 是存在导致反序列化风险的类。让我们一起分析它来寻找原因。

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

    图 13.6:findResource() 函数

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

    图 13.7:method RAStreamHandler()

    RAURLConnection 函数调用 _getPathBean 函数

    图 13.8:method RAURLConnection()

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

    图 13.9:_getPathBean 函数

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

    图 13.10:getInstanceFromString() 函数

    图 13.11:fromURLEncodedString() 函数

    当输入字符串出错时会抛出异常。异常主要来自 payload 中使用的 lib,可能是由于版本不匹配或 Lambda 文件路径错误。

    在 fromURLEncodedString() 函数中,返回一个参数为 url 的 fromString 函数,其代码如下:

    图 13.12:fromString() 函数

    在 fromString 函数中,数据经过 readObject() 后被返回。可以看到,输入完全没有被过滤,流经多个函数后最终在 fromString() 中被反序列化。这正是用于漏洞利用的 sink。有了 sink,接下来只需找到 source 即可。

    1. 寻找 source:如上面所分析的,要找到 source,需要确定输入的 url request。可以看到,要调用 findResource() 函数,必须能够导航到 RemoteApplicationResourceLoader 类。在 RenderKitResourceLoader 类中已经定义得非常清楚:```bash this._register("/./remote/(.)", new RemoteApplicationResourceLoader());
    root@kitploit:~
    因此,要调用上述类,我们需要一个形如 “/.*/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
    
    ![file Lambda](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload2.png)
    
    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__ 命令的机会。
    
    ![Main 函数](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload1.png)
    
    ## 复现利用
    
    ![利用 /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit1.png)
    
    
    ![利用 /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit2.png)
    
    
    ## 参考
    
    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
    
    下载工具