В этой статье я рас­ска­жу о тес­тирова­нии сети одной государс­твен­ной ком­пании, в котором я учас­тво­вал. Орга­низа­ция нес­коль­ко раз в год заказы­вала пен­тесты как внеш­ней, так и внут­ренней инфраструк­туры. Мы отра­баты­вали модель внут­ренне­го наруши­теля — зло­умыш­ленни­ка, обла­дающе­го дос­тупом к сети ком­пании, но без при­виле­гий в домене.

Pentest Award

Этот текст занял третье мес­то на пре­мии Pentest Award 2024 в катего­рии «Про­бив инфры». Сорев­нование еже­год­но про­водит ком­пания Awillix.

Де­ло было осенью 2022 года. Мы работа­ли вдво­ем с кол­легой: он отве­чал за веб‑уяз­вимос­ти, а я за ана­лиз инфраструк­туры — сер­висы, домен и про­чее.

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

В час­тнос­ти, в отде­ле безопас­ности утвер­жда­ли, что регуляр­но про­водят ана­лиз NTDS путем про­гона NTLM-хешей паролей домен­ных поль­зовате­лей по популяр­ным сло­варям, так что спре­ить на популяр­ные пароли смыс­ла нет.

И дей­стви­тель­но, про­ект ока­зал­ся неп­ростым, учет­ную запись в домене мне не пре­дос­тавили. Я про­верил воз­можность LLMNR poisoning и про­чие вари­ации этой ата­ки, поп­робовал слу­шать тра­фик, ска­ниро­вал на пред­мет наличия популяр­ных уяз­вимос­тей (Bluekeep, EternalBlue и тому подоб­ных), про­верил ано­ним­ные фай­ловые ресур­сы, нашел и изу­чил прин­теры и МФУ. Веб тоже не дал никаких надежд.

В один прек­расный момент мне повез­ло: я нашел три хос­та с активным сер­висом DameWare, из них домен­ный был толь­ко один. В некото­рых вер­сиях это­го про­дук­та есть уяз­вимость CVE-2019-3980, поз­воля­ющая получить несан­кци­они­рован­ный уда­лен­ный дос­туп к ата­куемой сис­теме.

Вер­сия DameWare ока­залась уяз­вимой, и мне уда­лось соз­дать локаль­ную учет­ную запись адми­нис­тра­тора, извлечь учет­ные дан­ные из памяти про­цес­са LSASS и раз­вить ата­ку до пол­ной ком­про­мета­ции домена. Опу­щу под­робнос­ти это­го век­тора, они не пред­став­ляют осо­бого инте­реса, он был дос­таточ­но три­виален. Дру­гих век­торов нам обна­ружить тог­да не уда­лось. Самое инте­рес­ное было даль­ше.

info

Наз­вание домена целевой орга­низа­ции на всех скрин­шотах замаза­но, в тек­сто­вой час­ти замене­но test.local.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

Ход атаки

С заказ­чиком у нас был зак­лючен договор сра­зу на два про­екта, и вес­ной 2023 года мы вер­нулись к нему сно­ва, в ту же самую инфраструк­туру, с той же самой точ­кой под­клю­чения, сер­висов DameWare в сети уже не наш­ли. Заказ­чик с еще боль­шей уве­рен­ностью стал заяв­лять, что в этот раз у нас точ­но ничего не получит­ся, так как все замеча­ния и единс­твен­ный най­ден­ный нами баг они устра­нили. Даже спор сно­ва пред­ложил, а мы сно­ва отка­зались. И сно­ва пожале­ли об этом!

До­мен­ную учет­ную запись нам, как всег­да, не дали, и мы при­нялись за сетевое окру­жение. Я вновь пос­каниро­вал на пред­мет ано­маль­ных ресур­сов, обо­шел все МФУ, пос­ниффал тра­фик и про­вел все про­чие про­цеду­ры. Ничего. Мой кол­лега уяз­вимос­тей тоже не нашел.

И тут на одном из веб‑ресур­сов мне попалось опуб­ликован­ное .NET-при­ложе­ние.

Веб-ресурс ppo-app
Веб‑ресурс ppo-app

