web-dev-qa-db-fra.com

Cracking une signature JWT

Je teste une API qui utilise JWT pour l'authentification. Ce JWT a une signature HS256 pour empêcher toute modification. J'ai pensé que si je déterminais la clé secrète utilisée dans cette signature, je pouvais créer mes propres JWT. Comment puis-je déchiffrer la clé secrète d'une signature JWT?

J'ai essayé d'utiliser jumbo john qui semble avoir support JWT , mais je n'arrive pas à le faire fonctionner:

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

Il n'y a pas d'option JWT dans john --list=format.

10
Sjoerd

J'ai fini par écrire n peu Python qui utilise PyJWT pour analyser le JWT et vérifier la signature.

Il y a aussi jwtbrute . Je ne l'ai pas testé, mais il semble être un peu plus efficace que mon script car il fait beaucoup de travail comme le décodage base64 en dehors de la boucle.

Si vous voulez casser des JWT à l'aide de John the Ripper, vous devez convertir leur format en quelque chose comme ceci:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOjEyMzQ1Njc4OTAsIm5hbWUiOiJKb2huIERvZSIsImFkbWluIjp0cnVlfQ#7a86835464c295175fc5465788fb377fc16624390313f5424055ea2b1a4bb2db

Comme vous pouvez le voir, les deux premières parties sont identiques, mais la signature est désormais hexadécimale au lieu de base64. En outre, il est séparé des données par un # au lieu de .. J'ai écrit n petit script pour faire la conversion.

Vous avez également besoin d'une version récente de john. La version fournie avec Kali n'a pas fonctionné pour moi, mais la version sur GitHub l'a fait.

$ ./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
9
Sjoerd

john prend en charge JWT nativement depuis ce commit https://github.com/magnumripper/JohnTheRipper/commit/85aa7b3e3f8204360683ddc5ec9734bf793d07cf (2015).

Vous pouvez donc simplement mettre un hachage JWT dans le fichier pw sans aucune modification de nos jours, sans avoir à effectuer de transformations.

$ cat jwt.john 
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYXNkZiJ9.GwJ7_ZrnpRLXXSBYzB9VkM4n7j2iSJEkdjhckeaXQ-U
$ john jwt.john
# Wait a few hours, then:
$ john --show jwt.john
1
thakis

Sur la base de ce que vous avez publié, il semble que vous attaquiez l'ensemble du JWT, ce qui, je pense, n'est pas assez intelligent pour décoder la base64 et séparer la signature.

Comment fonctionne JWT:

Ils ont un en-tête:

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

Ils ont des revendications

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

Vous les encodez dans base64Url et les combinez avec un secret pour obtenir quelque chose comme:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95HHF30

Tester contre cela n'est pas bon car la force brute essaie d'attaquer toute cette chaîne, ce qui n'est pas le secret.

Mieux vaut parier:

Téléchargez une bibliothèque JWT, utilisez leur fonction d'analyseur et la table Rainbow et espérons que les gens qui utilisent l'API sont assez stupides pour utiliser un dictionnaire Word pour la sécurité.

Vous pouvez le forcer brutalement, je suppose, mais s'il est fort, vous resterez assis pendant très longtemps.

1
Shane Andrie