
Всем привет! На связи Дмитрий Неверов, руководитель направления тестирования на проникновение в Бастионе. Мы профессионально ломаем системы безопасности компаний. Разумеется, с разрешения их владельцев. Расскажу кейс, за который я получил ачивку «Фаворит года по версии жюри» Pentest Awards 2025.
Представьте: крупная инфраструктурная компания с регулярными пентестами, серьезным бюджетом на ИБ и жесткими регуляторными требованиями. Казалось бы, что тут можно сломать? А мы взяли и получили права доменного администратора, начав путь с непривилегированной учетки сотрудника. И никаких бэкдоров или zero-day, только чистая работа с Active Directory.
Самое интересное — как несколько на первый взгляд безобидных настроек превратились в билет к полному контролю над доменом. Сейчас покажу всю цепочку от начала и до победного DCSync.
Это реальная история. События, о которых я расскажу, произошли не так давно. По настоятельной просьбе юристов все имена и названия изменены. Из уважения к вам, читателям, всё остальное рассказано так, как было на самом деле.
На этот раз объектом исследования стала сеть крупной инфраструктурной компании. Заказчик — настоящий тертый калач: регулярные внутренние и внешние пентесты, серьезные ресурсы, жесткие регуляторные требования к ИБ и богатый опыт латания дыр после наших коллег по цеху. В общем, мы совсем не ждали легкой прогулки. В роли гипотетического, модельного нарушителя выступил условный штатный сотрудник.
В стартовый набор пентестера входили:
доступ во внутреннюю сеть через VPN;
удаленное рабочее место;
ни капли не подозрительная доменная учетная запись PENTESTER без каких-либо привилегий. Обычный «доменный пользователь».
Цель была поставлена амбициозная: найти уязвимости в этой укрепленной среде и захватить полный контроль, получив права администратора домена «DOMAIN.LOCAL».
Вначале нам выдали доступ по RDP через Citrix к хосту WS-536. На машине, конечно же, был установлен антивирус Kaspersky, что сразу отсекало самые простые и шумные методы атак. Но когда это нас останавливало?
Первым делом мы запустили джентльменский набор для разведки в Active Directory: модифицированные версии SharpHound, Group3r, ADACLScan и несколько самописных скриптов. Параллельно выяснили, что функциональный уровень домена — 2012R2, а значит, техники атак, связанные с PKINIT, нам не светят.
Спойлер: в итоге нам удалось нащупать клубок из нескольких, на первый взгляд, незначительных недостатков в настройках и раскрутить его до получения прав доменного администратора. Но самое интересное — как именно. Сейчас расскажу, но перед этим небольшое замечание.
Результаты пентестов, которые мы проводим для клиентов, плотно обложены NDA, и это правильно. Чтобы написать эту статью и в то же время защитить интересы заказчика, мы воспроизвели ключевые узлы сети и конфигурации, повторив цепочку атаки в лабораторных условиях.
Начало цепочки атаки
Не буду утомлять перечислением всех этапов разведки и сразу зайду с козырей. Вот что нам удалось нащупать с позиции простого пользователя.
Некорректные настройки ACL для скрипта в GPO
Первой зацепкой стала групповая политика (GPO) с говорящим названием install_r7_office. GPO — это, по сути, набор правил, который домен спускает на все компьютеры. Конкретная политика при загрузке системы запускала скрипт License_R7_RW.bat на всех машинах в подразделении (OU) «Workstations».

В чем проблема? На файл скрипта License_R7_RW.bat были выставлены небезопасные права доступа (ACL). Любой компьютер в домене имел полные права на изменение этого файла.

Политика применялась к 800 активным компьютерам. Это означало, что если бы мы имели возможность действовать от имени любого компьютера в домене, то могли бы переписать скрипт и заставить 800 машин выполнить наш код. Звучит как план. Но как это сделать? Мы не могли просто так добавить свой компьютер в домен — эту привилегию, как и ожидалось, оставили только администраторам.

Слабый пароль для объекта «компьютер»
В корпоративных сетях иногда встречаются учетные записи компьютеров, созданные с параметром обратной совместимости «pre-Windows 2000». Если такой объект «компьютер» никогда по-настоящему не использовался (атрибут userAccoutControl
будет содержать «PASSWD_NOTREQD» и «WORKSTATION_TRUST_ACCOUNT»), то его пароль по умолчанию будет соответствовать его имени, только прописными буквами. Также простые пароли встречаются у машинных учетных записей, если их креды сбрасывали через оснастку ADUC.
И тут на сцену выходит старая, но не забытая техника проверки слабых паролей, которую называют pre2k. Мы проверили все активные объекты-компьютеры в домене и нашли хост WS-876 со слабым предсказуемым паролем.
Эскалация: от одной зацепки к сотне машин
Теперь нам предстояло развить отдельные находки в полноценную атаку. Вооружившись учетными данными машины WS-876, мы получили для нее TGT-билет Kerberos. Теперь мы могли говорить с доменом от её имени.

Получив эту возможность, мы тут же отредактировали тот самый злополучный скрипт License_R7_RW.bat, дописав всего одну строчку: команду на добавление нашей учетной записи PENTESTER в локальную группу администраторов.

Затем мы сделали то, что хакеры делают нечасто — взяли паузу и стали ждать. Скрипт выполнялся при загрузке систем, а значит, нужно было дождаться утра, когда сотрудники начнут включать свои компьютеры. К обеду мы стали локальными администраторами на сотне пользовательских машин.

Захват учетных данных сотрудника поддержки
Теперь, имея плацдарм, мы запустили утилиту Invoke-SessionsHunter. Она просканировала доступные нам машины и показала, какие пользователи сейчас работают на них. Изучив список, мы увидели на компьютере WS-421 сессию пользователя I.IVANOV, чья учетная запись A-101 входила в группу техподдержки. Попался!

Права локального администратора на WS-421 позволили подключиться к хосту WS-421 и сделать дамп TGT-билета Kerberos для учетной записи A-101.

С помощью техники Pass-The-Ticket мы импортировали этот билет на наш хост WS-536.

Теперь мы могли действовать в домене от имени сотрудника техподдержки. И это было только начало.

Компрометация домена: первый план и... тупик
Итак, в нашем кармане была административная учетная запись A-101. Настало время планировать финальный рывок. Мы построили красивую цепочку:

Наша A-101 входит в группу UserAdmin.
UserAdmin имеет полные права (GenericAll) на учетную запись MIGRATOR.
MIGRATOR состоит в группе Organization Management.
Эта группа, в свою очередь, может добавлять участников в Exchange Windows Permissions.
А уже эта группа имеет право сбросить пароль для учетки SVC_SP_AD.
SVC_SP_AD обладает правами на репликацию изменений с контроллера домена (DCSync), что равносильно ключам от всей инфраструктуры. Эти права ей даны через объект-компьютер SERVER.

План казался безупречным. Но при детальном изучении объекта SERVER нас ждал неприятный сюрприз: он был отключен. И тут... тупик.

Права GenericWrite позволяют включить объект «компьютер», но получить его учетные данные нельзя из-за функционального уровня домена 2012R2. План, такой красивый на бумаге, рассыпался. Но никто не собирался сдаваться.
Обновленный сценарий: дьявол кроется в деталях
Мы снова уткнулись в карту доступов и начали искать обходные пути. И нашли. Оказалось, что полные права на объект SERVER были не только у администраторов домена, но и у группы Account Operators. Это позволяло не только включить компьютер, но и сбросить его пароль.
К счастью, в этой группе состоял пользователь P.PETROV. Мы повторно запустили Invoke-SessionsHunter по всем доступным машинам, и сессия нашего P.PETROV нашлась на компьютере WS-ADMIN-3. А на этот хост, по совпадению, были права GenericWrite у ранее захваченной учетки SVC_SP_AD. Пазл сложился.

Родилась новая рабочая цепочка атаки:

Финальный рывок: исполнение

Функциональная версия домена 2012R2 не позволяла использовать технику Shadow Credentials для получения учетных данных от пользователей, так что сперва мы от имени MIGRATOR добавили себя в группу Exchange Windows Permissions. Это позволило нам сбросить пароль SVC_SP_AD.

Используя права SVC_SP_AD, мы настроили ограниченное делегирование Kerberos на основе ресурсов (RBCD) на хост WS-ADMIN-3. Это мощная техника, которая, грубо говоря, позволяет притвориться любым пользователем для доступа к конкретной машине.

В качестве цели мы выбрали учетную запись SVC_BACKUP из группы Domain Admins. Что важно, она не входит в группу «Protected Users», затрудняющую эксплуатацию RBCD. Эксплуатация RBCD дала нам полный административный доступ на хост WS-ADMIN-3, где сидел P.PETROV.

Получив доступ на хост WS-ADMIN-3 с правами локального администратора, мы сделали дамп TGT-билета P.PETROV.

Далее — дело техники. С помощью Pass-The-Ticket мы стали действовать от имени P.PETROV. Его прав из группы Account Operators хватило, чтобы наконец-то включить объект SERVER и сбросить для него пароль.

Получив TGT-билет для SERVER, мы оказались в шаге от победы. Учетная запись компьютера с правами на репликацию — это и есть ключ.

И вот он, финал. Мы запустили PowerShell в контексте учетной записи SERVER, обошли антивирусный сканер (AMSI) и загрузили в память Mimikatz.
Легким движением руки мы запустили команду lsadump::dcsync
и… получили учетные данные всего домена. Game over.

Заключение
Казалось бы, что особенного в неправильных ACL на скрипт GPO или слабом пароле одного компьютера? Но вот на ваших глазах из нескольких мелких недочетов родилась полноценная Cyber Kill Chain до Domain Admin.

Основная проблема оказалась не в каком-то супер-уязвимом софте или нулевом дне. Всё решили неправильные ACL на скрипт групповой политики, который выполнялся с правами SYSTEM. Одна строчка в настройках — и вся защита посыпалась.
Цепочка работает только целиком. По отдельности каждая находка была относительно безобидной. Но вместе они создали путь от обычного пользователя до Domain Admin. Это классический пример того, что безопасность — система, а не набор отдельных мер.
Legacy-объекты — источник проблем. Старые компьютерные учетки с предсказуемыми паролями до сих пор встречаются в доменах. Техника pre2k работает, потому что про старые объекты часто забывают.
Отключенное не значит безопасное. Объект SERVER был выключен, но сохранял критичные права. В нужный момент его можно было включить и использовать — что мы и сделали.
Уровень защищенности инфраструктуры мы оценили как средний. Да, мы смогли получить полный контроль над доменом, но для этого пришлось выстроить довольно сложную цепочку.
Это не та ситуация, когда домен ломается одной командой или через очевидную дыру. Заказчик проделал серьезную работу по укреплению безопасности — просто остались детали, которые в сумме дали критичный результат.
Хорошая новость: все обнаруженные проблемы решаются настройками и правильными процедурами. Никакой замены оборудования или кардинальной перестройки архитектуры не требуется. Вот основные пункты, которые помогут закрыть такой вектор атаки.
Провести аудит доменных прав. В данном случае требовалось убрать полные права у группы Domain Computers на скрипт License_R7_RW.bat. Это была главная дверь в инфраструктуру — через нее мы получили административный доступ к сотням машин.
Зачистить legacy-объекты. Компьютеры со слабыми паролями стоит просто удалять из домена. Такие «призраки» из прошлого — частая находка в корпоративных сетях.
Проверить необходимость избыточных прав. Учетная запись MIGRATOR в группе Organization Management, сервисная SVC_SP_AD с правами на кучу объектов — всё это требует ревизии по принципу минимальных привилегий.
Мы рекомендовали решить проблему с объектом SERVER. Либо удалить его совсем, либо отозвать права DS-Replication-Get-Changes и DS-Replication-Get-ChangesAll, так как они работают в связке. Отключенный объект с правами на репликацию — это мина замедленного действия.
Защитить критичные учетки. SVC_BACKUP из группы Domain Admins либо перенести в Protected Users, либо удалить, если не используется. Protected Users блокирует много техник атак, включая RBCD.
Разделить административные и пользовательские учетки. Для P.PETROV создать отдельную административную учетку, а его основную убрать из Account Operators. Это базовая гигиена AD.
Плохая новость: дьявол действительно кроется в деталях. И эти детали нужно регулярно проверять, иначе они превращаются в тропинки для атакующих.

PURP — телеграм-канал, где кибербезопасность раскрывается с обеих сторон баррикад
t.me/purp_sec — инсайды и инсайты из мира этичного хакинга и бизнес-ориентированной защиты от специалистов Бастиона