Пос­ле нажатия кноп­ки Start на стра­нице http://ppo-app.test.local/ про­исхо­дит ска­чива­ние исполня­емых фай­лов при­ложе­ния во вре­мен­ную дирек­торию на компь­юте­ре поль­зовате­ля. Я под­робно изу­чил ска­чан­ное при­ложе­ние и выяс­нил, что оно под­клю­чает­ся к базе дан­ных Microsoft SQL, раз­мещен­ной на хос­те PPO-BD.test.local. Учет­ные дан­ные для под­клю­чения к базе находят­ся в фай­ле star.exe.config, который ска­чива­ется вмес­те с при­ложе­нием.

Окно настроек подключения к базе данных
Ок­но нас­тро­ек под­клю­чения к базе дан­ных

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

Параметры подключения к базе данных в star.exe.config
Па­рамет­ры под­клю­чения к базе дан­ных в star.exe.config

Для рас­шифров­ки пароля я деком­пилиро­вал при­ложе­ние с помощью ILSpy. В динами­чес­кой биб­лиоте­ке Star.Wpf.Controls.dll наш­лась фун­кция EncryptionLogic, содер­жащая ключ шиф­рования и алго­ритм рас­шифров­ки. В резуль­тате мне уда­лось получить пароль от учет­ной записи базы дан­ных asabrys (это не домен­ная учет­ная запись). Затем с помощью DBeaver я под­клю­чил­ся к базе дан­ных.

У ском­про­мети­рован­ной учет­ки были пра­ва sysadmin в пре­делах MSSQL, чем я и вос­поль­зовал­ся, что­бы вклю­чить обо­лоч­ку xp_cmdshell, поз­воля­ющую исполнять коман­ды опе­раци­онной сис­темы.

Ока­залось, что сер­вер базы дан­ных работа­ет в кон­тек­сте слу­жеб­ной учет­ной записи MSSQL$SQLEXPRESS, у которой есть при­виле­гия SeImpersonatePrivilege, то есть мож­но выпол­нять коман­ды в кон­тек­сте любой учет­ной записи, в том чис­ле сис­темной.

Функция расшифровки пароля для подключения к базе данных (файл Star.Wpf.Controls.dll)
Фун­кция рас­шифров­ки пароля для под­клю­чения к базе дан­ных (файл Star.Wpf.Controls.dll)

Что­бы заг­рузить необ­ходимые инс­тру­мен­ты на хост PPO-BD.test.local, я раз­вернул FTP-сер­вер на рабочей стан­ции, с которой про­водил тес­тирова­ние. Для эска­лации при­виле­гий до уров­ня SYSTEM я исполь­зовал инс­тру­мент SharpImpersonation. С его помощью соз­дал учет­ку локаль­ного адми­нис­тра­тора itadmin. Затем со сво­его компь­юте­ра под­клю­чил­ся к хос­ту PPO-BD.test.local по про­токо­лу RDP и с помощью обфусци­рован­ной сбор­ки Mimikatz соз­дал дамп памяти сис­темно­го про­цес­са lsass.exe и извлек хра­нящи­еся там учет­ные дан­ные.

В дам­пе памяти нашел­ся NTLM-хеш пароля учет­ной записи компь­юте­ра test.local\PPO-BD$. Дру­гих акту­аль­ных домен­ных уче­ток на хос­те PPO-BD.test.local не было.

Я исполь­зовал Rubeus, что­бы зап­росить TGT-билет Kerberos для учет­ной записи test.local\PPO-BD$, исполь­зуя NTLM-хеш ее пароля. Это поз­волило получить дос­туп в домен test.local.

Привилегии и контекст учетной записи сервера базы данных на хосте PPO-BD
При­виле­гии и кон­текст учет­ной записи сер­вера базы дан­ных на хос­те PPO-BD
Выполнение техники Pass the Hash для учетной записи PPO-BD<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Выполнениетехники</mtext><mi>P</mi><mi>a</mi><mi>s</mi><mi>s</mi><mi>t</mi><mi>h</mi><mi>e</mi><mi>H</mi><mi>a</mi><mi>s</mi><mi>h</mi><mtext>дляучетнойзаписи</mtext><mi>P</mi><mi>P</mi><mi>O</mi><mo>−</mo><mi>B</mi><mi>D</mi></mrow><annotation encoding="application/x-tex">' title='Выполнение техники Pass the Hash для учетной записи PPO-BD</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Выполнениетехники</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">a</span><span class="mord mathnormal">ss</span><span class="mord mathnormal">t</span><span class="mord mathnormal">h</span><span class="mord mathnormal" style="margin-right:0.08125em;">eH</span><span class="mord mathnormal">a</span><span class="mord mathnormal">s</span><span class="mord mathnormal">h</span><span class="mord cyrillic_fallback">дляучетнойзаписи</span><span class="mord mathnormal" style="margin-right:0.02778em;">PPO</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span></span></span></span>
Вы­пол­нение тех­ники Pass the Hash для учет­ной записи PPO-BD$

Ис­поль­зуя учет­ную запись компь­юте­ра PPO-BD$, я соб­рал информа­цию о домене, вклю­чая дан­ные о груп­повых полити­ках. При ана­лизе скрип­тов, запус­каемых эти­ми полити­ками, уда­лось най­ти нес­коль­ко фай­лов, в которых был про­писан пароль для локаль­ной учет­ной записи LocalAdmin.

Пароль для локальной учетной записи LocalAdmin в скрипте
Па­роль для локаль­ной учет­ной записи LocalAdmin в скрип­те

Я под­клю­чил­ся к сер­веру OMO-FSCHANGE.test.local от име­ни учет­ной записи LocalAdmin. Быс­трый осмотр содер­жимого дис­ков не при­нес ничего полез­ного — цен­ных дан­ных не наш­лось, активных сес­сий адми­нис­тра­торов тоже не было. Зато уда­лось сде­лать дамп хра­нили­ща локаль­ных учет­ных записей (LSA).

Дамп LSA на хосте OMO-FSCHANGE.test.local
Дамп LSA на хос­те OMO-FSCHANGE.test.local

Из­вле­чен­ные из LSA локаль­ные учет­ные дан­ные вклю­чали NTLM-хеш локаль­ной учет­ки admin-omsk, которая сос­тоит в груп­пе локаль­ных адми­нис­тра­торов. Пос­ле перебо­ра хеша по сло­варю уда­лось вос­ста­новить пароль — 16010916.

С помощью локаль­ной учет­ной записи admin-omsk я получил дос­туп к сер­веру OMO-TECH.test.local. На этом сер­вере нашел активную сес­сию учет­ной записи с таким же име­нем, но уже домен­ной — test.local\admin-omsk.

Сессии на сервере OMO-TECH
Сес­сии на сер­вере OMO-TECH

Хоть учет­ная запись test.local\admin-omsk и не вхо­дила в сос­тав домен­ных адми­нис­тра­тив­ных групп, она ока­залась вла­дель­цем учет­ных записей адми­нис­тра­торов, отве­чающих за реги­он «ОМСК».

Владелец учетной записи omo-adminvrs
Вла­делец учет­ной записи omo-adminvrs

Пра­ва локаль­ного адми­нис­тра­тора поз­волили извлечь TGT-билет Kerberos для test.local\admin-omsk из памяти сис­темно­го про­цес­са и выпол­нить ата­ку Pass the Ticket.

Результат атаки Pass the Ticket на учетку admin-omsk
Ре­зуль­тат ата­ки Pass the Ticket на учет­ку admin-omsk

Пос­коль­ку учет­ная запись test.local\admin-omsk была вла­дель­цем в том чис­ле учет­ной записи test.local\omo-adminvrs, я добавил для нее при­виле­гии GenericAll. Это откры­ло воз­можность про­вес­ти ата­ку Shadow Credentials, при которой генери­рует­ся пара клю­чей и откры­тый ключ записы­вает­ся в атри­бут ms-DS-Key-Credential-Link. С помощью этой пары из откры­того и зак­рытого клю­чей уда­лось зап­росить TGT-билет Kerberos и исполь­зовать его для аутен­тифика­ции в домене.

Результат атаки Shadow Credentials на учетку omo-adminvrs
Ре­зуль­тат ата­ки Shadow Credentials на учет­ку omo-adminvrs

Я уста­новил, что чле­ны груп­пы omo-admin-group, вклю­чая учет­ную запись test.local\omo-adminvrs, име­ют пра­ва (ACL) на 4507 объ­ектов в домене. Сре­ди этих прав — GenericWrite на сер­веры SRVDIRECTUM-SQL и SRV-ND-PROD-WIN. В поис­ках вари­антов ком­про­мета­ции домена и учет­ных записей с повышен­ными при­виле­гиями я про­вел ата­ку Shadow Credentials на объ­ект SRVDIRECTUM-SQL$ и получил воз­можность зап­росить для него билет TGT.

