关于 mapping-attack-paths-with-bloodhound-ce
面向授权安全测试人员的 BloodHound CE 使用技能,用于绘制 Active Directory 与 Entra ID 中的权限提升路径。涵盖数据采集、图分析和路径排序,也包括跨混合身份环境的路径。
主要功能
- 01使用 SharpHound 采集 AD 数据
- 02使用 AzureHound 采集 Entra ID 数据
- 03分析内置及自定义 Cypher 路径
- 04将已攻陷主体标记为 Owned
- 05排序并记录权限提升路径
适用场景
- 01从立足点追踪至 Domain Admins 的路径
- 02评估同步 AD 与 Entra ID 的风险
- 03在紫队演练中验证检测
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill mapping-attack-paths-with-bloodhound-ce安装后在 Claude Code 中输入/mapping-attack-paths-with-bloodhound-ce确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py详细介绍
使用 BloodHound CE 绘制攻击路径
法律声明: 本技能仅用于经授权的安全测试、红队演练和教育目的。Active Directory 和 Entra ID 侦察会揭示可导致域/租户完全沦陷的权限提升链。仅限针对你拥有或已获得明确书面授权(测试授权书)的环境使用。未经授权的使用违反《计算机欺诈与滥用法》及同等法律。
概述
BloodHound Community Edition (CE) 是 SpecterOps 推出的基于图的攻击路径管理平台。它将安全主体(用户、计算机、组、OU、GPO、Entra ID 用户/组/应用/角色)建模为节点,将它们之间的权限、组成员关系、会话、信任关系和 ACL 建模为边。通过将 Active Directory 和 Entra ID 抽象为有向图,BloodHound 把“这个低权限账户能否到达 Domain Admins / Global Administrator?”这一问题转化为最短路径查询,从而找出人工审查会遗漏的权限提升链。
BloodHound CE 用容器化技术栈取代了仅依赖 Neo4j 的旧版 BloodHound:一个 Go API 服务、一个 PostgreSQL 关系型存储和一个 Neo4j 图数据库,全部位于现代化的 Web UI 和 REST API 之后。数据由 SpecterOps 维护的两个收集器采集:
- SharpHound(CE/.NET 收集器,在已加入域的 Windows 主机上或针对其运行)采集本地 AD:对象、组成员关系、ACL、会话、本地管理员权限、信任关系、GPO、证书服务(ADCS)以及 LAPS 可读性。它输出一个包含 JSON 的 ZIP 文件。
- AzureHound(跨平台 Go 二进制文件)通过 Microsoft Graph 和 Azure REST API 采集 Entra ID 和 Azure Resource Manager 数据:用户、组、应用注册、服务主体、目录角色、订阅/角色分配以及密钥保管库。它输出单个 JSON 文件。
在近期的 CE 版本中,当 AD 域及其同步的 Entra ID 租户都已被摄取时,BloodHound 会自动渲染 混合攻击路径——跨越本地/云边界的链路(例如,一个本地用户同步到持有特权 Entra 角色的云账户)。映射到 MITRE ATT&CK,核心活动是 T1069 – 权限组发现,并得到 T1087(账户发现)、T1482(域信任发现)和 T1018(远程系统发现)的支持。
何时使用
- 在获得任何域立足点或 Entra 凭据后,于经授权的内部渗透测试或红队演练期间
- 当你需要优先排列从已拥有的主体到 Tier-0 资产(Domain Admins、Global Administrator)的权限提升路径时
- 在评估本地 AD 同步到 Entra ID 的混合身份风险时
- 在紫队演练期间,验证检测规则在采集阶段和路径执行步骤上是否触发
- 在为防御方客户产出攻击路径证据和修复建议时
前提条件
- 覆盖 AD/Entra 侦察的授权范围
- 一个立足点:任何有效的域用户(用于 SharpHound)和/或有效的 Entra 凭据或令牌(用于 AzureHound)
- 分析工作站上安装 Docker + Docker Compose
- 收集器:
# Deploy BloodHound CE (pulls Postgres, Neo4j, and the BloodHound API) curl -L https://ghst.ly/getbhce -o docker-compose.yml docker compose pull docker compose up -d # Reveal the randomly generated initial admin password docker compose logs bloodhound | grep -i "Initial Password" # AzureHound (download the release binary for your OS from the GitHub releases page) # https://github.com/SpecterOps/AzureHound/releases chmod +x ./azurehound # SharpHound CE collector: download SharpHound.zip from the BloodHound CE # web UI (Administration -> Download Collectors), transfer to a domain-joined host.
目标
- 部署 BloodHound CE 并通过身份验证访问 Web UI 和 API
- 使用 SharpHound 采集 AD 数据,使用 AzureHound 采集 Entra 数据
- 摄取两个数据集并将已失陷的主体标记为 Owned
- 运行内置分析(到 Domain Admins 的最短路径、可 Kerberoast 的账户、ADCS 滥用)
- 编写自定义 Cypher 查询以发现定制和混合攻击路径
- 为演练报告优先排列并记录权限提升路径
MITRE ATT&CK 映射
| ID | 技术 | 在此技能中的应用 |
|---|---|---|
| T1069 | 权限组发现 | 枚举 AD/Entra 组成员身份以及主体之间的权限,以构建攻击图 |
| T1087 | 账户发现 | 使用 SharpHound/AzureHound 枚举用户、计算机和服务主体 |
| T1482 | 域信任发现 | 收集并分析域/林信任关系作为图的边 |
| T1018 | 远程系统发现 | 枚举域计算机及其关系(会话、本地管理员) |
工作流
步骤 1:部署 BloodHound CE 并登录
启动整个栈,获取生成的密码,并在首次登录时重置它。
docker compose up -d
docker compose logs bloodhound 2>&1 | grep -i "Initial Password"
# Browse to http://localhost:8080 (default user: admin)
步骤 2:使用 SharpHound 收集本地 AD 数据
在加入域的 Windows 主机上(或通过域用户的 runas/令牌),运行 CE 收集器。-c All 会收集所有收集方法;--outputdirectory 控制 ZIP 文件的落盘位置。
# Full collection
.\SharpHound.exe -c All --outputdirectory C:\Temp
# Stealthier LDAP-only collection (no host touch for sessions/local-admin)
.\SharpHound.exe -c DCOnly --outputdirectory C:\Temp
# Looped session collection to map logged-on Tier-0 users over time
.\SharpHound.exe -c Session --loop --loopduration 02:00:00 --outputdirectory C:\Temp
在 Linux 上,当你只有凭据和网络访问权限时,Python 收集器(bloodhound-ce-python)是一个替代方案:
pip install bloodhound-ce
bloodhound-ce-python -u 'jdoe' -p 'Passw0rd!' -d corp.local -ns 10.0.0.10 -c All --zip
步骤 3:使用 AzureHound 收集 Entra ID / Azure 数据
使用凭据、JWT 或刷新令牌运行 AzureHound list,写出单个 JSON 文件。
# Username/password (where allowed by CA/MFA policy)
./azurehound list -u "[email protected]" -p "$PASSWORD" -t "corp.com" -o entra.json
# Using a previously acquired JWT (e.g., from roadtx / device-code phishing)
./azurehound list --jwt "$JWT" -o entra.json
# Using a refresh token
./azurehound list --refresh-token "$REFRESH_TOKEN" -t "<tenant-id>" -o entra.json
步骤 4:将数据导入 BloodHound CE
通过 Administration -> File Ingest 上传 SharpHound ZIP 和 AzureHound JSON,或 POST 到 API。
# API ingest (after obtaining a JWT from /api/v2/login)
TOKEN=$(curl -s http://localhost:8080/api/v2/login \
-H 'Content-Type: application/json' \
-d '{"login_method":"secret","username":"admin","secret":"<password>"}' \
| python -c "import sys,json;print(json.load(sys.stdin)['data']['session_token'])")
# Start a file-upload job, then PUT the collector ZIP/JSON to it
JOB=$(curl -s -X POST http://localhost:8080/api/v2/file-upload/start \
-H "Authorization: Bearer $TOKEN" | python -c "import sys,json;print(json.load(sys.stdin)['data']['id'])")
curl -s -X PUT "http://localhost:8080/api/v2/file-upload/$JOB" \
-H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/zip' \
--data-binary @C:/Temp/BloodHound.zip
curl -s -X POST "http://localhost:8080/api/v2/file-upload/$JOB/end" \
-H "Authorization: Bearer $TOKEN"
步骤 5:标记已拥有的主体
在 UI 中,搜索每个已攻陷的账户/计算机,打开节点,然后切换 Mark as Owned。已拥有的主体会作为路径查找查询({owned:true})的种子。
步骤 6:运行内置分析查询
打开 Cypher 标签页,或使用搜索面板中的预建查询:
- 到 Domain Admins 的最短路径
- 具有到高价值目标路径的 Kerberoastable 账户
- 可进行 AS-REP roasting 的用户
- 具有 DCSync 权限的主体
- ADCS 错误配置(CE 中的 ESC1-ESC8 边)
- 具有无约束委派的计算机
步骤 7:为定制路径编写自定义 Cypher
对于内置功能未覆盖的路径,使用 Cypher,包括混合 AD 到 Entra 的链。
// Shortest path from any owned principal to Domain Admins
MATCH p=shortestPath((n {owned:true})-[*1..]->(g:Group))
WHERE g.objectid ENDS WITH "-512"
RETURN p
// Kerberoastable users (SPN set) with a path to Domain Admins
MATCH (u:User {hasspn:true})
MATCH p=shortestPath((u)-[*1..]->(g:Group))
WHERE g.objectid ENDS WITH "-512"
RETURN p
// Principals who can DCSync the domain
MATCH (n)-[:MemberOf*0..]->()-[:DCSync|GetChanges|GetChangesAll*1..]->(d:Domain)
RETURN n.name, d.name
// ACL abuse from owned principals (GenericAll/WriteDacl/WriteOwner/ForceChangePassword)
MATCH p=(n {owned:true})-[:GenericAll|GenericWrite|WriteDacl|WriteOwner|ForceChangePassword*1..]->(t)
RETURN p
// Hybrid: on-prem user synced to an Entra account holding a privileged directory role
MATCH p=(u:User)-[:SyncedToEntraUser]->(:AZUser)-[:AZHasRole|AZGlobalAdmin*1..]->(r)
RETURN p
步骤 8:优先级排序并记录
根据跳数、隐蔽性(避免像 HasSession 这样需要接触主机的嘈杂边)和工具可用性对路径进行排序。记录每条路径的主体、边、所需操作以及修复说明(例如,移除可滥用的 ACL,对账户进行分层)。
工具和资源
| 工具 | 用途 | 来源 |
|---|---|---|
| BloodHound CE | 图攻击路径平台(Docker 栈) | https://github.com/SpecterOps/BloodHound |
| SharpHound (CE) | 本地 AD 收集器 | https://github.com/SpecterOps/SharpHound |
| AzureHound | Entra ID / Azure RM 收集器 | https://github.com/SpecterOps/AzureHound |
| bloodhound-ce-python | Linux Python AD 收集器 | https://github.com/dirkjanm/BloodHound.py |
| CE Quickstart | 官方部署文档 | https://bloodhound.specterops.io/get-started/quickstart/community-edition-quickstart |
| BloodHound Cypher 参考 | 边/查询文档 | https://bloodhound.specterops.io/ |
关键边 / 路径类型
| 边 / 路径 | 含义 | 提权示例 |
|---|---|---|
| MemberOf | 组成员身份 | 嵌套组到达 Domain Admins |
| GenericAll / WriteDacl | 对对象的完全/ACL 控制 | 重置特权用户的密码 |
| ForceChangePassword | 可以重置另一个主体的密码 | 接管 Tier-0 账户 |
| HasSession | 用户已登录到某台计算机 | 从已攻陷的主机窃取 DA 令牌 |
| ADCSESC1..ESC8 | 证书服务错误配置 | 以特权主体身份注册证书 |
| SyncedToEntraUser / AZGlobalAdmin | 混合身份边 | 本地立足点 -> 云 Global Admin |
验证标准
- BloodHound CE 已部署且可访问;默认管理员密码已轮换
- 已从所有范围内域收集 SharpHound 数据
- 已为范围内租户收集 AzureHound JSON(若混合/云环境在范围内)
- 两个数据集均已成功导入(没有失败的上传作业)
- 已将被攻陷的主体标记为 Owned
- 已识别通往 Domain Admins / Global Administrator 的最短路径
- 已枚举 ADCS 和 ACL 滥用路径
- 至少执行了一个自定义 Cypher 查询(在适用情况下包括混合查询)
- 路径已按跳数/隐蔽性排序,并已记录修复措施