
JWT-Brute-Force-Cracker, geschrieben in C
Ein multithreaded JWT-Brute-Force-Cracker, geschrieben in C. Wenn Sie sehr viel Glück haben oder über enorme Rechenleistung verfügen, sollte dieses Programm den geheimen Schlüssel eines JWT-Tokens finden, sodass Sie gültige Token fälschen können. Dies dient nur zu Testzwecken, also bringen Sie sich nicht in Schwierigkeiten :)
Ich habe die Apple Base64-Implementierung verwendet und leicht modifiziert.
docker build . -t jwtcrack
docker run -it --rm jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
Stellen Sie sicher, dass die Header von OpenSSL installiert sind. Unter Ubuntu können Sie sie mit apt-get install libssl-dev installieren.
make
Wenn Sie einen Mac verwenden, können Sie OpenSSL mit brew install openssl installieren, aber die Header werden an einem anderen Ort gespeichert:
make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
Die folgenden Hash-Funktionen werden für HMAC unterstützt, d.h. zur Generierung von keyed-hashed message authentication codes: „sha256“ für JSON HS256 (HMAC mit SHA-256), „sha384“ für HS384 und „sha512“ für HS512. Sie können den Namen einer beliebigen anderen Hash-Funktion genau so angeben, wie sie in OpenSSL benannt ist. Wenn OpenSSL die Verwendung dieser Hash-Funktion für HMAC erlaubt, versucht jwtcrack, das Geheimnis zu entschlüsseln. Da jwtcrack jedoch nur ein Decoder ist, gibt es keine Garantie, dass dieser Algorithmus tatsächlich zum Kodieren verwendet wurde, geschweige denn, dass er unter den für den RFC „JSON Web Algorithms“ zulässigen Algorithmen aufgeführt ist. Siehe Abschnitt 3.1. des RFC 7518 für weitere Details.
Im folgenden Beispiel verwenden wir eine sha256-Hash-Funktion, die JSON HS256 (HMAC-SHA256) entspricht, siehe „sha256“ als letzten Befehlszeilenparameter. Außerdem geben wir in diesem Beispiel eine maximale geheime Länge von 5 Zeichen an und beschränken das Alphabet auf die folgenden Zeichen: ABCSNFabcsnf1234
$ > ./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE ABCSNFabcsnf1234 5 sha256
Im obigen Beispiel ist der Schlüssel Sn1f, und es dauert weniger als eine Sekunde auf einem durchschnittlichen Notebook, das um 2019 hergestellt wurde (z.B. mit einer Intel CPU auf Basis der Ice-Lake-Mikroarchitektur). GCC Version 9.3.0 mit „-O3“ wurde zum Kompilieren des jwtcrack-Programms verwendet. Es wurde mit der OpenSSL-Bibliothek Version 1.1.1f unter Linux Ubuntu 20.04.1 LTS gelinkt.
Hier im nächsten Beispiel verwenden wir „sha512“ als letzten Befehlszeilenparameter, um HS512 (HMAC-SHA512) anzugeben, wir geben auch eine maximale geheime Länge von 9 Zeichen an und beschränken das Alphabet auf die folgenden sieben lateinischen Kleinbuchstaben: „adimnps“.
$ > ./jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.RnWtv7Rjggm8LdMU3yLnz4ejgGAkIxoZwsCMuJlHMwTh7CJODDZWR8sVuNvo2ws25cbH9HWcp2n5WxpIZ9_v0g adimnps 9 sha512
Im obigen Beispiel ist der Schlüssel adminpass, und es dauert etwa 15 Sekunden im Durchschnitt, um auf einem Notebook mit Intel Core i7 1065G7 CPU auf Ice-Lake-Mikroarchitektur (2019), Basisfrequenz 1.30 GHz, max. Turbo 3.90 GHz) zu dekodieren. Die gesamte Anzahl der CPU-Sekunden, die von jedem der Kerne im Benutzermodus aufgrund von Multithreading verbraucht wird, beträgt etwa 100 im Durchschnitt, um dieses Geheimnis zu dekodieren.
Beispiel mit „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
Die von mir verwendete Base64-Implementierung (von Apple) ist manchmal fehlerhaft, weil nicht jede Base64-Implementierung gleich ist. Daher funktioniert die Entschlüsselung Ihres Base64-Tokens manchmal nur teilweise, und Sie werden ein Geheimnis für Ihr Token finden, das nicht das richtige ist.
Wenn jemand bereit ist, eine robustere Base64-Implementierung zu implementieren, wäre das großartig :)