Атака Shadow Credentials на учетку SRVDIRECTUM-SQL<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Атака</mtext><mi>S</mi><mi>h</mi><mi>a</mi><mi>d</mi><mi>o</mi><mi>w</mi><mi>C</mi><mi>r</mi><mi>e</mi><mi>d</mi><mi>e</mi><mi>n</mi><mi>t</mi><mi>i</mi><mi>a</mi><mi>l</mi><mi>s</mi><mtext>научетку</mtext><mi>S</mi><mi>R</mi><mi>V</mi><mi>D</mi><mi>I</mi><mi>R</mi><mi>E</mi><mi>C</mi><mi>T</mi><mi>U</mi><mi>M</mi><mo>−</mo><mi>S</mi><mi>Q</mi><mi>L</mi></mrow><annotation encoding="application/x-tex">' title='Атака Shadow Credentials на учетку SRVDIRECTUM-SQL</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Атака</span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mord mathnormal">ha</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.07153em;">wC</span><span class="mord mathnormal">re</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ia</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">s</span><span class="mord cyrillic_fallback">научетку</span><span class="mord mathnormal" style="margin-right:0.00773em;">SR</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.13889em;">RECT</span><span class="mord mathnormal" style="margin-right:0.10903em;">U</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">SQ</span><span class="mord mathnormal">L</span></span></span></span>
Ата­ка Shadow Credentials на учет­ку SRVDIRECTUM-SQL$

Сле­дующим шагом я извлек NTLM-хеш компь­ютер­ной учет­ной записи SRVDIRECTUM-SQL$ с помощью UnPAC the Hash.

Получение NTLM-хеша для учетной записи test.local\srvdirectum-sql<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Получение</mtext><mi>N</mi><mi>T</mi><mi>L</mi><mi>M</mi><mo>−</mo><mtext>хешадляучетнойзаписи</mtext><mi>t</mi><mi>e</mi><mi>s</mi><mi>t</mi><mi mathvariant="normal">.</mi><mi>l</mi><mi>o</mi><mi>c</mi><mi>a</mi><mi>l</mi><mstyle mathcolor="#cc0000"><mtext>\srvdirectum</mtext></mstyle><mo>−</mo><mi>s</mi><mi>q</mi><mi>l</mi></mrow><annotation encoding="application/x-tex">' title='Получение NTLM-хеша для учетной записи test.local\srvdirectum-sql</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Получение</span><span class="mord mathnormal" style="margin-right:0.13889em;">NT</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord cyrillic_fallback">хешадляучетнойзаписи</span><span class="mord mathnormal">t</span><span class="mord mathnormal">es</span><span class="mord mathnormal">t</span><span class="mord">.</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">oc</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord text" style="color:#cc0000;"><span class="mord" style="color:#cc0000;">\srvdirectum</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal" style="margin-right:0.01968em;">ql</span></span></span></span>
По­луче­ние NTLM-хеша для учет­ной записи test.local\srvdirectum-sql$

Эта тех­нология осно­вана на исполь­зовании PKINIT, при котором кли­ент может зап­росить допол­нитель­ный тикет. В этом тикете KDC вклю­чает PAC_CREDENTIAL_INFO — спе­циаль­ную струк­туру, содер­жащую NTLM-клю­чи аутен­тифици­рующе­го поль­зовате­ля. Это дает кли­енту воз­можность перек­лючать­ся на NTLM-аутен­тифика­цию для служб, которые не под­держи­вают Kerberos.

По­лучен­ный NTLM-хеш исполь­зовал­ся в тех­нике Silver Ticket, которая поз­воля­ет генери­ровать сер­висные билеты (TGS) Kerberos для любых домен­ных учет­ных записей. Эти билеты будут обла­дать все­ми при­виле­гиями на хос­те, которы­ми обла­дал бы зашед­ший на хост поль­зователь. В резуль­тате мы сге­нери­рова­ли сер­висные билеты для домен­ного адми­нис­тра­тора test.local\d.syroezhkin, у которо­го есть пра­ва локаль­ного адми­на на хос­те SRVDIRECTUM-SQL.

Билеты TGS на имя d.syroezhkin
Би­леты TGS на имя d.syroezhkin

С получен­ными пра­вами уда­лось соз­дать дамп про­цес­са LSASS и извлечь из него пароли еще для некото­рых домен­ных уче­ток.

Извлеченные из памяти процесса LSASS на хосте SRVDIRECTUM-SQL пароли
Из­вле­чен­ные из памяти про­цес­са LSASS на хос­те SRVDIRECTUM-SQL пароли

