
🐍 Un kit pour tester, ajuster et craquer les JSON Web Tokens
jwt_tool.py est une boîte à outils pour valider, forger, scanner et falsifier les JWT (JSON Web Tokens).

Ses fonctionnalités incluent :
Cet outil est conçu pour les pentesteurs, qui doivent vérifier la robustesse des jetons utilisés et leur susceptibilité aux attaques connues. Une gamme d'options d'altération, de signature et de vérification est disponible pour approfondir les faiblesses potentielles présentes dans certaines bibliothèques JWT.
Il a également été utile aux participants de CTF - car les CTF semblent friands de JWT actuellement.
Il peut aussi être utile aux développeurs qui utilisent des JWT dans leurs projets et souhaitent tester la stabilité et les vulnérabilités connues lors de l'utilisation de jetons forgés.
Cet outil est écrit nativement en Python 3 (version 3.6+) et utilise les bibliothèques courantes. Cependant, diverses fonctions cryptographiques (ainsi que le côté esthétique/la lisibilité en général) nécessitent l'installation de quelques bibliothèques Python courantes.
(Une version plus ancienne de cet outil en Python 2.x est disponible sur la branche legacy pour ceux qui en ont besoin, bien qu'elle ne soit plus prise en charge ni mise à jour)
L'utilisation préférée de jwt_tool se fait avec l'image docker jwt_tool hébergée sur Dockerhub.
La commande de base pour l'exécuter est la suivante :
Commande de base pour exécuter jwt_tool :
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
En utilisant la commande ci-dessus, vous pouvez ajouter n'importe quel autre argument comme d'habitude.
Notez que les fichiers locaux de votre répertoire de travail courant seront mappés dans le répertoire /tmp du conteneur docker, vous pouvez donc les utiliser via ce chemin absolu dans vos arguments.
c.-à-d.
/tmp/localfile.txt
L'installation consiste simplement à télécharger le fichier jwt_tool.py (ou à faire git clone du dépôt).
(Ajoutez aussi chmod au fichier si vous voulez l'ajouter à votre $PATH et l'appeler depuis n'importe où.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
Au premier lancement, l'outil générera un fichier de configuration, des fichiers utilitaires, un fichier journal, et un ensemble de clés publiques et privées dans différents formats.
jwtconf.ini comme valeur « jwkloc ».Pour corriger les couleurs cassées sous Windows cmd/PowerShell : décommentez les deux lignes ci-dessous dans jwt_tool.py (retirez le « # » au début de chaque ligne)
Vous devrez également installer colorama : python3 -m pip install colorama
# import colorama
# colorama.init()
Le premier argument doit être le JWT lui-même (sauf si vous le fournissez dans un en-tête ou une valeur de cookie). Ne fournir aucun argument supplémentaire affichera les valeurs décodées du jeton pour examen.
$ python3 jwt_tool.py <JWT>
ou la commande de base Docker :
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
La boîte à outils validera le jeton et listera les valeurs de l'en-tête et du payload.
Les nombreux arguments supplémentaires vous mènent directement à la fonction appropriée et vous renvoient un jeton prêt à l'utiliser dans vos tests.
Par exemple, pour altérer le jeton existant, exécutez la commande suivante :
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
De nombreuses options nécessitent des valeurs supplémentaires pour être configurées.
Par exemple, pour exécuter un type d'exploit particulier, vous devez choisir l'option eXploit (-X) et sélectionner la vulnérabilité (ici en utilisant « a » pour l'exploit alg:none) :
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
Certaines options, comme la vérification des jetons, nécessitent la fourniture de paramètres/fichiers supplémentaires (ici, la clé publique au format PEM) :
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
Tous les modes permettent désormais d'envoyer le jeton directement à une application.
Vous devez spécifier :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M erDifférentes réponses à la requête sont affichées :
Voici un aperçu rapide d'une évaluation de base d'une implémentation JWT. Si ces options ne fonctionnent pas, creusez plus profondément dans les autres modes et options pour chasser de nouvelles vulnérabilités (ou des zero-days !).
Lisez la valeur du jeton pour avoir une idée des claims/valeurs attendus par l'application :
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
Lancez un Playbook Scan en utilisant le jeton fourni directement contre l'application pour rechercher les erreurs de configuration courantes :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
Si des vulnérabilités exploitables sont trouvées, modifiez les claims pertinents pour tenter de les exploiter (ici en utilisant l'exploit Inject JWKS et en injectant un nouveau nom d'utilisateur) :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Creusez plus loin en testant des valeurs et des claims inattendus pour identifier des comportements applicatifs inattendus, ou lancez des attaques sur la logique de programmation ou le traitement des jetons :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
Examinez toute exploitation réussie en interrogeant les journaux pour en savoir plus sur la requête et :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Pour obtenir la liste des options, appelez la fonction d'utilisation :
Certaines options, comme la vérification des jetons, nécessitent la fourniture de paramètres/fichiers supplémentaires :
$ python3 jwt_tool.py -h
Un guide utilisateur plus détaillé est disponible sur la page wiki.

Rendez-vous sur le JWT Attack Playbook pour un aperçu détaillé de ce que sont les JWT, ce qu'ils font, et un workflow complet pour les tester en profondeur à la recherche de vulnérabilités, de faiblesses courantes et d'erreurs de codage involontaires.
Regex pour trouver des JWT dans la recherche Burp
(assurez-vous que les options « Case sensitive » et « Regex » sont cochées)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - version JWT compatible URL
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - toutes les versions JWT (probabilité plus élevée de faux positifs)
JWT Attack Playbook (https://github.com/ticarpi/jwt_tool/wiki) - pour une méthodologie complète de test des JWT
Une excellente introduction aux JWT - https://jwt.io/introduction/
Une grande partie de l'inspiration initiale de cet outil provient des vulnérabilités découvertes par Tim McLean.
Consultez son blog sur les faiblesses des JWT ici : https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Tout un ensemble d'exercices pour tester les vulnérabilités JWT est fourni par Pentesterlab (https://www.pentesterlab.com). Je recommande vivement un abonnement PRO si vous vous intéressez au pentest d'applications web.
VEUILLEZ NOTER : Cette boîte à outils résoudra la plupart des exercices JWT de Pentesterlab en quelques secondes si elle est utilisée correctement, mais je vous encourage fortement à faire ces exercices vous-même, en comprenant la structure et les faiblesses. Après tout, l'important est d'apprendre...