JVBotelho/ghosthound
GitHub: JVBotelho/ghosthound
GhostHound 是一个 BloodHound OpenGraph 扩展,用于枚举 Active Directory 已删除的墓石对象并将其复活路径映射为图谱中的可遍历攻击路径。
Stars: 25 | Forks: 0
# GhostHound
[](https://crates.io/crates/ghosthound)
[](https://docs.rs/ghosthound)
[](https://securityscorecards.dev/viewer/?uri=github.com/JVBotelho/ghosthound)
GhostHound 是一个针对 Active Directory 的 [BloodHound](https://github.com/SpecterOps/BloodHound) OpenGraph 扩展。
SharpHound 以及所有其他的 AD 收集器都会跳过 `CN=Deleted Objects`:被删除的对象(墓石对象,tombstones)对标准的 BloodHound 攻击路径分析是不可见的,尽管 AD 回收站和墓石对象复活机制可能会让具有足够权限的主体恢复其中一个对象——并接管其所代表的身份。GhostHound 通过 LDAP 结合 `SHOW_DELETED` 控件枚举墓石对象,确定谁可以复活每一个对象,并输出 OpenGraph JSON payload 以及 `model.json` 扩展定义,以便 BloodHound CE v8+ 能够将其作为图中一等公民的一部分进行渲染。
**仅供授权使用。** 这是一个 offensive-security / red-team 工具,专为授权的渗透测试和检测实验室研究而设计。仅对您获得明确授权测试的 Active Directory 环境运行此工具。
## 前置条件
- 在目标域上拥有 **`Administrators` 同等权限**(或对 `CN=Deleted Objects` 具有明确的读取权限委派)。非特权账户完全无法看到该容器,无论使用哪种身份验证方法——这是 AD 强制执行的严格限制,而不是 GhostHound 能够绕过的。
- 在 LDAP (389) 或 LDAPS (636) 端口上具有到 Domain Controller 的网络可达性。
- 如果您想导入生成的图,则需要 BloodHound CE v8+(数据收集和 JSON 输出可以独立运行,无需此要求)。
## 使用说明
```
ghosthound -d ghost.local --dc-ip 10.0.0.10 -u alice -o tombstones.json
```
密码解析顺序:`--password`(避免使用——通过 `ps`/`/proc//cmdline` 和 shell 历史记录可见),其次是 `LDAP_PASSWORD` 环境变量,如果两者均未设置,则通过交互式提示输入。
默认情况下,GhostHound 通过 LDAPS (636) 进行连接并开启证书验证。对于不适合此规则的环境,提供了两个标志:
- `--disable-ldaps` — 退回到明文 LDAP (389)。绑定密码将以明文形式发送;除非是隔离的实验环境,否则请避免使用。
- `--insecure-tls` — 保持 LDAPS(加密传输),但跳过证书验证,适用于不在您的信任库中的自签名/实验环境证书。只要 DC 的证书是唯一问题时,请优先使用此选项而不是 `--disable-ldaps`。
`--timeout-secs`(默认为 30)限制了初始连接和随后的每一个 LDAP 操作的超时时间,因此如果 DC 不可达或 `--dc-ip` 错误,程序将在此时间窗口内失败,而不是一直挂起。
运行 `ghosthound --help` 获取完整的标志列表。
## 工作区布局
GhostHound 被构建为一个库优先的工作区——请参阅 `docs/adr/0001-language-rust-library-first.md` 了解其设计理念:
- `bloodhound-opengraph`:BloodHound OpenGraph JSON 构建器(Python 的 `bhopengraph` 的 Rust 对应实现)。
- `ad-secdesc`:许可宽松的、从零开始编写的 `ntSecurityDescriptor`/DACL/ACEs 解析器(关于为什么这不依赖于现有的唯一 Rust 等价库(该库为 GPL-3.0)的原因,请参阅 `docs/adr/0003-security-descriptor-parsing-strategy.md`)。
- `ad-secdesc-oracle`:内部的、未发布的差分测试框架,将 `ad-secdesc` 与那个 GPL-3.0 的 crate 作为黑盒预言机进行比较——它被隔离在默认构建和所有已发布的 crate 依赖图之外。
- `ad-tombstone`:LDAP `SHOW_DELETED` 枚举、AD 回收站状态建模以及复活权限分析。
- `ghosthound`:编排上述功能的 CLI。
## 导入 BloodHound
1. 在 BloodHound CE 的 OpenGraph 管理页面中,上传一次 `crates/ad-tombstone/model.json` 以注册
`GhostHound_TombstoneUser`/`GhostHound_TombstoneComputer`/`GhostHound_TombstoneGroup`
节点种类以及 `GhostHound_CanReanimate`/`GhostHound_WasMemberOf`/`GhostHound_SameAs`
关系种类(所有这些都被注册为可遍历的,因此它们可以参与最短路径查询)。
2. 将 GhostHound 生成的 JSON 作为常规的 OpenGraph 数据 payload 上传(通过 UI 或 ingest API)。
3. 直接针对 Neo4j 运行 `crates/ad-tombstone/bridge_shadow_nodes.cypher`(BloodHound CE 自带的 Cypher 搜索栏是只读的,会拒绝执行此操作):
docker exec -i cypher-shell -u neo4j -p < crates/ad-tombstone/bridge_shadow_nodes.cypher
GhostHound 指向现有 AD 主体(如 Domain Admins 等)的边会落在占位符节点上,而不是 BloodHound 已经拥有的真实节点上——这是 OpenGraph 导入的限制,而不是此数据的 bug;请参阅 `docs/adr/0006-opengraph-cross-source-node-identity.md`。此脚本将它们桥接起来,以便路径实际上是可遍历的。在每次导入后重新运行是安全的。
4. 导入 `crates/ad-tombstone/queries.json` 中的入门查询,并可选择性地运行一次 `crates/ad-tombstone/privilege_zones.cypher`,将 Tier Zero OU 下的墓石对象标记为高价值目标——出于与步骤 3 相同的原因,这也需要使用 `cypher-shell` 而不是搜索栏(它的 `SET` 也是一个更新子句)。
一旦完成桥接,复活路径就会呈现为一条普通的可遍历路径——一个在删除前曾是 Domain Admins 成员的墓石对象,可被每一个拥有 Reanimate-Tombstones 权限的主体到达,并通过桥接连入真实的 Domain Admins 节点:

## 供应链安全姿态
本项目从第一天起就优先考虑高可信度的安全性(`docs/adr/0005-supply-chain-openssf-posture.md`):
- 使用 `cargo deny` 严格执行对 copyleft/GPL 的禁令并进行漏洞审计。
- 使用 OpenSSF Scorecard 工作流。
- 使用 `cargo fuzz` 确保解析原始二进制描述符时的 panic 安全性。
- 基础库中不包含任何 `unsafe` 代码。
## 设计原理
`docs/adr/` 目录记录了此设计背后的决策(语言选择、身份验证范围、`ad-secdesc` 的许可限制、AD 回收站数据模型、供应链安全姿态),而 `docs/research/tombstone-viability-findings.md` 包含了相关的基础研究。
标签:Active Directory, BloodHound, Checkov, Plaso, Rust, 可视化界面, 网络流量审计, 通知系统