Та­ким же спо­собом я получил дос­туп к хос­ту SRV-ND-PROD-WIN.

Права GenericWrite на объект SRV-ND-PROD-WIN<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Права</mtext><mi>G</mi><mi>e</mi><mi>n</mi><mi>e</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>W</mi><mi>r</mi><mi>i</mi><mi>t</mi><mi>e</mi><mtext>наобъект</mtext><mi>S</mi><mi>R</mi><mi>V</mi><mo>−</mo><mi>N</mi><mi>D</mi><mo>−</mo><mi>P</mi><mi>R</mi><mi>O</mi><mi>D</mi><mo>−</mo><mi>W</mi><mi>I</mi><mi>N</mi></mrow><annotation encoding="application/x-tex">' title='Права GenericWrite на объект SRV-ND-PROD-WIN</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Права</span><span class="mord mathnormal">G</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">i</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal">i</span><span class="mord mathnormal">t</span><span class="mord mathnormal">e</span><span class="mord cyrillic_fallback">наобъект</span><span class="mord mathnormal" style="margin-right:0.00773em;">SR</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">PRO</span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>
Пра­ва GenericWrite на объ­ект SRV-ND-PROD-WIN$

В памяти про­цес­са LSASS ничего инте­рес­ного не наш­лось. Поэто­му мы соб­рали дан­ные о локаль­ных учет­ных записях из хра­нили­ща SAM. В резуль­тате получи­ли хеш NTLM для локаль­ной учет­ной записи Administrator и перебо­ром по сло­варю извлек­ли пароль Pa******123.

NTLM-хеш для локального администратора на хосте SRV-ND-PROD-WIN
NTLM-хеш для локаль­ного адми­нис­тра­тора на хос­те SRV-ND-PROD-WIN

В резуль­тате ата­ки Pass the Hash я уста­новил, что эта учет­ная запись с таким же паролем исполь­зует­ся на сле­дующих сер­верах:

Осо­бый инте­рес пред­став­ляет сер­вер SRV-WITNESS-EX. Он вхо­дит в груп­пы Exchange Trusted Subsystem и Exchange Windows Permissions как сер­вер Exchange.

Членство в группах компьютерной учетной записи SRV-WITNESS-EX<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Членствовгруппахкомпьютернойучетнойзаписи</mtext><mi>S</mi><mi>R</mi><mi>V</mi><mo>−</mo><mi>W</mi><mi>I</mi><mi>T</mi><mi>N</mi><mi>E</mi><mi>S</mi><mi>S</mi><mo>−</mo><mi>E</mi><mi>X</mi></mrow><annotation encoding="application/x-tex">' title='Членство в группах компьютерной учетной записи SRV-WITNESS-EX</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Членствовгруппахкомпьютернойучетнойзаписи</span><span class="mord mathnormal" style="margin-right:0.00773em;">SR</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.05764em;">TNESS</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">EX</span></span></span></span>
Членс­тво в груп­пах компь­ютер­ной учет­ной записи SRV-WITNESS-EX$

В свою оче­редь, Exchange Windows Permissions может добав­лять чле­нов в груп­пу AD_Mgmt, которая име­ет пра­ва GenericWrite на кон­трол­леры домена.

Возможные векторы развития атаки после захвата учетной записи SRV-WITNESS-EX<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext>Возможныевекторыразвитияатакипослезахватаучетнойзаписи</mtext><mi>S</mi><mi>R</mi><mi>V</mi><mo>−</mo><mi>W</mi><mi>I</mi><mi>T</mi><mi>N</mi><mi>E</mi><mi>S</mi><mi>S</mi><mo>−</mo><mi>E</mi><mi>X</mi></mrow><annotation encoding="application/x-tex">' title='Возможные векторы развития атаки после захвата учетной записи SRV-WITNESS-EX</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathnormal">t</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.01968em;">tl</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord cyrillic_fallback">Возможныевекторыразвитияатакипослезахватаучетнойзаписи</span><span class="mord mathnormal" style="margin-right:0.00773em;">SR</span><span class="mord mathnormal" style="margin-right:0.22222em;">V</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.05764em;">TNESS</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">EX</span></span></span></span>
Воз­можные век­торы раз­вития ата­ки пос­ле зах­вата учет­ной записи SRV-WITNESS-EX$

