В погоне за билетом
Как мы дважды проникли в домен, который считался неприступным
Pentest Award
Этот текст занял третье место на премии Pentest Award 2024 в категории «Пробив инфры». Соревнование ежегодно проводит компания Awillix.
Дело было осенью 2022 года. Мы работали вдвоем с коллегой: он отвечал за веб‑уязвимости, а я за анализ инфраструктуры — сервисы, домен и прочее.
Представитель заказчика из команды безопасников с порога заявил, что ничего у нас не получится, что их только недавно тестировали и все возможные дырки они закрыли. Он был настолько уверен в этом, что готов был спорить на ящик пенного. Немного жалею, что от спора мы решили отказаться.
В частности, в отделе безопасности утверждали, что регулярно проводят анализ NTDS путем прогона NTLM-хешей паролей доменных пользователей по популярным словарям, так что спреить на популярные пароли смысла нет.
И действительно, проект оказался непростым, учетную запись в домене мне не предоставили. Я проверил возможность LLMNR poisoning и прочие вариации этой атаки, попробовал слушать трафик, сканировал на предмет наличия популярных уязвимостей (Bluekeep, EternalBlue и тому подобных), проверил анонимные файловые ресурсы, нашел и изучил принтеры и МФУ. Веб тоже не дал никаких надежд.
В один прекрасный момент мне повезло: я нашел три хоста с активным сервисом DameWare, из них доменный был только один. В некоторых версиях этого продукта есть уязвимость CVE-2019-3980, позволяющая получить несанкционированный удаленный доступ к атакуемой системе.
Версия DameWare оказалась уязвимой, и мне удалось создать локальную учетную запись администратора, извлечь учетные данные из памяти процесса LSASS и развить атаку до полной компрометации домена. Опущу подробности этого вектора, они не представляют особого интереса, он был достаточно тривиален. Других векторов нам обнаружить тогда не удалось. Самое интересное было дальше.
info
Название домена целевой организации на всех скриншотах замазано, в текстовой части заменено test.
.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Ход атаки
С заказчиком у нас был заключен договор сразу на два проекта, и весной 2023 года мы вернулись к нему снова, в ту же самую инфраструктуру, с той же самой точкой подключения, сервисов DameWare в сети уже не нашли. Заказчик с еще большей уверенностью стал заявлять, что в этот раз у нас точно ничего не получится, так как все замечания и единственный найденный нами баг они устранили. Даже спор снова предложил, а мы снова отказались. И снова пожалели об этом!
Доменную учетную запись нам, как всегда, не дали, и мы принялись за сетевое окружение. Я вновь посканировал на предмет аномальных ресурсов, обошел все МФУ, посниффал трафик и провел все прочие процедуры. Ничего. Мой коллега уязвимостей тоже не нашел.
И тут на одном из веб‑ресурсов мне попалось опубликованное .NET-приложение.

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

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

Для расшифровки пароля я декомпилировал приложение с помощью ILSpy. В динамической библиотеке Star.
нашлась функция EncryptionLogic
, содержащая ключ шифрования и алгоритм расшифровки. В результате мне удалось получить пароль от учетной записи базы данных asabrys
(это не доменная учетная запись). Затем с помощью DBeaver я подключился к базе данных.
У скомпрометированной учетки были права sysadmin в пределах MSSQL, чем я и воспользовался, чтобы включить оболочку xp_cmdshell, позволяющую исполнять команды операционной системы.
Оказалось, что сервер базы данных работает в контексте служебной учетной записи MSSQL$SQLEXPRESS
, у которой есть привилегия SeImpersonatePrivilege
, то есть можно выполнять команды в контексте любой учетной записи, в том числе системной.

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


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

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

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

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

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

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

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

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

Эта технология основана на использовании PKINIT, при котором клиент может запросить дополнительный тикет. В этом тикете KDC включает PAC_CREDENTIAL_INFO
— специальную структуру, содержащую NTLM-ключи аутентифицирующего пользователя. Это дает клиенту возможность переключаться на NTLM-аутентификацию для служб, которые не поддерживают Kerberos.
Полученный NTLM-хеш использовался в технике Silver Ticket, которая позволяет генерировать сервисные билеты (TGS) Kerberos для любых доменных учетных записей. Эти билеты будут обладать всеми привилегиями на хосте, которыми обладал бы зашедший на хост пользователь. В результате мы сгенерировали сервисные билеты для доменного администратора test.
, у которого есть права локального админа на хосте SRVDIRECTUM-SQL
.

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

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

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

В результате атаки Pass the Hash я установил, что эта учетная запись с таким же паролем используется на следующих серверах:
-
SRV-ND-PROD-ACCEPT.
;TEST. LOCAL -
SRV-ND-PROD-AUT.
;TEST. LOCAL -
SRV-ND-PROD-WIN-KODWEB.
;TEST. LOCAL -
HV1-GORIZONT.
;TEST. LOCAL -
SRV-WITNESS-EX.
.TEST. LOCAL
Особый интерес представляет сервер SRV-WITNESS-EX
. Он входит в группы Exchange
и Exchange
как сервер Exchange.

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

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

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



Для полноты картины я включу сюда из отчета рекомендации, которые дал заказчику на основе изменений, сделанных в его инфраструктуре. Вот что я менял:
- На сервере
PPO-BD.
создал локальную учетную запись администратораtest. local itadmin
. Заказчику рекомендуется ее удалить. - Изменил значение атрибута
msDS-KeyCredentialLink
для объектаtest.
. Заказчику рекомендуется обнулить значение атрибута.local\ srvdirectum-sql$ - Изменил значение атрибута
msDS-KeyCredentialLink
для объектаtest.
. Заказчику рекомендуется обнулить значение атрибута.local\ srv-nd-prod-win$ - Изменил значение атрибута
msDS-KeyCredentialLink
у учетной записиtest.
. Заказчику рекомендуется обнулить значение атрибута.local\ omo-adminvrs - Назначил права
GenericAll
учетной записиtest.
наlocal\ admin-omsk test.
. Заказчику рекомендуется отозвать их.local\ omo-adminvrs
Рекомендации
По итогам тестирования я дал заказчику следующие рекомендации:
- сменить пароль для скомпрометированной локальной учетной записи
LocalAdmin
на всех машинах; - сменить пароль для скомпрометированной локальной учетной записи
admin-omsk
на всех машинах; - удалить скрипты, содержащие пароли;
- вместо скриптов использовать технологию LAPS;
- отключить механизм wdigest, который позволяет хранить пароли в открытом виде;
- настроить антивирус на запрет дампа процесса LSASS;
- провести оценку прав для группы
omo-admin-group
в отношении других объектов домена на предмет их избыточности.
Выводы
Ключевым фактором, который позволил получить доступ в домен, стала некорректная реализация сервисного приложения. В его исходном коде я нашел конфиденциальные данные. После декомпиляции приложения удалось получить административный доступ к доменной машине, провести разведку инфраструктуры и сформировать потенциальные векторы атак.
После получения доступа в домен мне удалось получить доступ к цепочке промежуточных серверов, что в итоге дало административный доступ к контроллеру домена. К компрометации домена привели несколько ключевых факторов: открытое хранение паролей в скриптах, использование слабых паролей для административных учетных записей и небезопасная настройка ACL, которая позволяла злоупотреблять избыточными правами объектов домена.
В целом уровень защищенности доменной инфраструктуры можно оценить как средний. Направления для компрометации домена были ограниченными. При реализации строгой парольной политики в домене, использовании механизма LAPS и корректной реализации ACL вероятность компрометации домена снизится, равно как и шансы все же как‑нибудь проспорить ящик пива пентестерам.