Les pyjails pour débutants

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 teste 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é.

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 :

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

Pour lancer une jails de votre choix vous avez simplement à l'exécuter avec Python :

python jail1.py

Note : les jails sont classées par ordre croissant avec la difficulté (jail1.py est plus simple que jail3.py par exemple).

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 lancement

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

Tests

Effectuons quelques tests afin de voir ce qui nous est interdit de faire :

Maintenant essayons de voir si nous pouvons sortir de la jail en appelant la fonction flag() :

Il ne se passe rien, pourtant il s'agit bien d'une fonction, comme indiqué dans l'énoncé, il doit se passer quelque chose entre l'entrée utilisateur et l'exécution de cette dernière.
Essayons de mieux comprendre ce qu'il se passe :

Résolution

On comprend ici que l'entrée utilisateur est filtrée, si la séquence de caractères flag() y apparaît, elle est supprimée. Mais il existe une technique très simple utilisée en web, on peut essayer d'afficher flaflag()g() pour tester.

Bingo ! Le gardien de cette prison n'est pas très regardant sur la sécurité, il ne filtre qu'une seule fois l'entrée utilisateur, donc flag() est supprimé de flaflag()g(), ce qui donne au final flag().

Appelons alors la fonction de sortie :