# Chanson d'Inde

**Catégorie:** Web - **Difficulté:** Difficile

**Description:**

<figure><img src="/files/LwyFMQZfSQPalijb7xZX" alt=""><figcaption></figcaption></figure>

Lien : <https://chanson-d-inde.challenges.404ctf.fr/>

**Solution:**

Pour ce challenge, nous avons accès à une page basique avec un bouton qui nous emmène vers une autre page :&#x20;

<figure><img src="/files/TtzsADnJOM0uwsCzqzSS" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/GmfIbMZlaZBRrVfl1m7Q" alt="" width="563"><figcaption></figcaption></figure>

Le possible point d'entrée est l'URL d'un fichier audio à envoyer (en haut de la page).\
Cependant après avoir fais différents tests, rien de bien concluant.

Dans le doute, nous tentons de voir s'il n'y a pas un fichier robots.txt disponible. Et c'est le cas : <https://chanson-d-inde.challenges.404ctf.fr/robots.txt>

<figure><img src="/files/lwicG3ryB2jlLdNuSq86" alt="" width="166"><figcaption></figcaption></figure>

Nous voyons donc qu'il y a un fichier CHANGELOG.md existant (<https://chanson-d-inde.challenges.404ctf.fr/CHANGELOG.md>)

<figure><img src="/files/FcUn8GgKNaumzir1g9tw" alt="" width="563"><figcaption></figcaption></figure>

Nous pouvons donc voir ce qui a été fait sur ce site ainsi que les dates de ces changements. Nous pouvons tout lire mais le plus intéressant est ce qui a été changé le plus récemment :&#x20;

<figure><img src="/files/4QE4eufmvGL2tFOGTM3M" alt="" width="563"><figcaption></figcaption></figure>

En regardant les changements, nous voyons que la version d'ExpressJS a été mise à jour juste avant le démarrage du 404CTF, ce qui fait qu'une nouvelle vulnérabilité aurait été bien vite trouvée (en 1 semaine). Mais pour être sûr, nous allons vérifier les anciennes dates de découvetes de vulnérabilités pour ExpressJS : <https://security.snyk.io/package/npm/express>\
La dernière en date est répertoriée en Octobre 2022.

Passons au deuxième changement datant du 15/02/2021 où la version d'EJS a été changée.\
En regardant les vulnérabilités sur la version d'EJS en Février 2021, nous trouvons ceci :&#x20;

<figure><img src="/files/jM3DjWoGGRfOt0F2CxTk" alt="" width="563"><figcaption><p><a href="https://security.snyk.io/package/npm/ejs">https://security.snyk.io/package/npm/ejs</a></p></figcaption></figure>

En regardant les dates des CVE découvertes et celle de la mise à jour d'EJS sur le site web, nous trouvons qu'il s'agit d'une vulnérabilité à exploiter avec une RCE : [CVE-2022-29078](https://security.snyk.io/vuln/SNYK-JS-EJS-2803307).\
Sur la page, nous trouvons directement un payload préparé. Néanmoins pour bien comprendre, nous pouvons chercher d'autres ressources. Voici celle que j'ai utilisée : <https://eslam.io/posts/ejs-server-side-template-injection-rce/>

Nous voyons donc le payload utilisé : `?id=2&settings[view options][outputFunctionName]=x;process.mainModule.require('child_process').execSync('command_to_execute');s` et comment l'utiliser. Nous passons simplement une commande que nous voulons exécuter sur le serveur et ça sera bon.

Maintenant il faut trouver où envoyer ce payload...\
Souvenons nous au début, nous avons trouvé qu'il est possible d'envoyer une URL d'un fichier audio afin qu'il soit pris en compte. Voilà notre porte d'entrée.

Pour la pratique, nous allons utiliser le proxy de Burp et modifier la requête avant de la renvoyer.\
**1. Interception de la requête :**&#x20;

<figure><img src="/files/Lsv5W8v67L4a19dB0NgK" alt="" width="563"><figcaption></figcaption></figure>

:information\_source:Pour ne pas réexécuter à chaque fois toutes ces étapes, nous allons envoyer la requête au module "Repeater" pour simplement changer les paramètres souhaités (ici l'URL).

Une fois dans le module Repeater, nous allons pouvoir passer à la suite.\
**2. Modification de la requête et envoi de notre payload :**&#x20;

Là nous avons la requête et notre payload a exécuter sur le serveur. Pour pouvoir l'envoyer, nous allons l'ajouter après notre URL comme ceci : <br>

<figure><img src="/files/b158pBQrbSiaD1cwyzLz" alt="" width="563"><figcaption><p>Ici nous exécutons la commande ls</p></figcaption></figure>

Mais étrangement nous n'avons aucun résultat, pas de retour...\
Il faut donc trouver une solution pour récupérer le retour de notre commande, car sinon ça ne servira pas à grand chose.

En y réfléchissant il faut trouver une solution pour retourner le résultat : `echo()` ? `print()` ? `alert()` ? `return` ?\
En les testant tous, nous voyons qu'il n'y a que le `return` qui fonctionne : \
**3. Récupération du résultat de notre payload :**&#x20;

<figure><img src="/files/zE59duFihbhumdnwyRcM" alt="" width="563"><figcaption></figcaption></figure>

Nous récupérons enfin le résultat de notre commande. C'est génial, car maintenant nous pouvons naviguer dans les fichiers et chercher où pourrait se situer notre flag (assez simple ici).

On continue étape par étape, jusqu'à récupérer le flag :&#x20;

<figure><img src="/files/OHgaMFdr7qL77Mfd6zv7" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/N8rEfbdXHxLQ5gchMmSy" alt="" width="563"><figcaption></figcaption></figure>

Nous parvenons enfin à récupérer notre flag grâce au payload suivant : `?id=2&settings[view%20options][outputFunctionName]=x;return global.process.mainModule.constructor._load('child_process').execSync('cat flag/flag.txt');s`

Ce chall était assez complexe mais très intéressant sur la manière d'exploiter une ancienne vulnérabilité d'un service utilisé très souvent.

<details>

<summary>🚩 FLAG</summary>

```
404CTF{v01la_Ind14_S0ng_s3_tErm1n3}
```

</details>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://writeups.ayweth20.com/2023/404ctf-2023/web/chanson-dinde.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
