В сети Windows NT (New Technology) LAN Manager ( NTLM ) — это набор протоколов безопасности Microsoft , предназначенных для обеспечения аутентификации, целостности и конфиденциальности для пользователей. [1] [2] [3] NTLM является преемником протокола аутентификации в Microsoft LAN Manager (LANMAN), более старом продукте Microsoft. Набор протоколов NTLM реализован в поставщике поддержки безопасности , который объединяет протокол аутентификации LAN Manager , протоколы сеансов NTLMv1, NTLMv2 и NTLM2 в одном пакете. Используются ли эти протоколы или могут ли они использоваться в системе, которая регулируется параметрами групповой политики , для которых разные версии Windows имеют разные настройки по умолчанию.
Пароли NTLM считаются слабыми, поскольку их можно очень легко подобрать с помощью современного оборудования. [4]
NTLM — это протокол аутентификации «вызов-ответ» , который использует три сообщения для аутентификации клиента в среде с установлением соединения (без установления соединения все аналогично) и четвертое дополнительное сообщение, если требуется целостность. [5] [6] [7] [8]
Протокол NTLM использует одно или оба из двух хэшированных значений пароля, оба из которых также хранятся на сервере (или контроллере домена), и которые из-за отсутствия соли являются эквивалентными паролям , что означает, что если вы получаете хэш-значение с сервера, вы можете пройти аутентификацию, не зная фактического пароля. Это LM-хэш ( функция на основе DES , применяемая к первым 14 символам пароля, преобразованным в традиционную 8-битную кодировку ПК для языка) и NT-хэш ( MD4 пароля Unicode UTF-16 с прямым порядком байтов ). Оба хэш-значения имеют размер 16 байт (128 бит) каждое. [12]
Протокол NTLM также использует одну из двух односторонних функций в зависимости от версии NTLM; NT LanMan и NTLM версии 1 используют одностороннюю функцию LanMan на основе DES (LMOWF), тогда как NTLMv2 использует одностороннюю функцию на основе NT MD4 (NTOWF). [12] [13]
Сервер аутентифицирует клиента, отправляя 8-байтовое случайное число, вызов. Клиент выполняет операцию, включающую вызов и секрет, общий для клиента и сервера, в частности, один из двух хэшей паролей, описанных выше. Клиент возвращает 24-байтовый результат вычисления. Фактически, в NTLMv1 вычисления обычно производятся с использованием обоих хэшей, и отправляются оба 24-байтовых результата. Сервер проверяет, что клиент вычислил правильный результат, и из этого делает вывод о владении секретом, а следовательно, и о подлинности клиента.
Оба хэша производят 16-байтовые величины. Пять байт нулей добавляются для получения 21 байта. 21 байт разделяется на три 7-байтовых (56-битовых) величины. Каждая из этих 56-битовых величин используется в качестве ключа для шифрования 64-битного вызова DES . Три шифрования вызова воссоединяются для формирования 24-байтового ответа. Как ответ с использованием LM-хеша, так и NT-хеша возвращаются в качестве ответа, но это можно настроить.
C = 8-байтовый вызов сервера, случайныйK1 | K2 | K3 = NTLM-хэш | 5-байт-0ответ = DES(K1,C) | ДЕС(К2,С) | ДЕС(К3,С)
NTLMv2, представленный в Windows NT 4.0 SP4 [14] (и изначально поддерживаемый в Windows 2000), является протоколом аутентификации «вызов-ответ». Он предназначен как криптографически усиленная замена NTLMv1, повышая безопасность NTLM за счет укрепления протокола против многих атак спуфинга и добавления возможности для сервера аутентифицироваться на клиенте. [1] [15] [16]
NTLMv2 отправляет два ответа на 8-байтовый вызов сервера . Каждый ответ содержит 16-байтовый хэш HMAC - MD5 вызова сервера, полностью/частично случайно сгенерированный вызов клиента и хэш HMAC-MD5 пароля пользователя и другой идентификационной информации. Два ответа отличаются форматом вызова клиента. Более короткий ответ использует 8-байтовое случайное значение для этого вызова. Чтобы проверить ответ, сервер должен получить как часть ответа вызов клиента. Для этого более короткого ответа 8-байтовый вызов клиента, добавленный к 16-байтовому ответу, создает 24-байтовый пакет, который соответствует 24-байтовому формату ответа предыдущего протокола NTLMv1. В некоторой неофициальной документации (например, DCE/RPC Over SMB, Leighton) этот ответ называется LMv2.
Второй ответ, отправленный NTLMv2, использует вызов клиента переменной длины, который включает (1) текущее время в формате NT Time , (2) 8-байтовое случайное значение (CC2 в поле ниже), (3) доменное имя и (4) некоторые стандартные форматные данные. Ответ должен включать копию этого вызова клиента и, следовательно, имеет переменную длину. В неофициальной документации этот ответ называется NTv2.
И LMv2, и NTv2 хешируют вызов клиента и сервера с помощью NT-хеша пароля пользователя и другой идентифицирующей информации. Точная формула начинается с NT-хеша, который хранится в SAM или AD, и продолжается хешированием, используя HMAC - MD5 , имени пользователя и имени домена. В поле ниже X обозначает фиксированное содержимое поля форматирования.
SC = 8-байтовый вызов сервера, случайныйCC = 8-байтовый клиентский запрос, случайныйCC* = (X, время, CC2, доменное имя)v2-Hash = HMAC-MD5(NT-Hash, имя пользователя, доменное имя)LMv2 = HMAC-MD5(v2-хэш, SC, CC)NTv2 = HMAC-MD5(v2-хэш, SC, CC*)ответ = LMv2 | CC | NTv2 | CC*
Протокол сеанса NTLM2 похож на MS-CHAPv2. [17] Он состоит из аутентификации NTLMv1 в сочетании с безопасностью сеанса NTLMv2.
Вкратце, применяется алгоритм NTLMv1, за исключением того, что 8-байтовый вызов клиента добавляется к 8-байтовому вызову сервера и хэшируется MD5. Меньшая 8-байтовая половина результата хэша является вызовом, используемым в протоколе NTLMv1. Вызов клиента возвращается в одном 24-байтовом слоте ответного сообщения, 24-байтовый вычисленный ответ возвращается в другом слоте.
Это усиленная форма NTLMv1, которая сохраняет возможность использовать существующую инфраструктуру контроллера домена, но при этом избегает атаки по словарю со стороны мошеннического сервера. Для фиксированного X сервер вычисляет таблицу, где местоположение Y имеет значение K, такое что Y=DES_K(X) . Без участия клиента в выборе вызова сервер может отправить X , найти ответ Y в таблице и получить K. Эту атаку можно сделать практичной, используя радужные таблицы . [18]
Однако существующая инфраструктура NTLMv1 позволяет, чтобы пара вызов/ответ не проверялась сервером, а отправлялась на контроллер домена для проверки. Используя сеанс NTLM2, эта инфраструктура продолжает работать, если сервер заменяет вызов хэшем вызовов сервера и клиента.
NTLMv1 Клиент<-Сервер: SC Клиент->Сервер: H(P,SC) Сервер->DomCntl: H(P,SC), SC Server<-DomCntl: да или нетСессия NTLM2 Клиент<-Сервер: SC Клиент->Сервер: H(P,H'(SC,CC)), CC Сервер->DomCntl: H(P,H'(SC,CC)), H'(SC,CC) Server<-DomCntl: да или нет
С 2010 года Microsoft больше не рекомендует использовать NTLM в приложениях: [19]
Разработчики должны знать, что NTLM не поддерживает последние криптографические методы, такие как AES или SHA-256. Он использует циклические проверки избыточности (CRC) или MD5 для целостности и RC4 для шифрования.
Вывод ключа из пароля осуществляется в соответствии с RFC1320 и FIPS46-2. Поэтому приложениям обычно рекомендуется не использовать NTLM.
Несмотря на эти рекомендации, NTLM по-прежнему широко используется в системах. [ необходима цитата ] Основная причина — сохранение совместимости со старыми системами. Однако в некоторых обстоятельствах этого можно избежать. [ как? ]
Microsoft добавила хэш NTLM в свою реализацию протокола Kerberos для улучшения взаимодействия (в частности, тип шифрования RC4-HMAC). По словам независимого исследователя, это решение позволяет обмануть контроллеры домена, заставив их выдать злоумышленнику билет Kerberos, если известен хэш NTLM. [20] Microsoft приняла Kerberos в качестве предпочтительного протокола аутентификации для Windows 2000 и последующих доменов Active Directory. [16] Kerberos обычно используется, когда сервер принадлежит домену Windows Server . Microsoft рекомендует разработчикам не использовать ни Kerberos, ни поставщика поддержки безопасности NTLM (SSP) напрямую. [21]
Ваше приложение не должно напрямую обращаться к пакету безопасности NTLM; вместо этого оно должно использовать пакет безопасности Negotiate. Negotiate позволяет вашему приложению использовать преимущества более продвинутых протоколов безопасности, если они поддерживаются системами, участвующими в аутентификации. В настоящее время пакет безопасности Negotiate выбирает между Kerberos и NTLM. Negotiate выбирает Kerberos, если только он не может использоваться одной из систем, участвующих в аутентификации.
NTLM SSP используется в следующих ситуациях:
После того, как разработчик приложения или Negotiate SSP решили, что NTLM SSP будет использоваться для аутентификации, групповая политика определяет возможность использования каждого из протоколов, которые реализует NTLM SSP. Существует пять уровней аутентификации. [23]
DC означает контроллер домена, но использование этого термина сбивает с толку. Любой компьютер, действующий как сервер и аутентифицирующий пользователя, выполняет роль DC в этом контексте, например, компьютер Windows с локальной учетной записью, такой как Администратор, когда эта учетная запись используется во время входа в сеть.
До Windows NT 4.0 Service Pack 4 поставщик общих служб согласовывал протокол NTLMv1 и возвращался к LM, если другая машина его не поддерживала.
Начиная с Windows NT 4.0 Service Pack 4, SSP согласовывал сеанс NTLMv2 всякий раз, когда и клиент, и сервер его поддерживали. [24] Вплоть до Windows XP включительно, на компьютерах за пределами США использовалось либо 40-, либо 56-битное шифрование, поскольку в то время в США были строгие ограничения на экспорт технологий шифрования. Начиная с Windows XP SP3, 128-битное шифрование можно было добавить, установив обновление, а в Windows 7 128-битное шифрование было по умолчанию.
В Windows Vista и выше LM был отключен для входящей аутентификации. Операционные системы на базе Windows NT вплоть до Windows Server 2003 включительно хранят два хэша паролей, хэш LAN Manager (LM) и хэш Windows NT. Начиная с Windows Vista , возможность хранить оба есть, но один из них отключен по умолчанию. Это означает, что аутентификация LM больше не работает, если компьютер под управлением Windows Vista выступает в качестве сервера. Предыдущие версии Windows (вплоть до Windows NT 4.0 Service Pack 4) можно было настроить на такое поведение, но это не было значением по умолчанию. [25]
NTLM остается уязвимым для атаки pass the hash , которая является вариантом атаки reflect , которая была устранена обновлением безопасности Microsoft MS08-068. Например, Metasploit может использоваться во многих случаях для получения учетных данных с одной машины, которые могут быть использованы для получения контроля над другой машиной. [3] [26] Набор инструментов Squirtle может использоваться для использования атак межсайтового скриптинга веб- сайтов в атаках на близлежащие активы через NTLM. [27]
В феврале 2010 года Amplia Security обнаружила несколько недостатков в реализации механизма аутентификации NTLM в Windows, которые нарушали безопасность протокола, позволяя злоумышленникам получать доступ на чтение/запись к файлам и удаленное выполнение кода. Одна из представленных атак включала возможность предсказывать псевдослучайные числа и запросы/ответы, генерируемые протоколом. Эти недостатки присутствовали во всех версиях Windows в течение 17 лет. Рекомендации по безопасности, объясняющие эти проблемы, включали полностью работающие эксплойты для проверки концепции. Все эти недостатки были исправлены в MS10-012. [28] [29]
В 2012 году было продемонстрировано, что каждая возможная перестановка хэша NTLM-пароля из 8 символов может быть взломана менее чем за 6 часов. [30]
В 2019 году это время сократилось примерно до 2,5 часов за счет использования более современного оборудования. [4] [31] Также доступны таблицы Rainbow для восьми- и девятисимвольных паролей NTLM. Более короткие пароли можно восстановить методом подбора. [32]
В 2019 году EvilMog [33] [34] опубликовал инструмент под названием ntlmv1-multitool [35] для форматирования ответов на вызов NTLMv1 в формате взлома, совместимом с hashcat. С hashcat и достаточной мощностью графического процессора хеш NTLM может быть получен с помощью известной атаки открытым текстом путем взлома ключей DES с режимом hashcat 14000, как продемонстрировал atom [36] на форумах hashcat.
Обратите внимание, что хэши, эквивалентные паролю, используемые в атаках pass-the-hash и взломе паролей, должны быть сначала «украдены» (например, путем взлома системы с разрешениями, достаточными для доступа к хэшам). Кроме того, эти хэши не совпадают с «хешем» NTLMSSP_AUTH, передаваемым по сети во время обычной аутентификации NTLM.
Реализации NTLM для Linux включают Cntlm [37] и winbind (часть Samba ) [38], которые позволяют приложениям Linux использовать прокси-серверы NTLM.
FreeBSD также поддерживает хранение паролей через Crypt (C) в незащищенной форме NT-Hash. [39]