miércoles, noviembre 15, 2017

#Metasploit: Automatizar scripts con msfrpcd y msfrpc

Llevaba tiempo queriendo echar un vistazo a los binarios msfrpcd y msfrpc que vienen con Metasploit Framework. Son dos binarios que para muchos están ahí, pero que si no toca automatizar nada no tenemos ni en la cabeza o, ni siquiera, hemos probado alguna vez. Hoy vamos a hablar sobre la automatización de acciones en Metasploit utilizando para ello RPC.

Figura 1: Metasploit: Automatizar scripts con msfrpcd y msfrpc

Si vamos al Github de Metasploit podemos encontrar información sobre RPC y la interacción con el framework y la instancia del "objeto framework" de Metasploit. Además, y como vamos a ver, es muy intuitivo y sencillo, por lo que ‘a pelo’ podemos hacer automatizaciones en scripts.

Rapid 7 ha publicado documentación de la RPC API, la cual si no la conoces te recomiendo que le eches un ojo. Al final, podrás llevar a cabo cualquier acción sobre el framework desde tu script de forma remota, consiguiendo la automatización de tareas en un Ethical Hacking. Y si lo que te gusta es el código, puedes ir directamente a los recursos o código fuente que hay en el Github oficial.

Figura 2: Framework de Metasploit en GitHub

Para ejecutar el daemon de msfrpc utilizaremos el binario msfrpcd. Con este binario podemos configurar una contraseña para que nadie pueda conectarse si no la sabe. Se puede configurar SSL para que la conexión fuera protegida. Incluso, podríamos ‘currarnosconfigurar Latch en Metasploit, al menos para la parte del servidor RPC. Para ejecutar el demonio en nuestro Kali Linux lanzamos la instrucción que se puede ver en la imagen.

Figura 3: Ejecución de msfrpcd

Una vez tenemos lanzado el demonio, deberemos conectarnos desde el cliente, en este caso el binario msfrpc. Decir que para este ejemplo se ha utilizado otra máquina Kali Linux para llevar a cabo la conexión remota al framework de Metasploit. El binario msfrpc se conectará al servicio RPC remoto a través de la siguiente instrucción msfrpc –P [contraseña] –a [dirección IP remota del servidor].

Una vez conectamos con el servicio RPC nos encontramos que obtenemos un objeto RPC. Con este objeto podemos realizar cualquier llamada e interacción con el framework como si estuviéramos en local. Es decir, podremos utilizarlo para automatizar cualquier acción. Da para otro post indicar que existe una gran cantidad de librerías en Ruby, Python y otros lenguajes, que permiten interactuar a través de RPC con Metasploit. Abstrayendo al desarrollador, pero hoy queremos bajar al nivel bajo de la cuestión.

Para ejemplificar una primera llamada muestro el método call del objeto rpc. Si nos fijamos podemos realizar acciones introduciendo una serie “comandos” en el interior del método. Realmente no son comandos, son métodos del objeto remoto. Otra función que estamos probando es module.info. Esta función o método pertenece al objeto remoto module.

Figura 4: Objeto module

Como podemos ver el juego es sencillo. Mirar la documentación o el código de cada clase y ver qué métodos existen para que a través del objeto rpc puedan ser invocados.

Explotando una vulnerabilidad desde RPC

Para seguir con el ejemplo, configuramos una llamada a module para que ejecute el método options. Los parámetros para esta acción, como puede verse en el código de Github de Metasploit, son rpc_options(mtype, mname), dónde mtype indica el tipo de módulo del queremos las opciones y mname indica el nombre/ruta del módulo. En este caso debemos ejecutar la instrucción rpc.call(module.options', 'exploit', [nombre del módulo]). Siendo ‘exploit’ el valor de mtype y [‘nombre del módulo’] el valor de mname. A continuación, se muestra un ejemplo de esto.

Figura 5: Invocación del exploit via rpc.call

Se obtienen las diferentes opciones. Esto puede ser almacenado fácilmente en una variable, por ejemplo, ejecutando var = rpc.call(module.options', 'exploit', [nombre del módulo]). Como vemos que el tipo que se retorna es un hash, se puede acceder fácilmente a los campos mediante las key, por ejemplo, var[‘WORKSPACE’].

Figura 6: Acceso vía variables

Vuelvo a hacer hincapié en la importancia de mirar la documentación o el código directamente de las funciones y clases de la parte de RPC. Sabiendo el uso básico de Metasploit y mirando la documentación se puede hacer, prácticamente, cualquier cosa de forma remota.

En la propia documentación del Github de Metasploit podemos encontrar ejemplos que pueden ser utilizados para comenzar. Como vemos, antes de cada función encontramos los parámetros de cada método y el tipo de dato que se retorna, incluyendo también información sobre las excepciones que puede dar.

Figura 7: Documentación en GitHub de Metasploit

Para finalizar, vamos a configurar en una máquina Windows 7 un servidor FTP Utility, el cual podéis encontrar en Exploit-DB su binario vulnerable y montarlo en vuestro laboratorio para las pruebas. Además, utilizando la conexión RPC vamos a configurar una variable llamada opts con los parámetros típicos de configuración del módulo de explotación, como son: LHOST, LPORT, PAYLOAD o RHOST. Esto es lo que he comentado antes, es la parte básica del uso de Metasploit.

También hay que indicar que, previamente a la configuración de la variable opts debemos utilizar un módulo que recoja las posibles sesiones que consigamos, si la explotación funciona. Para ello hay que ejecutar:
• Opts={“LHOST”=>[IP], “LPORT”=>[PORT], “PAYLOAD”=>[El que se quiera]} 
• Ahora ejecutamos el módulo multi/handler: rpc.call(‘module.execute’, ‘exploit’, ‘multi/handler’,opts)

Figura 8: Configuración de opts y ejecución de exploit para FTP Utility

Tras ejecutar la configuración y lanzamiento del módulo se puede obtener una sesión si la máquina es vulnerable. Ejecutando la función session.list podemos encontrar la sesión obtenida, tal y como se puede ver en la imagen. Lo importante es quedarse con el identificador para poder lograr interactuar con ella más adelante.

Figura 9: Lista de sesiones

Para finalizar el ejemplo, podemos utilizar session para interactuar con Meterpreter. En la imagen vemos como con la función meterpreter_write escribimos por el identificador de la sesión correspondiente, mientras que si queremos leer los resultados debemos ejecutar meterpreter_read. Es realmente sencillo y potente.

Figura 10: Sesión vía Meterpreter

Como se ha mencionado anteriormente, existe la posibilidad de utilizar librerías que abstraen de todos los detalles, pero quizá lo interesante es conocer lo que hemos visto por debajo. Quizá otro día hablemos de las librerías que existen o mostremos un pequeño ejemplo de automatización gracias al uso de este tipo de llamadas.

Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell”, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths

1 comentario:

Sheyk87 dijo...

Esto es lo que utiliza Armitage?

Entrada destacada

Programa de Especialización "Inteligencia Artificial para Expertos en Ciberseguridad" 2ª Edición.

Hoy, en medio del verano, os traigo información de la 2ª Edición del   Programa de Especialización  de "Inteligencia Artificial para Ex...

Entradas populares