Compte rendu du CTF Fetch the Flag 2022 : Not So Smart Fridge
Antonio Gomes
9 novembre 2022
0 minutes de lectureMerci d’avoir participé à Fetch avec nous ! Félicitations aux milliers de joueurs qui nous ont rejoints pour le Fetch the Flag CTF. Et un immense merci aux Snykers qui ont conçu, testé et documenté les défis !
Ce défi du Fetch the Flag CTF commence par un accueil chaleureux, avec toutes les informations nécessaires sur notre tout nouveau Smart Fridge Ultra SFU-3000 ! Passionnant, non ?
Isaac Asimov avait prédit un jour : « Des repas complets ou semi-préparés pourront être conservés au réfrigérateur et prêts à être consommés. Les équipements de cuisine pourront préparer des “repas automatiques”, chauffer l’eau et faire du café. » Et nous y voilà : nous utilisons ce réfrigérateur pour commander des produits et même écouter de la musique grâce à son système audio. C’est génial !

Eh bien, c’était passionnant jusqu’à ce que je découvre que la fonctionnalité Music n’était pas disponible. Et la fonctionnalité Settings, qui permet de mettre à jour le micrologiciel du réfrigérateur, était défectueuse : impossible de passer de pistache/0.0.3.20220107 à la dernière version. Au moins, nous connaissons la version du micrologiciel, ce qui nous aidera à atteindre notre objectif : trouver le flag et résoudre ce défi !

Guide pas à pas
Après avoir accédé à la page web de notre Smart Fridge Ultra SFU-3000 —et avoir été déçus par ses capacités réelles — nous avons consulté Settings et découvert que le micrologiciel était pistache/0.0.3.20220107. Si vous ne connaissez pas pistache,il s’agit d’un framework HTTP et REST moderne pour C++, ce qui est très utile, car cela nous donne des indices sur le logiciel qui se cache derrière la page web de notre défi.
Avec ces informations, nous pouvons facilement utiliser la base de données de vulnérabilités Snyk Intel pour rechercher les problèmes de sécurité liés à pistache/0.0.3.20220107. En recherchant pistache, nous découvrons que Pistache est touché par une vulnérabilité de traversée de répertoires, qui affecte la version utilisée par le micrologiciel de notre réfrigérateur — 0.0.3.20220107. C’est parfait : nous pouvons tenter de l’exploiter à l’aide de la commande suggérée ci-dessous dans le PoC de Snyk.

En exécutant curl --path-as-is, curl ne supprimera pas les séquences /../ du chemin complet. Cela nous permettra également d’obtenir les résultats ci-dessous, qui prouvent que nous avons réussi à récupérer la liste des utilisateurs ayant accès au système et que nous pouvons exploiter la vulnérabilité de traversée de répertoires. Nous avons aussi repéré un dossier nommé doc.
En accédant au chemin du dossier doc, nous obtenons un document d’API Swagger qui nous permet d’identifier les points de terminaison disponibles dans notre application web (par exemple, v1/system/flag/{flag}). À ce stade, nous savons déjà que nous avons affaire à une application web qui utilise pistache sous forme de binaire C++.

Et maintenant ? Nous allons exploiter proc, sous Linux. Plus précisément, /proc/self/exe, qui pointe littéralement vers le processus en cours d’exécution, ici le binaire de l’application web Pistache. Pour cela, nous exécutons la commande suivante :
Nous pourrons ainsi télécharger le binaire Pistache. Nous devrons procéder à sa rétro-ingénierie pour trouver le flag. Commençons par télécharger un outil de rétro-ingénierie logicielle. Ici, j’utiliserai Ghidra (également disponible pour les utilisateurs de macOS via brew).
Avec Ghidra, je vais créer un nouveau projet, dans lequel j’importerai le binaire .exe téléchargé précédemment.

Nous voici enfin à la partie passionnante du défi : nous allons découvrir à quoi ressemble ce flag ! Dans Ghidra, nous allons filtrer les résultats avec « flag ». Nous verrons alors qu’il existe une méthode nommée checkFlag, dont le contenu est visible dans l’image ci-dessous, dans la fenêtre Decompile: checkFlag - (exe).

En examinant la fenêtre de décompilation, nous pouvons voir que le flag doit comporter 70 caractères :
if lVar4 == 0x46. La condition définie dans le code d’origine indique que lVar4 contient la longueur du flag fourni en entrée, et que 0x46 correspond à 70 en décimal.

Si la condition ci-dessus est satisfaite (length == 70), nous verrons qu’une autre méthode, nommée checkIndexes, est appelée.

Comme le montrent les images ci-dessus et ci-dessous, checkIndexes attend une chaîne de caractères pour le flag, un vecteur contenant plusieurs index et un caractère — '7' dans l’image ci-dessus.

Qu’est-ce que cela signifie ? À chaque appel de checkIndexes, un caractère est vérifié à chaque position d’index n, afin de déterminer si la chaîne du flag est valide. Il faut appeler toutes les méthodes checkIndexes : si elles réussissent toutes, cela signifie que nous avons trouvé le flag. Pour le découvrir, nous pouvons examiner le fichier désassemblé, convertir en décimal chaque variable local_* en hexadécimal et déterminer la position

{13, 22, 29, 39,40, 45, 59} correspond à la liste des index où le caractère `5` apparaît dans le flag. Nous pouvons maintenant reconstituer le flag :
Une autre façon d’identifier tous les index de chaque vecteur alloué consiste à utiliser un script (consultez le code). Pour ce faire, nous allons exporter le programme au format C/C++, supprimer tout le reste et ne tenir compte que de la checkFlag méthode. Nous ajouterons un script qui l’analysera, convertira les variables local_* de l’hexadécimal au décimal et trouvera tous les index associés à chaque caractère jusqu’à reconstituer le flag.

Plus malin qu’un réfrigérateur
Dans ce défi, nous avons appris à utiliser Snyk pour repérer une vulnérabilité de traversée de répertoires dans une application web C++, accéder au binaire du processus en cours d’exécution et le télécharger, procéder à sa rétro-ingénierie avec Ghidra, puis trouver le flag en analysant le binaire décompilé. Amusant !
Voilà, c’est tout ! J’espère que vous avez apprécié nos défis. Merci d’avoir participé à notre CTF Snyk 2022 ! Vous voulez découvrir comment nous avons trouvé tous les autres flags ? Consultez notre page solutions Fetch the Flag pour découvrir notre méthode.



