Ду­маю, ты уже мно­го раз слы­шал, что под­дер­жку NTLM Relay в Windows вот‑вот отклю­чат. Я тоже слы­шал это не раз, но сей­час начало 2025 года, и поч­ти на каж­дом про­екте я до сих пор встре­чаю NTLM Relay. Сегод­ня я рас­ска­жу про акту­аль­ные тех­ники 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 и поз­воля­ет более эффектив­но управлять рабочи­ми стан­циями, соф­том и всем осталь­ным.

Для под­твержде­ния моих слов — скрин­шот из офи­циаль­ной докумен­тации.

Документация Microsoft
До­кумен­тация Microsoft

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

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

Схема устройства сайтов SCCM/MECM
Схе­ма устрой­ства сай­тов SCCM/MECM

Вот клю­чевые сос­тавля­ющие SCCM:

Разведка

На этом пора закан­чивать с теорией и прис­тупать к прак­тике. В качес­тве стен­да я взял лабу 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. Мож­но вос­поль­зовать­ся им, тог­да вся получен­ная информа­ция еще будет упо­рядо­чена в кра­сивые таб­лицы.

Разведка SCCM с помощью sccmhunter
Раз­ведка SCCM с помощью sccmhunter

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

Разведка SCCM через SMB с помощью CrackMapExec
Раз­ведка SCCM через SMB с помощью CrackMapExec

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

Разведка SCCM через SMB с помощью sccmhunter
Раз­ведка SCCM через SMB с помощью sccmhunter

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

Результаты разведки SCCM
Ре­зуль­таты раз­ведки SCCM

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

TAKEOVER1

Сно­ва обра­тим­ся к схе­ме стен­да.

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

За­пус­каем ntlmrelayx.

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

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

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

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

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

Возможности учетной записи sccm-sql
Воз­можнос­ти учет­ной записи sccm-sql

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

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

info

На одном сер­вере Microsoft SQL может быть нес­коль­ко сай­тов SCCM, и тог­да нуж­но вни­матель­но отсле­живать, в какой имен­но добав­ляет­ся новая запись. Пер­вая коман­да — use CM_P01 — как раз нуж­на для это­го.

Да­лее еще нуж­но накинуть при­виле­гии на опре­делен­ные типы объ­ектов.

Выполнение SQL-запросов для расширения привилегий в рамках сайта SCCM
Вы­пол­нение SQL-зап­росов для рас­ширения при­виле­гий в рам­ках сай­та SCCM

На самом деле от сай­та к сай­ту менять­ся будет толь­ко под­чер­кну­тое зна­чение. Это и есть уни­каль­ный иден­тифика­тор поль­зовате­ля в рам­ках сай­та SCCM. Прис­воен этот иден­тифика­тор был авто­мати­чес­ки при добав­лении поль­зовате­ля в таб­лицу, а перечис­лил я его на скрин­шоте выше.

info

Ес­ли хочешь под­робнее пог­рузить­ся в тему, рекомен­дую заг­лянуть в до­кумен­тацию. А еще любопыт­ное наб­людение: если наз­начить поль­зовате­лю роль адми­нис­тра­тора «пра­виль­но», через оснас­тку, а потом заг­лянуть в БД, то там будут записи такого же фор­мата в тех же таб­лицах, что я опи­сал выше.

Для любите­лей авто­мати­зации: sccmhunter поможет соб­рать пра­виль­ные SQL-зап­росы, и оста­нет­ся их толь­ко выпол­нить.

Демонстрация автоматизации выполнения атаки с помощью sccmhunter
Де­монс­тра­ция авто­мати­зации выпол­нения ата­ки с помощью sccmhunter

Итак, на этом эта­пе я успешно повысил при­виле­гии в рам­ках сай­та SCCM, а как это экс­плу­ати­ровать, рас­ска­жу чуть поз­же. Сна­чала — про дру­гие методы повыше­ния при­виле­гий.

TAKEOVER2

