September 27, 2025

NTLM

Протокол NTLM — это протокол аутентификации, используемый в средах Microsoft. В частности, он позволяет пользователю подтвердить свою личность на сервере для того, чтобы воспользоваться сервисом, предлагаемым этим сервером.

Здесь возможны два сценария:

  • Local account. Либо пользователь использует учетные данные локальной учетной записи сервера, в этом случае сервер имеет ключ пользователя в своей локальной базе данных и сможет аутентифицировать пользователя;
  • Domain account. Либо в среде Active Directory пользователь использует при аутентификации учетную запись домена, и в этом случае серверу придется обратиться к контроллеру домена для проверки информации, предоставленной пользователем.
    В обоих случаях аутентификация начинается с фазы вызова/ответа между клиентом и сервером.

Challenge - Response (основной принцип)

Принцип Challenge - Response ("вызов/ответ") используется для того, чтобы сервер проверял, знает ли пользователь ключ учетной записи, с которой он аутентифицируется, не передавая пароль по сети.

В криптографии называется доказательством с нулевым знанием (zero-knowledge proof).

В этом обмене есть три этапа:

  1. Negotiation : Клиент сообщает серверу, что он хочет аутентифицироваться на нем (NEGOTIATE_MESSAGE).
  2. Challenge : Сервер посылает клиенту вызов. Это не что иное, как 64-битное случайное значение, которое изменяется при каждом запросе аутентификации (CHALLENGE_MESSAGE).
  3. Authenticate : Клиент шифрует полученный ранее вызов, используя в качестве ключа хешированную версию своего пароля, и возвращает серверу эту зашифрованную версию, а также свое имя пользователя и, возможно, свой домен (AUTHENTICATE_MESSAGE).

Клиент использует в качестве ключа хешированную версию своего пароля это нужно для того, чтобы не хранить на сервере пароли пользователей открытым текстом. Вместо этого хранится хэш пароля.

Этот хэш является NT-хэшем, который представляет собой не что иное, как результат работы функции MD4, без соли, без ничего.

NThash = MD4(password) = RC4(password)

Local account:

  1. Сервер посылает вызов Challenge
  2. Клиент шифрует этот вызов хэшем своего пароля и затем отправляет его обратно на сервер вместе с именем пользователя
  3. Сервер ищет хэш пароля пользователя в своей базе данных SAM.
  4. Получив его, он также зашифрует ранее посланный вызов (1) с помощью этого хэша
  5. Сравнит свой результат с тем, который вернул пользователь. Если они совпадают, то пользователь аутентифицирован! В противном случае пользователь не указал правильный пароль.
Local account authentication

Domain account:

  1. Как и раньше, сервер посылает вызов Challenge
  2. Клиент jsnow шифрует этот вызов хэшем своего пароля и отправляет его обратно на сервер вместе с именем пользователя и именем домена.
  3. Сервер отправляет информацию (открытый Challenge + шифрованный клиентом Challenge + имя пользователя и имя домена) контроллеру домена по защищенному каналу с помощью службы Netlogon.
  4. Получив эту информацию, контроллер домена также зашифрует вызов, используя хэш пользователя, находящийся в его базе данных NTDS.DIT
  5. Контроллер домена сможет сравнить свой результат с тем, который вернул пользователь. Если они совпадают, то пользователь аутентифицирован.В противном случае пользователь не указал правильный пароль.
  6. В обоих случаях контроллер домена передает информацию на сервер.
Domain account authentication