miércoles, noviembre 22, 2017

¡Salta conmigo! Metasploit, Meterpreter, SSH, Port-Forwarding, Túneles & Exploits

Ya hemos hablado de la tunelización de conexiones con Proxychains, pero en esta ocasión quería mostrar un ejercicio fundamental en un proyecto de Ethical Hacking. Hablar de túneles, port-forwarding y pivoting con y sin Meterpreter. Un compendio de buenas prácticas y técnicas que ayudan a poder saltar y saltar entre diferentes máquinas y servicios de la organización.

Figura 1: ¡Salta conmigo! Metasploit, Meterpreter, SSH, Port-Forwarding, Túneles & Exploits

¿Qué es el pivoting?

Es una técnica, como dije anteriormente fundamental, utilizada para encaminar tráfico a través de un equipo comprometido en un test de intrusión. Estés en una máquina externa o una máquina interna, puedes necesitar conducir el tráfico a través de una máquina comprometida para buscar el compromiso de otros targets internos.

Figura 2: SSH & Meterpreter pivoting techniques "cheatsheet"

Al fin y al cabo, el pivoting permite ir enrutando el tráfico de red a través de diferentes máquinas que se van comprometiendo con el objetivo de lograr conectividad y acceso a otras subredes y máquinas, generalmente, más importantes de la red. En highon.coffee tienen unos cheatsheets bastante completos. En el artículo de hoy vamos a hacer un resumen de las posibilidades que tenemos, para ejemplificar a través de una pequeña prueba de concepto.

PoC: Pivoting con túneles SSH

Lo primero es hablar de SSH Port-forwarding. El propio SSH nos permite realizar este tipo de operaciones de manera sencilla. Proponemos el siguiente escenario:
• Máquina A con la dirección IP 10.0.0.1, dónde nosotros tenemos una shell. 
• Máquina B con la dirección IP 11.0.0.1, dónde nosotros tenemos una conexión a través de SSH. 
• Máquina C con la dirección IP 11.0.0.2, dónde esta máquina no tiene conectividad con la máquina 10.0.0.1, pero sí con la máquina 11.0.0.1.
Podríamos utilizar la opción –L de SSH para indicar un puerto local, por ejemplo 2222, al que enviaremos el tráfico. En nuestra máquina local se abrirá el puerto 2222 y SSH estará a la escucha. Es SSH, a través de dicho puerto, el encargado de reenviar el tráfico al puerto, por ejemplo, 22 de la máquina 11.0.0.2 a través del equipo 11.0.0.1.

Vamos a verlo de forma práctica. Ejecutando la instrucción ssh –L 2222:11.0.0.2:22 [user]@11.0.0.1. Recordemos que suponemos que la máquina 10.0.0.1 y la 11.0.0.1 tienen conectividad, pero la 10.0.0.1 no tiene con la máquina 11.0.0.2.

Figura 3: Abriendo la conexión en el puerto local 2222

Una vez que el usuario tiene acceso a la máquina 11.0.0.1, se ha creado el forward a través del puerto local 2222. Ahora, si ejecutamos un netstat –tulpn en nuestro Kali Linux podemos ver los procesos que están a la escucha en la máquina. Podemos ver de forma fácil como el proceso de SSH está a la escucha en el puerto 2222.

Figura 4: SSH a la escucha en el puerto 2222

Cuando queramos conectar con la máquina que se encuentra en la dirección IP 11.0.0.2, a la que no tenemos conectividad directa, pero sí a través de la 11.0.0.1, ejecutaremos el comando ssh –p 2222 [user]@127.0.0.1. Como se ve, estamos enviando la petición SSH a nuestro puerto local 2222 y a nuestro localhost. SSH recibe esta petición y hace el reenvío a través de la conexión o sesión abierta de la máquina 11.0.0.1 y de ésta salta a la 11.0.0.2. Ahora sí llegamos a la máquina 11.0.0.2.

