miércoles, 21 de septiembre de 2011

pyrasite - Inyectando código en procesos de python


Recientemente me he topado con el proyecto pyrasite el cual está pensado para poder inyectar nuestro propio código python en cualquier proceso en python que se esté corriendo en el sistema.
Obviamente, tal y como veremos un poco más adelante, esto tiene sus propias limitaciones.

Lo primero que haremos será realizar la instalación de todo lo necesario para ejecutar pyrasite y sus módulos

Instalamos pyrasite: root@ph0b0s:~# easy_install pyrasite
Instalamos meliae (para poder utilizar los módulos de dumpeo de procesos): root@ph0b0s:~# apt-get install python-meliae

Ahora necesitaremos un proceso en python para hacer de víctima, he estado probando distintos scripts que utilizo para diversas cosas y funciona bien, pero para no complicarlo, voy a utilizar ahora un ejemplo de código muy sencillo:.

#!/usr/bin/env python
import re
import time
import urllib2
import sys
if __name__ == '__main__':
while 1:
print "En nuestro bucle..."
time.sleep(10)

Ahora, dejamos corriendo el programa: z0mbiehunt3r@ph0b0s:~/workspace/pyrasite-test/src$ ./pyrasite-test.py
Proceso de prueba corriendo


Ahora, necesitamos saber el PID del proceso:

z0mbiehunt3r@ph0b0s:~/workspace/twitter-follow/src$ ps a | grep pyrasite-test
15447 pts/0 S+ 0:00 python ./pyrasite-test.py clear

Una vez que sabemos el PID del proceso podemos proceder a intentar inyectar código en el mismo (nótese que, para evitar problemas de rutas y hacerlo lo más fácil posible, he cambiado de path)


z0mbiehunt3r@ph0b0s:/usr/local/lib/python2.6/dist-packages/pyrasite-1.0-py2.6.egg$ pyrasite 15447 payloads/helloworld.py 

Si lo hacemos así, nos dará el siguiente error:

Error de ptrace


Si nos dirigimos a dicho fichero veremos lo siguiente: 
# A PTRACE scope of "0" is the more permissive mode.  A scope of "1" limits
# PTRACE only to direct child processes
kernel.yama.ptrace_scope = 1

Por lo que, para que pueda hacerse correctamente, tenemos dos opciones, cambiar dicha variable o utilizar el comando sudo para lanzar la inyección de código. En mi caso, voy a hacerlo de la última manera: z0mbiehunt3r@ph0b0s:/usr/local/lib/python2.6/dist-packages/pyrasite-1.0-py2.6.egg$ sudo pyrasite 15447 payloads/helloworld.py

Ahora, si nos vamos a la pantalla del script de prueba, veremos lo siguiente:
Código python inyectado en el proceso

Gracias a pyrasite, podemos inyectar el código que nosotros queramos. Con el propio proyecto se incluyen diversos payloads, para listar módulos, para dumpear la memoria del proceso (y buscar información útil), para forzar el recolector de basuras y, algo bastante graciosillo, para obtener una shell inversa, tal y como vemos en la siguiente imagen:
Shell inversa obtenida mediante inyección de código


Bueno, espero que os haya resultado interesante y que probéis cosillas que se os ocurran, estaré encantado de leerlo si alguien me deja algún comentario.

Un saludo y hasta la próxima!

No hay comentarios:

Publicar un comentario