Для начала, исполь­зуя пра­ва локаль­ного адми­нис­тра­тора, я извлек хеш NTLM-пароля компь­юте­ра из локаль­ного хра­нили­ща LSA на хос­те SRV-WITNESS-EX. Получен­ный хеш NTLM я исполь­зовал в ата­ке Overpass the Hash для получе­ния TGT-билета Kerberos. Это поз­волило внес­ти изме­нения в сос­тав домен­ной груп­пы AD_Mgmt. При этом исполь­зовалась домен­ная учет­ная запись wa, ском­про­мети­рован­ная ранее на хос­те SRVDIRECTUM-SQL.

Добавление учетной записи wa в группы AD_Mgmt
До­бав­ление учет­ной записи wa в груп­пы AD_Mgmt

В качес­тве конеч­ной цели я выб­рал кон­трол­лер домена SRVDC01. Через ата­ку Shadow Credentials уда­лось сге­нери­ровать пару клю­чей, с помощью которых я получил TGT-билет Kerberos для учет­ной записи кон­трол­лера домена. Пос­ле это­го про­вел ата­ку DCSync на учет­ную запись test.local\admin-voinov, что поз­волило извлечь хеш AES256 от ее пароля. Билет TGT так­же открыл дос­туп на сам кон­трол­лер домена.

Доступ на контроллер домена SRVDC01
Дос­туп на кон­трол­лер домена SRVDC01
Схема атаки
Схе­ма ата­ки

Для пол­ноты кар­тины я вклю­чу сюда из отче­та рекомен­дации, которые дал заказ­чику на осно­ве изме­нений, сде­лан­ных в его инфраструк­туре. Вот что я менял:

  1. На сер­вере PPO-BD.test.local соз­дал локаль­ную учет­ную запись адми­нис­тра­тора itadmin. Заказ­чику рекомен­дует­ся ее уда­лить.
  2. Изме­нил зна­чение атри­бута msDS-KeyCredentialLink для объ­екта test.local\srvdirectum-sql$. Заказ­чику рекомен­дует­ся обну­лить зна­чение атри­бута.
  3. Изме­нил зна­чение атри­бута msDS-KeyCredentialLink для объ­екта test.local\srv-nd-prod-win$. Заказ­чику рекомен­дует­ся обну­лить зна­чение атри­бута.
  4. Изме­нил зна­чение атри­бута msDS-KeyCredentialLink у учет­ной записи test.local\omo-adminvrs. Заказ­чику рекомен­дует­ся обну­лить зна­чение атри­бута.
  5. Наз­начил пра­ва GenericAll учет­ной записи test.local\admin-omsk на test.local\omo-adminvrs. Заказ­чику рекомен­дует­ся отоз­вать их.

Рекомендации

По ито­гам тес­тирова­ния я дал заказ­чику сле­дующие рекомен­дации:

Выводы

Клю­чевым фак­тором, который поз­волил получить дос­туп в домен, ста­ла некор­рек­тная реали­зация сер­висно­го при­ложе­ния. В его исходном коде я нашел кон­фиден­циаль­ные дан­ные. Пос­ле деком­пиляции при­ложе­ния уда­лось получить адми­нис­тра­тив­ный дос­туп к домен­ной машине, про­вес­ти раз­ведку инфраструк­туры и сфор­мировать потен­циаль­ные век­торы атак.

Пос­ле получе­ния дос­тупа в домен мне уда­лось получить дос­туп к цепоч­ке про­межу­точ­ных сер­веров, что в ито­ге дало адми­нис­тра­тив­ный дос­туп к кон­трол­леру домена. К ком­про­мета­ции домена при­вели нес­коль­ко клю­чевых фак­торов: откры­тое хра­нение паролей в скрип­тах, исполь­зование сла­бых паролей для адми­нис­тра­тив­ных учет­ных записей и небезо­пас­ная нас­трой­ка ACL, которая поз­воляла зло­упот­реблять избы­точ­ными пра­вами объ­ектов домена.

В целом уро­вень защищен­ности домен­ной инфраструк­туры мож­но оце­нить как сред­ний. Нап­равле­ния для ком­про­мета­ции домена были огра­ничен­ными. При реали­зации стро­гой пароль­ной полити­ки в домене, исполь­зовании механиз­ма LAPS и кор­рек­тной реали­зации ACL веро­ятность ком­про­мета­ции домена сни­зит­ся, рав­но как и шан­сы все же как‑нибудь прос­порить ящик пива пен­тесте­рам.