Ты еще пом­нишь схе­му, которую я раз­бирал в начале опи­сания TAKEOVER1? Обра­тим­ся к ней сно­ва.

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

info

По моему мне­нию, эта тех­ника сто­ит имен­но на вто­ром мес­те в клас­сифика­ции из‑за того, что с NTLM Relay на SMB ситу­ация ста­ла нем­ного луч­ше. Я час­то замечаю, что в инфраструк­турах нас­тро­ено тре­бова­ние при­нуди­тель­ной под­писи SMB. А вот с Microsoft SQL все не так глад­ко, защита от Relay-атак зачас­тую не нас­тро­ена вооб­ще ниг­де.

За­пус­каю ntlmrelayx для выпол­нения ата­ки.

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

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

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

Результат выполнения secretsdump на узле 192.168.60.12
Ре­зуль­тат выпол­нения secretsdump на узле 192.168.60.12

В резуль­тате получаю учет­ную запись локаль­ного адми­нис­тра­тора на ата­куемом сер­вере, саму учет­ную запись сер­вера, а еще учет­ную запись sccm-sql с паролем в откры­том виде.

info

Па­роль в откры­том виде находит­ся в HKLM\SECURITY. Это осо­бен­ность запус­ка служб в 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, нап­ример как на скрин­шоте ниже.

Получение SID пользователя через LDAP
По­луче­ние SID поль­зовате­ля через LDAP

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

Запуск ntlmrelayx для проведения атаки TAKEOVER5
За­пуск ntlmrelayx для про­веде­ния ата­ки TAKEOVER5

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

Отправка NTLM-аутентификации для демонстрации работоспособности кейса
От­прав­ка NTLM-аутен­тифика­ции для демонс­тра­ции работос­пособ­ности кей­са

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

В резуль­тате выпол­нения такой нес­ложной, но очень эффектив­ной ата­ки я сно­ва добавил под­кон­троль­ной учет­ной записи роль адми­нис­тра­тора сай­та SCCM.

Повышение привилегий в домене AD

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

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

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

get_device <DNSHostName>
Получение уникального идентификатора узла в рамках сайта SCCM
По­луче­ние уни­каль­ного иден­тифика­тора узла в рам­ках сай­та SCCM

В получен­ном выводе обра­щаем вни­мание на поле ResourceId.

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

Переключение оболочки на атакуемый узел
Пе­рек­лючение обо­лоч­ки на ата­куемый узел

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

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

В sccmhunter реали­зова­на механи­ка под­твержде­ния скрип­та вто­рым адми­нис­тра­тором, поэто­му сра­зу ука­зываю две учет­ные записи и выпол­няю нуж­ные дей­ствия.

Добавляем пользователя carol в группу локальных администраторов
До­бав­ляем поль­зовате­ля carol в груп­пу локаль­ных адми­нис­тра­торов

info

Все коман­ды выпол­няют­ся через WMI, который исполь­зует­ся в качес­тве тран­спор­та HTTP.

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

Юзер carol добавлен в группу локальных администраторов
Юзер carol добав­лен в груп­пу локаль­ных адми­нис­тра­торов

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.

  1. Откры­ваем оснас­тку.
  2. Рас­кры­ваем SQL Server Network Configuration.
  3. Нажима­ем пра­вой кноп­кой мыши на Protocols for MSSQLSERVER.
  4. Выбира­ем Properties.
  5. Нажима­ем Advanced.
  6. Меня­ем зна­чение Extended Protocols Protection: Required.
  7. Нажима­ем Flags.
  8. Меня­ем зна­чение Force Encryption: Yes.
  9. Нажима­ем Apply.
  10. На­жима­ем OK.
Применение настройки Force Encryption
При­мене­ние нас­трой­ки Force Encryption
Применение настройки Extended Protection
При­мене­ние нас­трой­ки Extended Protection

Бонус

Не­боль­шой бонус для ата­кующих и защит­ников. Как мас­сово про­верить инфраструк­туру на наличие тре­бова­ния под­писи 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 его будут намерен­но вклю­чать для под­дер­жки легаси.