• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Работа с большими наборами данных BloodHound

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Я регулярно участвую в заданиях, связанных с анализом безопасности Active Directory. Для проведения такой оценки используется множество инструментов, одним из которых является BloodHound. Сила BloodHound заключается в том, что он представляет различные объекты в Active Directory как узлы (например, пользователей, компьютеры, объекты групповой политики), а отношения между этими объектами — как ребра (например, MemberOf, Owns, CanRDP). С помощью запросов можно быстро определить потенциальные пути эскалации, а также визуализировать их в понятной форме.

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

Описание BloodHound со страницы GitHub 1 :

BloodHound использует теорию графов, чтобы выявить скрытые и часто непреднамеренные связи в среде Active Directory или Azure. Злоумышленники могут использовать BloodHound, чтобы легко идентифицировать очень сложные пути атак, которые в противном случае было бы невозможно быстро идентифицировать. Защитники могут использовать BloodHound для выявления и устранения тех же путей атаки. Как синие, так и красные команды могут использовать BloodHound, чтобы легко получить более глубокое понимание отношений привилегий в среде Active Directory или Azure.

В настоящее время BloodHound поддерживает ресурсы Active Directory и Azure AD. Эта статья посвящена функциональности Active Directory, хотя некоторые ее части (например, запросы), вероятно, также относятся к данным, собранным из Azure.

Процесс использования BloodHound заключается в том, чтобы сначала собрать данные с серверов LDAP Active Directory с помощью SharpHound (или API Azure в случае AzureHound) и сохранить их в файлах JSON, которые заархивированы для уменьшения размера файла. Далее эти файлы можно переместить в систему, в которой будет проводиться анализ, и импортировать в базу данных Neo4j. Наконец, запросы можно выполнять либо с помощью инструмента BloodHound, других сторонних инструментов, либо напрямую с использованием языка Cypher Neo4j. В этой статье мы пройдем эти три этапа.

1695031371577.png


Коллекция

Основным инструментом BloodHound для сбора информации из Active Directory является SharpHound. SharpHound — это исполняемый файл .NET 4, который имеет несколько параметров для настройки того, какие данные необходимо собирать. Эти параметры влияют на объем собираемых данных и скрытность выполнения. Затем SharpHound будет собирать информацию из LDAP / LDAPS с контроллера домена. Более того, в зависимости от указанных флагов перечисления он также будет подключаться к отдельным хостам через RPC через именованный канал ( ncacn_np ), который происходит через порт Microsoft-DS (445/TCP), чтобы получить информацию о членстве в локальной группе и вошедших в систему пользователях.

Помимо инструмента SharpHound, существует несколько других вариантов сбора данных, перечисленных в таблице ниже:

ИнструментЯзыкURLПримечания
SharpHound.NET 4 исполняемый файлhttps://github.com/BloodHoundAD/SharpHound/Также возможно выполнение в памяти с помощью Cobalt Strike, проверьте сообщение в блоге @william_knows.
AzureHoundPowerShellhttps://github.com/BloodHoundAD/AzureHound/Специально для сред Azure, выходящих за рамки этой статьи.
SharpHound.ps1PowerShellhttps://github.com/BloodHoundAD/BloodHound/Доступно из Collectors папки. Использование PowerShell рефлексивно загружает встроенный исполняемый файл SharpHound.exe .NET. Он предоставляет Invoke-BloodHound функцию, которая вызывает основную функцию двоичного файла SharpHound.
SharpHound.pyПитонhttps://github.com/fox-it/BloodHound.py/Python-версия SharpHound
ADExplorerSnapshot.pyПитонhttps://github.com/c3c/ADExplorerSnapshot.py/Преобразует снимки Sysinternals ADExplorer в файлы JSON, совместимые с BloodHound.
БОФХаундПитонhttps://github.com/fortalice/bofhound/Сгенерирует JSON, совместимый с BloodHound, на основе журналов, записанных ldapsearch BOF и pyldapsearch.

Собрав необходимые входные файлы, мы можем перейти к следующему шагу: импорту файлов в BloodHound.

Если у вас нет дампа Active Directory, но вы все равно хотите поиграться с запросами Cypher (обсуждается в разделе « Запросы »), вы также можете загрузить некоторые фиктивные данные в BloodHound с помощью инструмента DBCreator.py, который можно установить следующим образом:

1695031453511.png