Figura 5: Volcado de tcpdump que muestra el tráfico entre ambas máquinas

Como se aprecia en la imagen tenemos conectividad. Lo que nos interesa es ver qué tráfico y en qué forma llega a la máquina 11.0.0.2. En la máquina 11.0.0.1 configuramos un tcpdump y vemos cómo el tráfico que se envía hacia la máquina 11.0.0.2 va con dirección IP 11.0.0.1.

Figura 6: PoC de SSH Pivoting

PoC: Metamos a Metasploit en la ecuación

Ahora vamos a meter a Metasploit en el juego. Con el túnel creado entre la máquina 10.0.0.1 y 11.0.0.1, vamos a configurar el módulo de Metasploit para que pueda enviar el exploit a través del túnel, cuando éste llegue a la máquina 11.0.0.1 se hará forward y se enviará el exploit a la máquina 11.0.0.3. Ésta es una nueva máquina que metemos en la ecuación. Esta máquina es un Windows 7 y tiene un FTP vulnerable corriendo en el puerto 21.

Tenemos que crear un nuevo túnel con la máquina 11.0.0.1, el cual podemos hacerlo con la siguiente instrucción ssh –L 2222:11.0.0.3:21 pablo@11.0.0.1. De esta forma, en nuestra máquina local se abrirá el puerto 2222 en la interfaz de red 127.0.0.1 con el proceso de SSH y éste hará el forward al puerto 21 de la máquina 11.0.0.3 aprovechando la conexión con la máquina 11.0.0.3.

Podemos configurar el módulo de Metasploit para que RHOST apunte a 0.0.0.0, es decir, cualquier interfaz de red de nuestra máquina, incluyendo localhost que es dónde está a la escucha el puerto 2222. En RPORT, debemos utilizar el puerto 2222, ya que es el que está a la escucha en nuestra máquina.

Figura 7: Configuración de LPORT y RPORT en el módulo del exploit

Cuando ejecutamos el módulo podemos ver que éste se ejecuta, pero parece que no tenemos conexión o sesión. Aunque el exploit ha tenido éxito, no obtenemos sesión debido a que el payload se ha configurado de tipo bind y éste está atado al puerto 4444 de la máquina 11.0.0.3, a la cual no tenemos conectividad. Debemos, en este caso, crear un nuevo túnel que nos redirija al puerto 4444 de la máquina 11.0.0.3.

Figura 8: Conexión de nuevo tunel

Para conectarnos, utilizamos el módulo exploit/multi/handler con el que podremos buscar al Meterpreter que nos ha devuelto la explotación de la vulnerabilidad del servidor FTP. ¿Qué había ocurrido? La vulnerabilidad había sido explotada, y Meterpreter estaba ejecutándose en el puerto 4444 a la espera de que alguien se conectara a él.

Como se ve en la imagen, de nuevo RHOST apunta a 0.0.0.0 y LHOST, en este caso, apunta al puerto 2222, que es el de nuestra máquina local. Una vez lanzamos el módulo obtenemos la nueva sesión de Meterpreter y podemos ejecutar comandos.

Figura 9: Conexión con Meterpreter

Debemos tener claro que gracias al túnel SSH entre la máquina 10.0.0.1 y la máquina 11.0.0.1 hemos podido hacer forward del tráfico dirigido al puerto 21 de la máquina 11.0.0.3, utilizando como pivote a la 11.0.0.1, y, posteriormente, hemos realizado el mismo proceso, pero con el puerto 4444, para recoger el Meterpreter.

Figura 10: PoC Pivoting con Meterpreter

Una mejora sería utilizar un Meterpreter reverse para que la máquina 11.0.0.3 pueda conectarse a nosotros si tuviera conectividad desde dentro hacia fuera. Todo el proceso se puede ver en el vídeo de la PoC que tienes aquí.

PoC: Rizando el rizo. Dos saltos y pwned en el servidor FTP

