NTLMv2

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

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), процесс аутентификации происходит следующим образом:

  1. Клиент, пытается установить соединение с сервером и посылает запрос, в котором информирует сервер, на каких диалектах он способен произвести аутентификации, например: LM, NTLM, NTLM2, NTLMv2. Следовательно, диалект аутентификации LMv2 между клиентом и сервером исключаются.
  2. Сервер, из полученного от клиента списка диалектов, (по умолчанию) выбирает наиболее защищённый диалект (например, NTLMv2), затем отправляет ответ клиенту.
  3. Клиент, определившись с диалектом аутентификации, пытается получить доступ к серверу и посылает запрос NEGOTIATE_MESSAGE.
  4. Сервер, получает запрос от клиента и посылает ему ответ CHALLENGE_MESSAGE, в котором, содержится случайная (random) последовательности из 8 байт, она называется Server Challenge.
  5. Клиент, поучив от сервера последовательность Server Challenge, при помощи своего пароля производит шифрование этой последовательности, а затем посылает серверу ответ AUTHENTICATE_MESSAGE, который содержит 24 байта.
  6. Сервер, получив ответ, производит туже операцию шифрования последовательности Server Challenge, которую произвел клиент, а затем сравнив свои результаты с ответом от клиента на основании совпадения, разрешает или запрещает доступ.


Эволюция алгоритмов аутентификации LM и NTLM[править | править вики-текст]

LM[править | править вики-текст]

  1. Пароль пользователя, в виде OEM-строки[что?], преобразуем в верхний регистр. Например, пароль «SecREt01» тогда получаем OEM строку: 0x5345435245543031
  2. Если пароль меньше 14 символов, он дополняется нулями до 14 байт: 0x5345435245543031000000000000
  3. Полученная последовательность из 14 байт делится на две половины по 7 байт: 0x53454352455430 и 0x31000000000000
  4. Каждая из половин, состоящая из 7 байт, используется для создания двух DES-ключей, состоящих из 8 байт: 0x52a2516b252a5161 и 0x3180010101010101
  5. Используя алгоритм DES и ASCII строку «KGS!@#$%», а также сформированные ранее два DES-ключа, вычисляется два hash-значения, каждое по 8 байт: 0xff3750bcc2b22412 и 0xc2265b23734e0dac
  6. Hash-значения из 8 байт объединяются в последовательность из 16 байт, формируя, тем самым LM-hash: 0xff3750bcc2b22412c2265b23734e0dac
  7. LM-hash из 16 байт дополняется нулями до 21 байта: 0xff3750bcc2b22412c2265b23734e0dac0000000000
  8. Последовательность из 21 байта делится на три части по 7 байт: 0xff3750bcc2b224, 0x12c2265b23734e и 0x0dac0000000000
  9. Каждая из частей используется для создания трех DES-ключей: 0xfe9bd516cd15c849, 0x136189cbb31acd9d и 0x0dd6010101010101
  10. Используя алгоритма DES и Server Challenge, а также сформированные ранее три DES-ключа, вычисляется три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаем: 0xc337cd5cbd44fc97, 82a667af6d427c6d и e67c20c2d3e77c56
  11. Hash-значения из 8 байт обедняются в последовательность из 24 байт. Эта последовательность и есть LM Response: 0xc337cd5cbd44fc9782a667af6d427c6de67c20c2d3e77c56

LMv2[править | править вики-текст]

  1. Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляем NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4, будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808
  2. Имя пользователя и имя домена в виде Unicode строк, объединяются и приводятся к верхнему регистру. Далее из этой последовательности и ранее полученного NTLM-hash при помощи алгоритма HMAC-MD5 вычисляется NTLMv2-hash, состоящий из 16 байт. Например, имя пользователя «User» и имя домена «Domain» дадут строку «USERDOMAIN» или Unicode строку 0x550053004500520044004f004d00410049004e00 после алгоритма HMAC-MD5 где применяется NTLM-hash вычисляется NTLMv2-hash : 0x04b8e0ba74289cc540826bab1dee63ae.
  3. Формируется последовательность Client Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344
  4. Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Например, если Server Challenge был 0x0123456789abcdef тогда получаем: 0x0123456789abcdefffffff0011223344
  5. Из последовательности Server Challenge и Client Challenge и ранее вычисленного NTLMv2-hash при помощи алгоритма HMAC-MD5, вычисляется hash-значение, состоящие из 16 байт: 0xd6e6152ea25d03b7c6ba6629c2d6aaf0
  6. Hash-значение объединяется с Clinet Challenge в последовательность из 24 байт. Эта последовательность и есть LMv2 Response: 0xd6e6152ea25d03b7c6ba6629c2d6aaf0ffffff0011223344

NTLM[править | править вики-текст]

  1. Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляем NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4, будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808
  2. NTLM-hash из 16 байт дополняется нулями до 21 байта: 0xcd06ca7c7e10c99b1d33b7485a2ed8080000000000
  3. Последовательность из 21 байта делится на три части по 7 байт.0xcd06ca7c7e10c9, 0x9b1d33b7485a2e и 0xd8080000000000
  4. Каждая из частей, состоящая из 7 байт, используется для создания трех DES-ключей, состоящих из 8 байт: 0xcd83b34fc7f14392, 0x9b8f4c767543685d и 0xd904010101010101
  5. Используя алгоритм DES и Server Challenge, а также сформированные ранее три DES-ключа, вычисляется три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаем: 0x25a98c1c31e81847, 0x466b29b2df4680f3 и 0x9958fb8c213a9cc6
  6. Нash-значения из 8 байт обедняются в последовательность из 24 байт. Эта последовательность и есть NTLM Response: 0x25a98c1c31e81847466b29b2df4680f39958fb8c213a9cc6

