Skip to main content

Les pyjails pour les débutants

<time datetime="2019-03-09 18:30:00 &#43;0000 UTC">9 March 2019</time><span class="px-2 text-primary-500">&middot;</span><span>513 words</span><span class="px-2 text-primary-500">&middot;</span><span title="Reading time">3 mins</span><span class="px-2 text-primary-500">&middot;</span><span> <span id="views_posts/les pyjails pour les débutants/index.md" title="views">0</span> <span class="inline-block align-text-bottom"> <span class="relative block icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"> <path fill="currentColor" d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM432 256c0 79.5-64.5 144-144 144s-144-64.5-144-144s64.5-144 144-144s144 64.5 144 144zM288 192c0 35.3-28.7 64-64 64c-11.5 0-22.3-3-31.6-8.4c-.2 2.8-.4 5.5-.4 8.4c0 53 43 96 96 96s96-43 96-96s-43-96-96-96c-2.8 0-5.6 .1-8.4 .4c5.3 9.3 8.4 20.1 8.4 31.6z"/></svg> </span> </span> </span><span class="px-2 text-primary-500">&middot;</span><span> <span id="likes_posts/les pyjails pour les débutants/index.md" title="likes">0</span> <span class="inline-block align-text-bottom"> <span class="relative block icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path fill="currentColor" d="M47.6 300.4L228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6 0 115.2 0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> </span> </span> </span><span class="px-2 text-primary-500">&middot;</span><span> <button id="likes_button" class="rounded-md border border-primary-400 px-1 py-[1px] text-xs font-normal text-primary-700 dark:border-primary-600 dark:text-primary-400" onclick="process_article()"> <span id="likes_button_heart" style="display:none" class="inline-block align-text-bottom"> <span class="relative block icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path fill="currentColor" d="M47.6 300.4L228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6 0 115.2 0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> </span> </span> <span id="likes_button_emtpty_heart" class="inline-block align-text-bottom"> <span class="relative block icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path fill="currentColor" d="M244 84L255.1 96L267.1 84.02C300.6 51.37 347 36.51 392.6 44.1C461.5 55.58 512 115.2 512 185.1V190.9C512 232.4 494.8 272.1 464.4 300.4L283.7 469.1C276.2 476.1 266.3 480 256 480C245.7 480 235.8 476.1 228.3 469.1L47.59 300.4C17.23 272.1 0 232.4 0 190.9V185.1C0 115.2 50.52 55.58 119.4 44.1C164.1 36.51 211.4 51.37 244 84C243.1 84 244 84.01 244 84L244 84zM255.1 163.9L210.1 117.1C188.4 96.28 157.6 86.4 127.3 91.44C81.55 99.07 48 138.7 48 185.1V190.9C48 219.1 59.71 246.1 80.34 265.3L256 429.3L431.7 265.3C452.3 246.1 464 219.1 464 190.9V185.1C464 138.7 430.4 99.07 384.7 91.44C354.4 86.4 323.6 96.28 301.9 117.1L255.1 163.9z"/></svg> </span> </span> <span id="likes_button_text">&nbsp;Like</span> </button> </span><span class="px-2 text-primary-500">&middot;</span> <span class="mb-[2px]"> <a href="https://github.com/OxNinja/blog" class="text-lg hover:text-primary-500" rel="noopener noreferrer" target="_blank" title="Edit content" ><span class="inline-block align-text-bottom"> <span class="relative block icon"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M490.3 40.4C512.2 62.27 512.2 97.73 490.3 119.6L460.3 149.7L362.3 51.72L392.4 21.66C414.3-.2135 449.7-.2135 471.6 21.66L490.3 40.4zM172.4 241.7L339.7 74.34L437.7 172.3L270.3 339.6C264.2 345.8 256.7 350.4 248.4 353.2L159.6 382.8C150.1 385.6 141.5 383.4 135 376.1C128.6 370.5 126.4 361 129.2 352.4L158.8 263.6C161.6 255.3 166.2 247.8 172.4 241.7V241.7zM192 63.1C209.7 63.1 224 78.33 224 95.1C224 113.7 209.7 127.1 192 127.1H96C78.33 127.1 64 142.3 64 159.1V416C64 433.7 78.33 448 96 448H352C369.7 448 384 433.7 384 416V319.1C384 302.3 398.3 287.1 416 287.1C433.7 287.1 448 302.3 448 319.1V416C448 469 405 512 352 512H96C42.98 512 0 469 0 416V159.1C0 106.1 42.98 63.1 96 63.1H192z"/></svg> </span> </span></a > </span>
ctf jail python
0xNinja
Author
0xNinja
mov al, 11
Table of Contents

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 :

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

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

1python3 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&rsquo;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