
自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/HEAD/docs/required_permissions.md)找到。
推荐以计划任务或 cron 作业的方式运行 FalconHound。这样你可以定期运行它,保持你的图、警报和富化列表处于最新状态。
### 要求
- BloodHound,或者目前至少是 Neo4j 数据库。
- 一个 SIEM 或其他日志聚合工具。目前支持 Azure Sentinel 和 Splunk。
- 每个要通信的端点的凭据,具有[所需的权限](https://github.com/falconforceteam/falconhound/blob/HEAD/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
一旦会话结束,它必须从图中移除,但这感觉像是浪费信息。所以,与其移除会话,不如将其添加为计算机和用户之间的关系。该关系将被称为 `HadSession`。该关系将具有以下属性:```json
{
"till": "2021-08-31T14:00:00Z",
"source": "falconhound",
"reason": "logoff",
}
这允许进行额外的路径发现,我们可以调查用户是否曾经登录到某个系统,即使会话已结束。
FalconHound 将向图中的节点添加以下属性:
Computer: - 'exploitable': true/false - 'exploits': CVE 列表 - 'exposed': true/false - 'ports': 可从互联网访问的端口列表 - 'alertids': 警报 ID 列表
当前支持的为 FalconHound 提供凭据的方式有:
配置文件保存每个平台所需的所有详细信息。配置文件中的所有项都区分大小写。 最佳实践是将应用按服务级别分离,但您可以使用一个 AppID/AppSecret 执行所有基于 Azure 的操作。
您的 AppID/AppSecret 所需的权限列在此处。
更安全的凭据存储方式是使用 Azure Key Vault。请注意,使用 Key Vault 存在轻微的成本问题。
当前对 Key Vault 的访问支持基于托管系统标识或需要在 config.yml 中配置的 AppID/AppSecret 的身份验证。
推荐的方式是为运行 FalconHound 的 VM 分配托管系统标识,并为其授予对此 Key Vault 的 Key Vault Secrets User 角色。这将允许 FalconHound 无需任何额外配置即可向 Key Vault 进行身份验证。
或者,您可以使用仅对此 Key Vault 具有 Key Vault Secrets User 角色的 ServicePrincipal。该角色仅允许访问机密,甚至不允许列出它们。不要重复使用具有 Sentinel 和/或 MDE 访问权限的 ServicePrincipal,因为这会几乎完全抵消使用 Key Vault 的好处。
需要在 Key Vault 中配置的项目如下所示。请注意,Key Vault 机密不区分大小写。``` 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
配置完成后,你可以在启动 FalconHound 时添加 `-keyvault` 参数。
#### 混合模式 / 回退
当在命令行中设置了 `-keyvault` 参数时,它将作为所有必需密钥的主要来源。如果 FalconHound 无法检索到项目,它将回退到 `config.yml` 中的对应项目。
如果两者都失败,并且该源或目标启用了操作,则会抛出警告并跳过该操作。
## 部署
FalconHound 设计为以计划任务或 cron 作业的形式运行。这样你可以定期运行它,使你的图谱、警报和丰富信息保持最新。
根据你启用的操作数量、处理的数据量以及写入图谱的数据量,这可能需要一些时间。
所有基于日志的查询都设计为每 15 分钟运行一次。如果处理时间过长,你可能需要稍微调整这个时间。
如果是这种情况,建议禁用某些操作。
此外,某些操作(例如会话操作)可能存在重叠。如果你有很多会话,你可能希望禁用 Sentinel 的会话操作,而依赖 MDE 的会话操作。这假设你已经连接了 MDE 和 Sentinel,并且大多数机器已加入 MDE。
### Sharphound / Azurehound
尽管 FalconHound 设计用于与 BloodHound 配合使用,但它并不能替代 Sharphound 和 Azurehound。FalconHound 旨在补充数据收集,并消除定期收集的瞬时性问题。由于并非所有类似数据都能从日志中获取,因此仍然需要 Sharphound 和 Azurehound 来收集数据。
建议定期运行 Sharphound 和 Azurehound,例如每天、每周或每月一次,而 FalconHound 每 15 分钟运行一次。
## 许可证
本项目采用 BSD3 许可证授权 - 详情请参阅 [LICENSE](https://github.com/falconforceteam/falconhound/blob/HEAD/LICENSE) 文件。
这意味着你可以免费使用本软件,甚至用于商业产品,只要注明出处即可。
你无法要求我们对本软件造成的任何损害承担责任。