Хакер - Гид по NTLM Relay, часть 2. Проводим Relay-атаки
hacker_freiDrieVlad
Содержание статьи
- Клиенты
- SMB (445/TCP)
- LDAP (389/TCP, 636/TCP)
- RPC (135/TCP)
- HTTP (80/TCP)
- Выводы
- Бонус
- Защита
- Итог
С атаками NTLM Relay специалисты по пентестам знакомы давно. В большинстве случаев предпосылки к успешной Relay-атаке — это не уязвимость, а особенность настройки инфраструктуры, поэтому атака часто используется в боевой обстановке на реальных проектах. Сегодня мы разберем, как выполняется такая атака, когда NTLM-аутентификация уже получена.
INFO
О том, как получить NTLM-аутентификацию, предшествующую Relay-атаке, подробно рассказано в статье «Гид по NTLM Relay. Захватываем NTLM-аутентификацию для Relay-атаки». NTLM Relay-атаки можно проводить не только в Active Directory, но еще, например, в ALD и FreeIPA-доменах.
Для глубокого понимания темы с точки зрения теории рекомендую прочитать статью. Прежде чем перейти непосредственно к разбору методов, договоримся о терминах.
Допустим, клиент хочет пройти аутентификацию с машины Work1 на SMB, атакующий перехватывает эту сессию и хочет пройти аутентификацию на LDAP. Такой кейс мы будем называть Relay с SMB на LDAP.
Еще один пример, чтобы закрепить наше понимание. Клиент хочет пройти аутентификацию с машины Work1 на HTTP, атакующий перехватывает эту сессию и хочет пройти аутентификацию на SMB. Такой кейс мы будем называть Relay с HTTP на SMB.
КЛИЕНТЫ
Для реализации атаки нам нужен клиент и сервер, ntlmrelayx как раз по такой модели и построен. Про RelayServers мы говорили в прошлой статье, в этой будем говорить про RelayClients.
SMB (445/TCP)
На SMB аутентификацию можно пересылать с любого другого протокола. Главное условие успешности Relay-атаки — это отсутствие требования подписи SMB-сообщений на машине, куда мы выполняем Relay. Чтобы проверить это, можно воспользоваться следующей командой:
crackmapexec smb -u '' -p '' --shares <target IP or nets or file>
На рисунке требование подписи включено, на этой машине выполнить атаку на SMB Relay не получится.
А в этом примере на машине требование отключено, на нее Relay делать можно.
Для автоматизации можно использовать следующую команду:
crackmapexec smb --gen-relay-list targets.txt <nets>
Рассмотрим варианты выполнения Relay на SMB. Самый простой вариант — выполнить Relay на машину с SMB, когда пересылаемая нами учетная запись имеет права локального администратора на целевом хосте. При выполнении такой пересылки сдампятся хеши SAM, и мы получим NT-хеш локального администратора и закрепимся на машине.
impacket-ntlmrelyx -t smb://<IP>
Но если прав нет, мы получим ошибку, и на этом атака закончится.
В ситуации, когда у нас используется SMBv2, всегда необходимо добавлять флаг -smb2support
. В качестве цели можно указать файл, где перечисляются в порядке приоритета цели и протокол, на который надо выполнить атаку, примерно в следующем формате:
smb://IP1
ldap://IP2
smb://IP3
rpc://IP4
Чтобы подать на вход этот файл со списком целей, используем флаг -tf
:
impacket-ntlmrelayx -tf targt.txt
И тут стоит сказать, что обычно аутентификация прилетает не одна, а сразу несколько, поэтому можно попробовать Relay в несколько мест. Но также в ntlmrelayx есть механизм multirelay, суть которого состоит в том, что он может одну условную аутентификацию превратить в десять. Это действительно работает, но не стабильно. При первой же ошибке или отказе доступа процесс остановится. Чтобы отключить этот механизм в случае с несколькими целями, нужно добавить в команду параметр --no-multirelay
:
impacket-ntlmrelayx -tf targt.txt -smb2support --no-multirelay
А также важно не забыть добавить необходимые флаги для каждого из протоколов, которые присутствуют в списке целей. Применительно ко всем остальным клиентам эта информация тоже актуальна.
Для взаимодействия с сетевыми папками целевой машины от имени пересылаемой учетной записи можем использовать интерактивный режим:
impacket-ntlmrelyx -t smb://<IP> -i
После этого у нас поднимается оболочка на локальном интерфейсе, к которой можно присоединиться следующей командой:
nc 127.0.0.1 11000
После подключения нам доступен обычный smbclient из Impacket с точно таким же синтаксисом.
Способ получения интерактивного режима может быть полезен, когда мы не знаем, есть у нас привилегированные права на целевой машине или нет. Если прав нет и мы пользуемся стандартным режимом — ничего не произойдет. Если права есть, мы хотя бы получим доступ ко всей файловой системе и, может быть, сумеем найти что‑то интересное. Но в целом есть еще более универсальный способ.
Может сложиться ситуация, когда мы не имеем прав локального администратора, но можем закрепиться на целевой машине от имени пересылаемой учетной записи с помощью флага -socks
:
impacket-ntlmrelyx -t smb://<IP> -socks
В этом режиме можно реализовать примерно следующую схему.
После успешной Relay-атаки мы получаем SMB-сессию и можем использовать ее многократно с помощью proxychains4. Для этого редактируем конфигурационный файл /etc/proxychains4.conf
. В конец добавляем строчку:
socks4 127.0.0.1 1080
Для использования уже созданного соединения после настройки конфига proxychains подойдет следующий синтаксис:
proxychains4 impacket-smbclient 'domain/username@<target IP>' -no-pass
Стоит обратить внимание, что проходить аутентификацию таким образом можно только на машине, куда был совершен Relay. Запускаем ntlmrelayx с флагом socks
, в качестве целей указываем машины без SMB Signing.
Редактируем конфиг proxychains. Мы можем запускать smbclient без пароля через proxychains.
Такой способ может позволить закрепиться на целевой машине даже не привилегированному пользователю, что используется в определенных ситуациях. Но если сессия окажется привилегированной, можно запустить secretsdump и получить NT-хеши.
Таким образом мы можем запускать весь софт из Impacket, а также основанные на нем скрипты. С помощью этого способа можно делать действительно удивительные вещи, но об этом чуть позже, а пока плавно переходим к следующему протоколу.
LDAP (389/TCP, 636/TCP)
Выполнять Relay на LDAP можно только в случае, если на сервере отключено требование подписи сообщений. Проверить можно с помощью скрипта LdapRelayScan.py.
python3 LdapRelayScan.py -dc-ip <target IP>
Relay-атаки на LDAP могут быть крайне импактными для атакующего, поэтому Microsoft пытается этому всячески препятствовать. Есть несколько главных условий, при которых возможна пересылка NTLM-аутентификации на LDAP:
- Аутентификация с HTTP всегда пересылается на LDAP.
- Аутентификация с SMB пересылается на LDAP в следующих случаях:использование NetNTLMv1-хеша клиентом;
- уязвимости CVE-2019-1040 и CVE-2019-1166 на контроллерах домена;
- Эксплуатация RemotePotato0.
Для эксплуатации пересылки с HTTP на LDAP никаких флагов добавлять не надо:
impacket-ntlmrelayx -t ldap://<DC IP>
Из результата видно, что ntlmrelayx проверяет привилегии пользователя в домене, добавляет нового, если может, и накидывает ему привилегии на DCSync, а также создает дамп домена. Если пользователь не обладает никакими привилегиями, то просто создается дамп домена.
Дампим ntds.dit
с помощью созданной в результате Relay-атаки учетки.
Дамп домена, полученный в результате успешной Relay-атаки на LDAP, показан на рисунке ниже.
Теперь несколько слов можно сказать про Relay с SMB на LDAP. Углубляться в структуру каждого из хешей не будем, все‑таки разговор идет не про это, но пару слов про разницу именно в контексте такой атаки сказать стоит:
- NetNTLMv1-хеш будет приятным подарком для атакующего, потому что у него есть недостаток дизайна — отсутствие значения MIC (значение для проверки целостности), которое позволяет выполнять Relay с SMB на LDAP.
- В NetNTLMv2 исправлен этот недостаток, но все‑таки в реализации были обнаружены уязвимости 2019-1040 и CVE-2019-1166, которые позволяют удалить MIC и выполнить Relay с SMB на LDAP.
Во всех описанных случаях применяем флаг --remove-mic
в ntlmrelayx:
impacket-ntlmrelayx -t ldap://<DC IP> -smb2support --remove-mic
В случае аутентификации с NetNTLMv2-хешем на контроллер с патчем получаем ошибку.
В случае аутентификации с NetNTLMv2-хешем на контроллер без патча получаем профит.
Аналогичная ситуация будет с NetNTLMv1-хешем при Relay-атаке на контроллер с патчем — получаем профит.
Также полезным может оказаться интерактивный режим:
impacket-ntlmrelayx -t ldap://<DC IP> -i
После этого у нас есть возможность подключиться к интерактивной оболочке и начать взаимодействовать с LDAP. Встроенные функции позволяют сделать дамп домена, добавить пользователя в группу, удалить его оттуда, провести эксплуатацию RBCD, создать пользователя и т. д. В целом небогато, но жить можно.
А вот один из классных примеров использование RAW-сервера, о котором мы говорили в предыдущей статье с Relay-атакой на LDAP.
Результат пересылки аутентификации на LDAP — созданная учетная запись, не админская, но с привилегией DCsync.
RPC (135/TCP)
Также возможна пересылка NTLM-аутентификации на DCE/RPC. В основном эта тема раскрывается в контексте Potato-атак. Но также есть уязвимости, которые позволяют выполнять команды на узле вне зависимости от требований подписи SMB, потому что SMB там не используется совсем.
Первые исследования на эту тему опубликовали CompasSecurity в своем блоге. Более того, три года подряд они находят все новые векторы эксплуатации Relay на RPC. Первой была уязвимость CVE-2020-1113, потом CVE-2021-26414, и в 2022 году они открыли миру атаку на AD CS ESC11.
Для эксплуатации CVE-2020-1113 (присутствует в Impacket 0.10.0) используем следующую команду:
impacket-ntlmrelayx -t rpc://<target IP> -c ’whoami’
В качестве примера выполним код на контроллере домена с включенным требованием подписи SMB-сообщений.
Даже если в домене настроено требование подписи SMB, можно пробовать Relay на RPC, поскольку один‑единственный непоставленный патч может дать преимущество атакующему.
Чтобы иметь возможность эксплуатации ESC11, необходимо в свой Impacket добавить немного кода, который можно найти на GitHub.
INFO
ESC11 — это одна из техник для повышения привилегий в AD через центр сертификации, основанная на выпуске сертификата через RPC.
Вот cсылка на первоисточник описания техники.
Для эксплуатации ESC11 достаточно следующей команды:
impacket-ntlmrelayx -t rpc://<CA IP> -rpc-mode ICPR -icpr-ca-name <CA name> --template "template name"
В результате эксплуатации мы получаем сертификат от имени учетки, аутентификация которой была перехвачена. Например, мы можем принудить контроллер домена пройти аутентификацию на нашей машине, сделать ESC11, получить сертификат от имени контроллера и в итоге скомпрометировать домен.
HTTP (80/TCP)
Пересылка аутентификации на HTTP возможна с любого другого протокола, основной вектор эксплуатации — это AD CS ESC8.
INFO
ESC8 — это одна из техник для повышения привилегий в AD через центр сертификации, основанная на выпуске сертификата через WEB. Вот ссылка на первоисточник описания техники.
При поиске AD CS без учетной записи можно проверить все контроллеры, а также все обнаруженные Windows Server на доступность URL вида http://<CA IP>/certsrv
. С учетной записью все гораздо проще, можно воспользоваться удобным инструментом Certipy.
Для выполнения Relay-атаки можно использовать следующую команду:
impacket-ntlmrelayx -t "http://<CA IP>/certsrv/certfnsh.asp" --adcs --template "template name"
На рисунке ниже приведен пример Relay с RPC на HTTP.
Вот пример пересылки аутентификации с RAW на HTTP и реализация атаки ESC8.
INFO
Помимо повышения привилегий, данную технику можно использовать для получения начального доступа в домене. Если на этапе разведки удалось обнаружить AD CS с включенным WebEnroll, то при получении NTLM-аутентификаций можно сразу нацелиться на получение сертификата и таким образом получить закрепление.
ВЫВОДЫ
Если с брутом все ясно: находишь тип хеша и запускаешь hashcat, то с Relay не все так однозначно. Из‑за различных особенностей не всегда понятно, куда можно пересылать аутентификацию.
Для начала просто приведем таблицу экспериментов с Relay-атаками. Все эксперименты были проведены с помощью ntlmrelayx v0.10.0.
Аутентификацию с SMB при определенных условиях можно пересылать на любой другой протокол.
Аутентификацию с DCE RPC точно можно переслать на HTTP, SMB, RPC. В сочетании с техниками RemotePotato0 можно получить HTTP-аутентификацию от имени привилегированного пользователя и выполнить Relay на LDAP.
Аутентификацию с HTTP можно переслать куда угодно, без ограничений.
Аутентификацию с WCF точно можно пересылать на HTTP, SMB, RPC. С LDAP надо разбираться отдельно, с наскока не получилось.
БОНУС
Может сложиться ситуация, когда на внутреннем пентесте будет открыт доступ по VPN, который запрещает обратные соединения — то есть при принуждении ни одна аутентификация до атакующего долететь не сможет.
Домен маленький и достаточно новый, уязвимостями и мисконфигами обрасти не успел. Но сразу же бросается в глаза, что почти на всех машинах на SMB не требуется подпись, в том числе на Exchange-серверах, которые часто обладают высокими привилегиями в домене.
На этапе разведки удалось найти локальную учетную запись от нескольких доменных машин, но без прав локального администратора. С помощью локальной учетки можно выполнить Coerce-атаку. Таким образом, есть возможность получить доменную учетку машины и, соответственно, доступ к каким‑то сетевым папкам и даже больше.
В случае с доступом к сетевым папкам все достаточно просто: выполняем Coerce на машину атакующего, далее Relay на SMB в интерактивном режиме на любой доменный узел без требования подписи SMB. На схеме этот алгоритм выглядит немного понятнее.
Иными словами, имея только локальную учетку, вполне реально получить доступ к некоторым доменным ресурсам. Но можно выжать из этого больше. С помощью такого хитрого способа есть возможность принудить другую машину после успешного Relay. Коротко схема получится такой: Coerce + Relay + Coerce + Relay = Admin.
А если конкретнее, то такой кейс возможен, если на Exchange отключен SMB Signing и Exchange находятся друг у друга в админах, как это часто бывает. С помощью локальной учетки получаем доменную учетку машины и делаем Relay на SMB на Exchange1, после чего принудим его пройти аутентификацию на машине атакующего. После получения аутентификации выполняем Relay на Exchange2 на SMB уже от имени Exchange1. На схеме это выглядит примерно так.
Не имея доменной учетки и даже учетки локального админа на каком‑нибудь хосте, можно проворачивать довольно‑таки хитрые трюки.
ЗАЩИТА
В приведенной таблице хорошо прослеживается тенденция, что для защиты надо закрывать эндпоинты, куда может быть совершен Relay. Если коротко:
- Включить требование подписи SMB-сообщений.
- Включить требование подписи LDAP.
- Отключить WebEnroll в AD CS.
- Выставить в AD CS флаг
IF_ENFORCEENCRYPTICERTREQUEST
в положениеTrue
. - Регулярно устанавливать обновления безопасности.
В большинстве случаев Relay возможен из‑за небольших недостатков в настройках инфраструктуры, поэтому защитить свой домен можно простыми методами.
ИТОГ
В итоге можно сказать, что Relay-атаки сильно расширяют возможности атакующего. Если провести качественную разведку и правильно оценить ситуацию, использовать все векторы для получения аутентификации и пробовать их пересылать в различные эндпоинты, то шансы на успех резко возрастут.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei