Захват домена через GPO: разбор HTB-машины с уязвимым SYSVOL

На HTB-боксе с доменным окружением я нашёл у рядового пользователя право GenericWrite на GPO, привязанный к OU с контроллером домена. BloodHound показал зелёную стрелку от скомпрометированного аккаунта к объекту политики — а от неё до NT AUTHORITY\SYSTEM на DC оставалось три команды в терминале Kali и меньше пятнадцати минут. Ниже — полный разбор цепочки: от разведки до эксплуатации, с объяснением того, почему именно запись в SYSVOL конвертируется в захват домена через GPO. И с альтернативным вектором, который русскоязычные источники почти не разбирают.
Бизнес-логика атаки через Group Policy Object
Group Policy Object (GPO) — механизм Windows для централизованного управления настройками компьютеров и пользователей в домене Active Directory. Если коротко: через GPO администраторы раздают политики паролей, ставят ПО, запускают скрипты и создают запланированные задачи на сотнях машин одновременно. Одна политика — и у всех на рабочих столах новый антивирус.
Для атакующего GPO — рычаг масштабирования. Право записи в GPO, привязанный к нужной OU (Organizational Unit — контейнер объектов домена, что-то вроде папки в AD), позволяет выполнить произвольный код на каждой машине этой OU. Если OU включает контроллер домена — один изменённый GPO равен полной компрометации.
В терминах MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1484.001 — её идентификаторы) атака через GPO — техника T1484.001 Group Policy Modification. Тактики: Privilege Escalation и Defense Impairment. Параллельно может сработать T1552.006 Group Policy Preferences — когда в SYSVOL (сетевая папка на контроллере домена, где хранятся файлы групповых политик) остались устаревшие GPP-файлы с зашифрованными паролями. Microsoft использовала единый статический AES-ключ для всех установок Windows и опубликовала его в документации MSDN в 2012 году. Расшифровка — тривиальная для любого, кто имеет доступ на чтение SYSVOL. Разведку GPO покрывает техника T1615 Group Policy Discovery.
Это не теория. По данным отраслевых отчётов, группировки BlackCat, LockBit, Sandworm (APT44), Storm-0501 и Vanilla Tempest используют GPO abuse для распространения ransomware. Согласно публикациям Microsoft, Storm-0501 предположительно использовал GPO с запланированной задачей для запуска шифровальщика на устройствах в сети. По данным Mandiant, Sandworm (APT44) предположительно распространял вайпер CaddyWiper через GPO в украинских сетях.
Финальный импакт: одна лишняя строка в ACL (Access Control List — список контроля доступа, определяющий «кто что может делать с объектом») GPO, выданная по ошибке при делегировании helpdesk-команде, приводит к полной компрометации домена.
Разведка — находим уязвимый GPO abuse в Active Directory
Сбор данных через bloodhound-python
BloodHound строит граф связей Active Directory: учётные записи, группы, GPO, OU и ACL. Представьте карту метро — только вместо станций узлы AD, а вместо линий — пути повышения привилегий. Он визуализирует, кто куда может дотянуться.
Зачем: перед атакой на GPO нужно понять, какие объекты контролирует скомпрометированный аккаунт. Руками перебирать ACL в домене с тысячами объектов — часы. BloodHound справляется за минуты.
Предпосылки: на атакующей машине (Kali Linux) установлен bloodhound-python — коллектор, работающий по сети без агента на целевом хосте. Между Kali и контроллером домена открыт LDAP (389/TCP) и DNS.
Запуск сбора: bloodhound-python -u raj -p 'Password@1' -ns 192.168.1.11 -d ignite.local -c all. Флаг -c all включает полный сбор, в том числе ACL — без него права на запись в SYSVOL и GPO не попадут в граф. Параметр -ns указывает DNS-сервер, обычно совпадающий с IP контроллера домена.
Ожидаемый результат: в текущей директории появятся JSON-файлы — computers.json, groups.json, users.json и другие. Пустые файлы или ошибка «Connection refused» — проверяйте сетевой доступ к LDAP и корректность DNS.
Загружаете файлы в интерфейс BloodHound (кнопка Upload Data), переходите к узлу скомпрометированного пользователя и открываете Outbound Object Control — исходящие связи контроля объектов.
Три ребра, открывающие GPO abuse
BloodHound может показать три типа рёбер от пользователя к GPO. Каждого достаточно для атаки:
| Ребро | Что даёт | Как обычно возникает |
|---|---|---|
| GenericWrite | Запись любых атрибутов объекта, включая содержимое GPO в SYSVOL | Делегирование helpdesk-команде, legacy-скрипты настройки |
| WriteDacl | Изменение ACL самого GPO — можно назначить себе полные разрешения | Ошибки при настройке делегирования, вложенные группы |
| WriteOwner | Смена владельца GPO с последующим назначением любых разрешений | Миграции доменов, слияния организаций |
Любое из трёх — достаточное условие для эксплуатации небезопасного GPO.
В правой панели BloodHound для узла GPO отображается Distinguished Name с GUID (глобально уникальный идентификатор) — строка формата {4B878AA9-238D-4975-B3A3-B7EE9990F66C}. Инструмент эксплуатации адресует конкретную политику в SYSVOL именно по этому GUID. Запишите его — он понадобится дальше.
Почему права на запись в SYSVOL ведут к захвату контроллера домена
Ключевой момент всей цепочки: почему право записи в сетевую папку конвертируется в полный контроль над доменом? Ответ — в архитектуре GPO.
GPC и GPT — два компонента одной политики
Каждый GPO состоит из двух частей.
Group Policy Container (GPC) — LDAP-объект в Active Directory. Хранит метаданные: имя GPO, версию, статус, привязки к OU. GPC содержит атрибут gPCFileSysPath, указывающий путь к содержимому политики.
Group Policy Template (GPT) — папка в сетевой шаре SYSVOL на контроллере домена. Путь: \\dc.ignite.local\SYSVOL\ignite.local\Policies\{GUID}. Здесь лежат файлы с настройками: скрипты, конфигурации реестра, описания запланированных задач в XML.
Критический момент: GPC и GPT используют разные механизмы доступа. GPC — LDAP-протокол. GPT — SMB (порт 445/TCP). Права на GPC и GPT могут не совпадать — и это порождает отдельный вектор атаки.
Цикл обновления политики — точка входа для атакующего
Каждые 90 минут (плюс-минус 30 минут для рядовых машин, каждые 5 минут для контроллеров домена) или при вызове gpupdate /force клиент делает LDAP-запрос к DC: «Какие GPO мне применять и какая у них версия?»
Если версия в GPC новее кэшированной — клиент скачивает обновлённые файлы из GPT по SMB. Среди файлов может оказаться описание Immediate Scheduled Task — задачи, которая выполнится немедленно при получении политики. И выполнится она с правами NT AUTHORITY\SYSTEM — наивысшей локальной учётной записью Windows.
Отсюда логика: записываем в GPT файл с описанием задачи, повышаем версию в GPC — клиент скачивает обновление, задача выполняется с SYSTEM. Атакующий контролирует машину.
Эксплуатация небезопасного GPO через pyGPOAbuse — делай раз, делай два, делай три
pyGPOAbuse — Python-инструмент, который модифицирует содержимое GPO в SYSVOL через SMB. Он создаёт Immediate Scheduled Task, выполняемую при ближайшем обновлении политики.
Предпосылки: Kali Linux, SMB-порт 445/TCP открыт до контроллера домена, учётные данные пользователя с GenericWrite/WriteDacl/WriteOwner на целевой GPO.
Делай раз — устанавливаем инструмент. Клонируем репозиторий и создаём изолированное Python-окружение. Виртуальное окружение нужно, чтобы зависимости не конфликтовали с системными пакетами Kali:
git clone https://github.com/hackndo/pyGPOAbuse.git
cd pyGPOAbuse
python3 -m venv .venv && source .venv/bin/activate
python3 -m pip install -r requirements.txt
Ожидаемый результат: зависимости установлены без ошибок, в промпте терминала появилась метка (.venv).
Делай два — внедряем задачу в GPO. Запускаем pyGPOAbuse с GUID, извлечённым из BloodHound. Первая команда создаёт нового локального пользователя на целевых машинах, вторая добавляет его в группу администраторов:
python3 pygpoabuse.py ignite.local/raj:'Password@1' \
-gpo-id "4B878AA9-238D-4975-B3A3-B7EE9990F66C" \
-command "net.exe" -args "user john H4x00r123.. /add"
# Примечание: пароль должен соответствовать доменной политике сложности; проверьте экранирование спецсимволов в -args
python3 pygpoabuse.py ignite.local/raj:'Password@1' \
-gpo-id "4B878AA9-238D-4975-B3A3-B7EE9990F66C" \
-command "net.exe" -args "localgroup administrators john /add"
Ожидаемый результат: строка [+] ScheduledTask TASK_<random_id> created! после каждого запуска. Ошибка доступа — убедитесь, что у аккаунта действительно есть нужное право на этот GPO и SMB-порт доступен.
Что происходит на целевой стороне: при следующем цикле обновления политики (для контроллеров домена — каждые 5 минут) DC считывает обновлённый GPO из SYSVOL. Задача попадает в Computer Configuration → Preferences → Scheduled Tasks и выполняется с правами SYSTEM.
Делай три — проверяем результат. Подключаемся к контроллеру домена: evil-winrm -i 192.168.1.11 -u john -p 'H4x00r123..'. Успешное подключение — повышение привилегий состоялось. Команда whoami /priv покажет SeDebugPrivilege, SeImpersonatePrivilege, SeBackupPrivilege и другие привилегии локального администратора.
С этого момента доступен дамп NTDS.dit, извлечение хэша krbtgt и создание Golden Ticket. Захват контроллера домена завершён.
Подмена gPCFileSysPath — вектор без записи в SYSVOL
Этот вектор атаки через Group Policy Object русскоязычные источники почти не разбирают, хотя он решает реальную проблему: у атакующего есть право на GPC (LDAP-объект), но нет доступа к GPT (папке в SYSVOL). Такое бывает, потому что LDAP и SMB используют разные модели авторизации.
Суть: атрибут gPCFileSysPath в GPC указывает, откуда клиент скачивает шаблон политики. По умолчанию это путь вида \\dc.corp.com\SYSVOL\.... Атакующий меняет его на путь к собственному SMB-серверу — и все клиенты, применяющие политику, тянут вредоносный шаблон оттуда.
Инструмент GPOddity (разработка Synacktiv) автоматизирует цепочку: поднимает собственный SMB-сервер с вредоносными файлами политики, меняет gPCFileSysPath в GPC через LDAP, направляя клиентов к себе, а после применения модифицированных политик восстанавливает исходное значение из бэкапа.
Принципиальное отличие от pyGPOAbuse: GPOddity работает через NTLM relay. Атакующему не нужно знать пароль или NT-хэш пользователя с правами на GPO — достаточно перехватить его аутентификацию, встав в позицию Man-in-the-Middle. Традиционные инструменты (pyGPOAbuse, SharpGPOAbuse) требуют прямой аутентификации, и это ограничивает их применимость в ситуациях, когда пароль неизвестен, а есть только сетевая позиция.
По интерпретации авторов GPOddity (Synacktiv), Microsoft рассматривает возможность хранения GPT вне SYSVOL не как уязвимость, а как особенность конфигурации. По документам нельзя — на практике работает и никто не патчит.
Детект: то же Event ID 5136, но отслеживаем изменение атрибута gPCFileSysPath вместо gPCMachineExtensionNames. В SigmaHQ нет готового правила именно для этого атрибута, но по аналогии с win_security_default_domain_gpo_modification.yml можно создать кастомный фильтр, исключающий события создания нового GPO, где путь указывает на штатный SYSVOL.
Предусловия и ограничения уязвимости GPO Windows
Перед попыткой любого из описанных векторов убедитесь, что все условия выполнены:
| Параметр | pyGPOAbuse | SharpGPOAbuse | GPOddity |
|---|---|---|---|
| Платформа атакующего | Linux (Python) | Windows (.NET) | Linux (Python) |
| Требуемое право на GPO | GenericWrite, WriteDacl или WriteOwner | То же | WriteDacl, GenericWrite на GPC |
| Сетевой доступ | SMB 445/TCP до DC | SMB 445/TCP (локально) | LDAP 389/TCP + свой SMB-сервер |
| Аутентификация | Пароль или NT-хэш | Сессия доменного пользователя | Пароль, NT-хэш или NTLM relay |
| Нужен доступ к SYSVOL | Да | Да | Нет |
| GPO привязан к целевой OU | Обязательно | Обязательно | Обязательно |
| Подходит при NTLM relay | Нет | Нет | Да |
Ограничение по времени: между инъекцией задачи и её выполнением проходит от 0 до 90 минут для рядовых машин, около 5 минут для контроллеров домена. Принудительный gpupdate /force ускорит процесс, но требует доступа к консоли целевой машины.
Ограничение по версии: атака работает на всех поддерживаемых версиях Windows Server (2012, 2016, 2019, 2022) с дефолтной конфигурацией. Включение Advanced GPO Auditing и мониторинг Event ID 5136 не блокируют атаку, но делают её обнаружимой.
SharpGPOAbuse работает из Windows-сессии на скомпрометированном хосте. Удобен, когда атакуешь изнутри домена без выхода на Linux. Три режима: Immediate Scheduled Task (аналог pyGPOAbuse), Startup Script (скрипт при перезагрузке — persistence), Local Admin (добавление пользователя в группу администраторов). Вызов: SharpGPOAbuse.exe --AddComputerTask --TaskName "Update" --Author "NT AUTHORITY\SYSTEM" --Command "cmd.exe" --Arguments "/c net localgroup administrators attacker /add" --GPOName "Vuln GPO".
Что видит защитник: детект атаки на GPO
Каждое изменение объекта Active Directory генерирует Event ID 5136 — модификация объекта каталога. Для SOC-аналитика (Security Operations Center — центр мониторинга безопасности) это главный источник детекта взлома Active Directory через SYSVOL.
При инъекции задачи через pyGPOAbuse в логах появляются изменения двух атрибутов: versionNumber (повышается, чтобы клиенты скачали обновление) и gPCMachineExtensionNames или gPCUserExtensionNames (добавляются GUID клиентских расширений).
Конкретные CSE GUID, которые должны вызвать алерт:
{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}— Preference Tool CSE GUID Scheduled Tasks{AADCED64-746C-4633-A97C-D61349046527}— Preference CSE GUID Scheduled Tasks
В репозитории SigmaHQ есть готовые правила детекции для техники T1484.001:
win_security_susp_group_policy_abuse_privilege_addition.yml— детект добавления привилегий через GPOwin_security_susp_group_policy_startup_script_added_to_gpo.yml— детект скриптов автозапускаwin_security_default_domain_gpo_modification.yml— изменение дефолтных GPO домена (Default Domain Policy, Default Domain Controllers Policy)posh_ps_modify_group_policy_settings.yml— детект PowerShell-модификации настроек GPO
Для поиска устаревших GPP-паролей в SYSVOL (техника T1552.006) — отдельные правила: proc_creation_win_findstr_gpp_passwords.yml и proc_creation_win_susp_sysvol_access.yml.
Корреляция событий для расследования: Event ID 5136 (изменение GPO) → Event ID 4698 (создание запланированной задачи на целевой машине) → Event ID 4688 (запуск процесса от NT AUTHORITY\SYSTEM). Эта цепочка в пределах 5–90 минут — надёжный индикатор GPO abuse.
Из защитных контрмер MITRE D3FEND для T1484.001 рекомендует четыре подхода: D3-CI (Configuration Inventory — инвентаризация конфигураций GPO), D3-AM (Access Modeling — моделирование доступа, чтобы отличить штатное изменение от атаки), D3-NTPM (Network Traffic Policy Mapping — анализ сетевого трафика политик) и D3-RC (Restore Configuration — восстановление конфигурации при обнаружении несанкционированных изменений).
На практике это значит: перед включением мониторинга зафиксируйте, кто имеет право менять каждый GPO, и регулярно сравнивайте текущий ACL с эталонным. Без этого baseline SOC-аналитик утонет в ложных срабатываниях — в крупном домене GPO обновляются десятки раз в день легитимно.
На большинстве HTB-боксов с Active Directory и на реальных пентестах продвинутый аудит GPO не включён. Event ID 5136 требует явной настройки: Computer Configuration → Windows Settings → Security Settings → Advanced Audit Policy Configuration → DS Access → Audit Directory Service Changes. Без неё контроллер домена не пишет события изменения объектов — и атака проходит незаметно.
По IBM X-Force Threat Intelligence Index 2025, атаки с использованием действительных учётных данных выросли на 71% год к году. GPO abuse — классический пример: злоумышленник использует легитимные права легитимного пользователя. Он не эксплуатирует уязвимость в коде — он эксплуатирует ошибку конфигурации. Стандартные EDR часто не детектят изменение GPO, потому что оно выглядит как штатное административное действие.
Весь разбор сводится к одной мысли: GPO abuse — не сложная техника. Три команды в терминале. Основная сложность — в разведке, в умении найти нужное ребро GenericWrite в графе BloodHound среди тысяч связей. На первом HTB-боксе с доменным окружением я потратил четыре часа на разведку и пять минут на эксплуатацию. На десятом — разведка заняла десять минут. Навык строится через повторение: чем больше доменов изучаешь в графе, тем быстрее замечаешь лишние рёбра. И именно поэтому GPO abuse остаётся одним из самых эффективных векторов повышения привилегий в домене — защитники редко аудируют ACL на GPO, а атакующему хватает одного лишнего разрешения. IB Basics на codeby.school — для тех, кому скучно от Hack The Box без объяснений почему.
Эту тему и смежные навыки разбирают на практике в курсе «Анализ защищённости инфраструктуры на основе Active Directory» Codeby Academy.
