
Cracker de force brute JWT écrit en C
Un craqueur par force brute multi-threadé de JWT écrit en C. Si vous êtes très chanceux ou disposez d'une puissance de calcul énorme, ce programme devrait trouver la clé secrète d'un jeton JWT, vous permettant de forger des jetons valides. Ceci est uniquement à des fins de test, ne vous mettez pas dans le pétrin :)
J'ai utilisé l'implémentation Base64 d'Apple que j'ai légèrement modifiée.
docker build . -t jwtcrack
docker run -it --rm jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
Assurez-vous d'avoir les en-têtes d'openssl installés.
Sur Ubuntu, vous pouvez les installer avec apt-get install libssl-dev
make
Si vous utilisez un Mac, vous pouvez installer OpenSSL avec brew install openssl, mais les en-têtes seront stockés dans un emplacement différent :
make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
Les fonctions de hachage suivantes sont prises en charge pour HMAC, c'est-à-dire pour générer des codes d'authentification de message à clé hachée : "sha256" pour JSON HS256 (HMAC utilisant SHA-256), "sha384" pour HS384 et "sha512" pour HS512 respectivement. Vous pouvez spécifier le nom de toute autre fonction de hachage exactement comme elle est nommée dans OpenSSL. Si OpenSSL autorise cette fonction de hachage à être utilisée pour HMAC, alors jwtcrack essaiera de décoder le secret. Cependant, étant donné que jwtcrack n'est qu'un décodeur, il n'y a aucune garantie que cet algorithme ait été réellement utilisé pour l'encodage, encore moins parmi la liste des algorithmes autorisés dans le RFC "JSON Web Algorithms". Voir la section 3.1. du RFC 7518 pour plus de détails.
Dans l'exemple suivant, nous utilisons une fonction de hachage sha256 qui correspond à JSON HS256 (HMAC-SHA256), voyez "sha256" comme dernier paramètre de ligne de commande. De plus, dans cet exemple, nous spécifions une longueur maximale de secret de 5 caractères, et limitons l'alphabet aux caractères suivants : ABCSNFabcsnf1234
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE ABCSNFabcsnf1234 5 sha256
Dans l'exemple ci-dessus, la clé est Sn1f, et cela prend moins d'une seconde sur un ordinateur portable moyen fabriqué vers 2019 (par exemple avec un CPU Intel basé sur la microarchitecture Ice Lake). La version 9.3.0 de GCC avec "-O3" a été utilisée pour compiler le programme jwtcrack. Il a été lié avec la bibliothèque OpenSSL version 1.1.1f sous Linux Ubuntu 20.04.1 LTS.
Ici, dans l'exemple suivant, nous utilisons "sha512" comme dernier paramètre de ligne de commande pour spécifier HS512 (HMAC-SHA512), nous spécifions également une longueur maximale de secret de 9 caractères, et limitons l'alphabet aux sept caractères latins minuscules suivants : "adimnps".
$ > ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.RnWtv7Rjggm8LdMU3yLnz4ejgGAkIxoZwsCMuJlHMwTh7CJODDZWR8sVuNvo2ws25cbH9HWcp2n5WxpIZ9_v0g adimnps 9 sha512
Dans l'exemple ci-dessus, la clé est adminpass, et il faut environ 15 secondes en moyenne pour décoder sur un ordinateur portable avec un CPU Intel Core i7 1065G7 sur microarchitecture Ice Lake (2019), fréquence de base 1,30 GHz, turbo max 3,90 GHz). Le nombre total de secondes CPU consommées par chacun des cœurs en mode utilisateur en raison du multithreading est d'environ 100 en moyenne pour décoder ce secret.
Exemple d'utilisation de "sha384" :
$ > ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJyb2xlIjoiYWRtaW4ifQ.31xCH3k8VRqB8l5qBy7RyqI2htyCskBy_4cIWpk3o43UkIMW-IcjTUEL_NyFXUWJ 0123456789 6 sha384
/usr/bin/time -f "Total number of CPU-seconds consumed directly from each of the CPU cores: %U\nElapsed real wall clock time used by the process: %E" ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.RnWtv7Rjggm8LdMU3yLnz4ejgGAkIxoZwsCMuJlHMwTh7CJODDZWR8sVuNvo2ws25cbH9HWcp2n5WxpIZ9_v0g adimnps 9 sha512
L'implémentation Base64 que j'utilise (d'Apple) est parfois boguée car toutes les implémentations Base64 ne sont pas identiques. Donc parfois, le décryptage de votre jeton Base64 ne fonctionnera que partiellement et vous pourrez ainsi trouver un secret pour votre jeton qui n'est pas le bon.
Si quelqu'un veut implémenter une implémentation Base64 plus robuste, ce serait génial :)