bvtuhan/pathhound

GitHub: bvtuhan/pathhound

一个基于 Rust 的 BloodHound 攻击路径分析器,从图谱数据中计算并输出精简的可遍历攻击路径。

Stars: 0 | Forks: 0

# Pathhound 用于 Bloodhound 的简单攻击路径分析器,是我为 CTF 机器开发的。它从 Bloodhound API 获取图谱数据并转换为 `petgraph`。支持经典 AD、ADCS、Azure/Entra 风格的节点和边,过滤不可遍历的关系,并使用 A* 寻路算法在所选源节点和目标节点之间构建精简的攻击路径图。 ## 用法 ``` Pathhound -- Simple Bloodhound attack path enumerator Usage: pathhound [OPTIONS] Options: -x, --no-filter Tool's default behavior is to filter out "non-traversable" edges. Set this flag to disable the default filtering -c, --credentials Path to the Bloodhound credentials file (in JSON format, {"key": ..., "id": ..., "url": }) [default: ./credentials.json] -s, --source-nodes Source nodes (comma-separated, e.g. "A@COMP.COM,S-123-431-1234"; template: ALL-NON-TIER-0) -t, --target-nodes Target nodes (comma-separated, e.g. "DOMAIN ADMINS@COMP.COM,S-123-431-1234"; templates: DOMAIN-ADMINS,ALL-TIER-0) -a, --export-attack-graph Export subgraph containing only attack-path nodes/edges as DOT file without printing the table(s) to standard output -h, --help Print help -V, --version Print version ``` 你需要创建一个符合以下格式的 `credentials.json` 文件,才能从 Bloodhound API 获取图谱数据: ``` { "key": "your_api_key", "id": "your_api_id", "url": "http://localhost:7474/db/data/transaction/commit" // optional } ``` 该文件必须与可执行文件位于同一目录。若要使用自定义路径,请使用 `-c` 或 `--credentials` 标志。 ### 模板 该工具支持一些用于源节点和目标节点的预定义模板。例如,你可以使用 `ALL-NON-TIER-0` 作为源节点模板,以选择图中的所有非 Tier-0 节点;或使用 `DOMAIN-ADMINS` 作为目标节点模板,以选择图中的“DOMAIN ADMINS”组。示例: ``` $ cargo run -r -- -s ALL-NON-TIER-0 -t DOMAIN-ADMINS ``` 这将查找从任意非 Tier-0 节点到“DOMAIN ADMINS”组成员的所有攻击路径。若要获取攻击路径的图谱表示,请使用 `-a` 或 `--export-attack-graph` 标志: ``` $ cargo run -r -- -s ALL-NON-TIER-0 -t DOMAIN-ADMINS -a ``` ### 示例 #### 表格形式打印到标准输出 ``` $ cargo run -r -- -s "GMSA_SHS\$@PHANTOM.CORP, TARGET@PHANTOM.CORP" -t "DOMAIN ADMINS@PHANTOM.CORP" ``` ``` +------------------------------------------------------------------------------------------+ | Starting Node: GMSA_SHS$@PHANTOM.CORP --> Target Node: DOMAIN ADMINS@PHANTOM.CORP | +------------------------------------------------------------------------------------------+ | +------+---------------------------+-------------------+-------------------------------+ | | | Step | Current Node | Relationship | Next Hop | | | +------+---------------------------+-------------------+-------------------------------+ | | | 1 | GMSA_SHS$@PHANTOM.CORP | -MemberOf(0)-> | DOMAIN USERS@PHANTOM.CORP | | | +------+---------------------------+-------------------+-------------------------------+ | | | 2 | DOMAIN USERS@PHANTOM.CORP | -AdminTo(5)-> | FILESERVER01.PHANTOM.CORP | | | +------+---------------------------+-------------------+-------------------------------+ | | | 3 | FILESERVER01.PHANTOM.CORP | -HasSession(11)-> | ROSHI@PHANTOM.CORP(★) | | | +------+---------------------------+-------------------+-------------------------------+ | | | 4 | ROSHI@PHANTOM.CORP(★) | -MemberOf(0)-> | DOMAIN ADMINS@PHANTOM.CORP(★) | | | +------+---------------------------+-------------------+-------------------------------+ | +------------------------------------------------------------------------------------------+ +----------------------------------------------------------------------------------------------+ | Starting Node: TARGET@PHANTOM.CORP --> Target Node: DOMAIN ADMINS@PHANTOM.CORP | +----------------------------------------------------------------------------------------------+ | +------+-------------------------------+-------------------+-------------------------------+ | | | Step | Current Node | Relationship | Next Hop | | | +------+-------------------------------+-------------------+-------------------------------+ | | | 1 | TARGET@PHANTOM.CORP | -MemberOf(0)-> | DOMAIN USERS@PHANTOM.CORP | | | +------+-------------------------------+-------------------+-------------------------------+ | | | 2 | DOMAIN USERS@PHANTOM.CORP | -AdminTo(5)-> | DF-WIN10-DEV01.PHANTOM.CORP | | | +------+-------------------------------+-------------------+-------------------------------+ | | | 3 | DF-WIN10-DEV01.PHANTOM.CORP | -HasSession(11)-> | ADMINISTRATOR@PHANTOM.CORP(★) | | | +------+-------------------------------+-------------------+-------------------------------+ | | | 4 | ADMINISTRATOR@PHANTOM.CORP(★) | -MemberOf(0)-> | DOMAIN ADMINS@PHANTOM.CORP(★) | | | +------+-------------------------------+-------------------+-------------------------------+ | +----------------------------------------------------------------------------------------------+ ``` #### 以 DOT 格式保存攻击子图 ``` $ cargo run -r -- -s "GMSA_SHS\$@PHANTOM.CORP, TARGET@PHANTOM.CORP" -t "DOMAIN ADMINS@PHANTOM.CORP" -a ``` ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/7a197d996b182045.png) 另一个示例: ``` cargo run -r -- -s "DAVID@PHANTOM.CORP, GUEST@PHANTOM.CORP, DA-NOPW@PHANTOM.CORP" -t "DOMAIN ADMINS@PHANTOM.CORP" -a ``` ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/e565817932182047.png) 再一个示例: ``` cargo run -r -- -s "DAVID@PHANTOM.CORP" -t "DOMAIN-ADMINS" -a ``` ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/df9bb586ff182049.png) ## 待办事项 欢迎所有贡献,但以下是我未来希望添加或修复的内容: - [ ] 测试用例 - [ ] 我已在官方 `SpecterOps` 团队提供的示例数据集(https://github.com/SpecterOps/BloodHound/wiki/Example-Data)上测试过该工具。但该数据集可能缺少官方数据集未包含的节点和边类型。 - [ ] 为了获取完整的 AD 图,工具会通过执行自定义 Cypher 查询 `MATCH p=(n)-[r]->(m) WHERE n<>m RETURN p` 来调用 API。然而,此查询未经过优化,在包含数百万节点和边的大型数据集上执行可能需要较长时间并消耗约 5GB 内存。即使是约 15k 个节点和 12k 条边的示例数据集,也需要大约 16 秒并消耗约 5GB 内存。 - [ ] 代码优化。当前的实现未完全优化,并包含一些样板代码。 - [ ] 更详细的日志与日志机制
标签:ADCS, AD攻击, ALL-NON-TIER-0, API 客户端, Azure, A* 路径搜索, BloodHound, CTF 工具, DOMAIN-ADMINS, DOT 格式, Entra ID, JSON 凭证, PetGraph, 反取证, 可视化界面, 子图导出, 安全评估, 攻击路径分析, 数字调查, 数据展示, 枚举器, 红队, 节点模板, 路径枚举, 过滤不可遍历边, 通知系统