Relay again
Изучаем актуальные техники атак NTLM Relay через SCCM
Минутка исторического экскурса. В конце 2023 года коллеги из Specterops опубликовали исследование, в котором подробно раскрыли техники повышения привилегий в домене AD через эксплуатацию серверов SCCM (System Center Configuration Manager). С тех пор вышло еще несколько крутых ресерчей на ту же тему. Если хочешь фундаментально во всем разобраться — добро пожаловать в репозиторий на GitHub, где собраны и упорядочены техники получения учеток, повышения привилегий и постэксплуатации, связанные с SCCM. Здесь же я хочу наглядно продемонстрировать, как можно пользоваться атаками NTLM Relay на SCCM.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Теория
Для тех, кто только погружается в тему и еще не знает, что такое SCCM, дам небольшую справку. Итак, System Center Configuration Manager (с 2020 года известен как Microsoft Endpoint Configuration Manager, MECM) — это ПО для централизованного управления. В официальной документации мне не удалось обнаружить четкого определения, что это за сущность и зачем нужна, поэтому я сформулировал его самостоятельно.
Можно заметить, что это определение, по сути, описывает сам Active Directory (далее AD). На самом деле — и да и нет: Configuration Manager был создан для облегчения жизни ИТ‑администраторам, а также для снижения затрат на администрирование.
Приведу простой пример. Когда в твоей компании тысяча сотрудников, с администрированием может справиться условно пять человек, а что, если компания выросла до десяти тысяч или даже ста тысяч человек? Наймем пятьдесят или пятьсот человек соответственно? Конечно, мы хотим избежать линейной зависимости, для этого и был придуман сначала AD, а после Configuration Manager.
SCCM зачастую встречается в достаточно больших компаниях, где количество пользователей давно перевалило за десять тысяч. Он объединяет в себе почти все возможные оснастки в AD и позволяет более эффективно управлять рабочими станциями, софтом и всем остальным.
Для подтверждения моих слов — скриншот из официальной документации.

Также я выделил ключевую мысль: «может повлиять на каждый компьютер в организации». Но оговорюсь: при условии, если компьютер находится под управлением сервера SCCM.
Со структурой помогла разобраться схема, приведенная ниже.

Вот ключевые составляющие SCCM:
- Архитектура «клиент‑сервер». Клиентами выступают все узлы домена, например DC или Exchange, а сервером — мастер SCCM.
- Реализована отказоустойчивость. Она достигается добавлением пассивного сервера, готового перехватить обязанности мастера в случае, если тот выйдет из строя.
- Работает в терминах сайтов. Здесь всё из официальной документации, просто нужно привыкнуть к терминологии: сайтов в одном домене AD может быть несколько.
- Реализована иерархия сайтов. Сайты могут быть связаны между собой дочерними отношениями. Каждый сайт можно атаковать независимо от другого.
- Реализована ролевая модель. В сайтах SCCM используется хорошо проработанная ролевая модель как для пользователей, так и для серверов. Подробно на этом останавливаться не буду, в рамках статьи важны только две роли: Full administrator для пользователей и Site system servers для серверов. Подробнее про ролевую модель серверов можно прочитать в документации (также — в разделе для пользователей).
- Использует MSSQL. SCCM вообще не может существовать без MSSQL. В БД хранится вся служебная информация, например таблицы с записями про роли. Оснастка MSSQL может быть развернута на мастере, но зачастую выделяется в отдельный сервер.
Разведка
На этом пора заканчивать с теорией и приступать к практике. В качестве стенда я взял лабу GOAD. Если у тебя возникнет желание попробовать все описанное ниже, то ты без проблем развернешь стенд и проведешь тесты. Схема стенда достаточно понятная, у меня будет SCCM/MECM, контроллер домена, который не находится под управлением SCCM, клиент SCCM и сервер с MSSQL для хранения всей служебной информации.

Все дальнейшие действия подразумевают наличие у атакующего учетной записи в домене AD.
В первую очередь мы должны понять, есть ли в домене SCCM. Сделать это можно с помощью одного нехитрого LDAP-запроса:
ldapsearch -E pr=10000/noprompt -D <username>@<domain> -w <password> -x -H ldap://<IP> -b
DC=<domain>,DC=<domain> '(objectclass=mssmsmanagementpoint)' dnshostname,msSMSSiteCode
Также в сообществе разработали инструмент для автоматизации всей разведки — sccmhunter.py. Можно воспользоваться им, тогда вся полученная информация еще будет упорядочена в красивые таблицы.

После разведки через LDAP можно провести разведку по SMB. Это будет вполне по силам сделать руками.

Но лучше автоматизировать.

Благодаря этой разведке мы обнаруживаем SiteCode и проверяем SMB Signing. Отсутствие требования подписи SMB и SiteCode необходимы для дальнейших атак.

Серверы мы обнаружили, теперь повысим привилегии несколькими способами.
TAKEOVER1
Снова обратимся к схеме стенда.

На ней четко видно, что учетная запись компьютера MECM$
является администратором базы данных на сервере Microsoft SQL. Единственная проблема — где взять учетку MECM$
? Но тут вспоминаем про атаку NTLM Relay и технику принуждения к аутентификации (Coerce).
Запускаем ntlmrelayx.

Выполняем атаку принуждения к аутентификации с помощью PetitPotam.

Получаю положительный результат — установленную сессию Microsoft SQL от имени MECM$.

Подключаюсь к SCCM, используя установленную сессию.

После получения шелла пробую по классике выполнить код через xp_cmdshell.

Итак, у меня есть RCE на сервере SCCM/MECM, но правда ли это конечная цель? Более того, учетка sccm-sql
— это локальный администратор на сервере.

И тут проверка на внимательность. В самом начале статьи я упомянул, что сайты SCCM строятся на Microsoft SQL и вся информация о ролях хранится в БД. Попробую выполнить несколько SQL-запросов, чтобы добавить своей учетке роль администратора и права на выполнение скриптов.

Давай разберемся, что произошло выше. Я вставляю строку в таблицу с говорящим названием RBAC_Admins
. Длинное значение из непонятных символов — это шестнадцатеричное представление SID пользователя, которого надо добавить в администраторы. Значение SourceSite — это имя сайта, которое обнаружили на этапе разведки по SMB.
info
На одном сервере Microsoft SQL может быть несколько сайтов SCCM, и тогда нужно внимательно отслеживать, в какой именно добавляется новая запись. Первая команда — use
— как раз нужна для этого.
Далее еще нужно накинуть привилегии на определенные типы объектов.

На самом деле от сайта к сайту меняться будет только подчеркнутое значение. Это и есть уникальный идентификатор пользователя в рамках сайта SCCM. Присвоен этот идентификатор был автоматически при добавлении пользователя в таблицу, а перечислил я его на скриншоте выше.
info
Если хочешь подробнее погрузиться в тему, рекомендую заглянуть в документацию. А еще любопытное наблюдение: если назначить пользователю роль администратора «правильно», через оснастку, а потом заглянуть в БД, то там будут записи такого же формата в тех же таблицах, что я описал выше.
Для любителей автоматизации: sccmhunter поможет собрать правильные SQL-запросы, и останется их только выполнить.

Итак, на этом этапе я успешно повысил привилегии в рамках сайта SCCM, а как это эксплуатировать, расскажу чуть позже. Сначала — про другие методы повышения привилегий.
TAKEOVER2
Ты еще помнишь схему, которую я разбирал в начале описания TAKEOVER1? Обратимся к ней снова.

На схеме четко видно, что учетная запись компьютера MECM$ находится в группе локальных администраторов на сервере Microsoft SQL. При такой конфигурации атакующий может попробовать реализовать NTLM Relay на SMB или RPC. В этом и заключается суть TAKEOVER2, но не без нюансов. Впрочем, с ними сейчас разберемся.
info
По моему мнению, эта техника стоит именно на втором месте в классификации из‑за того, что с NTLM Relay на SMB ситуация стала немного лучше. Я часто замечаю, что в инфраструктурах настроено требование принудительной подписи SMB. А вот с Microsoft SQL все не так гладко, защита от Relay-атак зачастую не настроена вообще нигде.
Запускаю ntlmrelayx для выполнения атаки.

Выполняю принуждение к аутентификации с помощью PetitPotam.

Получаю положительный результат.

После успешно установленной SMB-сессии сразу пробую создать дамп веток реестра HKLM\
и HKLM\
.

В результате получаю учетную запись локального администратора на атакуемом сервере, саму учетную запись сервера, а еще учетную запись sccm-sql с паролем в открытом виде.
info
Пароль в открытом виде находится в HKLM\
. Это особенность запуска служб в Windows. Чтобы избежать этого, можно использовать GMSA. Подробнее — в официальной документации.
В этот момент снова вспоминаю схему и понимаю, что учетная запись sccm-sql — это администратор БД на сервере Microsoft SQL. Попробую подключиться к БД.

