Эта статья является русскоязычной адаптацией оригинальной статьи, с который вы можете ознакомится перейдя по ссылке.

Введение

Я сталкивался со многими хакерами, которые хотели бы научиться использовать BloodHound, но по каким либо причинам не могут начать. В результате они теряются и разочаровываются.

В этой статье я расскажу о настройке, сборе данных, их анализе и предоставлении связей на основе этих данных. В качестве образца данных для сбора и анализа будет использован лес GOADv2. Я уже собрал несколько образцов данных и поместил их в репозиторий для анализа и практической работы.

Огромная благодарность SpecterOps за создание BloodHound и предоставление его сообществу!

Зачем это все

Прежде чем мы начнем, нам нужно понять, зачем это нужно. Active Directory печально известна своей сложностью, а в любой сложной системе есть много возможностей для ошибок. AD интересна тем, что в большинстве сред не существует традиционных эксплойтов на основе CVE - вместо этого большинство эскалационных атак основывается на неправильной конфигурации. Наша задача - перечислить как можно больше таких сценариев эскалации, определить их риск и представить рекомендации по снижению риска до минимально возможного уровня.

Если вы хотите, чтобы вам платили за эту работу, вы должны уметь эффективно представлять эти риски в письменном виде!

Background

BloodHound был разработан компанией SpecterOps как способ визуализации отношений между объектами в AD. Из-за масштаба и сложности большинства сетей AD аудит этих связей вручную - сущий кошмар. Вместо этого в оригинальной BloodHound для визуализации этой информации использовалась теория графов Neo4j, позволяющая передавать информацию между объектами.

В настоящее время существует три версии BloodHound, о которых вам необходимо знать:

BloodHound Legacy: Оригинальная версия BloodHound, которая больше не поддерживается. Построена на базе приложения Electron, несколько сложна в настройке.

BloodHound Community Edition: Выпущена в августе 2023 года, активно поддерживается. Использует docker compose для управления набором контейнеров, исключительно прост в развертывании. Плавный интерфейс веб-приложения.

BloodHound Enterprise: Платная версия BloodHound для управления путями атак. Основное отличие заключается в том, что эта версия используется для управления рисками и проверки.

Основные компоненты

Есть несколько различных компонентов, о которых мы должны знать. Во-первых, само приложение BloodHound - это не более чем фронт-энд для визуализации, представления и анализа данных. Нам нужно собрать данные об окружающей среде с помощью коллектора, чтобы они попали в приложение для анализа.

Коллектор

Нам нужно собрать данные из среды AD, чтобы передать их в BloodHound для анализа. Существует два основных коллектора, о которых вам нужно знать:

SharpHound: Это официально поддерживаемый инструмент коллектора для BloodHound, написанный на C#. Для сбора информации его необходимо запускать с компьютера под управлением Windows, подключенного к домену.

BloodHound.py: Сценарий на языке python, разработанный сообществом и используемый для сбора данных AD. Может быть запущен с машины на базе Linux, например Raspberry Pi.

Важно понимать, что на момент написания этой статьи bloodhound.py не поддерживает BloodHound-CE. Вы должны использовать ветку bloodhound-ce коллектора bloodhound.python, если решите использовать его. Не стоит смешивать устаревшие коллекторы с коллекторами Community Edition - это приведет к сбою при вводе (а это очень неприятно!).

Фронтенд

BloodHound - это веб-приложение, используемое для интерпретации данных, полученных от коллектора. Это приложение с графическим интерфейсом, с которым мы взаимодействуем, чтобы интерпретировать данные для выявления рисков и путей эскалации. Фронтенд хорош лишь настолько, насколько хороши данные, полученные от коллектора.

Ввод данных

Внутри графического интерфейса фронтенда находится File Ingest. С его помощью данные, полученные от коллектора, помещаются в базу данных Neo4j. После разбора эти данные будут доступны GUI-приложению для анализа.

API