После установки скрипт можно просто запустить, чтобы открыть интерактивную подсказку. В командной строке эту gкоманду dbconfi можно использовать для интерактивной настройки URI, имени пользователя и пароля вашего экземпляра Neo4j. После этой настройки подключитесь к базе данных с помощью этой команды connect, сгенерируйте и вставьте фиктивные данные с помощью этой команды generate. После этого вы можете пропустить раздел «Импорт» и сразу перейти к разделу «Запросы» .

Импорт

После настройки BloodHound с серверной базой данных графов Neo4j, как описано в разделе «Установка» на https://bloodhound.readthedocs.io/, собранные данные можно импортировать.

Обычный способ импорта — просто запустить графический интерфейс BloodHound и перетащить файлы JSON и/или zip в главное окно приложения. Альтернативно, кнопку «Импорт» справа можно использовать для выбора файлов, которые вы хотите импортировать.

Во время процесса импорта BloodHound считывает JSON и преобразует его в операторы Cypher, которые создают различные узлы и ребра в базе данных графов Neo4j. Узлы представляют такие объекты, как Computers, Users, , и т. д. с соответствующими атрибутами, Groupsа GPOs ребра представляют отношения типа MemberOf, Owns, WriteDacl, CanRDPи т. д.

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

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

Большие файлы

Моей первой попыткой решить проблему импорта было использование скрипта bloodhound-importer.py2 , однако оказалось, что в настоящее время поддерживается только формат данных BloodHound v3, тогда как дампы, которые я получаю, по-видимому, имели формат версии 4. Как позже выяснилось, формат файла особо не отличается, но в тот момент я решил разбить файл с помощью нескольких строк PowerShell.

Я пошел дальше и использовал PowerShell Get-Content/ConvertFrom-Json для чтения данных JSON и разделения файла JSON размером 250 МБ. Структура JSON-файла BloodHound v4 выглядит следующим образом:

{
"data": [
"ChildObjects": [
{
...
},
{
...
}
],
"Trusts": [
{
...
}
]
],
"meta": {
"methods": 29695,
"type": "domains",
"count": 3,
"version": 4
}
}

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

Затем я выполнил сценарий для файла JSON размером 4 ГБ, однако, несмотря на 64 ГБ ОЗУ в моей системе, PowerShell почти сразу завершил выполнение сценария с исключением Insufficient memory to continue the execution of the program. Это имеет смысл, поскольку, когда файл загружается в память и анализируется как файл JSON с использованием .NET, для этого потребуется гораздо больше памяти, чем просто копирование файла в память 1-к-1. Это был облом, потому что это означало, что мне нужно было найти библиотеку, которая каким-то образом сможет проанализировать огромный файл JSON, не загружая его полностью в память.

Поскольку сценарий PowerShell представлял собой всего лишь быстрый PoC, а в Python, по моему опыту, имеется много полезных библиотек, я начал писать новый сценарий Python. Сценарий chophound.ps1PowerShell доступен в репозитории GitHub по адресу https://github.com/bitsadmin/chophoound/ .

Импортер на Python

Для эффективного анализа огромного файла JSON я нашел модуль ijson Python 3 для перебора файла. Поскольку тег meta требуется для каждого результирующего файла JSON и находится в конце файла JSON, я сначала считываю последние 0x100 байт из файла JSON на диске. Затем я использую регулярное выражение для извлечения метатега, который впоследствии анализируется анализатором JSON, чтобы иметь возможность обновить его значения.

После получения metaтега цикл перебирает файл JSON и извлекает фрагменты, размер которых можно указать с помощью параметра -c(long: --chunksize), где значение по умолчанию равно 500. Затем тег meta обновляется с учетом количества элементов в текущем фрагменте после который хранится в файле на диске с порядковым номером, добавленным к имени файла. Процесс разделения происходит относительно быстро и приводит к созданию каталога с файлами JSON размером около 20 МБ каждый. Размер выходного файла немного варьируется в зависимости от типа BloodHound (компьютеры, группы, пользователи и т. д.) и указанного размера фрагмента. Сценарий chophound.py также доступен в репозитории ChopHound на GitHub 4 .

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

Символы, отличные от ASCII

Выполнив бинарный поиск путем разделения ошибочного файла на более мелкие подфайлы, я определил виновника. Несмотря на то, что в процессе я использовал UTF8-BOM в качестве кодировки файлов JSON (точно так же, как выходные файлы SharpHound), BloodHound не нравились специальные символы, присутствующие в JSON. Поскольку мне не хотелось исследовать, как решить эту проблему, я прибегнул к написанию другого (уродливого) сценария, который просто заменяет все символы, отличные от ASCII, в файле вопросительными знаками ('?'), используя файл, отображенный в памяти чтобы избежать проблем с памятью. Этот файл также доступен в репозитории ChopHound GitHub 4 под именем replace.py.

