IPAHound/IPAHound
GitHub: IPAHound/IPAHound
IPAHound 是一款专为 FreeIPA 设计的 BloodHound 数据收集器,通过 LDAP 枚举将 Linux 域环境中的身份与权限关系转化为图数据库格式,支撑基于图的安全分析与攻击路径发现。
Stars: 21 | Forks: 1
IPAHound
专为 FreeIPA 打造的 BloodHound 收集器
“攻击者以图的方式思考...” — 在 Linux 上也是如此!
## 目录
- [概述](#overview)
- [配套 GUI](#companion-gui)
- [快速入门](#quickstart)
- [环境要求](#requirements)
- [类型与边](#types-and-edges)
- [工作原理](#how-it-works)
- [安装](#installation)
- [使用方法](#usage)
- [将数据导入 Neo4j](#loading-data-into-neo4j)
- [待办事项](#todo)
- [其他资源](#additional-resources)
- [Star 历史](#star-history)
- [贡献指南](#contributing)
## 概述
IPAHound 是一个专门为 FreeIPA 域控制器设计的 LDAP 收集器,可通过基于图的可视化实现全面的域分析。它填补了 FreeIPA 复杂结构与 BloodHound 强大分析能力之间的空白。
该收集器主要分为两个阶段运行:
1. **数据收集** - 从 FreeIPA LDAP 服务器收集信息。
2. **数据处理** - 创建关系(边)并导出为 JSON 格式。
数据收集完成后,可以通过以下任一方式导入:
- **Neo4j 的 APOC (Awesome Procedures On Cypher) 插件**(推荐 - 速度显著提升)
- **经典 BloodHound GUI**(旧版支持)
### 设计理念
IPAHound 通过将 FreeIPA 繁杂的抽象简化为直观的格式,优先考虑了用户友好性。它将复杂的 FreeIPA 结构转化为易于分析的图,从而使您的安全评估工作更加高效。
## 配套 GUI
原版 BloodHound 无法识别 FreeIPA 的节点和边标签,因此不会对其进行渲染。要可视化和查询 IPAHound 生成的数据,请使用配套的分支版本:
- **[IPAHound-GUI](https://github.com/IPAHound/IPAHound-GUI)** - 支持 FreeIPA 节点/边的 BloodHound 分支版本。
## 快速入门
端到端操作,从零开始生成可查询的图:
1. 安装 IPAHound。
~$ uv tool install git+https://github.com/IPAHound/IPAHound.git
2. 从您的 FreeIPA DC 收集数据(此处演示 Kerberos 认证;密码认证请参阅使用方法)。
~$ kinit admin
~$ ipahound -k -s dc01.ipa.local -a out.json
3. 在 Neo4j 中(一次性操作,在首次导入前) - 创建约束。完整约束列表请参阅下文的“将数据导入 Neo4j”。
4. 通过 APOC 导入 JSON(cypher-shell 或 Neo4j Browser)。
CALL apoc.import.json("/absolute/path/to/out.json");
5. 打开 IPAHound-GUI,将其指向您的 Neo4j,然后开始狩猎。
## 环境要求
- **Python** ≥ 3.10
- **Neo4j** 4.x 或 5.x,以及与之版本匹配的 **APOC** 插件(Neo4j 的次要版本与 APOC 版本**必须**匹配)。
- **FreeIPA** - 已在 4.9–4.11 版本上测试通过。更早的版本可能可以使用,但未进行主动测试。
- 能够访问 FreeIPA DC 上的 LDAP/LDAPS 端口的网络访问权限,以及有效的 Kerberos 票据或 LDAP 凭据。
## 类型与边
### 节点类型
IPAHound 将各种 FreeIPA 对象整合为简化的节点类型:
| IPAHound 类型 | FreeIPA 对象 |
|:--------------------------:|:-----------------------------------------------------------|
| **IPADomain** | 根域对象 |
| **IPAUser** | 用户,系统用户 |
| **IPAGroup** | 组,系统组,权限,网络组,主机组 |
| **IPAComputer** | 计算机 |
| **IPAService** | 服务 |
| **IPAPermission** | 权限 |
| **IPARole** | 角色 |
| **IPACA** | 证书颁发机构 |
| **IPACertificateTemplate** | 证书模板 |
| **IPASELinux** | SELinux 规则 |
### 边类型
节点之间的关系代表了各种权限和成员身份:
| 边类型 | 描述 |
|:-----------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **TrustedBy** | FreeIPA 域与 MS Active Directory 之间的信任关系 |
| **MemberOf** | 属于 IPAGroup、IPASELinux、IPACertificateTemplate 等的成员 |
| **AddMember** | 管理组成员的能力(通过 _MemberManager_ 属性) |
| **ForceChangePassword** | 创建新 Kerberos 密钥的权限 (_ipaAllowedToPerform;write_keys_) |
| **ReadKerberosKey** | 读取 Kerberos 密钥/检索 keytab 的权限 (_ipaAllowedToPerform;read_keys_) |
| **Owns** | 对 Computer 或 Group 对象的完全控制权 (_ManagedBy_ 属性)。支持配置 RBCD、创建 Kerberos 密钥、添加 SSH 密钥以及管理证书 |
| **CanSSH** | 允许 SSH 访问的 HBAC 规则 |
| **CanSUDO** | 允许在主机上执行 sudo 的组合 HBAC 和 SUDO 规则 |
| **Can{*}** | 使用 `--save-all-hbac` 时,每个 HBAC 服务生成一条边(例如,`Cancrond`、`CanFTP`)。边名称派生自服务的 `cn`。 |
| **AllowedToDelegate** | 约束委派权限 (S4U2Proxy) |
| **Enroll** | 签发证书的权限 |
| **AddRBCD** | 配置基于资源的约束委派的权限 (_ipaAllowedToPerform;write_delegation_) |
| **DCSync** | DCSync 权限(从默认权限值推断) |
## 工作原理
### 步骤 1:身份验证
FreeIPA LDAP 服务器支持两种身份验证方法:
- **Kerberos** - 自动使用您 Kerberos 票据中的凭据。
- **简单绑定** - 需要完整的 DN (Distinguished Name)。
对于简单绑定,收集器接受纯用户名,并尝试自动构建完整的 DN。在非标准配置中,此预测可能会失败;如果失败,请显式传入完整的 DN。
DN 示例:
- **User:** `uid=admin,cn=users,cn=accounts,dc=ipa,dc=local`
- **Service:** `krbprincipalname=dogtag/pc01.ipa.local@IPA.LOCAL,cn=services,cn=accounts,dc=ipa,dc=local`
### 步骤 2:数据收集
收集器根据 `LDAP_PATHS` 结构检索所有可访问的数据。FreeIPA 可能会根据您的权限限制某些条目和属性的可见性。考虑使用不同的用户账户运行收集器,以获得最全面的覆盖。
运行结束后,IPAHound 会打印警告信息,例如 `No "krbTicketFlags" in computer accounts, try again with more privileges.` - 这些警告在低权限绑定下是**预期内**的,仅表明将缺少哪些图功能,而不是出现了错误。
可以使用 `--output-raw` 标志保存原始数据,以便用于:
- 离线处理
- 调试目的
- 审计追踪
### 步骤 3:数据处理
在此阶段,IPAHound 会:
- 分析原始数据以创建关系边
- 过滤掉已禁用的账户和不活跃的规则
- 优化图结构以便于分析
### 步骤 4:导出
IPAHound 支持两种导出格式。它们是**互斥的** - 每次运行只能选择一种:
1. **APOC 格式** (`-a` 选项) - 为 Neo4j APOC 插件导入优化(推荐)
2. **经典格式** (`-o` 选项) - 兼容经典 BloodHound JSON 加载器
## 安装
安装 [uv](https://docs.astral.sh/uv/):
```
~$ curl -LsSf https://astral.sh/uv/install.sh | sh
```
将 `ipahound` 作为 CLI 工具安装:
```
~$ uv tool install git+https://github.com/IPAHound/IPAHound
~$ ipahound -h
```
安装 `ipahound` 以进行开发:
```
~$ git clone https://github.com/IPAHound/IPAHound
~$ cd IPAHound
~$ uv sync
~$ uv run ipahound -h
```
如果您更喜欢 [Poetry](https://python-poetry.org/),该仓库还附带了 `poetry.lock`:
```
~$ pip install poetry
~$ poetry install
~$ poetry run ipahound -h
```
## 使用方法
### 命令行选项
```
_____ _____ _____ _____ _
| | _ | _ | | |___ _ _ ___ _| |
|- -| __| | | . | | | | . |
|_____|__| |__|__|__|__|___|___|_|_|___|
by Mikhail Sukhov (@Im10n), @ptswarm
usage: ipahound [-h] [-d] [-s SERVER] [-b BASE_DN] [-u USER] [-p PASSWORD] [-k]
[--save-all-hbac] [-a FILE] [-o FILE] [--output-raw FILE] [--input-raw FILE]
IPA BloodHound Collector
options:
-h, --help Show this help message and exit
-d, --debug Enable debug output
LDAP connection parameters:
-s SERVER, --ldap-server SERVER
IP address or DNS name of LDAP server
-b BASE_DN, --ldap-base-dn BASE_DN
Base DN for LDAP dump (optional, defaults to auto-detection)
Authentication options:
-u USER, --ldap-user USER
Username for LDAP (can use DN format: uid=admin,cn=users,cn=accounts,dc=ipa,dc=local)
-p PASSWORD, --ldap-password PASSWORD
Password for LDAP authentication
-k, --kerberos Use Kerberos authentication instead of username/password
Output format options:
--save-all-hbac Draw all HBAC services in the graph (default: only sudo and SSH)
-a FILE, --apoc-output FILE
Output JSON for APOC neo4j plugin (recommended)
-o FILE, --output FILE
Output JSON for BloodHound loader
Advanced options (debugging):
--output-raw FILE Output RAW JSON before processing (useful for debugging)
--input-raw FILE Process existing RAW JSON instead of performing LDAP dump
```
### 示例
使用密码认证导出域数据(APOC 格式):
```
~$ ipahound -u uid=admin,cn=users,cn=accounts,dc=ipa,dc=local -p P@ssw0rd -s dc01.ipa.local -a out_for_apoc.json
~$ ipahound -u admin -p P@ssw0rd -s dc01.ipa.local -a out_for_apoc.json
```
使用 Kerberos 认证导出域数据(BloodHound 经典格式):
```
~$ ipahound -k -s dc01.ipa.local -o out.json
```
处理现有的原始数据转储(不产生 LDAP 流量):
```
~$ ipahound --input-raw raw_dump.json -a processed_output.json
```
## 将数据导入 Neo4j
### 前置条件
1. 从 [APOC 发布页面](https://github.com/neo4j/apoc/releases) 安装 APOC 插件。Neo4j 版本**必须**与 APOC 插件的版本匹配。
2. 在 `/etc/neo4j/apoc.conf` (Linux) 或 `conf/apoc.conf` (Windows) 中添加以下内容,启用 Neo4j 中的文件导入功能:
apoc.import.file.enabled=true
3. 在 Neo4j 中创建必要的约束(一次性操作,在**首次**导入前执行):
CREATE CONSTRAINT FOR (n:IPADomain) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPAUser) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPAGroup) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPAComputer) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPAService) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPAPermission) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPACertificateTemplate) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPACA) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:Base) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPARole) REQUIRE n.neo4jImportId IS UNIQUE;
CREATE CONSTRAINT FOR (n:IPASELinux) REQUIRE n.neo4jImportId IS UNIQUE;
### 导入过程
导入(或重新导入)收集到的数据:
```
CALL apoc.import.json("/path/to/file.json");
```
要在全新导入前清除现有数据(例如在两次任务之间):
```
MATCH (n) DETACH DELETE n;
```
上述步骤 3 中创建的约束在执行 `DETACH DELETE` 后依然有效,永远不需要重新创建。
## 待办事项
- [ ] 添加 ACI 解析器
## 其他资源
有关 FreeIPA 安全分析和攻击技术的更多详细信息,请参阅我们的博客文章:
1. https://swarm.ptsecurity.com/thinking-in-graphs-with-ipahound/
2. https://habr.com/ru/companies/pt/articles/1028412/
- ...
## 贡献指南
我们欢迎各种贡献!请随时提交 Issue、功能请求和 Pull Request。
祝您狩猎愉快! 🎯
标签:APT, BloodHound, Checkov, Cypher, FreeIPA, GUI, HTTP, LDAP, Neo4j, 协议分析, 反取证, 图论, 域控制器, 域渗透, 域环境分析, 威胁建模, 安全评估, 开源安全工具, 攻击路径分析, 数据展示, 无线安全, 权限提升, 电子数据取证, 系统管理员, 红队, 网络安全, 逆向工具, 逆向工程平台, 隐私保护