Одним из самых интересных моментов в BloodHound-CE является доступный HTTP API для запроса данных. Это поможет нам автоматизировать и быстро извлекать данные, чтобы доказать их ценность в ходе пентестинга.

Устаревшая версия BloodHound

Мы уже рассказывали об оригинальной версии BloodHound и о том, почему она важна, но это очень важно понимать. Старые коллекторы НЕ РАБОТАЮТ с Community Edition BloodHound. Любой желающий может использовать устаревшую версию, и она по-прежнему будет отлично работать, однако она не будет соответствовать последним угрозам. Поскольку мы доказываем ценность игры для клиентов, нам нужно использовать предметы, которые могут оценить наиболее применимые для них риски.

Начало работы

Отлично, теперь, когда мы знаем все о каждой части головоломки, мы можем приступить к установке BloodHound-CE и сбору данных для нашего анализа.

Запуск контейнеров

Community Edition использует docker compose через набор контейнеров. Это значительно упрощает запуск и управление инфраструктурой для BloodHound, поскольку все контейнеры находятся в сети docker.

Нам нужно лишь загрузить файл docker-compose.yml и дать команду docker на сборку контейнеров.

wget https://raw.githubusercontent.com/SpecterOps/bloodhound/main/examples/docker-compose/docker-compose.yml -O docker-compose.yml  
docker-compose up

Обратите внимание, что в журналах будет указан начальный пароль, который нам нужно использовать для входа в систему.

Скопируйте этот пароль и перейдите по адресу http://localhost:8080, чтобы войти в графический интерфейс. Пользователем будет admin.

Когда вы войдете в систему, вам будет предложено изменить пароль.

Причем легкий пароль вам поставить не позволят.

Отлично, мы вошли. Но подождите, здесь нет данных! Как же нам приступить к анализу? Сначала нам нужно загрузить коллекторы.

Сбор данных

У нас есть несколько способов сделать это. Мы можем использовать коллекторы SharpHound.exe C#, PowerShell или Python для сбора этой информации.

Чтобы получить копию поддерживаемых коллекторов, мы можем загрузить их прямо из графического интерфейса BHCE. Щелкните на шестеренке, а затем на “Загрузить коллекторы”. Откроется страница, на которой мы можем загрузить коллектор.

После распаковки мы можем запустить этот инструмент сбора на удаленном хосте. Выберите удобный для вас способ выполнения этой операции, будь то маяк для последовательного выполнения или интерактивная RDP-сессия.

Коллектор на C#

Использование SharpHound.exe очень простое - мы можем просто запустить его без каких-либо дополнительных флагов, и он с радостью соберет стандартную информацию о текущем домене с текущим пользователем.

.\SharpHound.exe

Чтобы собрать всю доступную информацию, мы можем указать флаг -c All. Это позволит получить такие сведения, как информация ADCS, RDP и DCOM. Однако в больших средах сбор всей информации может привести к перегрузке машины - имейте это в виду!

Лично мне нравится собирать все, а затем шифровать ZIP паролем и присваивать файлам префикс. Хотя эти данные доступны всем пользователям домена, в чужих руках они могут оказаться конфиденциальной информацией.

.\SharpHound.exe -c All --zippassword 'p@ssw0rd' --outputprefix 'NORTH'

После завершения мы увидим, что zip-файл был создан и с нашим предполагаемым префиксом. Обратите внимание на количество объектов, это может быть полезным числом в отчете для клиента.

Междоменный сбор данных

Чтобы собрать данные из других доменов в том же лесу, нам нужно добавить несколько дополнительных флагов. Например, с помощью флага --domain нам нужно будет направиться в нужный домен. Далее мы переключимся на домен sevenkingdoms.local, работая от имени пользователя [email protected]. Для работы эта машина должна быть способна разрешить домен в DNS.

.\SharpHound.exe -c All --domain sevenkingdoms.local --zippassword 'p@ssw0rd' --outputprefix 'SEVENKINGDOMS'

Сбор от имени другого пользователя

