Introduction

Tout d’abord qu’est-ce qu’une ‘pyjail’ ? Il s’agit le plus souvent d’un environnement Python 🐍 restreint, c’est-Ă -dire que (comme pour les autres types de ‘jails’) certaines fonctions, classes ont Ă©tĂ© supprimĂ©es, ou sont filtrĂ©es lors du traitement de l’input utilisateur pour bloquer l’attaquant.

Ces environnements restreints sont prĂ©sents lors de CTFs mais c’est une catĂ©gorie qui nĂ©cessite un peu de connaissances avant de s’y lancer, mais sont aussi utilisĂ©s dans des milieux professionnels afin d’Ă©viter de donner l’accĂšs Ă  tout le systĂšme si un attaquant arrive Ă  entrer sur un serveur SSH par exemple.

Un peu de pratique

Avec l’aide d’un cobaye pour le test, qui se reconnaĂźtra, j’ai rĂ©alisĂ© quelques pyjails qui permettent de mieux apprĂ©hender le langage Python, mais aussi de dĂ©velopper une mĂ©thodologie de rĂ©solution.

Nous allons voir comment rĂ©soudre une jail des plus basiques ensemble, ensuite vous serez libres d’approfondir vos connaissances avec d’autres jails que j’ai rĂ©alisĂ©, et si le cƓur vous en dit vous pouvez mĂȘme tenter de flag les jails sur Root-Me 😊.

Avant de commencer

VĂ©rifiez bien d’avoir Python 3 d’installĂ© sur votre machine, puis tĂ©lĂ©chargez cette archive zip qui contient l’environnement de travail adĂ©quat pour rĂ©soudre toutes les jails. Cette archive contient un fichier flag.txt qui est lu par toutes les jails lorsque vous avez rĂ©ussi le challenge, vous devez alors laisser les fichiers jail*.py dans le mĂȘme dossier.

Pour démarrer

Au préalable, décompressez le fichier zip :

1
mkdir jails; unzip jails.zip -d jails/; cd jails

Pour lancer une jail de votre choix vous avez simplement Ă  l’exĂ©cuter avec Python :

1
python3 jail1.py

Note : les jails sont classées par difficulté croissante, on a alors jail1 plus simple que jail3

Au boulot !

Passons Ă  la rĂ©alisation de la jail 1. Le but est de finir le challenge sans lire le code source du fichier, mais si vous ĂȘtes bloquĂ© plusieurs heures n’hĂ©sitez pas Ă  y jeter un coup d’Ɠil rapide.

Premier lançement

Pour nous Ă©chapper de cette prison nous allons devoir Ă©tudier comment fonctionne le programme. On lance la jail1 :

Lançement de la jail1 dans l’invite de commande

Tests

Effectuons quelques tests afin de dĂ©terminer ce que l’on peut faire dans cet environement restreint :

Premiers tests

On peut voir que les opĂ©rations usuelles (calculs, affichage, variables…) sont autorisĂ©es, essayons sd’appeler la mĂ©thode flag() afin de sortir :

Appel de la méthode flag

Pas de chance, rien ne se passe, pourtant on voit bien que flag est une fonction, on devrait ĂȘtre en mesure de l’apeller, comme pour print() par exemple.

Il doit se passer quelque chose entre le moment oĂč l’on entre la commande et l’exĂ©cution de cette derniĂšre 😔.

Essayons de déterminer le problÚme :

Différents tests

RĂ©solution

On comprend alors que l’entrĂ©e utilisateur est filtrĂ©e : si la chaĂźne "flag()" est prĂ©sente, elle est supprimĂ©e. Comment y remĂ©dier ?

Il existe une astuce moldave bien connue pour contourner ce filtre, vous connaissez le film Inception ? C’est le mĂȘme principe, sauf que c’est pas dans un rĂȘve mais un shell Python.

Contournement moldave

En effet, Ă©crire fflag()lag(), ou flag(flag()), ou toute autre variation permet de contourner le filtre. 🎉🎉

RĂ©solution de la pyjail

Jail escape gif