Hace unas semanas hablamos de diferentes técnicas para pivotar y hacer port-forwarding como eran: túneles SSH y port-fowarding o la utilización de Metasploit para simplificar el proceso del port-forwarding en el contexto de un proyecto de Ethical Hacking. Hoy quería hablaros de PortProxy o cómo hacer Port-Forwarding en equipos Windows. Un investigador español, y amigo personal, Borja Merino (@BorjaMerino), desarrolló en su día un módulo de post-explotación en Metasploit para llevar a cabo esta técnica de manera sencilla en equipos Windows.
Antes de destripar el módulo de Borja y comentarlo, vamos a explicar brevemente el concepto y cómo podemos hacerlo manualmente. Desde Windows XP, en adelante, existe una característica en el sistema que permite crear ports forwarding. Es cierto que en Windows XP pueden existir problemas a la hora de configurarlo, por ejemplo, si no existe una configuración IPv6.
El comando que se utiliza para poder crear una regla de port-forwarding en Windows es el comando netsh. La sintaxis del comando es sencilla:
Teniendo privilegios de administrador y utilizando la sintaxis comentada anteriormente, se puede configurar el port-forwarding en la máquina Windows. Como se puede ver en la imagen, se configura en el puerto 3333 de la máquina local una regla para hacer forwarding al puerto 3389 de la máquina con dirección IP 10.0.0.4. Antes de seguir vamos a exponer el escenario de la siguiente prueba:
Resumiendo, cuando desde la máquina Windows 7 se haga una conexión a la dirección IP, por ejemplo, 127.0.0.1, aunque también valdría, por ejemplo, la 10.0.0.2 o cualquier interfaz de red configurada en dicha máquina, y al puerto 3333 se hará el forward a la máquina 10.0.0.4 al puerto 3389, tal y como se puede ver en la imagen siguiente.
Lógicamente, hay que tener en cuenta las reglas del firewall, ya que alguna puede entorpecernos el trabajo. Para ello, se puede trabajar con netsh advfirewall y la posibilidad de crear reglas que permitan el paso del forwarding. Si queremos mostrar el listado de reglas de forwarding que tenemos en Windows tenemos la posibilidad de ejecutar netsh interface portproxy show all, tal y como se puede ver en la imagen.
Si queremos eliminar una regla podemos utilizar la siguiente sintaxis:
El investigador en seguridad Borja Merino desarrolló el módulo post/windows/manage/PortProxy. Este módulo permite simplificar el proceso manual y cuyo código se encuentra dentro del framework de Metasploit.
El módulo presenta diferentes opciones, como se pueden ver en la imagen siguiente. Utilizando register_options se amplían los atributos básicos de un módulo, en este caso se introducen las opciones LOCAL_ADDRESS, CONNECT_ADDRESS, CONNECT_PORT, LOCAL_PORT, hasta aquí todo claro y, además, se añadir las opciones IPV6_XP y TYPE.
El método run, el cual implementa la llamada run o exploit dentro del módulo, tiene un cuerpo sencillo en el que destaca lo comentado anteriormente, si no se tienen privilegios en la máquina comprometida no se podrá ejecutar el módulo. Para ello está la función “is_admin?”, la cual nos propone intentar un getsystem en caso de no poder lanzar el módulo por no tener suficientes privilegios.
Una vez revisados los privilegios, se comprueba el sistema operativo en el que se está ejecutando el módulo. En caso de ser un sistema Windows XP hay que chequear si IPV6 está habilitado, ya que en caso contrario no se podrá hacer port-forwarding. En el caso de ser otro sistema Windows posterior a XP no habrá problemas y el módulo continúa su ejecución. Por último, se llama al método enable_portproxy y, posteriormente, si éste ha ido bien, se llama a fw_enable_ports.
El método enable_portproxy prepara en la función netsh_args la regla comentada anteriormente, con los parámetros que el usuario haya ido colocando y que son leídos a través de datastore[‘LOCAL_PORT’], datastore[‘LOCAL_ADDRESS’], etcétera. Como se puede ver en el código se utiliza el mixin cmd_exec para ejecutar la instrucción compuesta de netsh y se almacena la salida en la variable output.
Si el tamaño de la salida es mayor de 2 significa que la creación de la regla en la máquina no ha ido correctamente, mientras que si no es mayor de 2 significa que PortProxy fue añadido.
La función fw_enable_ports ejecuta las reglas, a través de la creación de la sentencia netsh y el uso del mixin cmd_exec, necesarias para que el forwarding sea válido. Esto queda automatizado y se puede entender fácilmente viendo el código que se expone a continuación.
Probando el módulo PortProxy
Una vez se dispone de una sesión en una máquina comprometida, se puede utilizar este módulo. Hay que recordar que necesitaremos tener privilegios en el sistema. Además, como se puede ver en la imagen, tenemos el atributo SESSION, el cual deberemos configurar para indicar a Metasploit por cual sesión disponible deberemos lanzar el módulo.
La configuración del módulo es sencilla. Simplemente hay que ir rellenando los atributos CONNECT_ADDRESS, CONNECT_PORT, LOCAL_ADDRESS y LOCAL_PORT. No se nos puede olvidar el identificador de sesión por el que se lanzará el módulo PortProxy. Al ejecutar el método run se creará la regla en la máquina comprometida, en este caso una máquina Windows 7.
El forward configurado hará que cuando se haga una petición al puerto 3333, éste redirija a la máquina 10.0.0.4 y al puerto 3389, por lo que si ahora, nos situamos en la máquina con Kali Linux y ejecutamos rdesktop 192.168.0.14:3333, recordando que esa es la dirección IP de la máquina Windows 7, ésta nos hará el forward y realmente estaremos conectando con la máquina Windows XP.
Para que podáis ver todo el proceso en menos de un minuto, os he preparado este pequeño vídeo que recoge cómo funciona el portforwarding con netsh en Windows que reproduzco en este artículo.
Figura 1: Destripando PortProxy en Windows y en Metasploit |
Antes de destripar el módulo de Borja y comentarlo, vamos a explicar brevemente el concepto y cómo podemos hacerlo manualmente. Desde Windows XP, en adelante, existe una característica en el sistema que permite crear ports forwarding. Es cierto que en Windows XP pueden existir problemas a la hora de configurarlo, por ejemplo, si no existe una configuración IPv6.
El comando que se utiliza para poder crear una regla de port-forwarding en Windows es el comando netsh. La sintaxis del comando es sencilla:
netsh interface portproxy add [tipo de forwarding] listenaddress=[dirección local] listenport=[puerto local a la escucha] connectaddress=[dirección destino del forward] connectport=[puerto destino del forward]Ahora, vamos a explica, brevemente, que es cada parámetro de la sintaxis anterior:
• Listenaddress. Aquí indicaremos la dirección IP local dónde recibiremos la conexión. Generalmente, se podrá utilizar la dirección 0.0.0.0 para indicar que nos es indiferente la interfaz de red de la máquina por la que llegue la conexión.Ejemplificando el port-forwarding manual en Windows
• Listenport. Puerto local a la escucha.
• Connectaddress. Es una dirección IP o un nombre DNS al cual se realizará el forward desde esta máquina Windows.
• Connectport. Puerto TCP al que se realizará la conexión tras hacer el forward.
Teniendo privilegios de administrador y utilizando la sintaxis comentada anteriormente, se puede configurar el port-forwarding en la máquina Windows. Como se puede ver en la imagen, se configura en el puerto 3333 de la máquina local una regla para hacer forwarding al puerto 3389 de la máquina con dirección IP 10.0.0.4. Antes de seguir vamos a exponer el escenario de la siguiente prueba:
• Máquina Kali Linux desde la que llevamos a cabo un posible ataque. La máquina Kali Linux solo tiene direccionamiento 192.168.0.X.
• Máquina Windows 7 que será la máquina dónde se configure el PortProxy. La dirección IP de la máquina Windows 7 tiene direccionamiento 192.168.0.X y 10.0.0.X.Como se puede ver en la imagen se añade una regla v4tov4, es decir, el tráfico IP es v4 y el reenvío de tráfico sigue siendo v4. Además, se configura como listenaddress la 0.0.0.0, indicando que es indiferente la interfaz de red que reciba el tráfico en la máquina Windows 7, que se hará caso a lo que llegue al puerto configurado en listenport. Por último, indicar que connectaddress es la dirección IP de la máquina Windows con 10.0.0.4 y el connectport es 3389.
• Máquina Windows con direccionamiento 10.0.0.X. En este caso la dirección IP es 10.0.0.4.
Figura 2: Configuración comando netsh |
Resumiendo, cuando desde la máquina Windows 7 se haga una conexión a la dirección IP, por ejemplo, 127.0.0.1, aunque también valdría, por ejemplo, la 10.0.0.2 o cualquier interfaz de red configurada en dicha máquina, y al puerto 3333 se hará el forward a la máquina 10.0.0.4 al puerto 3389, tal y como se puede ver en la imagen siguiente.
Figura 3: Redirección al puerto RDP de la máquina |
Lógicamente, hay que tener en cuenta las reglas del firewall, ya que alguna puede entorpecernos el trabajo. Para ello, se puede trabajar con netsh advfirewall y la posibilidad de crear reglas que permitan el paso del forwarding. Si queremos mostrar el listado de reglas de forwarding que tenemos en Windows tenemos la posibilidad de ejecutar netsh interface portproxy show all, tal y como se puede ver en la imagen.
Figura 4: Reglas de forwarding |
Si queremos eliminar una regla podemos utilizar la siguiente sintaxis:
netsh interface portproxy delete v4tov4 listenport=[puerto que hayamos configurado] listenaddress=[dirección IP configurada]Por otro lado, si se quiere eliminar todas las reglas de forwarding configuradas podemos ejecutar:
netsh interface portproxy resetJugando con el módulo PortProxy de Metasploit
El investigador en seguridad Borja Merino desarrolló el módulo post/windows/manage/PortProxy. Este módulo permite simplificar el proceso manual y cuyo código se encuentra dentro del framework de Metasploit.
El módulo presenta diferentes opciones, como se pueden ver en la imagen siguiente. Utilizando register_options se amplían los atributos básicos de un módulo, en este caso se introducen las opciones LOCAL_ADDRESS, CONNECT_ADDRESS, CONNECT_PORT, LOCAL_PORT, hasta aquí todo claro y, además, se añadir las opciones IPV6_XP y TYPE.
Figura 5: Opciones del módulo de portProxy |
El método run, el cual implementa la llamada run o exploit dentro del módulo, tiene un cuerpo sencillo en el que destaca lo comentado anteriormente, si no se tienen privilegios en la máquina comprometida no se podrá ejecutar el módulo. Para ello está la función “is_admin?”, la cual nos propone intentar un getsystem en caso de no poder lanzar el módulo por no tener suficientes privilegios.
Una vez revisados los privilegios, se comprueba el sistema operativo en el que se está ejecutando el módulo. En caso de ser un sistema Windows XP hay que chequear si IPV6 está habilitado, ya que en caso contrario no se podrá hacer port-forwarding. En el caso de ser otro sistema Windows posterior a XP no habrá problemas y el módulo continúa su ejecución. Por último, se llama al método enable_portproxy y, posteriormente, si éste ha ido bien, se llama a fw_enable_ports.
Figura 6: Método run de portProxy |
El método enable_portproxy prepara en la función netsh_args la regla comentada anteriormente, con los parámetros que el usuario haya ido colocando y que son leídos a través de datastore[‘LOCAL_PORT’], datastore[‘LOCAL_ADDRESS’], etcétera. Como se puede ver en el código se utiliza el mixin cmd_exec para ejecutar la instrucción compuesta de netsh y se almacena la salida en la variable output.
Figura 7: Configurando netsh dentro de enable_portProxy |
Si el tamaño de la salida es mayor de 2 significa que la creación de la regla en la máquina no ha ido correctamente, mientras que si no es mayor de 2 significa que PortProxy fue añadido.
Figura 8: función enable_ports |
La función fw_enable_ports ejecuta las reglas, a través de la creación de la sentencia netsh y el uso del mixin cmd_exec, necesarias para que el forwarding sea válido. Esto queda automatizado y se puede entender fácilmente viendo el código que se expone a continuación.
Probando el módulo PortProxy
Una vez se dispone de una sesión en una máquina comprometida, se puede utilizar este módulo. Hay que recordar que necesitaremos tener privilegios en el sistema. Además, como se puede ver en la imagen, tenemos el atributo SESSION, el cual deberemos configurar para indicar a Metasploit por cual sesión disponible deberemos lanzar el módulo.
Figura 9: Máquina Kali Linux con Metasploit configurando PortProxy |
La configuración del módulo es sencilla. Simplemente hay que ir rellenando los atributos CONNECT_ADDRESS, CONNECT_PORT, LOCAL_ADDRESS y LOCAL_PORT. No se nos puede olvidar el identificador de sesión por el que se lanzará el módulo PortProxy. Al ejecutar el método run se creará la regla en la máquina comprometida, en este caso una máquina Windows 7.
Figura 10: Ejecución de PortProxy |
El forward configurado hará que cuando se haga una petición al puerto 3333, éste redirija a la máquina 10.0.0.4 y al puerto 3389, por lo que si ahora, nos situamos en la máquina con Kali Linux y ejecutamos rdesktop 192.168.0.14:3333, recordando que esa es la dirección IP de la máquina Windows 7, ésta nos hará el forward y realmente estaremos conectando con la máquina Windows XP.
Figura 11: Conexión RDP re-enviada |
Para que podáis ver todo el proceso en menos de un minuto, os he preparado este pequeño vídeo que recoge cómo funciona el portforwarding con netsh en Windows que reproduzco en este artículo.
Figura 12: PoC de uso de portforwarding con netsh
Sin duda, una técnica necesaria y que también se puede aplicar de manera sencilla sobre equipos Microsoft Windows. Aunque con el comando portfwd de Meterpreter se podía hacer de manera sencilla, esta forma también ayuda por su simplicidad y capacidades aportadas. A parte de esta prueba, os dejo unas lecturas sobre este tema que tal vez os interesen:
- Tunelizar conexiones con Proxychains
- Cómo utilizar Metasploit portForwarding
- Cómo pivotar con túneles ssh
Autor: Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y Hacking Windows, Microsoft MVP en Seguridad y Security Researcher en ElevenPaths
No hay comentarios:
Publicar un comentario