Если мы находимся в лесу, но у нас нет доступа к учетной записи, доверенной в отдельном домене, мы всегда можем запустить SharpHound.exe с помощью команды runas.execommand.

runas /netonly /user:[email protected] cmd  
.\SharpHound.exe -c All --domain essos.local --zippassword 'p@ssw0rd' --outputprefix 'ESSOS'

В качестве альтернативы можно указать флаги --ldapusername и --ldappassword для подключения к другому домену. Это не требует работы команды runas.exe.

.\SharpHound.exe -c All --domain essos.local --ldapusername khal.drogo --ldappassword horse --zippassword 'p@ssw0rd' --outputprefix 'ESSOS'

Reflectively Loading SharpHound

Сталкивались ли вы с ситуацией, когда файл SharpHound.exe отмечается средствами обнаружения как вредоносный? В некоторых сценариях мы можем обойти этот контроль, загрузив исполняемый файл C# в память, а затем выполнив точку входа (ATT&CK ID T1620).

$sh = [System.Reflection.Assembly]::Load([byte[]]([IO.FIle]::ReadAllBytes("C:\Temp\SharpHound.exe")));  
$cmd = "-c All --zippassword 'p@ssw0rd' --outputprefix REFLECTED"  
[Sharphound.Program]::Main($cmd.Split())

Обратите внимание, что вам может понадобиться добавить ключ --outputdirectory, чтобы обеспечить сохранение в нужном вам месте.

Python Collector

Далее мы можем использовать инструмент bloodhound.py для сбора и этой информации. Как отмечалось ранее, текущий пакет bloodhound.py в репозиториях Kali предназначен только для Legacy BloodHound. Вам нужно загрузить ветку bloodhound-ce с их GitHub.

sudo apt install bloodhound.py  
bloodhound-python -d north.sevenkingdoms.local -u hodor -p hodor -c All -op default_kali_bloodhoundpy --zip -ns 192.168.56.10

Поскольку нас интересуют данные для поддержки BHCE, давайте сосредоточимся на установке этой ветки и ее использовании. В частности, мы можем клонировать эту ветку прямо с GitHub.

git clone -b bloodhound-ce https://github.com/dirkjanm/BloodHound.py.git

Если мы не хотим устанавливать зависимости, мы всегда можем создать контейнер для запуска. В репозитории уже есть Dockerfile, который мы можем использовать для сборки.

cd BloodHound.py  
docker build -t bloodhound .  
docker run -v ${PWD}:/bloodhound-data -it bloodhound  
a0140a0d356a:/bloodhound-data# bloodhound-python -d north.sevenkingdoms.local -u hodor -p hodor -c All -op ce_branch_bloodhoundpy --zip -ns 192.168.56.10

Сбор данных

Теперь, когда мы смогли собрать данные, нам нужно уметь их использовать. Для этого нужно загрузить их в графический интерфейс, где они будут занесены в базу данных Neo4j. Для этого нужно нажать на кнопку cog, а затем на кнопку Administration.

На этом этапе мы можем нажать кнопку UPLOAD FILE(S), чтобы загрузить наши данные. Обратите внимание, что мы не можем загрузить zip-файл, но мы можем выбрать несколько JSON-файлов одновременно.

В появившемся всплывающем окне мы можем перетаскивать файлы, которые будут приняты. Помните, что мы не можем загрузить zip-архив, но мы можем загрузить все JSON-файлы, извлеченные из zip-архива.

После двойного нажатия на кнопку загрузки мы вернемся на страницу загрузки. Мы видим, что в статусе указано, что загрузка завершена! Мы можем продолжить загрузку дополнительных данных для других доменов в лесу.

Ошибки Ingest

Один из самых неприятных моментов в работе BHCE - отсутствие обратной связи при загрузке устаревшей информации. Именно из-за этого сценария, как мне кажется, многие хакеры, которые учатся использовать этот инструмент, разочаровываются и бросают работу.

В этом случае, если мы соберем информацию с коллекционера для Legacy Bloodhound и импортируем ее в BHCE, есть вероятность, что файлы пройдут первоначальную проверку на загрузку, будут отмечены как завершенные, но на самом деле не будут приняты.

Вернувшись на страницу Explore, мы видим, что данные все еще не получены. Здесь легко расстроиться - в конце концов, мы же загрузили данные, верно?

Чтобы обнаружить это, нам пришлось заглянуть в журналы с помощью docker compose logs, чтобы увидеть ошибку. Здесь показано, что произошла ошибка размаршалинга (процесса преобразования сериализованных данных, часто в определенном формате, например JSON, XML или бинарном, обратно в исходный объект или загруженные данные).

Такое случилось с данными, собранными с помощью bloodhound-python из репозитория Kali.

Чтобы исправить это, я бы рекомендовал использовать последние версии коллекторов для BHCE. Я также хотел бы, чтобы графический интерфейс BHCE был обновлен, чтобы отразить эти ошибки размаршалинга или, по крайней мере, предоставить индикацию того, что Ingest не был успешно выполнен.

Ввод данных через API

Чтобы получить данные через API, мы можем прочитать документацию. Лично я этого не делаю, поскольку загружаю данные через GUI, однако такая возможность поддерживается.

Просмотр данных

Раз уж вы зашли так далеко, мы можем приступить к изучению собранных данных! Это позволит нам найти и понять взаимосвязи между объектами в лесу и то, как их можно использовать. Для начала мы можем использовать встроенные запросы для изучения данных. Для этого нужно нажать на кнопку CYPHER, затем на значок папки, чтобы открыть запросы.

Щелкнув на одном из поисковых запросов, например “Все администраторы домена”, вы добавите запрос Cypher в строку поиска и поищите совпадения в базе данных. Результаты теперь будут на экране! Чтобы получить подробную информацию об объекте, мы можем щелкнуть на нем, чтобы просмотреть его свойства. Это поможет найти дополнительную информацию об учетной записи или домене.

Поиск векторов атаки

Чтобы найти конкретные пути от одного объекта к другому, мы можем использовать кнопку PATHFINDING. В данном случае мы можем запросить, как пользователь samwell.tarly может получить доступ к администраторам домена, чтобы определить, как этот пользователь может использовать этот путь.

Edges

В этом сценарии мы видим, что пользователь samwell.tarly имеет разрешения GenericWrite, WriteOwner и WriteDacl на GPO STARKWALLPAPER. Если мы не знаем, как это может быть использовано, мы можем щелкнуть на самом краю, чтобы в правой панели открылись свойства. Здесь содержится информация об эдже, в том числе о том, как злоупотреблять этим разрешением на машинах под управлением Windows или Linux.

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

Пометка объектов “Owned”

Чтобы пометить объект как Owned, мы можем щелкнуть на нем правой кнопкой мыши в графическом интерфейсе. При этом на объекте появится значок черепа, что позволит нам выполнять дополнительные запросы на основе принадлежащих объектов. Это поможет нам отслеживать, как мы можем маневрировать в среде по мере получения доступа.

Чтобы просмотреть объекты, помеченные как Owned, мы можем нажать на кнопку “GROUP MANAGEMENT” в верхней части страницы. Вы заметите, что сначала страница будет пустой, и нам придется нажать несколько кнопок, чтобы получить нужную информацию.

Начните с нажатия второй кнопки, чтобы выбрать сущность для поиска. В большинстве случаев достаточно выбрать “Все домены Active Directory”.

После этого мы можем нажать на верхнее выпадающее меню и выбрать “OWNED”.

На этом этапе мы сможем увидеть учетную запись, которую мы отметили как захваченную. Это может быть полезно для отслеживания объектов по мере получения доступа, а также для отчетности перед клиентом.

Запросы Cypher

Хотя готовые поисковые запросы помогут быстро найти интересные объекты, нередки случаи, когда нам нужно найти что-то, не охваченное этими запросами. Чтобы решить эту проблему, мы можем создавать собственные запросы, отправляемые в базу данных Neo4j. Так мы можем убедиться, что поиск работает именно так, как мы задумали, и впоследствии сохранить его в пользовательском поиске.

Лично я считаю, что в готовых запросах BHCE не хватает некоторых критически важных операций поиска, которые помогают сопоставить принадлежащие объекты с ценными целями. В BHCE и Legacy это решается по-другому, и для этого требуются специальные запросы в Cypher. Ниже приведен способ получения списка всех принадлежащих объектов в BHCE:

MATCH (n) WHERE "owned" in n.system_tags RETURN n

Его можно поместить в панель запросов Cypher, нажать кнопку поиска и увидеть все захваченные объекты. Обратите внимание, что на изображении ниже объекты User и Computer захвачены, но не имеют пути друг к другу из этого поиска.

Вот несколько полезных запросов, которые я использовал в прошлом и которые помогли мне найти неправильную конфигурацию:

Найти все неограниченные делегирования от не-DC

MATCH (c1:Computer)-[:MemberOf*1..]->(g:Group) WHERE g.objectid ENDS WITH '-516' WITH COLLECT(c1.name) AS domainControllers MATCH (c2 {unconstraineddelegation:true}) WHERE NOT c2.name IN domainControllers RETURN c2  

Найдите пользователей, в описании которых есть слово “pass”.

MATCH p = (d:Domain)-[r:Contains*1..]->(u:User) WHERE u.description =~ '(?i).*pass.*' RETURN p  

Список всех захваченных объектов

MATCH (n) WHERE "owned" in n.system_tags RETURN n  

Найдите все пути от владения к объектам уровня 0

MATCH p = allShortestPaths((o)-[*1..]->(h)) WHERE 'owned' in o.system_tags AND 'admin_tier_0' in h.system_tags RETURN p

Если вы хотите узнать больше, в документации BloodHound есть несколько фантастических ресурсов о том, как создавать и понимать глубокие запросы Cypher: Поиск с помощью Cypher - BloodHound (bloodhoundenterprise.io)

Пользовательские запросы

Когда мы хотим сохранить результаты поиска для дальнейшего использования, мы можем сохранить его с помощью кнопки “Save Query”. Это приведет к появлению категории “Пользовательские поиски” в той же иконке папки для последующего использования.

Однако на данный момент не существует способа загрузки пользовательских запросов с диска, как в BloodHound Legacy. Об этом несколько раз писали в BloodHound Slack, предлагая использовать API вместо этого.

Тем не менее, мы можем воспользоваться документацией по API, чтобы попытаться понять, что нам нужно сделать. Полезно отметить, что есть несколько различных вещей, которые мы можем использовать для чтения и размещения новых пользовательских запросов в системе.

Веб-консоль Neo4j

Если нам понадобится прямой доступ к веб-консоли Neo4j, мы можем зайти в нее, перейдя по адресу http://localhost:7474. Для большинства сценариев в этом нет необходимости, если только нам не нужен прямой доступ к базе данных.

Это веб-интерфейс для базы данных Neo4j, который позволит нам выполнять необработанные запросы к шифру и просматривать данные. Зайдем, используя дефолтные учетные данные neo4j:bloodhoundcommunityedition

Мы можем поместить необработанные запросы в подсказку и увидеть результаты, а также все свойства для каждого возвращенного объекта.

Это поможет нам создавать и отлаживать пользовательские запросы для BHCE. Опять же, доступ к веб-консоли Neo4j, как правило, не нужен в большинстве сценариев, но его полезно иметь в качестве запасного варианта на случай необходимости.

Очистка данных

В большинстве консалтинговых сред нам необходимо очистить данные BloodHound, чтобы сохранить разделение данных между клиентами. В последнем выпуске BloodHound 5.8.0 это можно сделать в графическом интерфейсе.

