Saltar a contenido

NTLM Authentication

Aparte de Kerberos y LDAP, Active Directory utiliza varios otros métodos de autenticación que pueden ser utilizados (y abusados) por aplicaciones y servicios en AD. Estos incluyen LM, NTLM, NTLMv1 y NTLMv2. LM y NTLM aquí son los nombres de los hash, y NTLMv1 y NTLMv2 son protocolos de autenticación que utilizan el hash LM o NT. A continuación, se presenta una rápida comparación entre estos hashes y protocolos, que nos muestra que, aunque no son perfectos de ninguna manera, Kerberos es a menudo el protocolo de autenticación preferido siempre que sea posible. Es esencial entender la diferencia entre los tipos de hash y los protocolos que los utilizan.

Hash Protocol Comparison

Hash/Protocol Cryptographic technique Mutual Authentication Message Type Trusted Third Party
NTLM Criptografía de clave simétrica No Número aleatorio Domain Controller
NTLMv1 Criptografía de clave simétrica No Hash MD4, número aleatorio Domain Controller
NTLMv2 Criptografía de clave simétrica No Hash MD4, número aleatorio Domain Controller
Kerberos Criptografía de clave simétrica y criptografía asimétrica Ticket cifrado usando DES, MD5 Domain Controller/Key Distribution Center (KDC)

LM

Los hashes LAN Manager (LM o LANMAN) son el mecanismo más antiguo de almacenamiento de contraseñas utilizado por el sistema operativo Windows. LM debutó en 1987 en el sistema operativo OS/2. Si están en uso, se almacenan en la base de datos SAM en un host de Windows y en la base de datos NTDS.DIT en un Domain Controller. Debido a importantes debilidades de seguridad en el algoritmo de hashing utilizado para los hashes LM, se ha desactivado por defecto desde Windows Vista/Server 2008. Sin embargo, todavía es común encontrarlo, especialmente en entornos grandes donde se siguen utilizando sistemas antiguos. Las contraseñas que utilizan LM están limitadas a un máximo de 14 caracteres. Las contraseñas no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas antes de generar el valor hash, lo que limita el espacio de claves a un total de 69 caracteres, lo que hace que sea relativamente fácil crackear estos hashes utilizando una herramienta como Hashcat.

Antes de hacer el hash, una contraseña de 14 caracteres se divide primero en dos bloques de siete caracteres. Si la contraseña tiene menos de catorce caracteres, se completará con caracteres NULL para alcanzar el valor correcto. Se crean dos claves DES a partir de cada bloque. Estos bloques se cifran utilizando la cadena KGS!@#$%, creando dos valores de texto cifrado de 8 bytes. Estos dos valores se concatenan, lo que da como resultado un hash LM. Este algoritmo de hashing significa que un atacante solo necesita realizar fuerza bruta sobre siete caracteres dos veces en lugar de los catorce caracteres completos, lo que hace que crackear los hashes LM sea rápido en un sistema con una o más GPUs. Si una contraseña tiene siete caracteres o menos, la segunda mitad del hash LM siempre tendrá el mismo valor e incluso podría determinarse visualmente sin necesidad de herramientas como Hashcat. El uso de hashes LM se puede desactivar utilizando Group Policy. Un hash LM tiene la forma de 299bd128c1101fd6.

Nota: Los sistemas operativos Windows anteriores a Windows Vista y Windows Server 2008 (Windows NT4, Windows 2000, Windows 2003, Windows XP) almacenaban tanto el hash LM como el hash NTLM de la contraseña de un usuario por defecto.


NTHash (NTLM)

Los hashes NT LAN Manager (NTLM) se utilizan en sistemas Windows modernos. Es un protocolo de autenticación de desafío-respuesta y utiliza tres mensajes para autenticar: un cliente primero envía un NEGOTIATE_MESSAGE al servidor, cuya respuesta es un CHALLENGE_MESSAGE para verificar la identidad del cliente. Finalmente, el cliente responde con un AUTHENTICATE_MESSAGE. Estos hashes se almacenan localmente en la base de datos SAM o en el archivo de base de datos NTDS.DIT en un Domain Controller. El protocolo tiene dos valores de contraseñas hashed para elegir al realizar la autenticación: el hash LM (como se discutió anteriormente) y el hash NT, que es el hash MD4 del valor UTF-16 little-endian de la contraseña. El algoritmo se puede visualizar como: MD4(UTF-16-LE(password)).

