NTLM
| Fiche express | |
|---|---|
| Type | Protocole d'authentification challenge/réponse (Windows) |
| Versions | NTLMv1, NTLMv2 |
| Stockage | Base SAM |
| Successeur | Kerberos (par défaut depuis Windows 2000) |
| Prédécesseur | LM |
NTLM (NT LAN Manager) est un protocole d'authentification Windows de type challenge/réponse. Il regroupe deux méthodes, NTLMv1 et NTLMv2, cette dernière améliorant l'authentification LM historique. Ces protocoles utilisent différentes méthodes de hachage pour sécuriser le stockage des mots de passe dans la base SAM.
À partir de Windows 2000, le protocole par défaut d'un domaine est Kerberos, NTLM restant disponible en repli.
Comparatif LM / NTLMv1 / NTLMv2
| Attribut | LM | NTLMv1 | NTLMv2 |
|---|---|---|---|
| Mot de passe sensible à la casse | Non | Oui | Oui |
| Longueur de la clé de hash | 56b + 56b | - | - |
| Algorithme de hachage | DES (ECB) | MD4 | MD5 |
| Longueur de la valeur de hash | 64b + 64b | 128 bits | 128 bits |
| Longueur de clé challenge/réponse | 56 + 56 + 16 bits | 56 + 56 + 16 bits | 128 bits |
| Algorithme challenge/réponse | DES (ECB) | DES (ECB) | HMAC-MD5 |
| Longueur de valeur challenge/réponse | 64 + 64 + 64 b | 64 + 64 + 64 b | 128 bits |
Format du hash
Administrateur:500:aad3b435b514746eaad3b435b51404ee:31d6579416ae931b73c59d7e0c089c0:::
Un hash commençant par aad3b435 correspond à un mot de passe vide ou nul. Une autre
forme possible :
Administrateur:500:NOPASSWD:ntlmhash
Le mot de passe stocké se décompose en :
- Les 8 premiers octets, dérivés des 7 premiers caractères du mot de passe (hachage LM).
- Les 8 derniers octets, dérivés du mot de passe (hachage NT, en little-endian).
Cas d'usage de NTLM
NTLM est utilisé plutôt que Kerberos lorsque :
- le client s'authentifie auprès d'un serveur en utilisant une adresse IP ;
- le client s'authentifie auprès d'un serveur d'une autre forêt Active Directory reliée par une approbation NTLM héritée (et non une approbation inter-forêts) ;
- le client s'authentifie auprès d'un serveur hors domaine ;
- il n'y a pas d'Active Directory.
- NB : après Vista, LM et NTLMv1 restent utilisés pour les authentifications internes ; les authentifications externes passent par défaut sur NTLMv2.
Déroulement du protocole
NTLM est un protocole challenge/réponse en trois messages :
Client --(demande)--> Serveur
Serveur --(défi, basé sur son ID)--> Client
Client --(message d'authentification)--> Serveur
La communication s'appuie sur les valeurs du mot de passe haché, stockées côté serveur.
NTLMv1
Client --(demande)--> Serveur
Serveur --(défi)--> Client
Envoi d'un nombre de 8 octets, haché par la chaîne secrète du client.
Client --(message d'authentification)--> Serveur
Les deux hashs produisent un résultat de 16 octets. On ajoute 5 octets
de zéros pour atteindre 21. On sépare ces 21 octets en 3 blocs de 7 octets
(56 bits). Chaque bloc sert de clé pour chiffrer le défi en DES 64 bits.
Les résultats combinés forment une réponse de 24 octets, renvoyée au serveur.
C = 8 octets, défi aléatoire serveur
K1 | K2 | K3 = NT-Hash | 5-octets-0
R1 = DES(K1, C) | DES(K2, C) | DES(K3, C)
K1 | K2 | K3 = LM-Hash | 5-octets-0
R2 = DES(K1, C) | DES(K2, C) | DES(K3, C)
answer = R1 | R2
NTLMv2
À partir de NT4, NTLMv2 s'appuie sur un hash HMAC-MD5 de 128 bits (16 octets) :
NTLMv2 Hash = HMAC-MD5(NT Hash, uppercase(username) + target)
LMv2 Goodies = HMAC-MD5(NTLMv2 Hash, challenge + 8-byte client nonce)
LMv2 Response = LMv2 Goodies + 8-byte client nonce
Client --(demande)--> Serveur
Serveur --(défi/challenge)--> Client
NTLMv2 Hash = HMAC-MD5(NT Hash, uppercase(username) + target)
NTLMv2 Goodies = HMAC-MD5(NTLMv2 Hash, challenge + blob)
NTLMv2 Response = NTLMv2 Goodies + blob
Client --(message d'authentification)--> Serveur
NTLM2 Session Key = 8-byte client nonce + 16-byte server challenge
NTLM2 Session Hash = (MD5(NTLM2 Session Key))[0-7]
NTLM2 Response = DES(NTLM2 Session Hash[0-6], NTLM2 Session Hash) +
DES(NTLM2 Session Hash[7-13], NTLM2 Session Hash) +
DES((NTLM2 Session Hash[14-15] + 5 * NULL), NTLM2 Session Hash)
Autre notation :
SC = 8 octets, défi aléatoire serveur
CC = 8 octets, épreuve client aléatoire
CC* = (X, temps, CC, nom de domaine)
v2-Hash = HMAC-MD5(NT-Hash, nom d'utilisateur, nom de domaine)
LMv2 = HMAC-MD5(v2-Hash, SC, CC)
NTv2 = HMAC-MD5(v2-Hash, SC, CC*)
answer = LMv2 | CC | NTv2 | CC*
Récupération de hashs (contexte pentest)
Extraction depuis la base Active Directory (NTDS.DIT). Après récupération du fichier,
l'exploiter avec libesedb puis NTDSExtract :
# %SystemRoot%\ntds\NTDS.DIT
cd /mnt/windows/WINDOWS/system32/config/
cp SYSTEM ntds/NTDS.DIT /pentest/
esedbexport -l /tmp/esedbexport.log /pentest/ntds.dit
python dsusers.py /pentest/ntds.dit.export/datatable.3 \
/pentest/ntds.dit.export/link_table.5 \
--passwordhashes SYSTEM --passwordhistory SYSTEM \
--certificates --supplcreds SYSTEM \
--membership > /tmp/ntds.dit.output
python ntdstopwdump.py /tmp/ntds.dit.output
Récupération depuis le cache mémoire (Windows Credentials Editor) :
./wce.exe -w
Voir aussi
- LM — format de hachage historique amélioré par NTLM
- Kerberos — protocole par défaut des domaines AD
- SAM — base de stockage des mots de passe locaux
- Ntlm — authentification NTLM côté Linux (winbind / samba)
- NTLM challenge/response (smallsec.ca)
- The NTLM Authentication Protocol (davenport)