torchiachristian/bh-path-visualizer
GitHub: torchiachristian/bh-path-visualizer
无需 Neo4j 的独立 BloodHound 攻击路径分析器,在内存中重建 AD 图并计算到 Domain Admins 的提权路径,输出 CLI 报告与交互式 HTML 可视化。
Stars: 1 | Forks: 0
# BH-Path-Visualizer
## 预览


**一个零依赖的 BloodHound 攻击路径分析器和交互式 D3 可视化工具 —— 无需 Neo4j。**
BH-Path-Visualizer 导入原始的 [SharpHound](https://github.com/SpecterOps/BloodHound) JSON,在内存中重建 Active Directory 对象图,并计算出导致非特权用户获得 **Domain Admins** 权限的提权路径。它生成两个产出物:用于快速分类的命令行**瓶颈点报告**,以及可以在任何浏览器中打开或直接交付给客户的独立**交互式 HTML 图表** —— 无需数据库,无需服务器,也无需安装步骤。
## 为什么开发此工具
BloodHound 是分析 AD 攻击路径的事实标准工具,但它附带了一套重量级技术栈:Neo4j 数据库、数据导入服务以及 Electron UI。对于以下三种常见场景,这种重量级配置带来的阻力超出了任务本身所需的复杂度:
1. **在跳板机或物理隔离的主机上进行分类排查**,在这些环境中搭建 Neo4j 是不切实际的。
2. **作为客户交付物**,一个可共享的 HTML 文件胜过 GUI 的屏幕录制。
3. **展示对图数据本身的理解** —— AD 提权是一个有向可达性问题,而不是简单的点击练习。
BH-Path-Visualizer 仅重新实现了 BloodHound 中满足此需求的核心切片:有向属性图及其上的寻路算法。
## 一段话描述威胁模型
Active Directory 提权本质上是有向图的遍历。每条 BloodHound 边都编码了“主体 *A* 可以操作 / 成为 / 到达对象 *B*”的语义——包括组成员身份、DACL 滥用(`GenericAll`、`WriteDacl`、`WriteOwner`、`ForceChangePassword` 等)、本地管理员权限、实时会话、委派以及直接危及域的安全操作(`DCSync`)。因此,一条提权路径就是从低特权用户到 `Domain Admins` 组的有向通路,而**瓶颈点**(choke point)则是大部分通路都必须经过的对象——这是防御者在修复时能获得最高杠杆效应的节点。
## 架构
代码库沿*构建*图与对其*进行推理*之间的边界进行了划分,因此每一层都可以独立进行测试和验证。
| 模块 | 职责 |
| --- | --- |
| `parser.py` | 格式适配器 + 数据模型。将 SharpHound JSON(包括传统格式和 CE 信封)转换为由 `ADNode`/`ADEdge` 值对象组成的 `ADGraph`。负责管理边的分类体系。 |
| `analyzer.py` | 图论算法。通过反向 BFS 计算到 `Domain Admins` 的可达性、重建最短路径以及对瓶颈点进行排名。完全不了解 JSON 相关的信息。 |
| `visualizer.py` | 表现层。将分析结果映射为 D3 payload,并生成一个独立的 HTML 文件。完全不涉及寻路逻辑。 |
| `main.py` | CLI。使用 `argparse` 作为前端,负责调度到报告和/或可视化模式,并提供明确的退出代码以供流水线使用。 |
```
SharpHound JSON ──▶ BloodHoundParser ──▶ ADGraph ──▶ EscalationAnalyzer ──┬─▶ CLI report
└─▶ GraphVisualizer ─▶ graph.html
```
### 关键设计决策
- **纯 Python 实现的有向属性图。** 该图同时维护正向 (`_out`) 和反向 (`_in`) 邻接索引。正向边用于回答“这个用户能去往哪里?”(可视化工具);反向边用于回答“谁能到达 DA?”(分析器)。两者都以线性内存开销换来了 O(1) 的邻居查找效率。
- **单次反向 BFS,而非按用户进行 BFS。** 针对一个固定目标(`Domain Admins`)的可达性是通过一次基于入边的反向广度优先搜索计算得出的,复杂度为 **O(V + E)**,能够同时得出每个节点的最短路径距离和后继指针。如果从 *N* 个用户分别执行正向 BFS,获得相同结果将需要 O(N·(V+E)) 的复杂度。
- **基于路径覆盖频率的瓶颈点评估。** 每个节点的得分取决于有多少条不同的最短提权路径经过它(不包括端点)。这是介数中心性(betweenness centrality)的一种透明且具操作性的代理指标——“修复这一个对象,*N* 条路线就会随之瓦解”——且仅在真正能到达 Tier-0 的路径上进行定义。如果需要全节点对的影响力分析,已记录的 Brandes 精确介数算法可以直接作为替代方案使用。
- **与语言环境无关的目标解析。** 首先通过众所周知的 RID(`-512`)来查找 `Domain Admins`,因此该工具在非英语森林中也能正常工作;其次是名称匹配和高价值回退机制。
- **构造上即完全独立。** 输出中唯一的外部引用是 D3 的 `