Por último, se quiere saltar por dos máquinas antes de llegar al servidor FTP. Para ello, se abre el puerto 2222 en local y se indica que es a 127.0.0.1 dónde se lanza la petición con destino puerto 2223 en la máquina remota. Una vez se tiene acceso en la máquina 11.0.0.1, se abre el puerto 2223 y se indica que las peticiones que salgan de dicha máquina vayan al puerto 21 de la máquina 11.0.0.3. Puede resultar un poco lioso, pero os dejo una imagen que puede ayudaros.

Figura 11: Ahora dos saltos en vez de uno

Ahora, lanzamos el exploit con la misma configuración que en el paso anterior. El exploit pasará por la máquina 11.0.0.1, de la 11.0.0.1 pasa a la 11.0.0.2 y de ésta a la 11.0.0.3 dónde llega ya en plano, en la petición de protocolo FTP. De la máquina 10.0.0.1 a la 11.0.0.1 y de la 11.0.0.1 a la 11.0.0.2 hay dos túneles SSH. Cuando queremos preparar los túneles para recoger el Meterpreter de tipo bind. En la imagen se puede ver cómo queda la configuración de los túneles, para la recogida del Meterpreter en el puerto 4444.

Figura 12: Túneles preparados para la recogida de la sesión Meterpreter

Para acabar, vemos cómo obtener el acceso a la máquina Windows 7, que se encuentra a dos saltos de nosotros, sin ningún tipo de conectividad con la máquina Kali Linux dónde nos encontramos.

Figura 13: Goal!

Para más adelante dejamos la funcionalidad de Metasploit de Portfwd, con la que podemos hacer este tipo de cosas más sencillas, y tras conseguir la explotación con Metasploit. Sin duda, una técnica necesaria y que debemos manejar. Y no he querido rizar el rizo, pero si quieres que estas SSH sean solo tuyas, puedes ver el artículo de configurar SSH in paranoid mode.

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

5 comentarios:

  1. En la parte de Metasploit utilizais la ip 11.0.0.3, en un error o es otra máquina que se me ha pasado a mi? :) Entiendo que os referís a 11.0.0.2 no?

    ResponderEliminar
  2. ¿Esta es una novedad? Acabas de descubrir port forwarding con SSH...
    ¡Claro que sí campeón! Dejando el log como una catedral.
    ¿No has pensado usar netcat, socat, etc?
    Cada día este sitio web tiene menos que ofrecer, entre las tonterías y la cháchara que no para.
    Me gustaría que fuera más serio, más directo y menos estilo abuela. Es poco profesional.

    Un sitio a nombre de Chema Alonso, ¿de qué estamos hablando? ¿de exploits propios descubrimientos y aportaciones novedosas e intersantes?
    No, hablamos de búsquedas en google, de cosas tipo: sé a qué hora te has levantado o sé que usas Firefox o no sé qué hablas pero sé con quien hablas, el gran descubrimiento de port forwarding (metasploit, ssh; Esto es de la era de piedra)... y etc etc

    Venga ya, por Dios. Cosas para niños de 14 años, les enseñas un truco miserable con unas cartas o esto y flipan igual.

    ResponderEliminar
  3. @Vasile, en este blog siempre ha primado enseñar y compartir. A lo largo de 12 años de blog se han publicado nuevas técnicas que han sido parte de las conferencias que hemos dado, parte de herramientas que hemos lanzado, de trabajos de otros, o simplemente ideas sueltas. Pero también se han publicado cosas para que la gente aprenda y pruebe cosas. La explicación en este artículo es un post más que merecedor de El lado del mal, donde lo que queremos es enseñar y compartir. De hecho, yo publico mis cuentos, y mis dibujos, porque al final, un blog es un blog y no un CFP de una conferencia IEEE o ACM con revisión ciega para sacarse un doctorado.

    Saludos!

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar