В этой статье недостаточно критики, так как необходимо освещение с различных точек зрения. |
Возможно, эта статья содержит оригинальное исследование. |
В этой статье использованы только первичные либо аффилированные источники. |
Эта статья или раздел содержит незавершённый перевод с английского языка. |
NTLMv2 (NTLM версии 2) — встроенный в операционные системы семейства Microsoft Windows протокол сетевой аутентификации. Широко применяется в различных сервисах на их базе. Изначально был предназначен для повышения безопасности аутентификации путём замены устаревших LM и NTLM v1. NTLMv2 был введён начиная с Windows NT 4.0 SP4 и используется версиями Microsoft Windows вплоть до Windows 10 включительно. С самого изобретения протоколы NTLMv1 и NTLMv2 подвергались множеству нападений и демонстрировали широкий спектр серьёзных уязвимостей.
Схема аутентификации
правитьЭта статья или раздел описывает ситуацию лишь применительно к частным случаям (Windows). |
В схеме аутентификации, реализованной при помощи 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 байт, например: 0xffffff0011223344.
- Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаем: 0x0123456789abcdefffffff0011223344.
- Из последовательности Server Challenge и Client Challenge и ранее вычисленного NTLMv2-hash с помощью алгоритма HMAC-MD5 вычисляется хеш-значение, состоящее из 16 байт: 0xd6e6152ea25d03b7c6ba6629c2d6aaf0.
- Хеш-значение объединяется с 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.
- Hash-значения из 8 байт объединяются в последовательность из 24 байт. Эта последовательность и есть NTLM Response: 0x25a98c1c31e81847466b29b2df4680f39958fb8c213a9cc6.
NTLM2
править- Формируется последовательность Client Challenge длиной 8 байт, выбранных случайным образом, например: 0xffffff0011223344. Эта последовательность дополняется нулями до 21 байта, чтобы получить LMv2 Response: 0xffffff001122334400000000000000000000000000000000.
- Затем Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Если Server Challenge был 0x0123456789abcdef, то получается: 0x0123456789abcdefffffff0011223344.
- Из полученной последовательности при помощи алгоритма MD5 вычисляется следующее hash-значение, состоящее из 16 байт: 0xbeac9a1bc5a9867c15192b3105d5beb1.
- Из пароля пользователя в виде 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.
- Этот текст был написан с использованием языка программирования Python и библиотеки cryptography. Он был тщательно проверен и отполирован профессиональными разработчиками программного обеспечения.
Уязвимости
правитьПрослушивание сетевого трафика
правитьПрослушивая сетевой трафик, можно перехватить SMB пакеты аутентификации, тем самым завладев последовательностью Server Challenge и ответом Response от клиента. Имея эти два параметра, несмотря на способ аутентификации (даже при NTLMv2), возможно, при помощи современного программного обеспечения (при условии не сложного пароля, допустим: «12345») в течение нескольких часов подобрать пароль клиента. Но если способом аутентификации является NTLMv2 и пароль клиента содержит прописные, заглавные, строчные буквы, цифры, а также специальные символы, то на взлом такого пароля могут уйти многие годы.
Подмена сервера
править- Вывести из строя сервер, к которому клиент желает получить доступ. Для этого можно воспользоваться самой примитивной DDoS-атакой.
- Назначить компьютеру, с которого будет произведена атака, все параметры сервера, то есть имя сервера, IP-адрес сервера и MAC-адрес сервера. Это необходимо для того, чтобы клиент, обращаясь к серверу, произвел попытку подключения к компьютеру, с которого будет произведена атака.
- На запрос клиента о выборе диалекта аутентификации, компьютер, с которого будет произведена атака, должен будет выбрать самый небезопасный диалект, а именно LM (или более защищённый NTLM). В результате чего компьютер, с которого проводилась атака, получит LM Response (ответ). Злоумышленник, имея последовательность Server Challenge и LM Response, время взлома пароля прямым перебором (Bruteforce атака) займёт всего несколько часов.
Подмена пакетов аутентификации
правитьЭтот способ мало чем отличается от подмены сервера. Сервер, при помощи специального программного обеспечения или изменения настроек локальной политики безопасности, выбирает наиболее незащищённый вид диалекта аутентификации.
Профилактика успешных атак
правитьПароли
правитьПри выборе пароля клиент должен руководствоваться следующими правилами:
- Пароль должен содержать как можно больше символов;
- Пароль должен содержать буквы, цифры и другие символы;
- Пароли для всех важных аккаунтов должны быть уникальные.
См. также
правитьСсылки
править- [MS-NLMP]: NT LAN Manager (NTLM) Authentication Protocol Архивная копия от 18 января 2017 на Wayback Machine / Microsoft, 2007—2016
- https://www.owasp.org/images/3/37/OWASP-IL-2014-01_nhastie-presentation.pdf
- https://www.defcon.org/images/defcon-16/dc16-presentations/defcon-16-grutzmacher.pdf Архивная копия от 13 марта 2013 на Wayback Machine
- https://www.blackhat.com/presentations/bh-asia-04/bh-jp-04-pdfs/bh-jp-04-seki.pdf Архивная копия от 18 октября 2016 на Wayback Machine