Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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:
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
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:
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í:
• 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:
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:
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:
198
Como podemos apreciar, el enviar y el recibir comando está
funcionando, probemos a obtener el nombre de la máquina:
199