JWT Kiddo

Flag: CYBN{h4ck3r_2_h4ck3r5}

Challenge

Description


J'ai découvert un forum assez étrange, apparement ça se refile des solutions sous le manteau pour la CyberNight...

Il faudra pouvoir accèder au compte de l'administrateur du site pour révéler ses plus sombres secrets !

Solution

Analyse du site

En cliquant sur le bouton Obtenir le flag, on voit qu'il faut être l'utilisateur admin.

À partir de maintenant, j'utilise BurpSuite pour explorer le site, avec l'extension JWTEditor pour faciliter le traitement des JWT (c'est tout à fait possible de faire sans rien).

Lors de notre première visite sur le site, un cookie nous a été donné. Il contient un JWT :

Le JWT utilise le champ kid, c'est le champ qui indique la clé utilisée pour signer le token. En modifiant sa valeur, on obtient une erreur :

On se rend compte que la clé est récupérée dans le dossier /public/keys/.

En regardant les autres requêtes du site, on peut également voir que les messages envoyés sont enregistrés dans le dossier /public/data/ :

LFI Proof of Concept

Si l'on remplace le kid par l'un des messages, on confirme que l'on peut les utiliser comme clé de signature puisqu'on a plus d'erreur "No such file".

Forger ses tokens

L'objectif est de créer notre propre paire de clé privée/publique, envoyer la clé publique dans le chat et l'utiliser pour la signature. La clé privée, elle, servira à signer notre prope token.

On commence par créer la paire de clé avec openssl :

$ openssl genrsa -out private-key.pem 4096
$ openssl rsa -in private-key.pem -pubout -out public-key.pem

Maintenant, on envoie la clé publique dans le chat et récupérer son chemin :

Enfin, on peut aller sur un site comme JWT.io pour créer le token avec les infos que l'on a. Il faut mettre le bon header du JWT et changer le nom du user dans le body :

Ce token peut être utilisé pour récupérer le flag :

Mis à jour

Ce contenu vous a-t-il été utile ?