NTLM Authentication Request

image

Aunque son considerablemente más fuertes que los hashes LM (soportando todo el conjunto de caracteres Unicode de 65,536 caracteres), todavía se pueden crackear relativamente rápido mediante fuerza bruta offline utilizando una herramienta como Hashcat. Los ataques con GPU han demostrado que todo el espacio de claves NTLM de 8 caracteres se puede crackear en menos de 3 horas. Los hashes NTLM más largos pueden ser más difíciles de crackear dependiendo de la contraseña elegida, e incluso las contraseñas largas (15+ caracteres) se pueden crackear utilizando un ataque de diccionario offline combinado con reglas. NTLM también es vulnerable al ataque pass-the-hash, lo que significa que un atacante puede utilizar solo el hash NTLM (después de obtenerlo a través de otro ataque exitoso) para autenticarse en sistemas objetivo donde el usuario es administrador local sin necesidad de conocer el valor en texto claro de la contraseña.

Un hash NT tiene la forma de b4b9b02e6f09a9bd760f388b67351e2b, que es la segunda mitad del hash NTLM completo. Un hash NTLM se ve así:

Rachel:500:aad3c435b514a4eeaad3b935b51304fe:e46b9e548fa0d122de7f59fb6d48eaa2:::

Al observar el hash anterior, podemos desglosar el hash NTLM en sus partes individuales:

  • Rachel es el nombre de usuario.
  • 500 es el Identificador Relativo (RID). 500 es el RID conocido para la cuenta de administrator.
  • aad3c435b514a4eeaad3b935b51304fe es el hash LM y, si los hashes LM están desactivados en el sistema, no se puede utilizar para nada.
  • e46b9e548fa0d122de7f59fb6d48eaa2 es el hash NT. Este hash se puede crackear offline para revelar el valor en texto claro (dependiendo de la longitud/fuerza de la contraseña) o utilizar para un ataque pass-the-hash. A continuación se muestra un ejemplo de un ataque pass-the-hash exitoso utilizando la herramienta CrackMapExec:
crackmapexec smb 10.129.41.19 -u rachel -H e46b9e548fa0d122de7f59fb6d48eaa2

SMB         10.129.43.9     445    DC01      [*] Windows 10.0 Build 17763 (name:DC01) (domain:INLANEFREIGHT.LOCAL) (signing:True) (SMBv1:False)
SMB         10.129.43.9     445    DC01      [+] INLANEFREIGHT.LOCAL\rachel:e46b9e548fa0d122de7f59fb6d48eaa2 (Pwn3d!)

Ahora que entendemos las capacidades y la estructura de NTLM, examinemos la progresión del protocolo a través de NTLMv1 y NTLMv2.

Nota: Ni LANMAN ni NTLM utilizan un salt.


NTLMv1 (Net-NTLMv1)

El protocolo NTLM realiza un desafío/respuesta entre un servidor y un cliente utilizando el hash NT. NTLMv1 utiliza tanto el hash NT como el hash LM, lo que puede facilitar su "crackeo" offline después de capturar un hash utilizando una herramienta como Responder o mediante un ataque de relay NTLM (ambos están fuera del alcance de este módulo y se cubrirán en módulos posteriores sobre Lateral Movement). El protocolo se utiliza para la autenticación en red, y el hash Net-NTLMv1 en sí mismo se crea a partir de un algoritmo de desafío/respuesta. El servidor envía al cliente un número aleatorio de 8 bytes (desafío) y el cliente devuelve una respuesta de 24 bytes. Estos hashes NO se pueden utilizar para ataques pass-the-hash. El algoritmo es el siguiente:

V1 Challenge & Response Algorithm

C = 8-byte server challenge, random
K1 | K2 | K3 = LM/NT-hash | 5-bytes-0
response = DES

(K1,C) | DES(K2,C) | DES(K3,C)

Un ejemplo de un hash NTLMv1 completo se ve así:

