JWT Kiddo
Flag: CYBN{h4ck3r_2_h4ck3r5}
Challenge
Ce challenge tourne sur un docker et n'est pas disponible
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 ?