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

Pentest Award

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

Де­ло было осенью 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 в пре­делах MS SQL, чем я и вос­поль­зовал­ся, что­бы вклю­чить обо­лоч­ку 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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    6 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии