Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

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!

viernes, 10 de septiembre de 2010

Information Gathering - DNS Cache Snooping

Como ya hemos visto en alguna ocasión, a la hora de realizar una auditoría o una prueba de pentest lo primero y más importante es reunir cuanta información sea posible acerca del objetivo, es la fase que se denomina "information gathering".

Probablemente nos interese saber qué clase de webs visitan los usuarios de dicha empresa, quizá para realizar un ataque de ingeniería social relacionado con alguno de los dominios cacheados, o realizar un ataque de evilgrade para comprometer equipos. La mejor manera de saber los dominios visitados es comprobar si se puede realizar un "snooping" sobre la caché del servidor DNS.
¿Y cómo sabemos si se puede realizar? Muy fácil, debido al funcionamiento jerárquico del protocolo DNS si nosotros realizamos una consulta DNS e indicamos al servidor que es una consulta no recursiva (el servidor DNS no intentará escalar la consuta) y se nos devuelve la entrada de dicha consulta querrá decir que el servidor permite realizar consultas a la caché y que dicho dominio ya se ha solicitado con anterioridad.

Hace un tiempo cree un pequeño script en python para poder realizar dicho trabajo de una forma sencilla. Para obtener una lista de dominios que probar lo más fácil es acudir a Alexa y extraer los dominios que nos interesen, incluso tienen un csv con el top 1 millón de webs en el ránking. Dependiendo de la finalidad buscada se pueden usar distintas categorías:
  • Direcciones de actualización para realizar ataques de evilgrade
  • Dominios de malware para saber si algún equipo está contactando con un servidor de malware (existen multitud de dominios de malware, pero puede ser útil para comprobar algunos en concreto)
  • Un atacante con fines lucrativos podría buscar ciertos dominios "para adultos" con el fin de chantajear
  • Búsqueda de redes sociales y profesionales. Por ejemplo, para buscar en ellas más información acerca de los empleados.
  • Para buscar tus propios dominios y saber si la empresa se ha interesado por tí. Por ejemplo, una entidad de gestión visitando páginas p2p o de detectives privados :)
  • Y un sinfín de posibilidades, os animo a comentar más posibilidades.
A continuación os dejo unos pantallazos del script:

El script al ejecutarse sin parámetros y la ayuda del mismo


El script al ejecutarlo con el parámetro -c que comprueba si los servidores DNS correspondientes a un dominio permiten resolución no recursiva.

La forma en la que comprueba si un servidor es susceptible de dicha enumeración es pidiendo primero unas direcciones muy comunes como puedan ser google, youtube, facebook, etc.
(He quitado el dominio por si acaso a alguien se le ocurre tirarle la lista de Alexa entera o algo así...)

Aquí el programa con el parámetro -s y los primeros resultados de la lista de Alexa

Bueno, aquí os dejo el código, espero que os sirva.

Un saludo a todos y hasta la próxima!