Authentification NTLM

Dans un précédent article nous avons parlé du protocole Kerberos. Par la suite je vous avais montré comment exploiter ce protocole en phase de pentest. Aujourd’hui, on va s’attaquer à son « petit frère » NTLM !

Alors pourquoi « petit frère » ? Eh bien parce que Kerberos a été implémenté après NTLM afin de mieux sécuriser la phase d’authentification. Cependant NTLM et Kerberos coexiste toujours sur un environnement Active Directory. Les deux sont utilisables.

Même si par défaut c’est Kerberos qui est utilisé pour l’authentification, NTLM est toujours utilisable dans le cas ou le client souhaite se connecter à un serveur en utilisant une adresse IP ou encore quand Kerberos n’est pas utilisable (firewall qui bloque le port 88 par exemple).

Il est donc intéressant de comprendre comment ce protocole fonctionne et ce qu’il est possible de faire avec !

NTLM (New Technology Lan Manager) est un protocole qui fonctionne sur le principe du challenge/response. La première étape de l’authentification consiste en un envoi d’un nom de domaine, d’un nom d’utilisateur et d’un mot de passe. Ces informations sont récupérées lors de la phase de login sur une session Windows.

Le client va de suite créer un hash à partir du mot de passe spécifié qu’il va stocker en mémoire. Le mot de passe en clair sera détruit dans la foulé. Puis le client va envoyer le nom d’utilisateur au serveur :

ntlm1.png

Par la suite, le serveur va envoyer un nonce (un nombre aléatoire) de 16 bits au client :

ntlm2.png

Le client, quant il va recevoir le nonce va le chiffrer à l’aide du hash qu’il a généré au préalable à partir du mot de passe de l’utilisateur. Puis l’envoyer au serveur :

ntlm3.png

La partie un peu tricky ici est que le serveur connaît le mot de passe de l’utilisateur (puisqu’il est stocké dans l’Active Directory). Donc il peut créer le même hash que celui qui a été créé par le client à l’étape une. Quand il réceptionnera le nonce chiffré, il pourra donc le déchiffrer et vérifier que le nonce qu’il a correspond bien à celui qu’il a envoyé !

ntlm4.png

Si les deux nonce sont identiques alors l’authentification a réussi et on donne accès au réseau au client :

ntlm5.png

Vous êtes connectés ! Alors attention, ici j’ai simulé une connexion au DC. En réalité, si vous tentez de vous connecter à un service alors le client va envoyer son nonce chiffré au serveur qui va le transférer au DC. Et ensuite il y aura la comparaison.

Comme nous l’avons vu, aucun mot de passe n’est transmis en clair sur le réseau et aucun mot de passe n’est stocké en clair sur la machine. Tout semble être parfait right ?!