Hack d'un JWT avec une clef secrete faible (mai 2024)
Introduction
Pour qu'un système d'authentification par JWT soit sécurisé, il est très important d'utiliser une clé secrète difficile à cracker. Dans cette quête tu vas pouvoir te mettre dans la peau d'un hacker et apprendre à cracker un token JWT qui a été généré avec une clé secrète pas suffisamment robuste.

👉 Disclaimer
L’article 323-1 du code pénal sanctionne le fait d’accéder ou de se maintenir frauduleusement, dans tout ou partie d’un système de traitement automatisé.
La peine encourue est 2 ans d’emprisonnement et 30 000€ d’amende. Celle-ci peut être portée à 3 ans d’emprisonnement et 45 000€ d’amende lorsqu’il en résulte soit la suppression, soit la modifications de données contenues dans le système, soit un altération du fonctionnement de ce système.
Pour que tu puisses effectuer cette quête en toute légalité, nous avons mis en place un serveur que tu as l'autorisation de hacker.
👉 Clone du repo et installation des dépendences
Clone ce repo qui contient tout ce dont tu as besoin pour cracker un JWT faible:
Une fois cloné, rends-toi dans le repo et lance la commande npm install pour installer les dépendances.
👉 Génération des clés potentielles
Une fois dans le repo, lance la commande npm run gen-candidate-keys.
Un nouveau fichier candidateKeys a été créé qui contient toutes les combinaisons possibles de 4 lettres minuscules.
Tu peux modifier les critères de génération de clés en modifiant le fichier candidateKeysGenerator.ts
👉 Génération d'un JWT
Lance la commande npm run gen-jwt pour générér toi même un token JWT. Observe le fichier jwt qui a été créé. Il est composé du header, du payload et de la signature, encodé en base 64 et séparé par des points.

Observe également le fichier jwtGenerator.ts qui a servi à générer ce token.
👉 Crack du JWT
Maintenant que tu as généré un JWT et une liste de clés potentielles, tu vas essayer de retrouver la clé qui a servi à générer le JWT. Pour cela, tu vas récupérer le header et le payload du JWT généré et pour chaque clé de la liste, générer une signature.
Tu vas répéter ce processus jusqu'à temps que la signature générée corresponde à la signature du JWT, à ce moment tu auras donc retrouvé la clé qui a servi à générer le JWT et tu pourras générer toi même des JWT qui seront validés par le serveur.
Observe le code du fichier crack.ts puis utilise-le en lançant la commande npm run crack.
Tu vas voir dans la console toutes les tentatives jusqu'au moment où le secret aura été retrouvé.
💪 Challenge
Maintenant que tu sais cracker un JWT faible, utilise tes connaissances pour cracker le site https://jwtchallenge.wilders.dev/login .
Connecte toi avec les identifiants vous avec bob / passw0rd et récupère le jwt dans les cookies de l'application sur les outils de développement de ton navigateur.

Place ce token dans le fichier jwt du repo et lances le crack pour trouver la clé.
Une fois la clé trouvée, génère un nouveau jwt avec les paramètres suivants : ({ role: "admin", user: "admin" }) et modifie la valeur cookie qui contient le jwt dans ton navigateur avec ce JWT d'admin généré avec la clé secrète.
En te rendant sur la page https://jwtchallenge.wilders.dev/admin, tu devrais tomber sur ceci

Tu constates à quel point il est facile de cracker un système d'authentification protégé avec une clé aussi simple. Utilise toujours des clés secrètes longues et générées aléatoirement pour rendre le piratage par force brute pratiquement impossible.