2. Протоколы аутентификации Windows Задачи протоколов аутентификации Windows
Протокол аутентификации должен выполнять по крайней мере две задачи. Во-первых, он должен безопасно передавать транзакции от запросчика в базу данных аутентификации. Во-вторых, он должен безопасно и надежно хранить пароль.
Протокол аутентификации должен защитить введенную пользователем информацию при пересылке в базу данных аутентификации (т.е. SAM или AD). Для этого протокол подписывает, скрывает или шифрует транзакцию. Кроме того, используется временная метка, чтобы взломщик не мог воспользоваться учетными данными в будущем. Чтобы не позволить взломщику извлечь пароль пользователя из базы данных, протокол должен обеспечить скрытное хранение паролей в базе данных аутентификации.
Протоколы аутентификации обеспечивают защиту путем хранения паролей в скрытой форме (обычно хешированной) в базе данных аутентификации и путем полного запрета на передачу паролей между запросчиком и базой данных аутентификации даже в скрытой форме.
Процесс запрос-ответ выглядит следующим образом:
Компьютер получает данные для идентификации и аутентификации от пользователя и запрашивает аутентификацию на соответствующем сервере.
Сервер аутентификации генерирует случайное произвольное значение (называемое запросом – challenge) и посылает его запросчику.
Запросчик получает запрос и производит над ним и скрытой формой пароля математические операции, а затем передает результат (называемый ответом – response) серверу аутентификации.
Сервер аутентификации также выполняет математические манипуляции с запросом методом, идентичным используемому на рабочей станции, и сравнивает результат с полученным ответом. Если результаты совпадают, то запросчик считается успешно аутентифицированным.
В протоколах аутентификации используется процесс запрос-ответ, поэтому пароль никогда не передается через сеть.
Протоколы аутентификации Windows
В Windows применяются следующие протоколы аутентификации: LAN Manager, NT, NTLM, NTLMv1, NTLMv2 и Kerberos.
Основными протоколами сетевой аутентификации в ОС Windows являются: Kerberos, NTLMv1 и NTLMv2. Протокол Kerberos применяется только для аутентификации в домене Active Directory. Он является международным стандартом и достаточно хорошо описан.
По умолчанию все компьютеры с операционными системами Windows 2000 и более новыми операционными системами (XP/Vista/Seven/Server 2003-2008 R2) совместимы со всеми протоколами аутентификации.
Передавая соответствующие команды, другие рабочие станции и сервера могут выбирать протокол для обработки запроса аутентификации.
Протокол Kerberos может использоваться только клиентами начиная с Windows 2000 (и более новыми) при обращениях в домены Windows 2000 (и выше).
Исследования в области безопасности показали, что более старые протоколы (LM, NT и NTLM) уязвимы в случае прослушивания и в случае атак с применением «грубой силы».
Поэтому, рекомендуется использовать только протоколы Kerberos и NTLMv2. Чтобы убедиться в правильности этого, следует оценить возможности каждого протокола.
NTLM и корпоративные сети
То, что в последние годы проблемы безопасности протокола NTLM обсуждаются реже, чем раньше, выходят новые версии Microsoft Windows и внедряются новые протоколы аутентификации, не означает что проблемы исчезли. Эта статья — попытка собрать в одном месте информацию о различных недостатках NTLM, возможных атаках и о том, как следует учитывать архитектуру NTLM при проектировании и администрировании корпоративных сетей.
Призы для победителей конкурса предоставил компьютерный интернет магазин
Автор: ЗАРАЗА
Введение
Когда, полтора десятка лет назад, компания Microsoft начала серьезную работу над созданием централизованных сетей масштабов предприятия при работе над операционной системой Windows NT, перед разработчиками была поставлена весьма сложная, и новая по тем временам задача – реализовать технологии single sign-on, и One user – one password.
One user – one password (один пользователь – один пароль) означает, что у пользователя должен быть только один пароль. Единый пароль используется для доступа ко всем ресурсам и протоколам сети. Single sign-on (единый вход) подразумевает, что этот пароль указывается всего один раз – при входе пользователя в сеть.
Можно много спорить о преимуществах и недостатках такого подхода, но бесспорно одно – этот подход удобен как для пользователей, так и для разработчиков приложений. Пользователь избавлен от необходимости помнить много паролей и вводить их, а разработчику не надо задумываться над тем, как организовать аутентификацию пользователя.
Для этого необходимо было разработать такую схему аутентификации, которая позволила бы любому сетевому приложению передавать данные аутентификации независимо от сетевого протокола. Так родился NTLM и NTLMSSP (NTLM Security Service Provider) – подсистема позволяющая любому клиент-серверному приложению использовать NTLM ничего не зная о его внутренней структуре.
Нельзя сказать, чтобы Microsoft проигнорировал требования безопасности для протокола аутентификации. В общем-то, на тот момент протокол NTLM не был слабее многих уже использовавшихся протоколов, и в чем-то даже лучше. Но сейчас можно с уверенностью сказать, что вместе с протоколом NTLM появилось большое количество проблем связанных с его безопасностью. Часть проблем вызвана тем, что Microsoft должен был сохранить совместимость с существующими сетями LanManager для MS-DOS и Windows for Workgroups. Другие являются ошибками дизайна и объясняются новизной решаемой проблемы. Третьи являются исключительно криптографическими, т.к. тогда производители ПО редко имели в штате профессиональных криптоаналитиков.
Проблемы протокола NTLM широко дискутировались начиная с 1995 года и обсуждаются до сих пор. Существует ошибочное мнение, что протокол аутентификации Kerberos v5, используемый в сетях Windows 2000 и Windows 2003, полностью снимает проблему NTLM. Это не так, т.к. поддержка NTLM в существующих сетях Windows является обязательной и любая из сторон, принимающих участие в процессе аутентификации, может инициировать использование этого протокола. По этой причине многие проблемы протокола NTLM остаются актуальными в современных сетях Windows и должны учитываться не только в процессе администрирования сети, но и на этапе ее проектирования.
Я попытался собрать в одном месте информацию, мысли, идеи и проблемы, родившиеся в результате почти десятилетней дискуссии в открытых списках рассылки, а так же личной переписки со многими людьми, которым мне хотелось бы выразить признательность за их помощь, ответы на вопросы и терпение – Urity (urity at securityfriday.com), Jesper Johansson (jesperjo at microsoft.com), Solar Designer (solar at openwall.com), offtopic (offtopic at mail.ru) Glenn Zorn (gzorn at cisco.com) и многим другим. Так же использовались материалы из постингов Todd Sabin, Luke Kenneth Casson Leighton и Salman Niksefat. Из-за природной лени и отсутствия точных названий и постоянных URL для большинства использованных постингов я не буду делать список литературы в конце статей, пусть это сделает Google.
Мы не будем углубляться в технические детали более, чем это необходимо для понимания проблемы, тем не менее, иногда от читателя потребуются некоторые минимальные представления о процессах аутентификации и авторизации, программировании и криптографии. Чтобы облегчить жизнь читателю, в статье будут встречаться вставки «общеобразовательного» характера.
Процесс аутентификации клиент-серверных приложений в сетях Microsoft
Что происходит после нажатия на Ctrl+Alt+Del? Появляется запрос локальной подсистемы безопасности (Local Security Authority, LSA) на ввод имени пользователя и пароля. После ввода пароль хэшируется (криптографический хэш – одностороннее преобразование делающее невозможным, или по крайней мере сложным восстановление по нему оригинального пароля) и хэш помещается в хранилище LSA. В открытом виде он больше уже нигде не фигурирует (в старых версиях Windows пароль мог храниться в открытом виде или с обратимым шифрованием, т.к. старые версии LanManager использовали аутентификацию в открытом тексте, но не будем вспоминать эти времена). Кроме того, к хранилищу LSA нельзя обратиться напрямую стандартными методами. В хранилище хэши находятся до окончания сеанса работы (а иногда и после, это будет рассмотрено далее).
Протокол NTLM относится к семейству challenge-response (запрос-ответ) протоколов. Это означает, что ни пароль ни его хэш никогда не передаются «как есть», вместо этого они используются для генерации ответа (response) на случайный запрос (challenge). Аутентифицирующая сторона сравнивает полученный ответ с вычисленным локально. Генерация и проверка запроса и ответа осуществляется не приложениями, а провайдером NTLMSSP. Данные аутентификации, генерируемые NTLMSSP через специальные функции API (InitializeSecurityContext()/AcceptSecurityContext()) могут быть включены в любой протокол прикладного уровня, упаковка этих данных (называемых security blob – «начинка безопасности») это все, что требуется от приложений с точки зрения NTLMSSP. После успешной проверки подсистема безопасности генерирует токен, который может быть использован серверным приложением с правами локальной системы для имперсонирования пользователя, т.е. при подключении пользователя к серверному приложению серверное приложение может работать от его имени. В таком случае пользователь совершает вход на удаленную систему. Возникает вопрос – а может ли серверное приложение обратиться к другим сетевым ресурсам с использованием NTLM, не запрашивая дополнительной аутентификации? Если в хранилище LSA удаленного компьютера нет хэшей пароля пользователя – то это невозможно. Отсюда, например, невозможность «прозрачного» доступа к сетевому диску из telnet-сеанса или через Web-сервер если доступ через telnet или к Web происходит с NTLM аутентификацией.
Теоретически все получается замечательно и абсолютно безопасно. Даже запустив приложение с правами пользователя, все равно не возможно получить его пароль или даже хэш. И даже перехватив сеанс и подменив сервер, не получится получить доступ к другим сетевым ресурсам.
Давайте посмотрим на все это с точки зрения реализации.
Хэши NTLM
В семействе протоколов NTLM (как мы увидим далее, NTLM-подобных протоколов несколько) могут использоваться 2 типа хэшей: LM (LanManager) хэш, унаследованный от предыдущих реализаций LanManager и NT (New Technology) хэш, созданный для протокола NTLM. Соответственно, при входе пользователя в систему, как правило, от пароля берутся и хранятся оба этих хэша. Первая версия протокола NTLM для совместимости поддерживала оба ключа (NT или LM ключем обычно называют соответствующий хэш пароля). В более поздних реализациях используется только NT ключ, однако по-умолчанию LM хэш все равно создается при входе и помещается в хранилище LSA. Давайте рассмотрим оба алгоритма хэширования.
LM ключ получается из пароля в 8-битной OEM кодировке (cp866 для России) с помощью алгоритма DES.
Для справки: DES является симметричным блочным шифром, использующим 56 битный ключ для шифрования 64 битного блока текста. Реально, внутри алгоритма используется 64 битный ключ, однако длина ключа искусственно занижена по непонятным соображениям – 56 битный ключ «растягивается» за счет вставки дополнительного бита через каждые 7 бит ключа. Поскольку DES обладает относительной стойкостью к атакам известного открытого текста, он может быть использован в качестве криптографической хэш функции, если в качестве открытого текста использовании какой-либо известный текст, а в качестве ключа – хэшируемое слово. Известный текст может быть либо случайным (в таком случае он называется salt – соль, и хранится в месте с паролем), либо предопределенным, в таком случае он называется Magic Word – заклинание. В классической реализации crypt() в Unix использовался первый подход, в Windows используется магическое слово KGS!@#$% (посмотрите на клавиатуру…. Наверное, это был чей-то пароль). При использовании в качестве хэш функции DES генерирует 64 битный хэш по 56 битному тексту.
Поскольку DES позволяет получить хэш лишь от 7-символьного блока, то реально используется пароль из 14 символов (более короткий пароль дополняется нулями), который разбивается на два блока по 7 символов, от каждого из которых независимо вычисляется хэш. В итоге получается 128-битный хэш «склееный» из двух частей.
Недостатки алгоритма очевидны. Независимое вычисление двух блоков позволяет и их независимый взлом, т.е. реально каждый 64 бита хэша можно атаковать с целью восстановления пароля. Причем для генерации LM ключа пароль не чувствителен к регистру символов и символы всегда используются в верхнем реестре. Это делает очень эффективной атаку на восстановление пароля методом последовательного перебора (не более 7 символов из очень ограниченного алфавита). Причем длинный пароль может быть легче восстановить чем более короткий. Например, для пароля из 12 символов, сначала за считанные секунды подбираются последние 5 символов, после чего делается предположение о структуре пароля и первые 7 символов пароля подбираются по более ограниченному алфавиту. В настоящее время известны очень быстрые реализации DES с использованием 64-битной арифметики, что делает его абсолютно непригодным для криптографии. В общем случае, восстановление пароля по LM хэшу на современной технике вопрос не более чем нескольких дней. Кроме того, фиксированное магическое слово позволяет использование таблицы заранее посчитанных значений ключей, что делает возможным восстановление пароля по LM хэшу в реальном времени.
NT ключ вычисляется с помощью стандартного алгоритма хэширования MD4. Хэш MD4 берется от пароля записанного в 16-битной кодировке Unicode с последовательностью байт low endian (т.е. первым байтом идет номер символа в странице). Пароль вычисляется с учетом регистра. MD4 имеет несколько криптографических проблем, самой большой из них является маленькое время вычисления хэша, что позволяет перебирать достаточно большое количество комбинаций в единицу времени упрощая, например, атаку по словарю или подбор слабой комбинации символов.
Подсказка: существует большое количество программ для восстановления пароля из NT или LM ключа путем подбора по словарю или перебора – John-the-Ripper, LophtCrack, Cain & Abel. При наличии обоих ключей, обычно сначала восстанавливается пароль в верхнем регистре из LM-ключа, затем по NT-ключу восстанавливается регистр пароля. Такой подход, в частности, реализован в Cain & Abel (http://www.oxid.it), являющейся на сегодня наиболее мощным и универсальным инструментом для выполнения различных задач связанных с обнаружением слабых конфигураций, в т.ч. и многих проблем NTLM. Мы еще неоднократно будем возвращаться к возможностям этой утилиты. Самая быстрая реализация алгоритма DES ориентированная на взлом LM-ключей в Solar Designer’овском John-the-Ripper.
Совет: Можно запретить генерацию LM-ключей в системе путем установки в 1 значения NoLmHash в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Несмотря на то, что будет описано ниже, сделать это настоятельно рекомендуется, хотя бы для очистки совести.
Кому нужен сломанный ключ?
Как мы уже говорили, NT и LM ключи (хэши) генерируются из пароля при входе пользователя в систему, после чего пароль нигде не хранится и никогда не используется. Возникает закономерный вопрос: если у нас есть на руках NT и LM хэши можем ли мы использовать их, например, для аутентификации по сети без восстановления пароля в открытом тексте? Очевидно, да. Начнем с простого случая открытых кодов. Попробуем модифицировать smbclient из состава SAMBA таким образом, чтобы подключаться к удаленному файловому серверу с исопльзованием NT хэша (как мы знаем, из NT хэша восстановить пароль гораздо сложнее). Было бы достаточно сложно перелопатить полтора десятка мегабайт исходников SAMBA, если бы мы не знали точно, что NT ключ это MD4 хэш. Нам будет достаточно только модифицировать библиотеку md4.c таким образом, чтобы не хэшировать что-то, что уже похоже на хэш. Например то, что состоит из 32х 16-ричных символов (как мы помним, ключ 128-битный, а пароль приходит в кодировке Unicode, т.е. каждый входящий символ занимает 2 байта, получается 64 байта на входе и 16 на выходе).
Лекция 11. Протоколы аутентификации в Windows

В рамках лекции рассматриваются протоколы аутентификации :
Текст лекции
Рассмотрим наиболее распространенные протоколы безопасности, используемые в процессе аутентификации в Windows .
SPNEGO
SPNEGO (сокр. от Simple and Protected GSS-API Negotiation Mechanism — простой и защищенный механизм переговоров по GSS-API ) — механизм, который используется для аутентификации клиентского приложения на удаленном сервере в том случае, когда ни одна из сторон не знает, какой протокол аутентификации поддерживает другая сторона.
GSS-API ( Generic Security Service Application Program Interface — Обобщенный прикладной программный интерфейс службы безопасности) [ 14.1 ] предназначен для защиты коммуникаций между компонентами программных систем, построенных в архитектуре клиент/ сервер . Он предоставляет услуги по взаимной аутентификации осуществляющих контакт партнеров и по контролю целостности и обеспечению конфиденциальности пересылаемых сообщений.
Пользователями интерфейса безопасности GSS-API являются коммуникационные протоколы (обычно прикладного уровня) или другие программные системы, самостоятельно выполняющие пересылку данных.
Обобщенный интерфейс безопасности GSS-API не зависит от конкретной языковой среды и от механизмов безопасности , обеспечивающих реальную защиту. Последнее обстоятельство позволяет создавать приложения, которые на уровне исходного текста мобильны по отношению к смене механизмов безопасности . Тем самым реализуется открытость прикладных систем и соответствующих средств защиты.
На каждом компьютере, где предполагается применять интерфейс безопасности GSS-API , должно быть установлено клиентское программное обеспечение соответствующего механизма защиты. Приложение , использующее GSS-API , локальным образом вызывает необходимые функции, получая в ответ так называемые » токены безопасности». Токен может содержать зашифрованное удостоверение пользователя, электронную подпись или целое зашифрованное сообщение. Приложения обмениваются токенами безопасности, достигая тем самым аутентификации , целостности и конфиденциальности общения. Поскольку коммуникационные аспекты вынесены за пределы GSS-API , он автоматически оказывается независимым от сетевых протоколов . Сетевая мобильность приложений должна обеспечиваться иными средствами.
SPNEGO — стандартный псевдо-механизм GSS-API . Псевдо-механизм определяет, какие механизмы GSS-API являются доступными, выбирает один из них и передает ему «право» осуществлять в дальнейшем необходимые операции по обеспечению безопасного взаимодействия приложений.
Наиболее известным применением SPNEGO является расширение Microsoft » HTTP Negotiate «. Впервые SPNEGO был реализован в Internet Explorer 5.01 и IIS 5.0 с целью реализации возможности SSO ( Single Sign -On , «единый вход», «принцип однократной регистрации «), позже переименованной в Integrated Windows Authentication . SPNEGO мог выбирать между протоколами Kerberos и NTLM . Позднее Firefox и Konqueror также стали поддерживать SPNEGO .
Когда Microsoft начала работу над созданием централизованных сетей масштабов предприятия при работе над операционной системой Windows NT , перед разработчиками была поставлена весьма сложная и новая по тем временам задача — реализовать технологии SSO и » One user — one password «. » One user — one password » — «один пользователь — один пароль » означает, что у пользователя должен быть единый пароль , используемый для доступа ко всем ресурсам и протоколам сети. Действенные меры защиты не должны затруднять работу пользователей. Например, их следует освободить от необходимости отдельно регистрироваться на каждом ресурсе, используя при этом разные пароли. Кроме того, процесс регистрации не должен сопровождаться длительными задержками при получении доступа. Single sign -on , как отмечалось выше, подразумевает, что этот пароль указывается всего один раз — при входе пользователя в сеть ).
Необходимо было разработать такую схему аутентификации , которая позволила бы любому сетевому приложению передавать данные аутентификации независимо от сетевого протокола . Это привело к появлению NTLM и NTLMSSP ( NTLM Security Service Provider — подсистемы, позволяющей любому клиент- серверному приложению использовать NTLM , ничего не зная о его внутренней структуре). Протокол NTLM относится к семейству challenge — response ( запрос -ответ) протоколов . Это означает, что ни пароль , ни его хеш никогда не передаются «как есть»: они используются для генерации ответа ( response ) на случайный запрос ( challenge ). Аутентифицирующая сторона сравнивает полученный ответ с вычисленным локально. Генерация и проверка запроса и ответа осуществляется не приложениями, а провайдером NTLMSSP .
Протокол NTLM имеет много брешей в безопасности. Часть проблем вызвана тем, что Microsoft необходимо было сохранить совместимость с существующими сетями LanManager для MS-DOS и Windows for Workgroups . Другие являются ошибками проектирования, третьи — исключительно криптографические.
В настоящее время Microsoft рекомендует в качестве протокола аутентификации использовать Kerberos (см. следующую главу). Тем не менее, в новых версиях Windows он поддерживается и все еще используется, к примеру, на уровне рабочих групп (при отсутствии домена Active Directory ).
Kerberos
Kerberos — протокол аутентификации , разработанный в 1980-х гг. в Массачусетском технологическом институте ( MIT — Massachusetts Institute of Technology ). Первой операционной системой семейства Windows , реализующей протокол Kerberos [ 14.2 ], стала Windows 2000 . Сетевая служба Kerberos действует как доверенный посредник, обеспечивая безопасную сетевую проверку подлинности, которая дает пользователю возможность работать на нескольких машинах сети.
Kerberos использует криптографию с секретным ключом: как правило, применяются шифры DES или Triple-DES ( 3DES ), хотя в последней версии, Kerberos v5, описанной в документе RFC 1510 [ 14.4 ], поддерживаются и другие алгоритмы: так, Windows Vista была выпущена с улучшенной версией протокола Kerberos , позволяющей использовать криптоалгоритм AES .
Kerberos версии 5 использует режим СВС ( Cipher Block Chaining ). CBC [ 14.3 ] — это режим шифрования с обратной связью , при котором перед вычислением очередного шифрованного блока открытый текст складывается побитно по модулю 2 с предыдущим шифртекстом . В режиме СВС над открытым текстом и предыдущим шифртекстом выполняется операция XOR и тем самым каждый предыдущий шифрблок используется для модифицирования очередного блока открытого текста.
Для аутентификации в службе Kerberos используются удостоверения. Различают два вида удостоверений ( credentials ): мандаты ( tickets ) и аутентификаторы ( authenticators ). Подробно структура различных сообщений Kerberos описана в документе RFC 1510 [ 14.2 ], мы ограничимся основной информацией.
Мандат используется для безопасной передачи серверу данных о клиенте. Сервер также может проверить, действительно ли мандат был выдан клиенту, который его предъявляет. Мандат Kerberos имеет следующую форму:
— сервер ,
— клиент,
— сетевой адрес клиента,
— начало и окончание времени действия мандата ,
— секретный ключ сервера,
здесь и далее обозначает некоторые данные
, зашифрованные ключом
. Клиент не может расшифровать мандат , т.к. не знает секретного ключа сервера, но он может предъявлять его серверу неограниченное количество раз в течение промежутка от начала до окончания действия мандата .
Аутентификатор — некий блок информации, зашифрованный с помощью секретного ключа . Аутентификатор предъявляется вместе с мандатом . Клиент создает аутентификатор каждый раз, когда ему нужно воспользоваться службами сервера. Аутентификатор Kerberos имеет следующую форму:
— сервер ,
— клиент,
— начало и окончание действия мандата ,

