NTLMv2 (NTLM версии 2) — встроенный в операционные системы семейства Microsoft Windows протокол сетевой аутентификации. Широко применяется в различных сервисах на их базе. Изначально был предназначен для повышения безопасности аутентификации путём замены устаревших LM и NTLM v1. NTLMv2 был введён начиная с Windows NT 4.0 SP4 и используется версиями Microsoft Windows вплоть до Windows 10 включительно. С самого изобретения протоколы NTLMv1 и NTLMv2 подвергались множеству нападений и демонстрировали широкий спектр серьёзных уязвимостей.
Схема аутентификации
В схеме аутентификации, реализованной при помощи SMB или SMB2 сообщений, вне зависимости от того, какой вид диалекта аутентификации будет использован (LM, LMv2, NTLM, NTLM2, NTLMv2), процесс аутентификации происходит следующим образом:
Клиент пытается установить соединение с сервером и посылает запрос, в котором информирует сервер, на каких диалектах он способен произвести аутентификации, например: LM, NTLM, NTLM2, NTLMv2. Следовательно, диалект аутентификации LMv2 между клиентом и сервером исключается. Сервер из полученного от клиента списка диалектов (по умолчанию) выбирает наиболее защищённый диалект (например, NTLMv2), затем отправляет ответ клиенту. Клиент, определившись с диалектом аутентификации, пытается получить доступ к серверу и посылает запрос NEGOTIATE_MESSAGE. Сервер получает запрос от клиента и посылает ему ответ CHALLENGE_MESSAGE, в котором содержится случайная (random) последовательность из 8 байт. Она называется Server Challenge. Клиент, получив от сервера последовательность Server Challenge, при помощи своего пароля производит шифрование этой последовательности, а затем посылает серверу ответ AUTHENTICATE_MESSAGE, который содержит 24 байта. Сервер, получив ответ, производит ту же операцию шифрования последовательности Server Challenge, которую произвёл клиент. Затем, сравнив свои результаты с ответом от клиента, на основании совпадения разрешает или запрещает доступ. Эволюция алгоритмов аутентификации LM и NTLM
LM
Пароль пользователя, в виде OEM-строки, преобразуется в верхний регистр. Например, пароль «SecREt01», тогда получается OEM строка: 0x5345435245543031 Если пароль меньше 14 символов, он дополняется нулями до 14 байт: 0x5345435245543031000000000000 Полученная последовательность из 14 байт делится на две половины по 7 байт: 0x53454352455430 и 0x31000000000000 Каждая из половин, состоящая из 7 байт, используется для создания двух DES-ключей, состоящих из 8 байт: 0x52a2516b252a5161 и 0x3180010101010101 Используя алгоритм DES и ASCII строку «KGS!@#$%», а также сформированные ранее два DES-ключа, вычисляются два hash-значения, каждое по 8 байт: 0xff3750bcc2b22412 и 0xc2265b23734e0dac Hash-значения из 8 байт объединяются в последовательность из 16 байт, формируя LM-hash: 0xff3750bcc2b22412c2265b23734e0dac LM-hash из 16 байт дополняется нулями до 21 байта: 0xff3750bcc2b22412c2265b23734e0dac0000000000 Последовательность из 21 байта делится на три части по 7 байт: 0xff3750bcc2b224, 0x12c2265b23734e и 0x0dac0000000000 Каждая из частей используется для создания трёх DES-ключей: 0xfe9bd516cd15c849, 0x136189cbb31acd9d и 0x0dd6010101010101 Используя алгоритм DES и Server Challenge, а также сформированные ранее три DES-ключа, вычисляются три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаются: 0xc337cd5cbd44fc97, 82a667af6d427c6d и e67c20c2d3e77c56 Hash-значения из 8 байт объединяются в последовательность из 24 байт. Эта последовательность и есть LM Response: 0xc337cd5cbd44fc9782a667af6d427c6de67c20c2d3e77c56 LMv2
Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляется NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4 будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808 Имя пользователя и имя домена в виде Unicode строк, объединяются и приводятся к верхнему регистру. Далее из этой последовательности и ранее полученного NTLM-hash при помощи алгоритма HMAC-MD5 вычисляется NTLMv2-hash, состоящий из 16 байт. Например, имя пользователя «User» и имя домена «Domain» дадут строку «USERDOMAIN» или Unicode строку 0x550053004500520044004f004d00410049004e00. После алгоритма HMAC-MD5, где применяется NTLM-hash, вычисляется NTLMv2-hash : 0x04b8e0ba74289cc540826bab1dee63ae. Формируется последовательность Client Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344 Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаем: 0x0123456789abcdefffffff0011223344 Из последовательности Server Challenge и Client Challenge и ранее вычисленного NTLMv2-hash при помощи алгоритма HMAC-MD5 вычисляется hash-значение, состоящее из 16 байт: 0xd6e6152ea25d03b7c6ba6629c2d6aaf0 Hash-значение объединяется с Client Challenge в последовательность из 24 байт. Эта последовательность и есть LMv2 Response: 0xd6e6152ea25d03b7c6ba6629c2d6aaf0ffffff0011223344 NTLM
Из пароля пользователя в виде Unicode строки при помощи алгоритма MD4 вычисляется NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4 будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808 NTLM-hash из 16 байт дополняется нулями до 21 байта: 0xcd06ca7c7e10c99b1d33b7485a2ed8080000000000 Последовательность из 21 байта делится на три части по 7 байт.0xcd06ca7c7e10c9, 0x9b1d33b7485a2e и 0xd8080000000000 Каждая из частей, состоящая из 7 байт, используется для создания трёх DES-ключей, состоящих из 8 байт: 0xcd83b34fc7f14392, 0x9b8f4c767543685d и 0xd904010101010101 Используя алгоритм DES и Server Challenge, а также сформированные ранее три DES-ключа, вычисляются три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получается: 0x25a98c1c31e81847, 0x466b29b2df4680f3 и 0x9958fb8c213a9cc6 Нash-значения из 8 байт объединяются в последовательность из 24 байт. Эта последовательность и есть NTLM Response: 0x25a98c1c31e81847466b29b2df4680f39958fb8c213a9cc6 NTLM2
Формируется последовательность Client Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344 Client Challenge дополняется нулями до 21 байта. Эта последовательность и есть LMv2 Response: 0xffffff001122334400000000000000000000000000000000 Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получается: 0x0123456789abcdefffffff0011223344 Из полученной последовательности при помощи алгоритма MD5 вычисляется следующее hash-значение, состоящее из 16 байт: 0xbeac9a1bc5a9867c15192b3105d5beb1 Отсекаются первые 8 байт от полученного ранее hash-значения: 0xbeac9a1bc5a9867c Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляется NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4 будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808 NTLM-hash из 16 байт дополняется нулями до 21 байта: 0xcd06ca7c7e10c99b1d33b7485a2ed8080000000000 Последовательность из 21 байта делится на три части по 7 байт.0xcd06ca7c7e10c9, 0x9b1d33b7485a2e и 0xd8080000000000 Каждая из частей, состоящая из 7 байт, используется для создания трёх DES-ключей, состоящих из 8 байт: 0xcd83b34fc7f14392, 0x9b8f4c767543685d и 0xd904010101010101 Используя алгоритм DES и отсечённую часть hash-значения, а также сформированные ранее три DES-ключа, вычисляются три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получается: 0x10d550832d12b2cc, 0xb79d5ad1f4eed3df и 0x82aca4c3681dd455 Нash-значения из 8 байт объединяются в последовательность из 24 байт. Эта последовательность и есть NTLM2 Response: 0x10d550832d12b2ccb79d5ad1f4eed3df82aca4c3681dd455 NTLMv2
Из пароля пользователя в виде Unicode строки при помощи алгоритма MD4 вычисляется NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4 будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808 Имя пользователя и имя домена в виде Unicode строк объединяются и приводятся к верхнему регистру. Далее, из этой последовательности и ранее полученного NTLM-hash при помощи алгоритма HMAC-MD5 вычисляется NTLMv2-hash, состоящий из 16 байт. Например, имя пользователя «User» и имя домена «Domain» дадут строку «USERDOMAIN» или Unicode строку 0x550053004500520044004f004d00410049004e00. После алгоритма HMAC-MD5, где применяется NTLM-hash, вычисляется NTLMv2-hash : 0x04b8e0ba74289cc540826bab1dee63ae Формируется последовательность Client Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344 Формируется blob, например: 0x01010000 — the blob signature, 0x00000000 — reserved value, 0x0090d336b734c301 — timestamp, 0xffffff0011223344 — a random Client challenge, 0x00000000 — unknown, 0x02000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d0000000000 — target information block, 0x00000000 — unknown Server Challenge и blob объединяются в последовательность, из которой при помощи алгоритма HMAC-MD5 и ранее вычисленного NTLMv2-hash вычисляется hash-значение, состоящие из 16 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получается следующая последовательность: 0x0123456789abcdef01010000000000000090d336b734c301ffffff00112233440000000002000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d000000000000000000. После использования алгоритма HMAC-MD5 получается следующее hash-значение: 0xcbabbca713eb795d04c97abc01ee4983 Нash-значения из 16 байт объединяются с blob в последовательность. Эта последовательность и есть NTLMv2 Response: 0xcbabbca713eb795d04c97abc01ee498301010000000000000090d336b734c301ffffff00112233440000000002000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d000000000000000000 Уязвимости
Прослушивание сетевого трафика
Прослушивая сетевой трафик, можно перехватить SMB пакеты аутентификации, тем самым завладев последовательностью Server Challenge и ответом Response от клиента. Имея эти два параметра, несмотря на способ аутентификации (даже при NTLMv2), возможно, при помощи современного программного обеспечения (при условии не сложного пароля, допустим: «12345») в течение нескольких часов подобрать пароль клиента. Но если способом аутентификации является NTLMv2 и пароль клиента содержит прописные, заглавные, строчные буквы, цифры, а также специальные символы, то на взлом такого пароля могут уйти многие годы.
Подмена сервера
Вывести из строя сервер, к которому клиент желает получить доступ. Для этого можно воспользоваться самой примитивной DDoS-атакой. Назначить компьютеру, с которого будет произведена атака, все параметры сервера, то есть имя сервера, IP-адрес сервера и MAC-адрес сервера. Это необходимо для того, чтобы клиент, обращаясь к серверу, произвел попытку подключения к компьютеру, с которого будет произведена атака. На запрос клиента о выборе диалекта аутентификации, компьютер, с которого будет произведена атака, должен будет выбрать самый небезопасный диалект, а именно LM (или более защищённый NTLM). В результате чего компьютер, с которого проводилась атака, получит LM Response (ответ). Злоумышленник, имея последовательность Server Challenge и LM Response, время взлома пароля прямым перебором (Bruteforce атака) займёт всего несколько часов. Подмена пакетов аутентификации
Этот способ мало чем отличается от подмены сервера. Сервер, при помощи специального программного обеспечения или изменения настроек локальной политики безопасности, выбирает наиболее незащищённый вид диалекта аутентификации.
Профилактика успешных атак
Пароли
При выборе пароля клиент должен руководствоваться следующими правилами:
- Пароль должен содержать как можно больше символов;
- Пароль должен содержать буквы, цифры и другие символы;
- Пароли для всех важных аккаунтов должны быть уникальные.
Настройка политики безопасности Windows
Запустите «Панель управления» и откройте раздел «Администрирование → Локальная политика безопасности → Локальные политики → Параметры безопасности» (Administrative Tools → Local Security Policy → Local Policies → Security Options). В этом разделе найдите политику «Сетевая безопасность: уровень проверки подлинности LAN Manager». Из раскрывающегося списка необходимо выбрать параметр «Отправлять только NTLMv2-ответ. Отказывать LM и NTLM»
Окно параметров безопасности Windows
Примеры