Cracking di una firma JWT

5

Sto testando un'API che utilizza JWT per l'autenticazione. Questo JWT ha una firma HS256 per impedire la modifica. Ho pensato che se ho determinato la chiave segreta utilizzata in questa firma, posso creare i miei JWT personali. Come posso decifrare la chiave segreta di una firma JWT?

Ho provato a utilizzare jumbo john che sembra avere supporto JWT , ma non riesco a farlo funzionare:

$ ./john jwt.txt 
Using default input encoding: UTF-8
No password hashes loaded (see FAQ)

Non esiste alcuna opzione JWT in john --list=format .

    
posta Sjoerd 18.08.2016 - 09:25
fonte

2 risposte

5

Ho finito per scrivere un piccolo script Python che utilizza PyJWT per analizzare il JWT e controllare la firma.

C'è anche jwtbrute . Non l'ho provato, ma sembra un po 'più efficiente del mio script perché fa molto lavoro come decodifica in base64 al di fuori del ciclo.

Se vuoi craccare i JWT usando John the Ripper, devi convertire il loro formato in qualcosa del genere:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSIsImFkbWluIjp0cnVlfQ#7a86835464c295175fc5465788fb377fc16624390313f5424055ea2b1a4bb2db

Come puoi vedere le prime due parti sono le stesse, ma la firma ora è hex invece di base64. Inoltre, è separato dai dati con # anziché . . Ho scritto un piccolo script per fare la conversione.

Hai anche bisogno di una versione recente di john . La versione fornita con Kali non ha funzionato per me, ma è stata eseguita la versione su GitHub .

$ ./john ~/dev/crackjwt/jwt.john
Using default input encoding: UTF-8
Loaded 1 password hash (HMAC-SHA256 [password is key, SHA256 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
secret           (?)
1g 0:00:00:00 DONE 2/3 (2016-08-24 15:58) 6.666g/s 218453p/s 218453c/s 218453C/s 123456..skyline!
Use the "--show" option to display all of the cracked passwords reliably
Session completed
    
risposta data 24.08.2016 - 15:59
fonte
1

In base a ciò che hai postato sembra che tu stia attaccando l'intero JWT, il che non credo che JTR sia abbastanza intelligente da decodificare il base64 e separare la firma.

Come funziona JWT:

L'intestazione è:

{ "alg": "HS256", "typ": "JWT" }

Hanno crediti

{ "sub": "1234567890", "name": "John Doe", "admin": true }

Li codifichi in base64Url e li combini con un segreto per ottenere qualcosa del tipo:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Provare contro questo non va bene dato che la forza bruta sta tentando di attaccare l'intera stringa, che non è il segreto.

Migliore scommessa:

Scarica una libreria JWT, usa la loro funzione parser e la tabella arcobaleno e spera che le persone che usano l'API siano abbastanza stupide da usare una parola del dizionario per sicurezza.

Potresti forza bruta, suppongo, ma se è strong, resterai seduto per un tempo terribilmente lungo.

    
risposta data 18.08.2016 - 22:44
fonte

Leggi altre domande sui tag