Снова получаю шелл на Microsoft SQL, а дальше атака сводится к TAKEOVER1. По аналогии с предыдущим кейсом выполняю четыре SQL-запроса для повышения привилегий в рамках сайта SCCM. Выполняю код на целевом устройстве, которым зачастую является контроллер домена.
www
Можно еще попробовать выполнить NTLM Relay на RPC, но для его успешной реализации требуется наличие на сервере уязвимости CVE-2020-1113.
TAKEOVER5
Создатель стенда GOAD не закладывал возможность демонстрации этой техники, но, если очень захотеть, можно протестировать и ее.
Суть техники заключается в проведении атаки NTLM Relay на HTTP для повышения привилегий через WMI. Чтобы провести атаку, понадобится пропатчить ntlmrelayx.
Нам понадобится любая учетная запись в домене AD, плюс нужно знать SID этой учетной записи. Его можно посмотреть в BloodHound в атрибутах пользователя или запросить через LDAP, например как на скриншоте ниже.

Запускаем ntlmrelayx, чтобы провести атаку и повысить привилегии на сайте SCCM пользователю eve. NTLM Relay направлена на SMS-сервер, который может быть настроен на мастере или вынесен на отдельный узел.

Теперь используем принуждение к аутентификации, например с помощью PetitPotam, против мастер‑сервера или резервного. Но стенд не предусматривает наличие двух таких серверов, поэтому искусственно пришлю аутентификацию на ntlmrelayx.

Получаю результат выполнения атаки. Подконтрольной учетной записи добавлена роль администратора сайта SCCM.

В результате выполнения такой несложной, но очень эффективной атаки я снова добавил подконтрольной учетной записи роль администратора сайта SCCM.
Повышение привилегий в домене AD
Я трижды смог повысить права своей учетке до полного администратора сайта SCCM, но что это дает? Возможность выполнения команд через SCCM API. Сделать это можно через оснастку с помощью SharpSCCM или sccmhunter.


Чтобы начать взаимодействовать с каким‑либо компьютером в домене, сначала нужно найти идентификатор целевого хоста на сайте SCCM. Делается это в одну команду через sccmhunter.
get_device <DNSHostName>

В полученном выводе обращаем внимание на поле ResourceId
.
Теперь попробуем выполнить команды непосредственно на компьютере.

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

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

info
Все команды выполняются через WMI, который используется в качестве транспорта HTTP.
После успешного выполнения команды снова попробую перечислить сетевые диски. Доступ к сетевым дискам ADMIN$
и С$
показывает, что наш пользователь стал локальным администратором.

info
На собственном опыте могу сказать, что в 100% случаев под управлением SCCM находились также и контроллеры домена. Так что все действия, которые будут показаны далее, обычно выполняются на DC.
Защита
В целом методы защиты от атак NTLM Relay обсуждаются со времен появления самой атаки. Защищаться нужно от получения атакующим NTLM-аутентификации (spoofing, MITM, Coerce и прочих методов), а также стоит защищать конечные точки, куда NTLM Relay будет направлена (SMB, MSSQL, HTTP, LDAP, RPC). Подробнее можно прочитать в официальной статье Microsoft или в предыдущих статьях про NTLM Relay. Здесь же хочу подробно разобрать защиту именно от NTLM Relay на Microsoft SQL, так как ранее эта техника не была настолько полезной.
Microsoft SQL
В Microsoft уже давно поняли, что от NTLM Relay надо защищаться, и разработали штатные средства для этого. Называются они Extended Protection и Force Encryption. Настроить их можно с помощью стандартной оснастки SQL от Microsoft.
- Открываем оснастку.
- Раскрываем SQL Server Network Configuration.
- Нажимаем правой кнопкой мыши на Protocols for MSSQLSERVER.
- Выбираем Properties.
- Нажимаем Advanced.
- Меняем значение Extended Protocols Protection: Required.
- Нажимаем Flags.
- Меняем значение Force Encryption: Yes.
- Нажимаем Apply.
- Нажимаем OK.


Бонус
Небольшой бонус для атакующих и защитников. Как массово проверить инфраструктуру на наличие требования подписи Microsoft SQL? Есть удобный инструмент mssqlrelay. Он пока не умеет работать по подсетям или файлам с таргетами, но всегда можно запустить его в цикле.
С его помощью легко проверить, включена ли защита на конечных точках.
mssqlrelay check -target-ip <IP>


Зачастую на реальных пентестах защита конечных точек Microsoft SQL отключена.
Выводы
В статье рассмотрено три кейса с NTLM Relay на SCCM, но на самом деле их существует больше. Но все они строятся на уже известных тебе по предыдущим статьям техниках, например NTLM Relay на LDAP + кейс с RBCD или ShadowCreds. Или NTLM Relay на ADCS для выпуска сертификата от имени мастер‑сервера с дальнейшим его захватом.

Второй вывод — рано еще списывать со счетов старую добрую атаку NTLM Relay, я думаю, еще долгое время NTLM будет существовать в инфраструктурах. Отказаться от него непросто, и даже на Windows 11 и Server 2022 его будут намеренно включать для поддержки легаси.