
自BloodHound CE 7.0版本发布以来,默认数据库已切换为Postgres。此版本的FalconHound仍然依赖Neo4j作为默认数据库。 如果您想在运行最新BloodHound版本的同时继续使用FalconHound,请在您的bloodhound.config.json文件中添加以下行。```json "graph_driver": "neo4j",
BloodHound 团队将在至少一年内继续支持 Neo4j。在此时间范围内,希望要么有重大的 API 改进,要么我们已为 FalconHound 实现了 PGSQL 支持。
---
FalconHound 是一个蓝队多工具。它允许你以更自动化的方式利用和增强 BloodHound 的能力。它设计用于与 SIEM 或其他日志聚合工具配合使用。
BloodHound 的一个挑战在于它是时间点的快照。FalconHound 包含可用于保持环境图最新状态的功能。这使你能够看到环境当前的状态。这对于持续变化的环境尤其有用。
BloodHound 最难收集的关系之一是本地组成员身份和会话信息。作为蓝队成员,我们在日志中随时可以获得这些信息。FalconHound 可用于收集这些信息并将其添加到图中,供 BloodHound 使用。
这只是 FalconHound 用途的一个例子。它可用于收集日志或安全工具中的任何信息,并将其添加到 BloodHound 图中。
此外,该图还可用于触发警报或生成富化列表。
例如,如果用户被添加到某个组,FalconHound 可用于查询图数据库,找到通往敏感或高特权组的最短路径。如果存在路径,则可以将其记录到 SIEM 或用于触发警报。
其他可以使用 FalconHound 的例子:
- 根据登录和注销事件,在图中添加、删除或超时会话。
- 当用户或计算机在 Sentinel 或 MDE 中有事件时,将其标记为已失陷。
- 将 CVE 信息以及是否存在公开漏洞的信息添加到图中。
- 各种 Azure 活动。
- 当用户被添加到组或拥有新角色时,重新计算通往敏感组的最短路径。
- 向图中添加新用户、组和计算机。
- 为 Sentinel 和 Splunk 生成富化列表,例如可 Kerberoast 的用户或拥有某些实体的所有权的用户。
这里的可能性是无穷的。请向问题跟踪器添加更多想法或提交 PR。
更多关于我们开发原因及一些用例示例的博客文章可[在此](https://medium.com/falconforce/falconhound-attack-path-management-for-blue-teams-42adedc9cae5?source=friends_link&sk=9f64b6b3028c5a2a6087d63b4fd2c82f)找到。
索引:
- [支持的数据源和目标](#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 监视列表
- Splunk
- Microsoft Defender for Endpoint
- Neo4j
- MS Graph API(早期阶段)
- CSV 文件
- Azure 数据资源管理器(ADX) - 测试版
- LogScale
- BloodHound CE 和 BHE(早期阶段)
- MarkDown 文件
- Elastic(早期阶段)
未来计划支持更多数据源和目标。
目前,FalconHound 仅支持 BloodHound 的 Neo4j 数据库。对 BH CE 和 BHE API 的支持正在积极开发中。
---
## 安装
由于 FalconHound 用 Go 编写,无需安装。只需从发布部分下载二进制文件并运行即可。
有适用于 Windows、Linux 和 macOS 的编译好的二进制文件。你可以在[发布](https://github.com/FalconForceTeam/FalconHound/releases)部分找到它们。
在运行之前,你需要创建一个配置文件。你可以在根文件夹中找到示例配置文件。关于如何创建所有凭据的说明可[在此](https://github.com/falconforceteam/falconhound/blob/main/docs/required_permissions.md)找到。
推荐以计划任务或 cron 作业的方式运行 FalconHound。这样你可以定期运行它,保持你的图、警报和富化列表处于最新状态。
### 要求
- BloodHound,或者目前至少是 Neo4j 数据库。
- 一个 SIEM 或其他日志聚合工具。目前支持 Azure Sentinel 和 Splunk。
- 每个要通信的端点的凭据,具有[所需的权限](https://github.com/falconforceteam/falconhound/blob/main/docs/required_permissions.md)。
### 配置
FalconHound 使用 YAML 文件进行配置。你可以在根文件夹中找到示例配置文件。
下面将解释配置文件的每个部分。
---
## 使用
#### 默认运行
要运行 FalconHound,只需运行二进制文件并添加 `-go` 参数,以运行操作文件夹中的所有查询。```bash
./falconhound -go
要列出所有已启用的操作,请使用 -actionlist 参数。这将列出 actions 文件夹中配置文件中所有已启用的操作。此参数应与 -go 参数结合使用。```bash
./falconhound -actionlist -go
### 使用选定动作运行
要运行选定的动作集,请使用 `-ids` 参数,后跟一个或多个逗号分隔的动作ID列表。这将运行参数中指定的动作,在测试、故障排除或需要特定、更频繁更新时非常方便。此参数应与 `-go` 参数结合使用。```bash
./falconhound -ids action1,action2,action3 -go
默认情况下,FalconHound会在当前目录中查找配置文件。你也可以使用-config标志指定一个配置文件。这允许你使用不同的配置运行多个FalconHound实例,针对不同的环境。```bash
./falconhound -go -config /path/to/config.yml
#### 使用不同的 actions 文件夹
默认情况下,FalconHound 会在当前目录中查找 actions 文件夹。你也可以使用 `-actions-dir` 标志指定不同的文件夹。这使得测试和故障排除更加容易,同时也允许你使用不同的配置、针对不同的环境或不同的时间间隔运行多个 FalconHound 实例。```bash
./falconhound -go -actions-dir /path/to/actions
默认情况下,FalconHound 将使用 config.yml(或自定义加载的文件)中的凭据。通过设置 -keyvault 标志,FalconHound 将从配置中获取密钥保管库,并从中检索所有机密。如果密钥保管库中缺少某些项,它将回退到配置文件。如果您希望使用托管标识从 Azure 密钥保管库获取机密,请将 authtype 变量定义为 msi。```bash
./falconhound -go -keyvault
## 动作
动作是FalconHound的核心。它们是FalconHound将执行的查询。动作以源和目标的本机语言编写,并存储在 `actions` 文件夹中。每个动作是一个单独的文件,存储在信息来源的目录(即查询目标目录)中。文件名用作动作的名称。
### 动作文件夹结构
动作文件夹按查询源划分为子目录。所有文件夹将被递归处理,所有YAML文件将按字母顺序执行。
Neo4j动作**应**最后处理,因为其输出依赖于其他数据源先更新图形数据库,以获取最新结果。
### 动作文件
所有文件都是YAML文件。YAML文件包含查询、一些元数据以及查询信息的目标。
根文件夹中有一个模板文件。您可以使用它来创建自己的动作。更多示例请参考 `actions` 文件夹中的动作。
虽然大多数项目一目了然,但关于动作有一些重要事项需要注意:
#### 启用
顾名思义,这用于启用或禁用动作。如果设置为 `false`,该动作将不会运行。```yaml
Enabled: true
此选项用于启用或禁用某个操作的调试模式。若设为 true,该操作将以调试模式运行,查询结果将输出到控制台。这对于测试和故障排查非常有用,但不建议在生产环境中使用。根据结果数量不同,它会减慢操作的处理速度。```yaml
Debug: false
#### Query
`Query` 字段是针对源运行的查询。根据你的 `SourcePlatform`,这可以是 KQL 查询、SPL 查询或 Cypher 查询。
重要:尽量保持查询尽可能精确,并且只返回你需要的字段。这将使结果的处理更快、更高效。
另外,在运行 Cypher 查询时,确保结果 `RETURN` 一个 JSON 对象,否则处理将失败。
例如,这将返回 Azure Subscriptions 的 Name、Count、Role 和 Owners:```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
参数部分定义了一组参数,这些参数将被查询结果中的值替换。可以使用 $parameter_name 语法将其引用为 Neo4j 参数。
Sentinel 目标会将查询结果写入 Sentinel 表。如果表不存在,则会创建该表。该表将在配置文件中指定的工作区内创建。查询中的数据将被添加到 EventData 字段中。EventID 将是操作 ID,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 将是操作 ID,Description 将是操作名称。```yaml
#### Azure Data Explorer
类似于 Sentinel,Splunk 会将查询结果写入 ADX 表。查询数据将被添加到 EventData 字段中。EventID 将对应操作 ID,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