После запуска сценария для огромного файла JSON, удаления 3-байтовой спецификации UTF-8 из начала файла с помощью шестнадцатеричного редактора (HxD 5) и последующего разделения полученного файла с помощью предыдущего сценария Python, BloodHound наконец-то с радостью принял все файлы JSON!

Некоторая статистика импортированных данных.

1695031497038.png


Теперь все данные сохранены в базе данных Neo4j, пришло время посмотреть, как можно извлечь ценную информацию.

1695031505278.png


Запрос

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

BloodHound

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

1695031519617.png


Чтобы глубже изучить запросы, выполняемые BloodHound, их можно отобразить, установив флажок «Режим отладки запросов» в настройках BloodHound. Это добавит поле «Необработанный запрос» в нижнюю часть графического интерфейса BloodHound и отобразит выполненный запрос Cypher. Запрос Cypher в поле также можно обновить и выполнить, нажав Enter. В следующем разделе мы углубимся в язык запросов Cypher.

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

ИмяОписаниеURL
BloodHoundГрафический интерфейс BloodHoundhttps://github.com/BloodHoundAD/BloodHound/
PlumHoundСоздает отчет с действиями по устранению недостатков безопасности в конфигурации Active Directory.https://github.com/DefensiveOrigins/PlumHound/
GoodHoundGoodHound запускает Bloodhound в эксплуатацию, определяя самые загруженные пути к важным целям и создавая действенные результаты для определения приоритетов устранения путей атак.https://github.com/idnahacks/GoodHound/
BlueHoundИнструмент, который помогает синим командам выявлять действительно важные проблемы безопасности. Объединив информацию о разрешениях пользователей, доступе к сети и неисправленных уязвимостях, BlueHound показывает пути, по которым злоумышленники могли бы пойти, если бы они оказались внутри вашей сети.https://github.com/zeronetworks/BlueHound/

Cypher

Язык запросов, используемый Neo4j для поиска узлов и путей, называется Cypher, а руководство Cypher — очень полезное руководство, в котором подробно описывается синтаксис Cypher и приводится множество примеров. Для вдохновения полезно извлечь встроенные аналитические запросы BloodHound, которые хранятся PrebuiltQueries.json в репозитории BloodHound GUI. Следующие строки PowerShell можно использовать для загрузки этого файла и сохранения запросов в формате CSV, который можно импортировать, например, с помощью Excel.

1695031666474.png


В некоторых случаях перечисляются несколько запросов, где результат первых запросов используется в качестве входных данных в последующих запросах. Это, например, относится к функции «Найти кратчайшие пути к администраторам домена» , где в случае нескольких доменов сначала необходимо выбрать соответствующую группу администраторов домена.

Помимо запросов анализа, существуют также запросы, которые выполняются при выполнении действий в графическом интерфейсе, например, при более глубоком изучении свойств определенного узла. Эти запросы сохраняются для каждого типа узла в соответствующем .jsx файле в том же каталоге, что и файл PrebuiltQueries.json, упомянутый ранее.

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

Помимо настройки запросов в графическом интерфейсе BloodHound, также может быть полезно выполнять запросы, сохраняющие результаты в структурированной форме. Именно об этом будет следующий раздел.

Инструменты шифрования запросов

Для выполнения запросов Cypher в Neo4j включены веб-интерфейс браузера Neo4j по адресу http://localhost:7474/ и утилита cypher-shell командной строки. Ниже приведен пример командной строки для получения имени и описания всех членов различных групп администраторов домена в наборе данных:

1695031680921.png


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

Я искал альтернативные способы выполнения запросов Cypher и наткнулся на модуль PSNeo4j PowerShell от Уоррена Ф.( @psCookieMonster ), который очень хорошо соответствовал моим потребностям. Кажется, этот модуль хорошо работает только с модулем Windows PowerShell (то есть не с PowerShell Core), и это нормально, поскольку я запускаю сервер Neo4j непосредственно на своем хосте Windows. Более того, PSNeo4j работает с версиями Neo4j до версии 4. Это связано с тем, что он использует REST API Neo4j, который был удален из версии 4.

