![]() |
https://forum.antichat.xyz/attachmen...d9ea5add93.png
Когда ты получаешь первый плацдарм в доменной сети - учётку рядового пользователя или локального админа на рабочей станции - начинается гонка со временем. У тебя минуты, чтобы понять структуру домена, нащупать путь до Domain Admins и начать двигаться. BloodHound превращает хаос из тысяч объектов Active Directory в читаемый граф атак. Каждый путь на этом графе - конкретная цепочка действий от скомпрометированного узла до полного контроля над доменом. Никакой магии, просто математика на графах. Здесь я разберу полный рабочий процесс: от запуска SharpHound с правильными флагами до написания кастомных Cypher-запросов под нестандартные сценарии. Только то, что реально используется на внутренних пентестах и в red team-проектах. Абстракций не будет. Для тех, кому интересна тема, собрал всё в 1 статье: Пентест Active Directory 2025: гайд от разведки до DA. Архитектура BloodHound: что собирает, где хранит, как показывает BloodHound - связка из трёх компонентов, каждый со своей задачей: SharpHound (коллектор) - собирает данные из Active Directory через LDAP-запросы, SMB-сессии и обращения к контроллеру домена. Две реализации: C#-бинарник SharpHound.exe для запуска с Windows-машины в домене и Python-версия bloodhound-python для удалённого сбора с Linux. Neo4j (графовая БД) - хранит собранные данные в виде узлов (пользователи, группы, компьютеры, OU, GPO) и рёбер (отношения между ними: MemberOf, AdminTo, GenericAll, WriteDACL и десятки других). Язык запросов - Cypher. BloodHound GUI - визуализирует граф и ищет кратчайшие пути атаки между любыми двумя узлами. По сути - навигатор по чужому домену. BloodHound Community Edition vs Legacy Сейчас существуют три версии, и выбор между ними - вопрос практический, а не философский: ХарактеристикаLegacy (4.x)Community EditionEnterpriseБэкендNeo4j + ElectronPostgreSQL + Apache AGE (графовое расширение) + API-серверОблачная платформаУстановка Код:
apt install bloodhoundКод:
curl -L https://ghst.ly/getbhce | docker compose -f - upCE разворачивается через Docker Compose с официальным docker-compose.yml от SpecterOps, а Код:
apt install bloodhoundНюанс, о который спотыкаются: CE не использует Neo4j. Вместо него - PostgreSQL с расширением Apache AGE, которое поддерживает подмножество Cypher. Не все Neo4j Cypher-конструкции работают - в частности, UNION и некоторые агрегации могут быть ограничены. Запросы идут через API (/api/v2/graphs/cypher) и строку поиска в UI. Лично я рекомендую тестировать сложные запросы перед боевым использованием - сюрпризы гарантированы. SharpHound: сбор данных Active Directory с учётом OPSEC Сбор данных - самый шумный этап работы с BloodHound. SharpHound генерирует массу LDAP-запросов к контроллеру домена, и любой вменяемый SOC это заметит. Поэтому выбор метода и параметров сбора - всегда баланс между полнотой данных и скрытностью. Методы сбора: когда какой использовать Метод 1: SharpHound.exe с доменной машины Классика, когда есть RDP-доступ или execute-assembly через C2-фреймворк: Код: Код:
# Максимальный сбор - все типы данныхРаботает удалённо через LDAP. Никаких файлов на целевой системе: Bash: Код:
# Полный сбор с KaliВстроенный модуль сбора - удобно, если NetExec уже крутится для валидации учёток: Bash: Код:
nxc ldapКод:
~/.nxc/logs/Флаги SharpHound: что собирать и зачем Выбор Collection Method определяет, какие данные попадут в граф. Согласно документации SANS, это ключевое решение OPSEC: ФлагЧто собираетШумностьКогда использоватьDCOnlyПользовате ли, группы, ACL, GPO, трасты - только с DCНизкаяПервый проход, когда важна скрытностьGroupЧленство в группахНизкаяБыстрая разведка AD структурыACLСписки контроля доступа на объектах ADСредняяПоиск опасных прав (GenericAll, WriteDACL)SessionАктивные сессии пользователей на машинахВысокаяПоиск, где залогинены привилегированные пользователиLocalAdminКто локальный админ и на каких машинахВысокаяПланировани е lateral movementAllВсё перечисленное + Trusts + GPOLocalGroupВысокаяКогда OPSEC не приоритет Для red team-проектов SANS рекомендует начинать с Код:
DCOnlyOPSEC-параметры SharpHound Код: Код:
# Jitter и Throttle - задержки между запросамиКод:
--Throttle 1000Код:
--Jitter 30Граф атак Active Directory: как читать рёбра и узлы После загрузки ZIP-архива в BloodHound появляется граф. Для пентестера критично понимать, что означает каждый тип ребра - от этого зависит, можно ли реально эксплуатировать найденный путь или это тупик. Типы узлов
Не все рёбра одинаково полезны. Вот те, которые на реальных проектах чаще всего приводят к эскалации привилегий Active Directory: РеброЧто даёт атакующемуКак эксплуатироватьGenericAllПолны й контроль над объектомСброс пароля, запись SPN, изменение ACLGenericWriteЗапись произвольных атрибутовTargeted Kerberoasting (добавить SPN), изменение logon scriptWriteDACLИзменение ACL объектаВыдать себе GenericAll, затем эксплуатироватьWriteOwnerСмена владельца объектаСтать владельцем, изменить ACLForceChangePasswordПринудительный сброс пароляСбросить пароль без знания текущегоAddMemberДобавление в группуДобавить себя в привилегированную группуAllExtendedRightsВсе расширенные праваDCSync, смена пароляAdminToЛокальный админ на машинеLateral movement, дамп хешей Outbound Control Rights - почему это первое, куда смотришь Когда в BloodHound ты кликаешь на пользователя и открываешь вкладку «Outbound Control Rights», видишь все объекты, над которыми у этого пользователя есть контроль. И вот тут начинается самое интересное: иногда пользователь без единого привилегированного членства имеет WriteDACL на OU, в которой сидит учётка доменного админа. Такие неочевидные связи - именно то, ради чего BloodHound и существует. Руками такое в LDAP-дампе на 50 000 строк ты не найдёшь. Ну, может найдёшь - на третьи сутки. Поиск пути до Domain Admin: встроенные запросы и кастомный Cypher Базовые запросы BloodHound После загрузки данных первое, что делает любой пентестер - запускает встроенные запросы из вкладки Analysis:
Кастомные Cypher-запросы для BloodHound Neo4j В Legacy-версии открываем консоль Neo4j ( Код:
http://localhost:7474Все пути до DA длиной не более 3 хопов: Код: Код:
MATCH p=shortestPath((n)-[*1..3]->(g:Group {name: 'DOMAIN ADMINS@CORP.LOCAL'}))Код: Код:
MATCH p=(u:User)-[:GenericAll|WriteDACL|WriteOwner|AllExtendedRights]->(g:Group)Код: Код:
// Примечание: свойство hasspn используется в Legacy (4.x); в CE схема свойств может отличаться - проверьте через APIКод: Код:
MATCH (u:User)Компьютеры, на которых залогинены Domain Admins: Код: Код:
MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group)Код: Код:
// Вариант 1: AllExtendedRights (включает все расширенные права на объекте, в том числе оба необходимых для DCSync)Анализ ACL - точка, где BloodHound из красивой картинки превращается в оружие. Каждое опасное ACL-ребро - конкретная техника эксплуатации. Сценарий 1: GenericAll на пользователя BloodHound показывает: Код:
jsmith --[GenericAll]--> svc_backupКод:
svc_backupBash: Код:
# Сброс пароля через net rpc (с Linux)Bash: Код:
# Через PowerView: добавляем SPNСценарий 2: WriteDACL на группу BloodHound показывает: Код:
helpdesk_group --[WriteDACL]--> SERVER_ADMINSBash: Код:
# Через dacledit.py (из форка ThePorgs/impacket - не входит в основной пакет Impacket)Сценарий 3: GenericAll на OU Из конкурента RU-2 (HTB Infiltrator) - реальный пример: пользователь Код:
D.AndersonКод:
MARKETINGBash: Код:
# Назначение FullControl с наследованием на OUКод:
MARKETINGПрактический пентест: от нуля до Domain Admin (лабораторный сценарий) Типичный workflow атакующего после получения доступа. Разберём по шагам на примере лабораторного сценария со слабыми паролями. В реальных доменах каждый этап может занять значительно больше времени: крекинг Kerberos-тикетов - часы или дни, а пути через ACL могут требовать нескольких итераций сбора и анализа. Шаг 1: Получение первой учётки (0-3 минуты) Предположим, через фишинг или AS-REP Roasting получена учётка рядового пользователя: Bash: Код:
# AS-REP Roasting - поиск учёток без предварительной аутентификации KerberosBash: Код:
# С Linux через bloodhound-pythonОтмечаем Код:
jsmith
BloodHound показал учётки с SPN. По данным Horizon3, SPN-учётки (Kerberoastable) обнаруживаются в большинстве проверяемых доменов: Bash: Код:
# Запрос TGS для всех SPN-учётокШаг 5: Lateral movement и эскалация (10-15 минут) Допустим, крякнулся пароль Код:
svc_sqlКод: Код:
jsmith --[Owned]--> svc_sql --[AdminTo]--> SQL01 --[HasSession]--> admin_da --[MemberOf]--> Domain AdminsBash: Код:
# Lateral movement на SQL01 через svc_sqlДобавление собственных рёбер в граф Как отметил конкурент RU-1 (Habr), BloodHound позволяет добавлять кастомные типы связей. Это критично, когда ты нашёл пароль в конфигурационном файле или на файловой шаре: Код: Код:
# Добавляем ребро HasCredentials между файлом и учёткойКод:
MATCH p=shortestPath((a)-[*1..5]->(b))Маркировка высокоценных целей По умолчанию BloodHound помечает как High Value Targets только стандартные группы (Domain Admins, Enterprise Admins). В реальном домене высокоценными бывают и другие объекты - и если их не пометить, граф будет врать: Код: Код:
# Помечаем сервер с критичной базой как High ValueBloodHound показывает потенциальные пути, но перед эксплуатацией стоит верифицировать ACL через PowerView. Граф - это карта, а не территория: Код: Код:
# Проверяем ACL конкретного объектаПонимание того, как обнаруживается SharpHound, помогает пентестеру планировать операцию и снижать шум. Сбор данных SharpHound регистрируется как массовые LDAP-запросы к контроллеру домена. Типичные индикаторы:
Код:
nTSecurityDescriptorКод:
svc_adminЧек-лист пентестера для работы с BloodHound
|
Ну тут главное — не запутаться в этих графах и не начать искать пути, которых нет. BloodHound — как карта сокровищ, только вместо золота там админские пароли. Главное, вовремя остановиться, пока не начался «гонконг» со временем и SOC. А то будешь с пулемётом в руках бегать и не заметишь, как тебя вычислят.
|
Короче, я чуть не понял с этих всех сборов и запросов — можешь проще объяснить, зачем, например, именно ACL так важен? Типа, что там такого особенного, что по ним можно быстро добраться до админов? Читал, что там все эти GenericAll и WriteDACL — но что с ними реально делать проще? Ну чтобы без сложных терминов, а то запутался немного прямо.
|
ACL — это как ключи от комнат в админском доме. Если у тебя есть GenericAll или WriteDACL, можно менять права и вползти туда, куда обычному юзеру ходить нельзя. BloodHound автоматом ищет такие дырки, чтобы показать короткий путь к админским правам, а не обходить всё по кругу. Вот почему ACL часто важнее прямого членства в группах — это скрытые мостики для прокачки доступа.
|
| Время: 04:21 |