NTLM2[править | править вики-текст]

  1. Формируется последовательность Clinet Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344
  2. Clinet Challenge дополняется нулями до 21 байта. Эта последовательность и есть LMv2 Response: 0xffffff001122334400000000000000000000000000000000
  3. Server Challenge и Client Challenge объединяются в последовательность из 16 байт. Например, если Server Challenge был 0x0123456789abcdef тогда получаем: 0x0123456789abcdefffffff0011223344
  4. Из полученной последовательности при помощи алгоритма MD5 вычисляем следующую hash-значение, состоящее из 16 байт. 0xbeac9a1bc5a9867c15192b3105d5beb1
  5. Отсекаем первые 8 байт от полученного ранее hash-значения: 0xbeac9a1bc5a9867c
  6. Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляем NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4, будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808
  7. NTLM-hash из 16 байт дополняется нулями до 21 байта: 0xcd06ca7c7e10c99b1d33b7485a2ed8080000000000
  8. Последовательность из 21 байта делится на три части по 7 байт.0xcd06ca7c7e10c9, 0x9b1d33b7485a2e и 0xd8080000000000
  9. Каждая из частей, состоящая из 7 байт, используется для создания трех DES-ключей, состоящих из 8 байт: 0xcd83b34fc7f14392, 0x9b8f4c767543685d и 0xd904010101010101
  10. Используя алгоритм DES и отсеченную часть hash-значения, а также сформированные ранее три DES-ключа, вычисляется три hash-значения, каждое по 8 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получаем: 0x10d550832d12b2cc, 0xb79d5ad1f4eed3df и 0x82aca4c3681dd455
  11. Нash-значения из 8 байт обедняются в последовательность из 24 байт. Эта последовательность и есть NTLM2 Response: 0x10d550832d12b2ccb79d5ad1f4eed3df82aca4c3681dd455

NTLMv2[править | править вики-текст]

  1. Из пароля пользователя в виде Unicode строки, при помощи алгоритма MD4 вычисляем NTLM-hash, состоящий из 16 байт. Например, пароль «SecREt01» или Unicode строка 0x53006500630052004500740030003100 после преобразования посредством алгоритма MD4, будет иметь вид: 0xcd06ca7c7e10c99b1d33b7485a2ed808
  2. Имя пользователя и имя домена в виде Unicode строк, объединяются и приводятся к верхнему регистру. Далее из этой последовательности и ранее полученного NTLM-hash при помощи алгоритма HMAC-MD5 вычисляется NTLMv2-hash, состоящий из 16 байт. Например, имя пользователя «User» и имя домена «Domain» дадут строку «USERDOMAIN» или Unicode строку 0x550053004500520044004f004d00410049004e00 после алгоритма HMAC-MD5 где применяется NTLM-hash вычисляется NTLMv2-hash : 0x04b8e0ba74289cc540826bab1dee63ae
  3. Формируется последовательность Client Challenge из 8 байт, выбранных случайным образом (random), например: 0xffffff0011223344
  4. Формируется blob, например: 0x01010000 — the blob signature, 0x00000000 — reserved value, 0x0090d336b734c301 — timestamp, 0xffffff0011223344 — a random Client challenge, 0x00000000 — unknown, 0x02000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d0000000000 — target information block, 0x00000000 — unknown
  5. Server Challenge и blob объединяются в последовательность из которой при помощи алгоритма HMAC-MD5 и ранее вычисленного NTLMv2-hash вычисляется hash-значение, состоящие из 16 байт. Например, если Server Challenge был 0x0123456789abcdef, тогда получается следующая последовательность: 0x0123456789abcdef01010000000000000090d336b734c301ffffff00112233440000000002000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d00000000000000000, а после использования алгоритма HMAC-MD5 получаем следующее hash-значение: 0xcbabbca713eb795d04c97abc01ee4983
  6. Нash-значения из 16 байт обедняется с blob в последовательность. Эта последовательность и есть NTLMv2 Response: 0xcbabbca713eb795d04c97abc01ee498301010000000000000090d336b734c301ffffff00112233440000000002000c0044004f004d00410049004e0001000c005300450052005600450052000400140064006f006d00610069006e002e0063006f006d00030022007300650072007600650072002e0064006f006d00610069006e002e0063006f006d000000000000000000

Уязвимости[править | править вики-текст]

Прослушивание сетевого трафика[править | править вики-текст]

Прослушивая сетевой трафик, можно перехватить SMB пакеты аутентификации, тем самым завладев последовательностью Server Challenge и ответом Response от клиента. Имея эти два параметра, несмотря на способ аутентификации (даже при NTLMv2), возможно, при помощи современного программного обеспечения (при условии не сложного пароля, допустим: «12345») в течение нескольких часов подобрать пароль клиента. Но если способом аутентификации является NTLMv2 и пароль клиента содержит прописные, заглавные, строчные буквы, цифры, а также специальные символы, то на взлом такого пароля могут уйти многие годы[А могут и не уйти?].

Подмена сервера[править | править вики-текст]

  1. Вывести из строя сервер, к которому клиент желает получить доступ. Для этого можно воспользоваться самой примитивной DDoS-атакой.
  2. Назначить компьютеру, с которого будет произведена атака, все параметры сервера, то есть имя сервера, IP-адрес сервера и MAC-адрес сервера. Это необходимо для того, чтобы клиент, обращаясь к серверу, произвел попытку подключения к компьютеру, с которого будет произведена атака.
  3. На запрос клиента, о выборе диалекта аутентификации, компьютер, с которого будет произведена атака, должен будет выбрать самый небезопасный диалект, а именно 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

Примеры[править | править вики-текст]


См. также[править | править вики-текст]

Ссылки[править | править вики-текст]