Chanson d'Inde

CatÊgorie: Web - DifficultÊ: Difficile

Description:

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 :

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

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

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 :

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 :

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

ℹī¸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 :

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 :

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 :

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 :

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.

🚩 FLAG
404CTF{v01la_Ind14_S0ng_s3_tErm1n3}

Last updated