До версии 5.8.0 нам нужно было удалить том, используемый BloodHound, чтобы очистить его. Я оставил здесь эти инструкции на случай, если кому-то еще понадобится знать, как это сделать, это также описано в выпуске #107 для BHCE.

Для начала давайте перечислим тома, используемые докером:

docker volume ls

В этих данных мы видим два тома, связанных с BloodHound.

Определение тома Neo4j, используемого BloodHound

Чтобы удалить эти данные и получить свежий экземпляр данных BloodHound, нам нужно удалить этот том. Обратите внимание, что том bloodhound_postgres-data используется для входа в графический интерфейс и веб-приложение. Обычно его не нужно удалять, если только вы не хотите все сбросить.

Давайте удалим этот том, чтобы сбросить данные. Мы используем приведенную ниже команду, чтобы попросить docker удалить этот том.

Чтобы упростить задачу, мы можем выполнить все это одной командой.

docker volume rm $(docker volume ls -q | grep neo4j-data)

Удалить все

Если вы хотите удалить все и получить свежую копию всех контейнеров, томов и конфигураций, следуйте этим инструкциям. Предполагается, что файл docker-compose.yml находится в рабочей директории.

Сначала нам нужно снести контейнеры и удалить тома с помощью следующей команды:

docker-compose down -v

После этого мы можем извлечь свежую копию контейнеров с помощью команды pull.

docker-compose pull

Остановка контейнеров

Остановить контейнеры очень просто: мы можем просто попросить docker остановить их.

docker compose stop

Предоставление другим пользователям

Во многих средах мы захотим поделиться нашим экземпляром BHCE с другими, чтобы все они могли подключиться к одному экземпляру. По умолчанию BHCE открыт только для localhost. Чтобы добиться этого, нам нужно изменить файл docker-compose.yml, чтобы открыть его для других.

Изменив приведенную ниже строку в службе bloodhound, мы можем указать Docker Compose открывать графический интерфейс для интерфейсов, отличных от localhost. Это очень удобно, если мы планируем использовать один сервер для одновременного использования многими пентестерами.

Если мы хотим открыть его для всех интерфейсов, измените параметр BLOODHOUND_HOST на 0.0.0.0. Обратите внимание, что если у вас белый IP, ваш сервер будет доступен в Интернете! Обычно лучше привязать его только к VPN-интерфейсу, например, к интерфейсу WireGuard, чтобы ограничить доступ.

Ускорение процесса

Если вы знаете меня, то знаете, что я люблю ускорять процессы и делать вещи более качественными. Так как же использовать это, чтобы быстрее справляться с задачами?

AD-Miner

Инструментарий AD-Miner использует данные в Neo4j для поиска множества известных рисков и путей эскалации, а затем представляет эти результаты в HTML-файле с общей оценкой.

Мы можем запустить его, сначала установив инструмент AD-Miner с помощью pipx, а затем предоставив информацию для подключения к базе данных Neo4j - эти учетные данные хранятся в файле docker-compose.yml. По умолчанию это neo4j:bloodhoundcommunityedition. Обратите внимание, что это пароль к базе данных Neo4j, а не к графическому интерфейсу BHCE!

Установка с помощью pipx

pipx install 'git+https://github.com/Mazars-Tech/AD_Miner.git'  

Создание отчета AD-Miner с использованием учетных данных BHCE по умолчанию

AD-miner -u neo4j -p bloodhoundcommunityedition -cf GOAD

Это может занять много времени в зависимости от размера среды - в некоторых доменах мне приходилось ждать более 2 часов! После завершения процесса файлы будут находиться в папке render_GOAD, используя метку, указанную в ключе -cf. Мы можем найти этот HTML-файл в созданной папке.

Как это здорово! Теперь у нас есть интерактивная приборная панель, которая позволяет обратить наше внимание на самые важные ошибки в конфигурации.

AD-Miner - это фантастический инструмент для дополнительного анализа и обогащения данных BloodHound - обязательно ознакомьтесь с ним!

References

Tags:

#ad#bloodhound