Writeup - Secure Pyshell - Python Jail - Xiomara CTF 2017

Le weekend du 25-25 Février 2017 avait lieu le Xiomara CTF. CTF auquel nous avons participé avec Beers4flags, équipe que j'ai rejoins en fin d'année 2016 lors de la Grehack.

Nous terminons ce CTF en 26ème positions sur 334 : https://ctftime.org/event/430

Malgré de nombreuses épreuves remplies de trolls, une épreuve de type python jail était présente et pas si compliquée, j'en ai profité pour réaliser un petit writeup : https://github.com/Beers4Flags/writeups/tree/master/2017/xiomara/pwn/secure_pyshell

Si avant de lire le writeup vous voulez tenter votre chance et essayer de sortir du shell python voici le script python 3 à lancer :

#!/usr/bin/python3
import sys, cmd, os

del __builtins__.__dict__['__import__']  
del __builtins__.__dict__['eval']

intro = """  
Welcome to Secure Python Interpreter  
================================================
Rules:  
    -Do not import anything
    -No peeking at files!
    -No sharing of flags :)
"""


def execute(command):  
       exec(command, globals())

class Jail(cmd.Cmd):

    prompt     = '>>> '
    filtered    = '\'|.|input|if|else|eval|exit|import|quit|exec|code|const|vars|str|chr|ord|local|global|join|format|replace|translate|try|except|with|content|frame|back'.split('|')

    def do_EOF(self, line):
        sys.exit()

    def emptyline(self):
        return cmd.Cmd.emptyline(self)

    def default(self, line):
        sys.stdout.write('\x00')

    def postcmd(self, stop, line):
        if any(f in line for f in self.filtered):
            print("Do you think my code is so insecure ?")
            print("You can never get out of my jail :)")
        else:
           try:
                execute(line)
           except NameError:
                print("NameError: name '%s' is not defined" % line)
           except Exception:
                print("Error: %s" % line)
        return cmd.Cmd.postcmd(self, stop, line)

if __name__ == "__main__":  
    try:
        Jail().cmdloop(intro)
    except KeyboardInterrupt:
        print("\rBye bye !")

Si les épreuves de type Python Jail vous intéressent, 3 épreuves similaires et intéressantes sont présentes sur le site de challenges root-me !

D'autres writeups de la team Beers4Flags sont et seront disponibles sur le repo github : https://github.com/Beers4Flags/writeups

Fap'ment,