# JWT Kiddo

**Flag:** CYBN{h4ck3r\_2\_h4ck3r5}

## Challenge

{% hint style="info" %}
**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 !
{% endhint %}

{% hint style="warning" %}
Ce challenge tourne sur un docker et n'est pas disponible
{% endhint %}

## Solution

### Analyse du site

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

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FwOwqtusQvfDBLwhNt9V5%2Fimage.png?alt=media&#x26;token=67f4fb49-bb98-4121-b901-aeb517c79246" alt=""><figcaption></figcaption></figure>

À partir de maintenant, j'utilise [**BurpSuite**](https://portswigger.net/burp) 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 :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FLbtbRIpbl7PNeaEVCvOn%2Fimage.png?alt=media&#x26;token=f3554076-971e-4b6d-a693-14957027f0cc" alt=""><figcaption></figcaption></figure>

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 :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2Fc67TToxdYOyQbley2p5e%2Fimage.png?alt=media&#x26;token=99d343f9-4a73-41ae-9567-6757151ad080" alt=""><figcaption></figcaption></figure>

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/`** :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2Fdtvt7Qq14inv2QbP6fnx%2Fimage.png?alt=media&#x26;token=94cf35c2-c780-45fd-9a41-2ae3681a5543" alt=""><figcaption></figcaption></figure>

### 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"**.

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2Fnq07qgWQTn7RCHv29OgN%2Fimage.png?alt=media&#x26;token=d5c204a6-0870-4d90-8abe-9b6092e6c142" alt=""><figcaption></figcaption></figure>

### 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 :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FsgLI1Gq8kQds5zto6OFV%2Fimage.png?alt=media&#x26;token=54093e4a-3f23-47c4-979b-692784e9e859" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FcH7BiQI54pNnmpg0l7nn%2Fimage.png?alt=media&#x26;token=a56f2da6-e341-4f0d-aee8-95f93434fb74" alt=""><figcaption></figcaption></figure>

Enfin, on peut aller sur un site comme [**JWT.io**](https://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 :

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FAErd8vItufVSFqrqmQgq%2Fimage.png?alt=media&#x26;token=58da1a17-83d1-4f93-bbc0-d9b1af50f1ae" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://2344605990-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5vTwbgJFy6k3bN4a9ntp%2Fuploads%2FMR9YDqpVJCKmJXjcL6xa%2Fimage.png?alt=media&#x26;token=048991d3-0e31-41ff-b7c0-5033bf170937" alt=""><figcaption></figcaption></figure>
