Archives Wild Code School
Cybersecurity

Hack d'un JWT avec une clef secrete faible (mai 2024)

Quête 7 sur 13 · 4 images archivées

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.

image

spacer-small

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

↗
JWT Workshop
github.com

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.

image

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.

image

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

image

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.