
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator 인증 우회 PoC
JwtAuthenticator 인증 우회 PoCCVE-2026-29000에 대한 개념 증명(PoC)입니다. 이는 pac4j-jwt의 JwtAuthenticator 구성 요소에서 발생하는 인증 우회 취약점입니다 (CVSS 10.0, 치명적).
이 스크립트는 비밀 키를 전혀 알지 못해도 대상이 RSA 공개 키를 노출하기만 하면, 모든 사용자를 가장하고 모든 역할을 부여받은 토큰을 위조합니다.
[!WARNING] 이 도구는 교육 목적 및 승인된 보안 테스트 전용으로 제공됩니다. Hack The Box 머신 **"Principal"**을 풀기 위해 작성되었으며, 기본값(
iss,role,kid)은 해당 머신에 맞게 조정되었습니다. 자신이 소유하거나 명시적으로 테스트 권한을 부여받은 시스템에만 사용하십시오.
pac4j-jwt 버전 < 4.5.9, < 5.7.9, < 6.3.3은 JwtAuthenticator가 암호화된 JWT(JWE)를 처리할 때 논리적 결함을 포함하고 있습니다.
JwtAuthenticator가 JWE를 복호화한 후, 내부 토큰을 SignedJWT로 파싱하려고 시도합니다. 내부 토큰이 서명되지 않은 PlainJWT(alg: none)인 경우 SignedJWT 객체는 null을 반환하고, 논리 오류로 인해 서명 확인 경로가 완전히 건너뛰어집니다. 그런 다음 인증자는 확인되지 않은 클레임에서 바로 사용자 프로필을 생성합니다.
다시 말해, 서버의 공개 키만 필요한 외부 JWE 암호화가 진위 증명으로 오인되므로, 공개 키를 읽을 수 있는 모든 공격자는 완전히 신뢰되는 토큰을 발행할 수 있습니다.
/api/auth/jwks)에서 RSA 공개 키를 가져옵니다.sub, role, iss, …)으로 서명되지 않은 PlainJWT(alg: none)를 위조합니다.PlainJWT를 대상의 공개 키로 암호화된 JWE 봉투로 감쌉니다.Bearer 토큰으로 전송합니다. 취약한 JwtAuthenticator는 이를 복호화하고 서명 확인을 건너뛰며 위조된 클레임을 신뢰합니다.requirements.txt의 종속성:pip install -r requirements.txt
(requests, jwcrypto, cryptography)
python3 exploit.py -u <사용자명> [옵션]
--target(네트워크를 통해 JWKS 가져오기) 또는 --jwks-file(로컬로 제공) 중 하나를 제공해야 합니다.
대상에서 공개 키를 가져와 관리자 토큰을 위조하고 stdout으로 출력:
python3 exploit.py -t http://target:8080 -u admin
토큰을 위조한 후 보호된 엔드포인트에 대해 자동으로 테스트:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
로컬에 저장된 JWKS를 사용하고 토큰을 파일로 저장:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
org.pac4j:pac4j-jwt를 패치된 릴리스로 업그레이드하십시오:
MIT 라이선스에 따라 배포됩니다.
| 플래그 | 설명 | 기본값 |
|---|
-t, --target | 대상의 기본 URL (예: http://host:8080) | — |
--jwks-url | JWKS 엔드포인트 경로 | /api/auth/jwks |
--jwks-file | --target에서 가져오는 대신 로컬 파일에서 JWKS 로드 | — |
-u, --username | sub 클레임 값 (필수) | — |
--role | role 클레임 값 | ROLE_ADMIN |
--iss | iss 클레임 값 | principal-platform |
--exp | 토큰 유효 시간(초) | 3600 |
--verify-endpoint | 위조 토큰을 테스트할 보호된 엔드포인트 (예: /api/settings) | — |
-k, --insecure | TLS 인증서 검증 비활성화 | off |
-o, --output | 위조된 JWE를 stdout 대신 파일에 쓰기 | stdout |
-v, --verbose | 위조된 JWT 페이로드를 stderr에 출력 | off |