NTLMv1 Hash Example

u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c

NTLMv1 fue el bloque de construcción para la autenticación NTLM moderna. Como cualquier protocolo, tiene fallas y es susceptible de ser crackeado y atacado de otras maneras. Ahora pasemos a NTLMv2 y veamos cómo mejora sobre la base que sentó la versión uno.


NTLMv2 (Net-NTLMv2)

El protocolo NTLMv2 se introdujo por primera vez en Windows NT 4.0 SP4 y se creó como una alternativa más fuerte a NTLMv1. Ha sido el predeterminado en Windows desde Server 2000. Está reforzado contra ciertos ataques de spoofing a los que NTLMv1 es susceptible. NTLMv2 envía dos respuestas al desafío de 8 bytes recibido por el servidor. Estas respuestas contienen un hash HMAC-MD5 de 16 bytes del desafío, un desafío generado aleatoriamente por el cliente y un hash HMAC-MD5 de las credenciales del usuario. Se envía una segunda respuesta, utilizando un desafío de cliente de longitud variable que incluye la hora actual, un valor aleatorio de 8 bytes y el nombre del dominio. El algoritmo es el siguiente:

V2 Challenge & Response Algorithm

SC = 8-byte server challenge, random
CC = 8-byte client challenge, random
CC* = (X, time, CC2, domain name)
v2-Hash = HMAC-MD5(NT-Hash, user name, domain name)
LMv2 = HMAC-MD5(v2-Hash, SC, CC)
NTv2 = HMAC-MD5(v2-Hash, SC, CC*)
response = LMv2 | CC | NTv2 | CC*

Un ejemplo de un hash NTLMv2 es:

NTLMv2 Hash Example

admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030

Podemos ver que los desarrolladores mejoraron la versión 1 haciendo que NTLMv2 sea más difícil de crackear y dándole un algoritmo más robusto compuesto de múltiples etapas. Tenemos un mecanismo de autenticación más que discutir antes de continuar. Este método es de interés para nosotros porque no requiere una conexión de red persistente para funcionar.


Domain Cached Credentials (MSCache2)

En un entorno de Active Directory, los métodos de autenticación mencionados en esta sección y la anterior requieren que el host al que estamos intentando acceder se comunique con el "cerebro" de la red, el Domain Controller. Microsoft desarrolló el algoritmo MS Cache v1 y v2 (también conocido como Domain Cached Credentials (DCC)) para resolver el posible problema de que un host unido al dominio no pueda comunicarse con un domain controller (por ejemplo, debido a una interrupción de la red u otro problema técnico) y, por lo tanto, la autenticación NTLM/Kerberos no funcione para acceder al host en cuestión. Los hosts guardan los últimos diez hashes de cualquier usuario del dominio que inicie sesión correctamente en la máquina en la clave de registro HKEY_LOCAL_MACHINE\SECURITY\Cache. Estos hashes no se pueden utilizar en ataques pass-the-hash. Además, el hash es muy lento de crackear con una herramienta como Hashcat, incluso cuando se utiliza una plataforma de cracking con GPU extremadamente potente, por lo que los intentos de crackear estos hashes suelen necesitar ser extremadamente dirigidos o depender de una contraseña muy débil en uso. Estos hashes pueden ser obtenidos por un atacante o pentester después de obtener acceso de administrador local a un host y tienen el siguiente formato: $DCC2$10240#bjones#e4e938d12fe5974dc42a90120bd9c90f. Es vital que, como penetration testers, entendamos los diversos tipos de hashes que podemos encontrar al evaluar un entorno de Active Directory, sus fortalezas, debilidades, cómo pueden ser abusados (crackeo a texto claro, pass-the-hash o relay), y cuándo un ataque puede ser inútil (por ejemplo, pasar días intentando crackear un conjunto de Domain Cached Credentials).


Moving On

Ahora que hemos cubierto los protocolos de autenticación y los hashes de contraseñas asociados, veamos los usuarios y grupos en Active Directory, que suelen ser el objetivo más importante para penetration testers y atacantes por igual. Estos pueden tener privilegios variados y ser utilizados para moverse lateralmente en un entorno o ganar acceso a recursos protegidos.