
Автоматическое обновление графа BloodHound для синих команд. Обогащает пути атак AD данными о сессиях, группах и CVE в реальном времени из SIEM, обеспечивая непрерывный мониторинг и оповещение.

Начиная с релиза BloodHound CE 7.0, база данных по умолчанию была заменена на Postgres. Эта версия FalconHound по-прежнему использует Neo4j в качестве базы данных по умолчанию. Если вы хотите продолжать использовать FalconHound вместе с последней версией BloodHound, добавьте следующую строку в файл bloodhound.config.json.```json "graph_driver": "neo4j",
Команда BloodHound будет поддерживать Neo4j как минимум в течение года. В этот период, как мы надеемся, либо произойдет значительное улучшение API, либо мы реализуем поддержку PGSQL в FalconHound.
---
FalconHound — это многофункциональный инструмент для синих команд. Он позволяет использовать и усиливать возможности BloodHound в более автоматизированном режиме. Он предназначен для использования совместно с SIEM или другим инструментом агрегации журналов.
Один из сложных аспектов BloodHound — это то, что он представляет собой моментальный снимок во времени. FalconHound включает функции, которые можно использовать для поддержания графа вашей среды в актуальном состоянии. Это позволяет видеть вашу среду такой, какая она есть СЕЙЧАС. Это особенно полезно для сред, которые постоянно меняются.
Одни из самых сложных отношений для сбора в BloodHound — это членство в локальных группах и информация о сеансах. Как специалисты синих команд, мы имеем эту информацию, доступную в наших журналах. FalconHound может использоваться для сбора этой информации и добавления её в граф, что позволяет BloodHound использовать её.
Это лишь пример того, как можно использовать FalconHound. Его можно использовать для сбора любой информации, имеющейся в ваших журналах или инструментах безопасности, и добавления её в граф BloodHound.
Кроме того, граф можно использовать для запуска оповещений или создания списков обогащения. Например, если пользователь добавляется в определенную группу, FalconHound можно использовать для запроса к графовой базе данных кратчайшего пути до чувствительной или привилегированной группы. Если такой путь существует, это может быть записано в SIEM или использовано для запуска оповещения.
Другие примеры использования FalconHound:
- Добавление, удаление или завершение сеансов в графе на основе событий входа и выхода.
- Пометка пользователей и компьютеров как скомпрометированных в графе, когда у них есть инцидент в Sentinel или MDE.
- Добавление информации о CVE и наличии публичного эксплойта в граф.
- Различные действия Azure.
- Пересчет кратчайшего пути до чувствительных групп при добавлении пользователя в группу или назначении новой роли.
- Добавление новых пользователей, групп и компьютеров в граф.
- Создание списков обогащения для Sentinel и Splunk, например, пользователей, уязвимых для Kerberoasting, или пользователей с правами владения определенными объектами.
Возможности здесь безграничны. Пожалуйста, добавляйте идеи в трекер задач или отправляйте PR.
Блог с подробным описанием причин разработки и примерами использования можно найти [здесь](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)
Index:
- [Поддерживаемые источники и цели данных](#supported-data-sources-and-targets)
- [Установка](#installation)
- [Использование](#usage)
- [Действия](#actions)
- [Расширения графа](#extensions-to-the-graph)
- [Управление учетными данными](#credential-management)
- [Развертывание](#deployment)
- [Лицензия](#license)
## Поддерживаемые источники и цели данных
FalconHound предназначен для использования с BloodHound. Он не заменяет BloodHound. Он предназначен для использования возможностей BloodHound и всех других поддерживаемых платформ данных в автоматизированном режиме.
В настоящее время FalconHound поддерживает следующие источники и/или цели данных:
- Azure Sentinel
- Azure Sentinel Watchlists
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API (ранняя стадия)
- CSV файлы
- Azure Data Explorer (ADX) - бета
- LogScale
- BloodHound CE и BHE (ранняя стадия)
- Markdown файлы
- Elastic (ранняя стадия)
Дополнительные источники и цели данных планируются в будущем.
На данный момент FalconHound поддерживает только базу данных Neo4j для BloodHound. Поддержка API BH CE и BHE находится в активной разработке.
---
## Установка
Поскольку FalconHound написан на Go, установка не требуется. Просто загрузите бинарный файл из раздела релизов и запустите его. Доступны скомпилированные бинарные файлы для Windows, Linux и MacOS. Вы можете найти их в разделе [релизов](https://github.com/FalconForceTeam/FalconHound/releases).
Перед запуском необходимо создать файл конфигурации. Пример файла конфигурации можно найти в корневой папке. Инструкции по созданию всех учетных данных можно найти [здесь](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
Рекомендуемый способ запуска FalconHound — запускать его как запланированную задачу или cron-задание. Это позволит запускать его регулярно и поддерживать граф, оповещения и обогащения в актуальном состоянии.
### Требования
- BloodHound или, по крайней мере, база данных Neo4j на данный момент.
- SIEM или другой инструмент агрегации журналов. В настоящее время поддерживаются Azure Sentinel и Splunk.
- Учетные данные для каждой конечной точки, с которой вы хотите взаимодействовать, с [необходимыми разрешениями](https://github.com/falconforceteam/falconhound/blob/HEAD/docs/required_permissions.md).
### Конфигурация
FalconHound настраивается с помощью YAML-файла. Пример файла конфигурации можно найти в корневой папке. Каждый раздел файла конфигурации описан ниже.
---
## Использование
#### Запуск по умолчанию
Чтобы запустить FalconHound, просто запустите бинарный файл и добавьте параметр `-go`, чтобы выполнить все запросы из папки actions.```bash
./falconhound -go
Чтобы перечислить все включенные действия, используйте параметр -actionlist. Он перечислит все действия, которые включены в конфигурационных файлах в папке actions. Его следует использовать в сочетании с параметром -go.```bash
./falconhound -actionlist -go
### Запуск с выбранным набором действий
Чтобы запустить выбранный набор действий, используйте параметр `-ids`, за которым следует один или список разделённых запятыми идентификаторов действий. Это запустит действия, указанные в параметре, что может быть очень удобно при тестировании, устранении неполадок или когда вам нужны определённые, более частые обновления. Это следует использовать в сочетании с параметром `-go`.```bash
./falconhound -ids action1,action2,action3 -go
По умолчанию FalconHound ищет файл конфигурации в текущем каталоге. Вы также можете указать файл конфигурации с помощью флага -config. Это позволяет запускать несколько экземпляров FalconHound с разными конфигурациями для разных сред.```bash
./falconhound -go -config /path/to/config.yml
#### Запуск с другой папкой действий
По умолчанию FalconHound ищет папку действий в текущем каталоге. Вы также можете указать другую папку с помощью флага `-actions-dir`. Это упрощает тестирование и устранение неполадок, а также позволяет запускать несколько экземпляров FalconHound с разными конфигурациями, в разных средах или с разными временными интервалами.```bash
./falconhound -go -actions-dir /path/to/actions
По умолчанию FalconHound использует учетные данные из config.yml (или из пользовательского загруженного файла). При установке флага -keyvault FalconHound получит keyvault из конфигурации и извлечет все секреты оттуда. Если в keyvault отсутствуют какие-либо элементы, будет выполнено обращение к конфигурационному файлу. Если вы хотите получить секреты из Azure keyvault с использованием управляемого удостоверения, определите переменную authtype как msi.```bash
./falconhound -go -keyvault
## Действия
Действия — это ядро FalconHound. Это запросы, которые будет выполнять FalconHound. Они написаны на родном языке источника и цели и хранятся в папке actions. Каждое действие представляет собой отдельный файл и хранится в каталоге источника информации, цели запроса. Имя файла используется как имя действия.
### Структура папки действий
Папка действий разделена на подкаталоги по источнику запроса. Все папки будут обрабатываться рекурсивно, и все YAML-файлы будут выполняться в алфавитном порядке.
Действия Neo4j **должны** обрабатываться последними, так как их результаты зависят от того, что другие источники данных сначала обновят базу графов, чтобы получить наиболее актуальные результаты.
### Файлы действий
Все файлы являются YAML-файлами. YAML-файл содержит запрос, некоторые метаданные и цель(и) запрашиваемой информации.
В корневой папке доступен файл шаблона. Вы можете использовать его для создания собственных действий. Ознакомьтесь с действиями в папке actions для получения дополнительных примеров.
Хотя большинство пунктов будут достаточно понятны, есть несколько важных моментов, которые следует отметить относительно действий:
#### Enabled
Как следует из названия, это используется для включения или отключения действия. Если для него установлено значение false, действие не будет запущено.```yaml
Enabled: true
Это используется для включения или отключения режима отладки для действия. Если установлено значение true, действие будет выполняться в режиме отладки. Это выведет результаты запроса в консоль. Это полезно для тестирования и устранения неполадок, но не рекомендуется использовать в производственной среде. Это замедлит обработку действия в зависимости от количества результатов.```yaml Debug: false
#### Query
Поле `Query` — это запрос, который будет выполняться к источнику. Это может быть запрос KQL, запрос SPL или запрос Cypher в зависимости от вашего `SourcePlatform`. ВАЖНО: старайтесь сделать запрос как можно более точным и возвращать только те поля, которые вам нужны. Это ускорит и повысит эффективность обработки результатов. Кроме того, при выполнении запросов Cypher обязательно возвращайте объект JSON в качестве результата, иначе обработка завершится ошибкой. Например, этот запрос вернет Имя, Количество, Роль и Владельцев подписок Azure:```cypher
MATCH p = (n)-[r:AZOwns|AZUserAccessAdministrator]->(g:AZSubscription)
RETURN {Name:g.name , Count:COUNT(g.name), Role:type(r), Owners:COLLECT(n.name)}
Каждая цель имеет несколько настраиваемых параметров. В зависимости от цели, некоторые могут требовать больше настройки, чем другие.
Все цели имеют поля Name и Enabled. Поле Name используется для идентификации цели. Поле Enabled используется для включения или отключения цели. Если это установлено в false, цель будет игнорироваться.
CSV поддерживает переменную {{date}}, которая будет заменена текущей датой в формате YYYY-MM-DD. Это можно использовать для создания ежедневных отчетов.
Это можно использовать в имени папки или файла (например, path/to/filename-{{date}}.csv) или в самом имени папки.```yaml
#### Markdown
Markdown поддерживает переменную {{date}}, которая будет заменена на текущую дату в формате `YYYY-MM-DD`. Это можно использовать для создания ежедневных отчетов.
Это можно использовать в имени папки или файла (например, `path/to/filename-{{date}}.md`) или в самом имени папки.```yaml
- Name: Markdown
Enabled: true
Path: path/to/filename.md
Пример вывода:```markdown
Description: Get a list of Domain Admins. Date: 2024-02-19
| Name | ObjectID |
|---|---|
| [email protected] | S-1-5-21-1122334455-112233445-1112223334-11223344 |
#### Neo4j
Цель Neo4j записывает результаты запроса в базу данных Neo4j. Этот вывод построчный, поэтому требует дополнительной настройки.
Поскольку мы можем передавать всевозможные данные в разных направлениях, FalconHound должен понимать, что делать с данными. Это достигается использованием переменных замены в первой строке ваших Cypher-запросов. Они передаются в Neo4j как параметры и могут использоваться в запросе.
Поля `ReplacementFields` настраиваются ниже.```yaml
- Name: Neo4j
Enabled: true
Query: |
MATCH (x:Computer {name:$Computer}) MATCH (y:User {objectid:$TargetUserSid}) MERGE (x)-[r:HasSession]->(y) SET r.since=$Timestamp SET r.source='falconhound'
Parameters:
Computer: Computer
TargetUserSid: TargetUserSid
Timestamp: Timestamp
Раздел Parameters определяет набор параметров, которые будут заменены значениями из результатов запроса. На них можно ссылаться как на параметры Neo4j, используя синтаксис $parameter_name.
Цель Sentinel запишет результаты запроса в таблицу Sentinel. Таблица будет создана, если она не существует. Таблица будет создана в рабочей области, указанной в файле конфигурации. Данные из запроса будут добавлены в поле EventData. EventID будет идентификатором действия, а Description — именем действия.
Вот почему вывод запроса также необходимо контролировать, иначе вы можете перегрузить вашу цель.```yaml
#### Sentinel Watchlists
Цель Sentinel Watchlists запишет результаты запроса в список наблюдения Sentinel. Список наблюдения будет создан, если его не существует. Список наблюдения будет создан в рабочей области, указанной в конфигурационном файле. Все столбцы, возвращённые запросом, будут добавлены в список наблюдения.```yaml
- Name: Watchlist
Enabled: true
WatchlistName: FH_MDE_Exploitable_Machines
DisplayName: MDE Exploitable Machines
SearchKey: DeviceName
Overwrite: true
Поле WatchlistName — это имя списка наблюдения. Поле DisplayName — отображаемое имя списка наблюдения.
Поле SearchKey — столбец, который будет использоваться в качестве ключа поиска.
Поле Overwrite определяет, следует ли перезаписать список наблюдения или дополнить его. Если установлено значение false, результаты запроса будут добавлены к списку наблюдения. Если установлено значение true, список наблюдения будет удален и создан заново с результатами запроса.
Как и в Sentinel, Splunk записывает результаты запроса в индекс Splunk. Индекс необходимо создать и привязать к конечной точке HEC. Данные из запроса будут добавлены в поле EventData. Идентификатор события (EventID) будет идентификатором действия, а описание (Description) — именем действия.```yaml
#### Azure Data Explorer
Как и Sentinel, Splunk записывает результаты запроса в таблицу ADX. Данные из запроса будут добавлены в поле EventData. EventID будет идентификатором действия, а Description — именем действия.```yaml
- Name: ADX
Enabled: true
Table: "name"
Чтобы создать таблицу в ADX, вы можете использовать следующую команду:```kql .create table FalconHound (Name: string, Description: string, EventID: string, BHQuery: string, EventData: dynamic, Timestamp: datetime)
### Расширения графа
#### Отношение: HadSession
Как только сессия завершалась, её приходилось удалять из графа, но это казалось растратой информации. Поэтому вместо удаления сессии, она будет добавлена как отношение между компьютером и пользователем. Отношение будет называться `HadSession`. Отношение будет иметь следующие свойства:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
Это позволяет обнаруживать дополнительные пути, где мы можем проверить, входил ли пользователь когда-либо в определённую систему, даже если сеанс уже завершён.
FalconHound добавит следующие свойства к узлам графа:
Computer: - 'exploitable': true/false - 'exploits': список CVE - 'exposed': true/false - 'ports': список портов, доступных из интернета - 'alertids': список идентификаторов предупреждений
В настоящее время поддерживаются следующие способы предоставления учётных данных FalconHound:
Файл конфигурации содержит все детали, необходимые для каждой платформы. Все элементы в файле конфигурации чувствительны к регистру. Рекомендуется разделять приложения по каждому сервису, но вы можете использовать один AppID/AppSecret для всех действий на основе Azure.
Необходимые разрешения для вашего AppID/AppSecret перечислены здесь.
Более безопасный способ хранения учётных данных — использование Azure KeyVault. Имейте в виду, что использование Keyvault влечёт небольшие затраты. В настоящее время доступ к KeyVault поддерживает аутентификацию на основе Managed System Identity или AppID/AppSecret, которые необходимо настроить в файле config.yml.
Рекомендуемый способ настройки — назначить Managed System Identity виртуальной машине, на которой работает FalconHound, и назначить ей роль Key Vault Secrets User для этого Keyvault. Это позволит FalconHound аутентифицироваться в Keyvault без необходимости какой-либо дополнительной конфигурации.
В качестве альтернативы вы можете использовать ServicePrincipal, который имеет только роль Key Vault Secrets User для этого Keyvault. Эта роль позволяет только доступ к секретам, даже без возможности их перечисления. Do НЕ ИСПОЛЬЗУЙТЕ повторно ServicePrincipal, имеющий доступ к Sentinel и/или MDE, так как это практически полностью сводит на нет использование Keyvault.
Элементы для настройки в Keyvault перечислены ниже. Обратите внимание, что секреты Keyvault не чувствительны к регистру.``` SentinelAppSecret SentinelAppID SentinelTenantID SentinelTargetTable SentinelResourceGroup SentinelSharedKey SentinelSubscriptionID SentinelWorkspaceID SentinelWorkspaceName MDETenantID MDEAppID MDEAppSecret Neo4jUri Neo4jUsername Neo4jPassword GraphTenantID GraphAppID GraphAppSecret AdxTenantID AdxAppID AdxAppSecret AdxClusterURL AdxDatabase SplunkUrl SplunkApiToken SplunkIndex SplunkApiPort SplunkHecToken SplunkHecPort BHUrl BHTokenID BHTokenKey LogScaleUrl LogScaleToken LogScaleRepository LimaCharlieAPIUrl LimaCharlieOrgId LimaCharlieIngestKey ElasticCloudID ElasticApiKey
После настройки вы можете добавить параметр `-keyvault` при запуске FalconHound.
#### Смешанный режим / резервный вариант
Когда параметр `-keyvault` задан в командной строке, он будет основным источником для всех необходимых секретов. Если FalconHound не сможет получить элементы, он вернётся к эквивалентному элементу в `config.yml`.
Если оба метода не сработают и для этого источника или цели включены действия, будет выдано предупреждение и действие(я) будет пропущено.
## Развёртывание
FalconHound предназначен для запуска в качестве запланированной задачи или cron-задания. Это позволит вам запускать его на регулярной основе и поддерживать актуальность графа, оповещений и обогащений.
В зависимости от количества включённых действий, объёма обрабатываемых данных и объёма данных, записываемых в граф, это может занять некоторое время.
Все запросы на основе журналов рассчитаны на выполнение каждые 15 минут. Если обработка занимает слишком много времени, возможно, потребуется немного подкорректировать это.
В таком случае может быть рекомендовано отключить некоторые действия.
Также может быть некоторое дублирование, например, с действиями по сеансам. Если у вас много сеансов, вы можете отключить действия по сеансам для Sentinel и полагаться на действия от MDE. Это предполагает, что у вас подключены MDE и Sentinel, и большинство машин подключены к MDE.
### Sharphound / Azurehound
Хотя FalconHound предназначен для использования с BloodHound, он не является заменой Sharphound и Azurehound. Он предназначен для дополнения сбора и устранения проблемы моментального снимка периодического сбора. Как Sharphound, так и Azurehound по-прежнему необходимы для сбора данных, поскольку не все аналогичные данные доступны в журналах.
Рекомендуется запускать Sharphound и Azurehound на регулярной основе, например, раз в день/неделю или месяц, а FalconHound — каждые 15 минут.
## Лицензия
Этот проект лицензирован по лицензии BSD3 — подробности см. в файле [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE).
Это означает, что вы можете использовать это программное обеспечение бесплатно, даже в коммерческих продуктах, при условии указания авторства.
Вы не можете привлекать нас к ответственности за любой ущерб, причинённый этим программным обеспечением.