Está en la página 1de 12

En este caso, por defecto vemos que viene el RHOSTS que

sería la dirección IP de la víctima y el puerto a atacar por


defecto es el 21 cuyo valor por defecto es correcto.
Así que solo debemos pasarle la dirección IP de
metasploitable, en mi caso 192.168.1.12, para hacer eso,
debemos hacer uso del comando set seguido del nombre de
la opción y luego del objetivo:

Como extra, podemos hacer uso del comando show payloads


cuyo retorno será la lista de payloads compatibles con el
exploit:

En este caso solo tenemos 1 el cual para seleccionarlo


deberíamos poner set payload 0

El cero hace referencia a su ID de búsqueda, el cual al ser


solo un payload compatible será 0.
Sabiendo esto podemos proceder a probar el exploit y para
ello tenemos 2 opciones, podemos ejecutar el comando run o
el comando exploit, veamos:

188
¡Sorpresa! El exploit ha funcionado y ahora nos encontramos
dentro del sistema objetivo, ¿Cómo sabemos esto?
Intentemos ejecutar un comando para determinarlo, por
ejemplo, pwd el cual nos retornará la ruta actual donde nos
encontramos:

Parece que estamos en la ruta principal, probemos listando


el directorio con ls -l

Esto parece mejor, pero vamos a terminar de asegurarnos


corriendo el comando hostname que, en Linux, debería de
retornarnos el nombre de la máquina en uso:

¡Estamos dentro! Hemos vulnerado nuestro primer sistema


en esta prueba, pero, ¿Y Python? Parece que por un
momento lo hemos dejado de lado y así es, es importante
conocer una herramienta antes de conectarnos a ella por
algún medio y trabajar con la información que nos brinda.
Quizá el lector se pregunte, ¿Para qué conectar a Python con
algo cómo metasploit?, ¿No es más sencillo hacerlo de la
manera tradicional? Puede que sí, pero no en todos los casos.
Imagina que ha logrado vulnerar su primer sistema, puede
que necesite hacer el mismo proceso cada vez que desee
explotarlo, hacer pruebas o presentarlo a alguien, el mismo
proceso de iniciar postgresql, abrir metasploit, buscar el
exploit correcto, seleccionarlo, configurarlo y lanzarlo, puede
ser poco práctico y tedioso y sí, si ya tiene conocimientos algo

189
medios o avanzados de metasploit puede que diga que puede
generar un fichero de configuración .rc y optimizar los pasos
antes descritos pero piense en otras situaciones. Puede que
para cuando necesite metasploit en X situación no cuente
con la herramienta instalada, no posea el internet necesario,
el espacio o tenga otra limitante que le impida usarla de
manera local sin embargo… ¡Genial!, alguien ha sido tan
generoso de poner a la escucha el servicio de msfrpcd en la
misma red que tú, por lo que ahora, como tal, podrías tener
acceso a metasploit desde cualquier lenguaje de
programación que posea un módulo compatible para
conectarse a metasploit como el caso de Python, ahora
podrías usar exploits, módulos auxiliares, generar payloads o
módulos post. También está la situación en la que se tiene un
metasploit pro, es decir, la versión NO comunitaria lanzada
por rapid7 la cual posee funcionalidades extra que la versión
gratuita no, al igual que en el ejemplo anterior, podría
configurar el servicio de msfrpcd y tener acceso a todas las
características de pago. Entre otras cosas, puede que te
encuentres trabajando con un equipo dedicado a realizar una
auditoría y entre el equipo se busque poder compartir
información descubierta como puertos abiertos, servicios,
vulnerabilidades, direcciones IP y hasta sesiones, gracias a
las posibilidades nuevas que ofrece el usar msfrpcd pueden
hacer esto sin complicaciones, y, desde luego, el saber
conectarse a este servicio con Python nos abre más las
puertas para recorrer caminos que serán tan largos como
nuestra imaginación nos lo permita.
Antes que nada, antes de ponerse a programar y realizar
tareas de ensueño desde nuestro lenguaje de programación
por excelencia vamos a tener que instalar un módulo
compatible, existen varios y que no son tan distintos unos de
otros como python-msfrpc sin embargo usaremos
pymetasploit3, así que lo instalaremos usando la utilidad pip
con:
pip3 install pymetasploit3
190
Una vez instalado, hagamos unas breves pruebas del uso de
pymetasploit3. Para que este módulo pueda usarse
necesitamos de 2 cosas, tener dicho módulo instalado y un
servicio de msfrpc corriendo, así que en una terminal
ejecutaremos: msfrpcd -P tucontraseña -S
Donde -P indicará la contraseña con la que protegeremos el
acceso a nuestro servicio y con -S deshabilitamos el SSL para
evitar posibles errores.
Una vez hecho esto, la herramienta debería empezar a
mostrar mensajes similares a los siguientes, lo cual indicaría
que se encuentra en ejecución:

En la imagen podemos distinguir en la salida de la


herramienta que el servicio está corriendo en la dirección
0.0.0.0, es decir, en nuestra máquina por todas las interfaces
de red corriendo en el puerto 55553, para verificar esto
tenemos varias utilidades de red disponibles, pero usaremos
netstat para validar que el puerto se encuentra a la escucha:

Como podemos ver, vemos en pantalla el protocolo usado


que es TCP, las inferfaces y su estado LISTEN, es decir, se
encuentra a la escucha de conexiones entrantes por parte de
otros equipos.
Ahora ya tenemos ambos requisitos cumplidos acerca de lo
que necesitamos para usar metasploit desde Python, ahora

191
pasemos a otra terminal donde mediante el intérprete del
lenguaje veremos algunos detalles de la herramienta.
Es de saberse que un módulo, ahora que sabemos cómo
crearlos, puede poseer distintas clases y métodos de clase, en
pymetasploit3 no hay excepciones, y una de las clases que
vienen es MsfRpcClient, la cual, como su nombre lo indica,
es un cliente cuyo fin es ser usado para establecer
comunicación con msfrpc, Así que vamos a importarlo con:
from pymetasploit3.msfrpc import MsfRpcClient

Ahora creamos un objeto de MsfRpcClient para poder


conectarnos con el servicio recordando la clave, en este caso
podríamos hacerlo de la siguiente manera:
client = MsfRpcClient('passwordsegura', ssl=False)

El primer parámetro será la contraseña establecida y el


segundo sirve para decirle a Python que el ssl se encuentra
deshabilitado en el servicio y por ende no será necesario
utilizarlo.
Hasta ahora parece que nos hemos conectado al servicio y
para terminar de asegurarlo, podemos acceder a la propiedad
authenticated del objeto client, en caso de devolver True
sabremos que la conexión fue exitosa:

Dado que msfrpcd nos da acceso a él API de metasploit,


podemos consultar el URI actual con:

192
Bien, ahora sabemos que estamos conectados, esto sería el
equivalente a estar en la consola de metasploit tal cual la
hubiéramos invocado con msfconsole, ¿Cómo compruebo
esto? Muy simple, si nos vamos a nuestro interprete y
ponemos algo como client.modules. y pulsamos 2 veces
seguidas el botón de tabulación nos saldrá el autocompletado
automatico de Python y veremos alguno de sus métodos,
que, como podemos observar a continuación, no son ni más
ni menos que todo los disponible desde una consola de
metasploit:

Desde módulos auxiliares hasta módulos post, el método del


final que es use nos ayuda a elegir una opción, algo que
veremos a continuación, por ahora, imaginemos que
queremos listar todos los exploits disponibles, solo
accedamos al método solicitado y listo, tendremos algo como
lo siguiente:

Tendremos una enorme lista de exploits a nuestro alcance, es


posible también que intentemos buscar uno en concreto, por
ejemplo, a nuestro amigo exploit que se encargaba de
explotar a vsftpd, podríamos crear una función simple que se
encargue de buscarlo entre toda esta lista de la siguiente
manera:

193
Gracias a la técnica de compresión de listas podemos reducir
una función de varias líneas de código a una sola, en la cual
recorremos toda la extensa lista de exploits en búsqueda de
una coincidencia o coincidencias que reduzcan la lista a unos
cuantos resultados posiblemente válidos, ahora, vamos a
explorar las opciones del exploit y algunos de sus métodos,
estos métodos son válidos para cualquiera que elijamos, sin
embargo las opciones de configuración van a variar
dependiendo del software, versión, sistema operativo y
arquitectura a la cual se enfoquen, así que antes de ver los
métodos del exploit hay que seleccionarlo usando el método
use de modules del objeto client, de manera que nos quede
así:

Creamos una variable que será igualada a lo que


seleccionemos con use, use es una función que va a recibir
obligatoriamente 2 argumentos, uno de ellos será el tipo de
módulo que va a ser usado, recordemos que puede ser:

• exploit
• auxiliary
• nop
• post
• encoder
• evasion
En este caso, es un exploit, así que ese será el tipo de módulo,
el segundo argumento será el nombre del exploit,
recordemos que creamos una pequeña lista de exploits
usando la compresión que derivó en un único resultado, así
que podríamos pasarle directamente el nombre del exploit o
únicamente accediendo a su posición en la variable resultado
que sería 0.

194
Tal como hicimos para explorar al objeto client.modules
podemos hacerlo con el objeto exploit, así que podemos
poner su nombre, un punto y pulsar 2 veces la tecla
tabulación para ver los métodos disponibles:

Entre ellos podemos consultar información al método:


• name: Nos retornará el nombre del exploit
actualmente usado.
• authors: Nos retornará información acerca del
nombre de los autores que escribieron el exploit.
• description: Nos dará una descripción acerca del
exploit y su funcionamiento.
• options: Nos dará un vistazo de las opciones que
podemos configurar antes de ejecutar el exploit.
• payloads: Nos dará una lista de los payloads
compatibles con el exploit que nos ayudarán a
gestionar nuestra conexión.
Otro método a destacar no mencionado en la lista es el
método execute el cual se encargará de lanzar el exploit y
buscar crear una sesión remota tal como lo vimos en el
ejemplo cuando usábamos msfconsole en ya algunas páginas
anteriores, ahora repetiremos este mismo proceso, pero
creando un script de Python para automatizar, así que…
Pensando un poco el código, ¿Qué le implementarían?, ¿Qué
personalizarían?, ¿Qué módulos pondrían en uso?

195
Veamos, para crear un script que automatice todo el proceso
anteriormente visto deberíamos implementar el uso de
argparse para poder recibir alguno que otro argumento
mediante la línea de comandos, esto es para hacer frente a
situaciones, por ejemplo, que nuestro objetivo no esté
encendido todo el tiempo y tenga una dirección IP dinámica,
así que constantemente estará cambiando al volver a
iniciarse, así podremos pasar la dirección IP del objetivo
como argumento y evitar modificar el código internamente
siempre que se necesite, considero, bajo mi perspectiva de
este ejemplo que ese sería el único detalle valioso a
considerar, así que veamos un ejemplo de código que pueda
ser usado para este ejemplo:

Parece bastante complejo, ¿No? Créeme que en la vida te


toparás con códigos mil veces más complicados y deberás
hacerles frente, este es sencillo y vamos a explicarlo de poco
en poco.

196
Primero que nada empezamos importando a el módulo de
argparse y a la clase MsfRpcClient del objeto msfrpc de
pymetasploit3, configuramos nuestro argparse para recibir
un argumento, algo que múltiples veces hemos explicado con
anterioridad, este argumento será el encargado de guardar la
dirección IP del objetivo que atacaremos, debajo de ello
verificaremos si la opción se encuentra con una entrada por
parte del usuario que pueda ser válida, si no, no
ejecutaremos nada y solo daremos un mensaje indicando que
no hay objetivo.
Creamos nuestro cliente de la clase MsfRpcClient en donde
establecemos la contraseña y la verificación del SSL en False,
por debajo seleccionaremos el exploit que utilizaremos, aquí
si bien es bastante similar al código visto en el intérprete sí
que varía un poco, dado que en el intérprete veíamos una
manera bastante simple de implementar un buscador
haciendo uso de la compresión de listas, aquí seleccionamos
directamente el exploit.
Algo que no vimos en el intérprete fue como establecer
valores, recodemos que en msfconsole para establecer un
objetivo poníamos algo como set rhosts ip aquí podemos
hacerlo de una manera bastante simple, únicamente usando
a exploit como diccionario y accediendo a su llave RHOSTS
la cual igualaremos al objetivo establecido por el usuario que
sería parse.target, luego de eso damos un simple mensaje
informativo, y, posterior a ello, ejecutamos el exploit
haciendo uso del método execute, mismo que lleva 1
argumento el cual será payload, recordemos que este exploit
solo era compatible o mejor dicho, tenía compatible un solo
payload por lo que se lo establecemos el cual es
cmd/unix/interact que no es nada más que un payload
bastante sencillo y silencioso que nos permite tener acceso a
la máquina como una consola simple de comandos de Linux.
Luego de ello mediante el uso de un condicional accedemos a
la propiedad sessions.list, que, por si su nombre no fuera ya
197
bastante descriptivo, nos retornará una lista de sesiones
actualmente disponibles en formato de diccionarios, y, he
aquí un error que puede presentarse luego de ejecutar el
script varias veces y es que por cada ejecución completada se
generará en el servidor msfrpc una nueva, por lo tanto, el
identificador de la sesión que esté disponible o busque
obtenerse no siempre será el mismo, esto lo he hecho a
propósito y tu tarea será corregir esta debilidad con tus
conocimientos, pero, para no hacer demasiada larga la
descripción continuemos.
Suponiendo que la sesión actualmente disponible es la
número 1 vamos a seleccionarla e igualarla a la variable shell
que será convertida en un objeto de sesión con la cual
nosotros podemos enviar y recibir información entre nuestra
máquina atacante y la víctima, así que creamos un bucle
‘infinito’ en el cual estaremos introduciendo comandos que
luego enviaremos con la función write de shell y luego
imprimiremos con la función read de el mismo objeto. Esto
se repetirá siempre y cuando no escribamos el comando exit
ya que con ello forzaremos a la herramienta a cerrar la sesión
y así misma.
Vamos a verla corriendo para ver como luce y que tal se
comporta:

Y como vemos, ¡Ha funcionado! Intentemos listar el


directorio actual donde nos encontramos para ver qué hay:

198
Como podemos apreciar, el enviar y el recibir comando está
funcionando, probemos a obtener el nombre de la máquina:

Bien, ahora estamos dentro de nuestro objetivo con una shell


abierta, ahora las posibilidades parecen ampliarse más
acerca de las cosas que podemos hacer, ¿Qué sigue? Vamos a
intentar migrar esta misma sesión a una de meterpreter e
intentaremos explotar otros servicios.

199

También podría gustarte