PSNeo4j можно просто установить с помощью, Install-Module PSNeo4jпосле чего его можно загрузить с помощью Import-Module PSNeo4j. После загрузки модуля соединение с базой данных можно установить с помощью следующих строк, в которых командлет Get-Neo4jUser проверяет правильность работы соединения.

1695031690123.png


После установления соединения запросы можно выполнять с помощью Invoke-Neo4jQuery командлета. В результате запрос из предыдущего примера будет выглядеть следующим образом.

1695031697218.png


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

1695031705182.png


Импорт в Excel можно выполнить с помощью кнопки «Из текста/CSV» на вкладке «Данные» в Excel. В зависимости от данных Excel автоматически распознает заголовки. Если заголовки не распознаются автоматически, первую строку CSV-файла можно повысить до заголовка, выбрав «Преобразовать данные» в мастере импорта, щелкнув «Использовать первую строку в качестве заголовков» , а затем нажав кнопку « Загрузить и закрыть» . Как только таблица станет видна в Excel, ее можно будет скопировать в ваш любимый инструмент для документирования (в моем случае OneNote).

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

1695031715208.png


Аналогичным образом можно извлечь определенные столбцы, например, в следующем запросе, который показывает домен, имя, отображаемое имя и DN активных пользователей, с которыми связано SPN.

1695031730113.png


Обратите внимание, что я добавил параметр -As ParsedColumns , который превращает плоский вывод в столбцы. При возврате полного узла, как в предыдущем запросе ( RETURN m), этот параметр не нужен, и его параметр -As Row можно добавить только опционально, чтобы скрыть некоторые лишние атрибуты метаданных.

Чтобы оформить заголовки столбцов, приведенный выше запрос также можно обновить следующим образом:

1695031738234.png


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

1695031751487.png


На этом завершается раздел, посвященный запросам к базе данных Neo4j с использованием Cypher и PowerShell. В следующем разделе мы закончим обсуждением способа использования нескольких разных баз данных.

Несколько баз данных

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

По этой причине полезно использовать несколько баз данных в Neo4j. Это возможно, просто используя разные папки базы данных для разных проектов, что можно сделать, выполнив следующие действия. Я тестировал это только в Windows, однако, вероятно, то же самое будет работать и в Linux.

1. Остановите службу neo4j из командной строки с повышенными правами: net stop neo4j(PowerShell: Stop-Service neo4j)
2. Перейдите в папку data\databases внутри папки установки Neo4j.
3. Переименуйте существующую папку graph.db во что-нибудь другое, напримерgraph.db-ProjectX
4. Снова запустите службу neo4j, используя net start neo4j(PowerShell: Start-Service neo4j). Новая папка graph.db папка создана автоматически
5. Импортируйте свои данные в эту чистую базу данных. Всякий раз, когда вы захотите вернуться назад, повторите эти шаги еще раз, graph.db например, переименовав существующую папку graph.db-ProjectY и переименовав ранее переименованную папку обратно вgraph.db


Альтернативный способ переключения между базами данных — раскомментировать и обновить строку dbms.active_database=graph.db в файле neo4j.conf внутри каталога Neo4j config. Третий вариант — запустить несколько экземпляров Neo4j с помощью Docker, как описано на странице «Neo4j с Docker» в документации разработчика Neo4j 10 .

Заключение

BloodHound — это очень мощный инструмент как для злоумышленников, так и для защитников, позволяющий идентифицировать непредвиденные пути в средах Active Directory. Этому способствует графовая база данных Neo4j, к которой можно напрямую обращаться с помощью Cypher для эффективного извлечения и последующей обработки любой информации, чтобы ее могли использовать злоумышленники, администраторы и защитники для непрерывной игры в атаку и защиту.

Все скрипты, упомянутые в разделе «Импорт» , можно найти на странице ChopHound GitHub.


Спасибо за чтение, и я надеюсь, что вы сможете использовать некоторые приемы в своих будущих заданиях Active Directory!

  1. GitHub - BloodHound ↩2
  2. GitHub - bloodhound-import
  3. PyPI - ijson
  4. GitHub - ChopHound ↩2
  5. mh-nexus - HxD hex editor
  6. Neo4j - The Neo4j Cypher Manual
  7. GitHub - BloodHound source code - Tabs folder ↩2
  8. GitHub - PSNeo4j
  9. The Neo4j REST API Documentation v3.5
  10. Neo4j - Developer - Neo4j with Docker
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://blog.bitsadmin.com/dealing-with-large-bloodhound-datasets
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх