AS-REP Roasting Active Directory: разбор HTB Forest от разведки до Domain Admin

Рост атак с использованием действительных учётных данных на 71% за год — цифра из IBM X-Force Threat Intelligence Index 2025. За ней стоит конкретная механика: атакующие не подбирают пароли в лоб, а вытаскивают хеши прямо из протоколов аутентификации. Машина HTB Forest — один из лучших полигонов, чтобы пройти такую цепочку целиком: AS-REP Roasting в Active Directory, чтение BloodHound-графа, злоупотребление WriteDACL и финальный DCSync до полного захвата домена. Дальше — каждый шаг с командами, разбором протокола и пояснением, на какую строку в выводе смотреть.
Цепочка атаки: где каждая техника стоит в kill chain
Прежде чем запускать первую команду, стоит понять, что мы строим. В терминах MITRE ATT&CK (открытая база тактик и техник атак; T-коды вроде T1558.003 — её идентификаторы) цепочка выглядит так:
- Разведка — перечисление пользователей домена через RPC или LDAP без аутентификации.
- Credential Access — AS-REP Roasting — запрос хеша для аккаунтов без Kerberos pre-authentication. Преаутентификация — обязательное подтверждение личности перед выдачей билета Kerberos. Если она отключена, KDC отдаёт зашифрованные данные кому угодно.
- Офлайн-взлом — подбор пароля по полученному хешу через Hashcat. По MITRE — Password Guessing (T1110.001, тактика Credential Access).
- Foothold — подключение к машине через Evil-WinRM с полученным паролем.
- Внутренняя разведка — сбор данных BloodHound (SharpHound) для анализа графа привилегий.
- Privilege Escalation — WriteDACL — изменение ACL (списков контроля доступа) на объекте домена, чтобы выдать себе права DCSync. По MITRE — Account Manipulation (T1098, тактика Persistence / Privilege Escalation).
- DCSync — имитация репликации контроллера домена для извлечения всех хешей, включая Administrator и krbtgt.
- Pass-the-Hash — вход от имени Administrator без знания пароля.
Весь путь — от первого nmap-скана до полного контроля домена — занимает на Forest около 30–40 минут. На реальном внутреннем пентесте каждый шаг может растянуться: ограничения сетевого доступа, EDR и SIEM-мониторинг вносят свои коррективы.
Kerberoasting (T1558.003) vs AS-REP Roasting — частый вопрос. Обе техники вытаскивают зашифрованные данные из Kerberos для офлайн-взлома. Разница: Kerberoasting требует аутентифицированного доступа в домен и целится в сервисные аккаунты с SPN (Service Principal Name — уникальный идентификатор сервиса в домене). AS-REP Roasting может работать вообще без учётных данных — достаточно знать имя пользователя с отключённой преаутентификацией. На практике это значит: если вы ещё даже не получили ни одного пароля, AS-REP Roasting — ваш первый шанс зацепиться.
[Применимо: внутренний пентест, black/grey box с сетевым доступом к контроллеру домена]
Требования к окружению и начальная разведка
Требования к окружению
Перед стартом убедитесь, что у вас есть:
- ОС: Kali Linux 2023+ или любой Linux-дистрибутив с Python 3.8+
- RAM: минимум 4 ГБ для атакующей машины; 2+ ГБ VRAM для GPU-крекинга в Hashcat (CPU-режим тоже работает, но медленнее в разы)
- Инструменты: Impacket (активно поддерживается, репозиторий fortra/impacket), BloodHound + Neo4j 4.x, Evil-WinRM (Ruby gem), Hashcat 6.x+
- Сеть: VPN-подключение к HTB (или доступ к контроллеру домена в лабораторной среде)
Перечисление пользователей
Первый шаг — узнать, какие пользователи есть в домене. На Forest (и во многих реальных средах с legacy-конфигурацией) работают null sessions — анонимные подключения к RPC. Это когда сервер принимает подключение без логина и пароля и всё равно отдаёт информацию. Звучит дико, но встречается регулярно.
Запускаем rpcclient -U '' -N <TARGET_IP> и внутри выполняем команду enumdomusers. Если null session разрешён, в ответ получим список всех доменных аккаунтов с их RID (числовыми идентификаторами). Сохраняем имена пользователей в файл users.txt — он понадобится на следующем шаге.
Альтернативный путь: enum4linux -a <TARGET_IP> или LDAP-запрос через ldapsearch -x -H ldap://<TARGET_IP> -b "DC=htb,DC=local" "(objectClass=user)" sAMAccountName.
Grey box сценарий: на реальном внутреннем пентесте заказчик часто выдаёт учётные данные low-privileged пользователя. Тогда можно пропустить null session и сразу перечислить пользователей с отключённой преаутентификацией через PowerShell: Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} или через LDAP с аутентификацией. Быстрее и надёжнее.
AS-REP Roasting: запрашиваем хеш без пароля
Теперь ищем аккаунты с отключённой Kerberos pre-authentication. По умолчанию этот флаг включён для всех пользователей, но администраторы иногда отключают его для совместимости со старыми приложениями — и забывают вернуть. Один из реальных кейсов, описанных в блоге HTB: администратор включил флаг «Do not require Kerberos preauthentication» на два года, пока не пришёл пентестер.
Инструмент GetNPUsers.py из набора Impacket делает всё за один вызов: отправляет AS-REQ (запрос аутентификации) для каждого пользователя из списка и проверяет, вернёт ли KDC (Key Distribution Center — центр распределения ключей Kerberos) ответ AS-REP без предварительной проверки.
GetNPUsers.py htb.local/ -dc-ip <TARGET_IP> \
-usersfile users.txt \
-format hashcat \
-outputfile asrep_hashes.txt
Что здесь происходит на уровне протокола: для каждого имени из users.txt скрипт отправляет AS-REQ на порт 88 (Kerberos) контроллера домена. Если у аккаунта отключена преаутентификация, KDC возвращает AS-REP, часть которого зашифрована ключом, производным от пароля пользователя. Если преаутентификация включена — KDC отвечает ошибкой KDC_ERR_PREAUTH_REQUIRED, и скрипт пропускает этот аккаунт.
Как понять, что сработало: в файле asrep_hashes.txt появится строка вида $krb5asrep$23$username@HTB.LOCAL:.... Число 23 — идентификатор типа шифрования RC4-HMAC (0x17 в hex). Именно RC4 делает хеш пригодным для быстрого взлома: этот алгоритм значительно слабее AES-256, и подбор пароля по нему идёт на порядки быстрее.
Когда техника НЕ работает: — Все аккаунты имеют включённую преаутентификацию (правильная конфигурация по умолчанию — и тогда AS-REP Roasting просто не даст результатов) — Нет сетевого доступа к порту 88 контроллера домена — Пароль длинный (25+ символов) и случайный — крекинг не даст результата за разумное время — Среда настроена на AES-only (без RC4) — хеш всё равно извлекается, но ломается на порядки дольше
Офлайн-взлом: Hashcat против слабого пароля
Полученный хеш ломаем локально, без каких-либо запросов к целевой системе — поэтому это и называется «офлайн-взлом». Никаких логов на стороне жертвы, никаких алертов. Запускаем hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule. Модуль -m 18200 — формат AS-REP. Правило best64.rule добавляет мутации к словарю: цифры, смена регистра, спецсимволы.
На GPU уровня RTX 3060 подбор по rockyou.txt с правилами занимает секунды. В CPU-режиме — минуты. Если пароль не из словаря и длинный — Hashcat не поможет. Это ограничение стоит помнить: AS-REP Roasting бесполезен против gMSA (Group Managed Service Accounts) — аккаунтов с автоматически ротируемыми 240-символьными паролями. Такой пароль вы не подберёте ни на каком железе.
Ожидаемый результат: в терминале Hashcat покажет строку username@HTB.LOCAL:password — пароль в открытом виде. Если статус Exhausted — пароль не найден в словаре, нужен другой подход (расширенные правила, маски или другой словарь).
Foothold: подключаемся к машине
С полученным паролем подключаемся к целевой машине через WinRM (Windows Remote Management — протокол удалённого управления, работает на порту 5985/5986). Команда: evil-winrm -i <TARGET_IP> -u '<username>' -p '<password>'. Если подключение прошло — перед нами PowerShell-консоль с правами этого пользователя. Это наш foothold — первоначальная точка закрепления в системе.
На этом этапе пользователь имеет ограниченные привилегии. Чтобы двигаться дальше, нужно разведать пути повышения через граф доменных привилегий.
BloodHound: читаем граф привилегий Active Directory
BloodHound — инструмент визуализации путей атаки в AD. Он строит граф: узлы (пользователи, группы, компьютеры) и рёбра между ними (членство в группах, ACL-права, делегирования). Задача — найти путь от текущего пользователя до Domain Admin. Без BloodHound вы будете вручную перебирать группы и разрешения часами. С ним — видите весь маршрут за минуты.
Сбор данных
Запускаем сборщик. С Linux-машины: bloodhound-python -u '<username>' -p '<password>' -ns <TARGET_IP> -d htb.local -c All. Он сгенерирует JSON-файлы с полной информацией о домене: пользователи, группы, ACL, сессии. Загружаем их в интерфейс BloodHound (локально: Neo4j + BloodHound GUI).
Альтернатива: запустить SharpHound прямо на целевой машине через Evil-WinRM, скачать архив и загрузить в BloodHound. Работает, но создаёт дополнительный артефакт на хосте.
Что искать в графе
В интерфейсе BloodHound выполняем встроенный запрос «Shortest Paths to Domain Admins from Owned Principals». Помечаем нашего пользователя как «Owned» (кликом на ноде → Mark as Owned) и запускаем анализ.
BloodHound строит путь примерно такого вида:
svc-alfresco → [MemberOf] → Группа A → [MemberOf] → Группа B (с WriteDACL на домене) → [WriteDACL] → HTB.LOCAL
Ключевое ребро здесь — WriteDACL. Пользователь, входящий в Группу B, может изменять DACL (Discretionary Access Control List — список разрешений) на объекте домена. А если можно менять разрешения на домене — можно выдать себе право DCSync.
На что смотреть в BloodHound-графе:
— Рёбра WriteDACL, GenericAll, GenericWrite, WriteOwner — все дают возможность эскалации через ACL
— Цепочки групповых членств, особенно через Exchange-группы (Exchange Windows Permissions — типичный вектор в доменах с Exchange Server; эта группа часто имеет WriteDACL на домене «из коробки»)
— Раздел «Outbound Object Control» у вашего пользователя — показывает, какие объекты вы контролируете напрямую или транзитивно
WriteDACL: злоупотребление правами для повышения привилегий
DACL (списки контроля доступа) определяют, кто что может делать с каждым объектом в AD. WriteDACL — право изменять эти списки. Имея WriteDACL на объекте домена, атакующий добавляет себе ACE (Access Control Entry — отдельную запись в списке доступа), разрешающую репликацию — то есть DCSync.
По MITRE это Account Manipulation (T1098, тактики Persistence и Privilege Escalation): мы не эксплуатируем уязвимость в коде, а злоупотребляем штатным механизмом управления правами. Домен работает как задумано — просто разрешения выданы не тому, кому следовало.
Предусловия
- BloodHound подтвердил наличие WriteDACL-ребра от контролируемого объекта к домену
- Текущий пользователь состоит в группе с WriteDACL (напрямую или транзитивно)
- Сетевой доступ к LDAP/LDAPS на контроллере домена (порты 389/636)
Если пользователь не входит в нужную группу напрямую, но имеет, например, право добавлять членов в эту группу (через AddMember или GenericAll на группу) — сначала добавляем себя или нового пользователя в группу, а потом выполняем WriteDACL.
Эксплуатация
С Linux-машины используем dacledit.py из Impacket. Скрипт добавляет в DACL домена запись, разрешающую нашему пользователю выполнять операции репликации (DS-Replication-Get-Changes и DS-Replication-Get-Changes-All — два extended right, необходимых для DCSync).
dacledit.py -action 'write' -rights 'DCSync' \
-principal '<username>' \
-target-dn 'DC=htb,DC=local' \
'htb.local'/'<username>':'<password>' \
-dc-ip <TARGET_IP>
Что происходит: скрипт подключается по LDAP к контроллеру домена, находит security descriptor объекта DC=htb,DC=local, добавляет два ACE с правами DS-Replication-Get-Changes и DS-Replication-Get-Changes-All для указанного principal и записывает изменённый дескриптор обратно.
Как понять, что сработало: вывод содержит сообщение об успешной модификации DACL. Проверяем через dacledit.py -action 'read' — в списке ACE должна появиться запись для вашего пользователя с правами репликации.
Альтернативный путь с Windows-машины (через Evil-WinRM): загрузить PowerView и выполнить Add-DomainObjectAcl -TargetIdentity "DC=htb,DC=local" -PrincipalIdentity "<username>" -Rights DCSync. PowerView модифицирует DACL аналогичным образом, но требует загрузки модуля на целевую машину — а это дополнительный артефакт для детектирования. На практике я предпочитаю dacledit.py с Linux: меньше следов на хосте.
Когда WriteDACL НЕ работает: — ACL домена настроены по принципу минимальных привилегий и проходят регулярный аудит — Включён мониторинг Event ID 5136 (изменение объекта директории) — SOC-аналитик увидит добавление ACE — На контроллере домена работает SIEM с правилом на изменение DACL доменного объекта (в репозитории SigmaHQ есть несколько правил в категории T1098)
DCSync атака Active Directory: забираем все хеши
Права репликации выданы — выполняем DCSync. Эта атака имитирует поведение легитимного контроллера домена, запрашивающего репликацию данных. Контроллер «не знает», что запрос идёт от атакующего, и отдаёт хеши паролей.
secretsdump.py 'htb.local/<username>:<password>@<TARGET_IP>' \
-just-dc-user Administrator
# Ожидаемый вывод:
# Administrator:500:aad3b435...:32693b11...:::
# Четвёртое поле (после третьего двоеточия) — NTLM-хеш
Флаг -just-dc-user Administrator извлекает хеш только для одного аккаунта. Для полного дампа домена уберите этот флаг или используйте -just-dc-ntlm — получите NTLM-хеши всех пользователей, включая krbtgt (чей хеш открывает дорогу к Golden Ticket — но это уже тема для отдельного разбора).
Финальный шаг — Pass-the-Hash: с полученным NTLM-хешем Administrator подключаемся обратно: evil-winrm -i <TARGET_IP> -u Administrator -H '<NTLM_hash>'. Флаг -H передаёт хеш вместо пароля. Видите PowerShell-приглашение от имени Administrator — домен скомпрометирован.
По данным CrowdStrike Global Threat Report 2025, среднее время lateral movement после initial access — 62 минуты. На Forest вся цепочка от первого скана до Domain Admin укладывается в 30 минут — и это без какого-либо EDR на машине. В реальной среде с CrowdStrike Falcon или SentinelOne каждый из этих шагов потребовал бы дополнительных мер по обходу детектирования.
Ограничения и детектирование AS-REP Roasting
Что видит защитник
AS-REP Roasting оставляет следы в логах контроллера домена. Ключевой индикатор — Event ID 4768 (запрос Kerberos Authentication Ticket) с тремя признаками одновременно:
- Pre-Authentication Type = 0 — преаутентификация отключена (главный маркер; именно по нему фильтруем шум)
- Service Name = krbtgt — запрос аутентификационного тикета, а не сервисного
- Ticket Encryption Type = 0x17 — RC4-шифрование, которое используют все популярные инструменты (Impacket, Rubeus)
Фильтрация по Pre-Authentication Type = 0 сразу убирает около 90% шума из логов, оставляя события для ручного анализа — об этом пишут в блоге HackTheBox по детектированию AS-REP Roasting.
Sigma-правила
В репозитории SigmaHQ (формат правил детектирования, конвертируемый под любой SIEM — Splunk, Elastic, MaxPatrol SIEM) есть готовые правила:
win_security_susp_rc4_kerberos.yml— детектирует запросы Kerberos-тикетов с RC4-шифрованием в Security-логах Windowsproc_creation_win_hktl_rubeus.yml— детектирует запуск Rubeus по аргументам командной строкиzeek_susp_kerberos_rc4.yml— сетевой детект RC4 в Kerberos-трафике через Zeek
Для WriteDACL-эксплуатации: мониторинг Event ID 5136 (изменение атрибутов объекта в AD) с фильтром по атрибуту nTSecurityDescriptor на объекте домена.
Чеклист для защиты
- Проверить все аккаунты с отключённой преаутентификацией:
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} - Включить преаутентификацию на всех аккаунтах, кроме документально обоснованных исключений
- Для сервисных аккаунтов — перейти на gMSA с автоматической ротацией паролей
- Настроить SIEM-правило на Event ID 4768 с
Pre-Authentication Type = 0иTicket Encryption Type = 0x17 - Провести аудит ACL домена через BloodHound — искать WriteDACL, GenericAll, GenericWrite от непривилегированных объектов
- Ограничить права DCSync только аккаунтами контроллеров домена
- Включить аудит Event ID 5136 для отслеживания изменений DACL на критичных объектах
По данным Verizon DBIR 2025, 38% утечек данных связаны с кражей учётных данных. ACL-аудит через BloodHound — одна из немногих мер, которая закрывает сразу несколько векторов: AS-REP Roasting, Kerberoasting, WriteDACL, DCSync.
На каждом внутреннем пентесте, где я запускаю BloodHound, находятся WriteDACL-пути к Domain Admin. Не на каждом третьем — на каждом. Проблема не в AS-REP Roasting: это просто входная точка, и если все аккаунты имеют нормальную преаутентификацию, вектор закрыт. Проблема в ACL-ах. За годы жизни домена накапливаются десятки групп с правами, которые никто не проверял: Exchange-группы, сервисные аккаунты от забытых интеграций, унаследованные разрешения от миграций. BloodHound показывает эти пути за минуты, но в типичной организации его запускают раз в год — во время пентеста. Всё остальное время домен живёт с открытыми путями, которые видит любой аутентифицированный пользователь. По-хорошему, BloodHound или его аналоги должны быть частью еженедельного аудита, а не инструментом из арсенала атакующего. Пока это не так — Forest останется не учебной задачей, а реалистичной моделью типичного корпоративного домена. Если только начинаете разбираться в AD и этот разбор показался плотным — на IB Basics в Codeby Academy берут с любого старта и ведут до первых реальных задач, без академического тона.
Эту тему и смежные навыки разбирают на практике в курсе «Специалист по тестированию на проникновение» Codeby Academy.