NTLM
Протокол NTLM — это протокол аутентификации, используемый в средах Microsoft. В частности, он позволяет пользователю подтвердить свою личность на сервере для того, чтобы воспользоваться сервисом, предлагаемым этим сервером.
- Local account. Либо пользователь использует учетные данные локальной учетной записи сервера, в этом случае сервер имеет ключ пользователя в своей локальной базе данных и сможет аутентифицировать пользователя;
- Domain account. Либо в среде Active Directory пользователь использует при аутентификации учетную запись домена, и в этом случае серверу придется обратиться к контроллеру домена для проверки информации, предоставленной пользователем.
В обоих случаях аутентификация начинается с фазы вызова/ответа между клиентом и сервером.
Challenge - Response (основной принцип)
Принцип Challenge - Response ("вызов/ответ") используется для того, чтобы сервер проверял, знает ли пользователь ключ учетной записи, с которой он аутентифицируется, не передавая пароль по сети.
В криптографии называется доказательством с нулевым знанием (zero-knowledge proof).
- Negotiation : Клиент сообщает серверу, что он хочет аутентифицироваться на нем (NEGOTIATE_MESSAGE).
- Challenge : Сервер посылает клиенту вызов. Это не что иное, как 64-битное случайное значение, которое изменяется при каждом запросе аутентификации (CHALLENGE_MESSAGE).
- Authenticate : Клиент шифрует полученный ранее вызов, используя в качестве ключа хешированную версию своего пароля, и возвращает серверу эту зашифрованную версию, а также свое имя пользователя и, возможно, свой домен (AUTHENTICATE_MESSAGE).
Клиент использует в качестве ключа хешированную версию своего пароля это нужно для того, чтобы не хранить на сервере пароли пользователей открытым текстом. Вместо этого хранится хэш пароля.
Этот хэш является NT-хэшем, который представляет собой не что иное, как результат работы функции MD4, без соли, без ничего.
NThash = MD4(password) = RC4(password)
Local account:
- Сервер посылает вызов Challenge
- Клиент шифрует этот вызов хэшем своего пароля и затем отправляет его обратно на сервер вместе с именем пользователя
- Сервер ищет хэш пароля пользователя в своей базе данных SAM.
- Получив его, он также зашифрует ранее посланный вызов (1) с помощью этого хэша
- Сравнит свой результат с тем, который вернул пользователь. Если они совпадают, то пользователь аутентифицирован! В противном случае пользователь не указал правильный пароль.
Domain account:
- Как и раньше, сервер посылает вызов Challenge
- Клиент jsnow шифрует этот вызов хэшем своего пароля и отправляет его обратно на сервер вместе с именем пользователя и именем домена.
- Сервер отправляет информацию (открытый Challenge + шифрованный клиентом Challenge + имя пользователя и имя домена) контроллеру домена по защищенному каналу с помощью службы Netlogon.
- Получив эту информацию, контроллер домена также зашифрует вызов, используя хэш пользователя, находящийся в его базе данных NTDS.DIT
- Контроллер домена сможет сравнить свой результат с тем, который вернул пользователь. Если они совпадают, то пользователь аутентифицирован.В противном случае пользователь не указал правильный пароль.
- В обоих случаях контроллер домена передает информацию на сервер.