BloodHound 工具概述
BloodHound 是一款強大的 Active Directory(AD)安全分析工具,由 @_wald0、@CptJesus 和 @harmj0y 共同開發。它利用圖論(Graph Theory)來揭示 Active Directory 環境中隱藏的、經常被忽略的關係,這些關係可能被攻擊者利用來進行權限提升和橫向移動。
BloodHound 的核心價值
BloodHound 的主要功能包括:
- 視覺化攻擊路徑:將複雜的 AD 關係轉換為直觀的圖形展示
- 自動化路徑發現:自動識別從低權限使用者到高價值目標的攻擊路徑
- 關係映射:揭示群組成員關係、ACL 權限、Session 資訊等
- 風險評估:幫助防守方識別和修復潛在的攻擊路徑
BloodHound 的架構組成
BloodHound 生態系統由以下主要元件組成:
| 元件 | 功能 |
|---|
| SharpHound | Windows 環境的資料收集器(C# 編寫) |
| BloodHound.py | Linux/跨平台的 Python 資料收集器 |
| Neo4j | 圖形資料庫,用於儲存和查詢資料 |
| BloodHound GUI | 圖形使用者介面,用於視覺化和分析 |
| BloodHound CE | 社群版,提供 Web 介面的新版本 |
為什麼選擇 BloodHound
在傳統的內網滲透測試中,分析 AD 關係是一項繁瑣且容易遺漏的工作。BloodHound 透過以下方式解決這個問題:
- 自動化收集:快速收集整個網域的關係資料
- 圖形化分析:將數千個物件和關係轉換為可理解的圖形
- 路徑計算:使用 Dijkstra 等演算法找出最短攻擊路徑
- 預定義查詢:提供常用的攻擊路徑查詢模板
SharpHound 資料收集
SharpHound 是 BloodHound 的官方資料收集器,用於從 Active Directory 環境中收集必要的資訊。它能夠收集使用者、群組、電腦、GPO、ACL 等多種類型的資料。
SharpHound 下載與準備
SharpHound 可以從官方 GitHub 儲存庫下載:
1
2
3
4
5
6
| # 從 GitHub 下載最新版本
# https://github.com/BloodHoundAD/SharpHound/releases
# 或者使用 PowerShell 直接下載
Invoke-WebRequest -Uri "https://github.com/BloodHoundAD/SharpHound/releases/latest/download/SharpHound-v2.0.0.zip" -OutFile "SharpHound.zip"
Expand-Archive -Path "SharpHound.zip" -DestinationPath ".\SharpHound"
|
基本資料收集
SharpHound 支援多種收集方法,可以根據需求選擇不同的收集範圍:
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 執行預設收集(Default)
.\SharpHound.exe
# 指定收集方法
.\SharpHound.exe --collectionmethods All
# 收集特定類型的資料
.\SharpHound.exe --collectionmethods DCOnly
.\SharpHound.exe --collectionmethods Session
.\SharpHound.exe --collectionmethods LoggedOn
.\SharpHound.exe --collectionmethods Trusts
.\SharpHound.exe --collectionmethods ACL
.\SharpHound.exe --collectionmethods ObjectProps
|
收集方法說明
| 收集方法 | 說明 | 資料來源 |
|---|
| Default | 預設收集(Group、LocalAdmin、Session、Trusts) | LDAP + 遠端連線 |
| All | 收集所有可用資料 | 全部 |
| DCOnly | 僅從 Domain Controller 收集 | LDAP |
| Session | 收集 Session 資訊 | NetSessionEnum |
| LoggedOn | 收集登入使用者資訊 | NetWkstaUserEnum |
| Trusts | 收集網域信任關係 | LDAP |
| ACL | 收集 ACL 權限資訊 | LDAP |
| ObjectProps | 收集物件屬性 | LDAP |
| GPOLocalGroup | 收集 GPO 相關的本地群組 | LDAP + SMB |
| ComputerOnly | 僅收集電腦相關資訊 | 遠端連線 |
進階收集選項
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # 指定網域
.\SharpHound.exe --domain corp.local
# 指定 Domain Controller
.\SharpHound.exe --domaincontroller dc01.corp.local
# 使用 LDAPS(加密連線)
.\SharpHound.exe --secureldap
# 排除 Domain Controller
.\SharpHound.exe --excludedcs
# 設定執行緒數量
.\SharpHound.exe --threads 50
# 設定 Jitter(隨機延遲,用於規避偵測)
.\SharpHound.exe --jitter 20
# 指定輸出目錄
.\SharpHound.exe --outputdirectory C:\Temp\BloodHound
# 指定輸出檔案前綴
.\SharpHound.exe --outputprefix corp_audit
# 循環收集 Session 資訊
.\SharpHound.exe --collectionmethods Session --loop --loopduration 02:00:00
|
使用替代憑證收集
在某些情況下,可能需要使用不同的憑證進行收集:
1
2
3
4
5
6
| # 使用 runas 以不同使用者身份執行
runas /netonly /user:CORP\username "SharpHound.exe --collectionmethods All"
# 或者使用 PowerShell 建立憑證
$cred = Get-Credential
Start-Process -FilePath ".\SharpHound.exe" -ArgumentList "--collectionmethods All" -Credential $cred
|
BloodHound.py(跨平台收集器)
對於 Linux 環境或無法執行 SharpHound 的情況,可以使用 Python 版本的收集器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 安裝 bloodhound.py
pip install bloodhound
# 基本收集
bloodhound-python -u username -p 'password' -d corp.local -ns 10.10.10.1 -c All
# 使用 LDAPS
bloodhound-python -u username -p 'password' -d corp.local -ns 10.10.10.1 -c All --ssl
# 使用 Kerberos 認證
bloodhound-python -u username -p 'password' -d corp.local -ns 10.10.10.1 -c All -k
# 使用 NTLM 雜湊
bloodhound-python -u username --hashes :NTLM_HASH -d corp.local -ns 10.10.10.1 -c All
# 指定收集方法
bloodhound-python -u username -p 'password' -d corp.local -ns 10.10.10.1 -c DCOnly
bloodhound-python -u username -p 'password' -d corp.local -ns 10.10.10.1 -c Group,LocalAdmin,Session
|
收集結果
SharpHound 執行完成後,會產生一個 ZIP 壓縮檔,包含多個 JSON 檔案:
1
2
3
4
5
6
7
8
| 20251127093000_BloodHound.zip
├── 20251127093000_computers.json
├── 20251127093000_containers.json
├── 20251127093000_domains.json
├── 20251127093000_gpos.json
├── 20251127093000_groups.json
├── 20251127093000_ous.json
└── 20251127093000_users.json
|
Neo4j 資料庫設定
BloodHound 使用 Neo4j 圖形資料庫來儲存和查詢收集到的資料。Neo4j 是一款高效能的原生圖形資料庫,非常適合處理複雜的關係資料。
安裝 Neo4j
Windows 安裝
1
2
3
4
5
6
7
8
| # 下載 Neo4j Community Edition
# https://neo4j.com/download-center/
# 或使用 Chocolatey 安裝
choco install neo4j-community
# 安裝完成後,啟動 Neo4j 服務
neo4j console
|
Linux 安裝(Ubuntu/Debian)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 添加 Neo4j 儲存庫
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.com stable 4.4' | sudo tee /etc/apt/sources.list.d/neo4j.list
# 安裝 Neo4j
sudo apt-get update
sudo apt-get install neo4j
# 啟動服務
sudo systemctl start neo4j
sudo systemctl enable neo4j
# 檢查狀態
sudo systemctl status neo4j
|
Docker 安裝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| # 使用 Docker 執行 Neo4j
docker run -d \
--name neo4j \
-p 7474:7474 \
-p 7687:7687 \
-e NEO4J_AUTH=neo4j/bloodhound \
-v neo4j_data:/data \
neo4j:4.4
# 使用 Docker Compose
cat > docker-compose.yml << 'EOF'
version: '3'
services:
neo4j:
image: neo4j:4.4
container_name: neo4j-bloodhound
ports:
- "7474:7474"
- "7687:7687"
environment:
- NEO4J_AUTH=neo4j/bloodhound
- NEO4J_dbms_memory_heap_initial__size=1G
- NEO4J_dbms_memory_heap_max__size=1G
volumes:
- neo4j_data:/data
volumes:
neo4j_data:
EOF
docker-compose up -d
|
Neo4j 初始設定
首次啟動 Neo4j 後,需要進行初始設定:
- 開啟瀏覽器,訪問
http://localhost:7474 - 使用預設帳號密碼登入:
neo4j / neo4j - 系統會要求設定新密碼(BloodHound 預設使用
bloodhound)
Neo4j 設定優化
對於大型環境,建議調整 Neo4j 設定以提升效能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 編輯 Neo4j 設定檔
sudo nano /etc/neo4j/neo4j.conf
# 調整記憶體設定
dbms.memory.heap.initial_size=1G
dbms.memory.heap.max_size=2G
dbms.memory.pagecache.size=1G
# 允許遠端連線(如果需要)
dbms.default_listen_address=0.0.0.0
# 設定 Bolt 連線
dbms.connector.bolt.listen_address=:7687
dbms.connector.bolt.enabled=true
# 重啟服務
sudo systemctl restart neo4j
|
驗證 Neo4j 連線
1
2
3
4
5
6
7
8
| # 使用 cypher-shell 測試連線
cypher-shell -u neo4j -p bloodhound
# 執行簡單查詢
MATCH (n) RETURN COUNT(n);
# 退出
:exit
|
BloodHound GUI 使用
BloodHound GUI 提供直觀的圖形介面,用於視覺化和分析 Active Directory 攻擊路徑。
安裝 BloodHound GUI
Windows/macOS/Linux 安裝
1
2
3
4
5
6
7
8
9
10
11
| # 從 GitHub 下載最新版本
# https://github.com/BloodHoundAD/BloodHound/releases
# Linux 安裝範例
wget https://github.com/BloodHoundAD/BloodHound/releases/download/v4.3.1/BloodHound-linux-x64.zip
unzip BloodHound-linux-x64.zip
chmod +x BloodHound-linux-x64/BloodHound
./BloodHound-linux-x64/BloodHound
# 如果遇到依賴問題,安裝必要的套件
sudo apt-get install libgconf-2-4 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm-dev libnss3-dev libxss-dev
|
連線到 Neo4j
啟動 BloodHound 後,需要連線到 Neo4j 資料庫:
在登入介面輸入 Neo4j 連線資訊:
- Bolt URL:
bolt://localhost:7687 - Username:
neo4j - Password:
bloodhound(或您設定的密碼)
點擊 “Login” 進行連線
匯入收集資料
將 SharpHound 收集的資料匯入 BloodHound:
1
2
3
4
5
6
7
| 方法一:拖放匯入
1. 將 ZIP 檔案直接拖放到 BloodHound 視窗
方法二:使用匯入按鈕
1. 點擊右側的 "Upload Data" 按鈕
2. 選擇 ZIP 檔案或 JSON 檔案
3. 等待匯入完成
|
介面導覽
BloodHound GUI 主要分為以下區域:
| 區域 | 功能 |
|---|
| 搜尋欄 | 搜尋使用者、電腦、群組等物件 |
| 圖形區域 | 顯示節點和關係的視覺化圖形 |
| 節點資訊面板 | 顯示選中節點的詳細資訊 |
| 查詢面板 | 執行預定義或自訂的 Cypher 查詢 |
| 設定面板 | 調整顯示設定和偏好 |
基本操作
1
2
3
4
5
6
7
8
9
10
11
12
13
| 節點操作:
- 左鍵點擊:選擇節點,顯示詳細資訊
- 右鍵點擊:開啟內容選單
- 雙擊:展開節點的關係
圖形操作:
- 滾輪:縮放視圖
- 拖動:移動視圖
- Ctrl + 滾輪:調整節點大小
快捷鍵:
- Ctrl + L:清除圖形
- Ctrl + Shift + I:開啟開發者工具
|
節點類型說明
BloodHound 使用不同顏色和形狀表示不同類型的物件:
| 節點類型 | 顏色 | 說明 |
|---|
| User | 綠色 | 使用者帳戶 |
| Computer | 紅色 | 電腦帳戶 |
| Group | 黃色 | 群組 |
| Domain | 灰色 | 網域 |
| OU | 橙色 | 組織單位 |
| GPO | 紫色 | 群組原則物件 |
邊緣(關係)類型
BloodHound 定義了多種關係類型:
| 關係類型 | 說明 | 攻擊意義 |
|---|
| MemberOf | 群組成員關係 | 繼承群組權限 |
| AdminTo | 本地管理員權限 | 可以在目標電腦執行命令 |
| HasSession | 有活躍的 Session | 可以竊取憑證 |
| CanRDP | 可以 RDP 連線 | 遠端桌面存取 |
| CanPSRemote | 可以 PowerShell 遠端 | 遠端命令執行 |
| ExecuteDCOM | 可以執行 DCOM | 橫向移動 |
| GenericAll | 完全控制權限 | 可以修改任何屬性 |
| GenericWrite | 寫入權限 | 可以修改特定屬性 |
| WriteOwner | 可以修改擁有者 | 可以取得完全控制 |
| WriteDacl | 可以修改 ACL | 可以授予自己權限 |
| ForceChangePassword | 可以重設密碼 | 接管帳戶 |
| AddMember | 可以新增群組成員 | 權限提升 |
| DCSync | 可以執行 DCSync | 取得所有密碼雜湊 |
| GPLink | GPO 連結 | 可能影響連結的物件 |
| Contains | 包含關係 | OU 包含的物件 |
| GpLink | GPO 連結到 OU | GPO 套用範圍 |
| AllowedToDelegate | 允許委派 | 模擬其他使用者 |
| AllowedToAct | 允許代理 | 資源型限制委派 |
| ReadLAPSPassword | 可以讀取 LAPS 密碼 | 取得本地管理員密碼 |
常見攻擊路徑分析
BloodHound 最強大的功能是自動識別攻擊路徑。以下是一些常見的攻擊路徑模式和分析方法。
預定義查詢
BloodHound 提供多種預定義查詢,可以在查詢面板中找到:
1
2
3
4
5
6
7
8
9
10
11
12
13
| Analysis 分類:
1. Find all Domain Admins - 找出所有 Domain Admin
2. Find Shortest Paths to Domain Admins - 找到 Domain Admin 的最短路徑
3. Find Principals with DCSync Rights - 找出具有 DCSync 權限的主體
4. Users with Foreign Domain Group Membership - 跨網域群組成員
5. Groups with Foreign Domain Group Membership - 具有外部網域成員的群組
6. Map Domain Trusts - 映射網域信任關係
7. Shortest Paths to Unconstrained Delegation Systems - 到無限制委派系統的路徑
8. Shortest Paths from Kerberoastable Users - 從可 Kerberoast 使用者的路徑
9. Shortest Paths to Domain Admins from Kerberoastable Users - 從可 Kerberoast 使用者到 DA 的路徑
10. Shortest Path from Owned Principals - 從已控制主體的最短路徑
11. Find Computers where Domain Users are Local Admin - 找出 Domain Users 是本地管理員的電腦
12. Find Computers where Domain Users can RDP - 找出 Domain Users 可以 RDP 的電腦
|
路徑分析:從普通使用者到 Domain Admin
這是最常見的攻擊路徑分析場景:
1
2
3
4
5
6
7
8
9
10
| 步驟一:標記已控制的節點
1. 右鍵點擊已控制的使用者節點
2. 選擇 "Mark User as Owned"
步驟二:執行路徑查詢
1. 開啟查詢面板
2. 選擇 "Find Shortest Paths to Domain Admins"
3. 或執行自訂查詢:
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p
|
常見攻擊路徑模式
模式一:群組成員關係鏈
1
2
3
4
5
| 路徑示例:
User1 --[MemberOf]--> Group1 --[MemberOf]--> Group2 --[MemberOf]--> Domain Admins
攻擊說明:
透過巢狀的群組成員關係,低權限使用者可能間接成為高權限群組的成員。
|
模式二:本地管理員 + Session 竊取
1
2
3
4
5
6
7
8
9
| 路徑示例:
User1 --[AdminTo]--> Computer1 <--[HasSession]-- DomainAdmin
攻擊步驟:
1. User1 對 Computer1 有本地管理員權限
2. Domain Admin 在 Computer1 有活躍 Session
3. 攻擊者使用 User1 登入 Computer1
4. 使用 Mimikatz 竊取 Domain Admin 的憑證
5. 使用竊取的憑證進行權限提升
|
模式三:ACL 濫用
1
2
3
4
5
6
7
| 路徑示例:
User1 --[GenericAll]--> User2 --[MemberOf]--> Domain Admins
攻擊步驟:
1. User1 對 User2 有 GenericAll 權限
2. 攻擊者使用 User1 重設 User2 的密碼
3. 使用 User2 的身份(已是 Domain Admin)
|
模式四:Kerberos 委派濫用
1
2
3
4
5
6
7
| 路徑示例:
User1 --[AdminTo]--> Computer1 --[AllowedToDelegate]--> Domain Controller
攻擊步驟:
1. User1 是 Computer1 的本地管理員
2. Computer1 被設定為可以委派到 Domain Controller
3. 攻擊者利用委派模擬任意使用者存取 DC
|
模式五:GPO 濫用
1
2
3
4
5
6
7
| 路徑示例:
User1 --[GenericAll]--> GPO1 --[GPLink]--> OU1 --[Contains]--> DomainAdmin
攻擊步驟:
1. User1 對 GPO1 有完全控制權限
2. GPO1 連結到包含 Domain Admin 的 OU
3. 修改 GPO 執行惡意腳本或新增本地管理員
|
高價值目標識別
1
2
3
4
5
6
7
8
9
10
11
| 高價值目標類型:
1. Domain Admins - 網域管理員群組
2. Enterprise Admins - 企業管理員群組
3. Domain Controllers - 網域控制器
4. Schema Admins - Schema 管理員
5. Account Operators - 帳戶操作員
6. Backup Operators - 備份操作員
7. DnsAdmins - DNS 管理員(可能用於權限提升)
8. GPO Creator Owners - GPO 建立者
9. 具有 DCSync 權限的帳戶
10. 無限制委派的系統
|
攻擊路徑範例分析
以下是一個完整的攻擊路徑分析範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 場景:已取得 jsmith 使用者的憑證
步驟 1:標記已控制的節點
- 在 BloodHound 中將 jsmith 標記為 "Owned"
步驟 2:執行路徑查詢
- 查詢:Find Shortest Paths from Owned Principals
步驟 3:分析發現的路徑
發現路徑:
jsmith --[MemberOf]--> IT-Support --[GenericAll]--> svc_backup --[MemberOf]--> Backup Operators --[HasSession]--> DC01
步驟 4:規劃攻擊步驟
1. 使用 jsmith(IT-Support 成員)
2. 利用 GenericAll 權限重設 svc_backup 密碼
3. 以 svc_backup 身份登入
4. 利用 Backup Operators 權限存取 DC01
5. 使用 Session 竊取或其他技術取得 Domain Admin
|
自訂 Cypher 查詢
Cypher 是 Neo4j 的查詢語言,BloodHound 使用 Cypher 來查詢和分析圖形資料。掌握 Cypher 查詢可以進行更深入的分析。
Cypher 基本語法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| -- 基本節點查詢
MATCH (n:User) RETURN n LIMIT 10
-- 查詢特定屬性
MATCH (u:User {name: "JSMITH@CORP.LOCAL"}) RETURN u
-- 查詢關係
MATCH (u:User)-[r:MemberOf]->(g:Group) RETURN u, r, g LIMIT 20
-- 使用 WHERE 子句
MATCH (u:User) WHERE u.enabled = true RETURN u.name
-- 計數查詢
MATCH (n:Computer) RETURN COUNT(n)
|
實用查詢範例
使用者和群組查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| -- 列出所有啟用的使用者
MATCH (u:User {enabled: true}) RETURN u.name ORDER BY u.name
-- 找出密碼永不過期的使用者
MATCH (u:User {pwdneverexpires: true, enabled: true}) RETURN u.name
-- 找出不需要 Kerberos 預認證的使用者(AS-REP Roasting)
MATCH (u:User {dontreqpreauth: true}) RETURN u.name
-- 找出具有 SPN 的使用者(Kerberoastable)
MATCH (u:User) WHERE u.hasspn = true RETURN u.name, u.serviceprincipalnames
-- 找出 Domain Admin 群組的所有成員(包含巢狀)
MATCH p=(u:User)-[:MemberOf*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"})
RETURN DISTINCT u.name
-- 找出特權群組的直接成員
MATCH (u)-[:MemberOf]->(g:Group)
WHERE g.name =~ ".*ADMIN.*"
RETURN u.name, g.name
|
電腦和 Session 查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
| -- 找出所有 Domain Controller
MATCH (c:Computer) WHERE c.name =~ ".*DC.*" RETURN c.name
-- 找出無限制委派的電腦
MATCH (c:Computer {unconstraineddelegation: true}) RETURN c.name
-- 找出有 Domain Admin Session 的電腦
MATCH (c:Computer)<-[:HasSession]-(u:User)-[:MemberOf*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"})
RETURN DISTINCT c.name, u.name
-- 找出特定使用者有 Session 的電腦
MATCH (c:Computer)<-[:HasSession]-(u:User {name: "ADMIN@CORP.LOCAL"})
RETURN c.name
|
權限和 ACL 查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| -- 找出對 Domain Admin 有 GenericAll 權限的使用者
MATCH (u)-[:GenericAll]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"})
RETURN u.name
-- 找出可以 DCSync 的非 Domain Admin 使用者
MATCH (u:User)-[:DCSync|GetChangesAll|GetChanges*1..]->(d:Domain)
WHERE NOT (u)-[:MemberOf*1..]->(:Group {name: "DOMAIN ADMINS@CORP.LOCAL"})
RETURN u.name
-- 找出可以修改 GPO 的使用者
MATCH (u:User)-[:GenericAll|GenericWrite|WriteOwner|WriteDacl]->(g:GPO)
RETURN u.name, g.name
-- 找出可以重設密碼的使用者
MATCH (u1:User)-[:ForceChangePassword]->(u2:User)
RETURN u1.name AS CanReset, u2.name AS Target
-- 找出可以新增群組成員的使用者
MATCH (u:User)-[:AddMember]->(g:Group)
RETURN u.name, g.name
|
攻擊路徑查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| -- 找出到 Domain Admin 的所有路徑(限制長度)
MATCH p=shortestPath((u:User)-[*1..5]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
WHERE u.enabled = true
RETURN p
-- 從已控制的使用者找路徑
MATCH p=shortestPath((u:User {owned: true})-[*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p
-- 找出透過 Kerberoasting 的攻擊路徑
MATCH (u:User {hasspn: true, enabled: true})
MATCH p=shortestPath((u)-[*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p
-- 找出透過 Session 的攻擊路徑
MATCH (u1:User {owned: true})-[:AdminTo]->(c:Computer)<-[:HasSession]-(u2:User)
MATCH p=shortestPath((u2)-[*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p
-- 找出最容易攻擊的路徑(考慮路徑長度)
MATCH p=allShortestPaths((u:User {owned: true})-[*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p, LENGTH(p) AS PathLength
ORDER BY PathLength ASC
|
統計和報告查詢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| -- 統計各類型節點數量
MATCH (n) RETURN labels(n), COUNT(n) ORDER BY COUNT(n) DESC
-- 統計使用者權限分佈
MATCH (u:User)-[r]->(t)
RETURN TYPE(r), COUNT(r)
ORDER BY COUNT(r) DESC
-- 找出擁有最多權限的使用者
MATCH (u:User)-[r]->(t)
RETURN u.name, COUNT(r) AS PermissionCount
ORDER BY PermissionCount DESC LIMIT 10
-- 找出最多人有權限的目標
MATCH (s)-[r]->(t)
RETURN t.name, labels(t), COUNT(r) AS IncomingCount
ORDER BY IncomingCount DESC LIMIT 10
-- 計算平均到 Domain Admin 的路徑長度
MATCH p=shortestPath((u:User {enabled: true})-[*1..]->(g:Group {name: "DOMAIN ADMINS@CORP.LOCAL"}))
RETURN AVG(LENGTH(p)) AS AvgPathLength
|
自訂查詢保存
在 BloodHound 中,可以將常用查詢保存為自訂查詢:
1
2
3
4
5
6
7
8
9
10
| 步驟:
1. 點擊查詢面板右上角的 "Custom Queries" 標籤
2. 點擊 "+" 按鈕新增查詢
3. 輸入查詢名稱和 Cypher 語句
4. 儲存查詢
查詢檔案位置:
- Linux: ~/.config/bloodhound/customqueries.json
- Windows: %APPDATA%\bloodhound\customqueries.json
- macOS: ~/Library/Application Support/bloodhound/customqueries.json
|
自訂查詢範例檔案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| {
"queries": [
{
"name": "Find Kerberoastable Users with Path to DA",
"category": "Custom",
"queryList": [
{
"final": true,
"query": "MATCH (u:User {hasspn: true, enabled: true}) MATCH p=shortestPath((u)-[*1..]->(g:Group {name: 'DOMAIN ADMINS@CORP.LOCAL'})) RETURN p"
}
]
},
{
"name": "Find Computers with Unconstrained Delegation",
"category": "Custom",
"queryList": [
{
"final": true,
"query": "MATCH (c:Computer {unconstraineddelegation: true}) RETURN c"
}
]
},
{
"name": "Find Users Who Can DCSync",
"category": "Custom",
"queryList": [
{
"final": true,
"query": "MATCH (u)-[:DCSync|GetChangesAll|GetChanges*1..]->(d:Domain) RETURN u.name"
}
]
}
]
}
|
BloodHound CE 社群版
BloodHound Community Edition(CE)是 BloodHound 的新一代版本,由 SpecterOps 開發,提供現代化的 Web 介面和更強大的功能。
BloodHound CE 特點
| 特點 | 說明 |
|---|
| Web 介面 | 使用瀏覽器存取,無需安裝桌面應用程式 |
| 容器化部署 | 使用 Docker Compose 一鍵部署 |
| 改進的資料模型 | 更完整的物件和關係支援 |
| API 支援 | 提供 RESTful API 進行整合 |
| 多租戶 | 支援多個獨立的資料集 |
| 即時更新 | 資料變更即時反映在介面上 |
安裝 BloodHound CE
使用 Docker Compose 安裝
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 下載 BloodHound CE
git clone https://github.com/SpecterOps/BloodHound.git
cd BloodHound/examples/docker-compose
# 或者直接下載 docker-compose 檔案
curl -L https://ghst.ly/getbhce -o docker-compose.yml
# 啟動服務
docker-compose up -d
# 檢查服務狀態
docker-compose ps
# 查看初始密碼
docker-compose logs bloodhound | grep "Initial Password"
|
Docker Compose 配置範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| version: '3'
services:
bloodhound:
image: specterops/bloodhound:latest
container_name: bloodhound-ce
ports:
- "8080:8080"
environment:
- bhe_disable_cypher_qc=false
depends_on:
- graph-db
- app-db
volumes:
- bloodhound-config:/bloodhound
graph-db:
image: neo4j:4.4
container_name: bloodhound-neo4j
environment:
- NEO4J_AUTH=neo4j/bloodhoundcommunityedition
- NEO4J_dbms_allow__upgrade=true
volumes:
- neo4j-data:/data
- neo4j-logs:/logs
app-db:
image: postgres:13
container_name: bloodhound-postgres
environment:
- POSTGRES_USER=bloodhound
- POSTGRES_PASSWORD=bloodhoundcommunityedition
- POSTGRES_DB=bloodhound
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
bloodhound-config:
neo4j-data:
neo4j-logs:
postgres-data:
|
BloodHound CE 使用
初次登入
- 開啟瀏覽器,訪問
http://localhost:8080 - 使用初始帳號和密碼登入(從日誌中取得)
- 系統會要求設定新密碼
上傳資料
1
2
3
4
5
6
7
8
9
| 方法一:Web 介面上傳
1. 點擊左側選單的 "File Ingest"
2. 拖放或選擇 ZIP 檔案
3. 等待處理完成
方法二:API 上傳
curl -X POST "http://localhost:8080/api/v2/file-upload" \
-H "Authorization: Bearer <token>" \
-F "file=@bloodhound_data.zip"
|
使用新版資料收集器
BloodHound CE 使用新版的 SharpHound 收集器:
1
2
3
4
5
6
7
8
| # 下載 SharpHound for BloodHound CE
# https://github.com/SpecterOps/SharpHound/releases
# 執行收集
.\SharpHound.exe --collectionmethods All --outputdirectory C:\Temp
# 新增的收集選項
.\SharpHound.exe --collectionmethods All --dolocal --certservices
|
探索模式
BloodHound CE 提供多種探索模式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 1. 節點搜尋
- 在搜尋欄輸入物件名稱
- 支援模糊搜尋和過濾器
2. 路徑搜尋
- 選擇起點和終點
- 自動計算攻擊路徑
3. Cypher 查詢
- 開啟 Cypher 編輯器
- 執行自訂查詢
4. 預定義分析
- 使用內建的分析功能
- 包含改進的視覺化效果
|
BloodHound CE API 使用
BloodHound CE 提供完整的 RESTful API:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 取得認證 Token
curl -X POST "http://localhost:8080/api/v2/login" \
-H "Content-Type: application/json" \
-d '{"login_method": "secret", "secret": "your_api_key"}'
# 列出所有使用者
curl -X GET "http://localhost:8080/api/v2/users" \
-H "Authorization: Bearer <token>"
# 執行 Cypher 查詢
curl -X POST "http://localhost:8080/api/v2/graphs/cypher" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"query": "MATCH (u:User) RETURN u.name LIMIT 10"}'
# 取得特定節點資訊
curl -X GET "http://localhost:8080/api/v2/base/CORP.LOCAL" \
-H "Authorization: Bearer <token>"
|
防禦與偵測策略
了解 BloodHound 的運作方式有助於防守方制定有效的防禦和偵測策略。
減少攻擊面
權限最小化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # 審計 Domain Admin 群組成員
Get-ADGroupMember -Identity "Domain Admins" -Recursive
# 審計特權群組
$privilegedGroups = @(
"Domain Admins",
"Enterprise Admins",
"Schema Admins",
"Account Operators",
"Backup Operators",
"Server Operators",
"Print Operators"
)
foreach ($group in $privilegedGroups) {
Write-Host "Members of $group:"
Get-ADGroupMember -Identity $group -Recursive | Select-Object Name, SamAccountName
}
# 使用 AdminCount 找出特權帳戶
Get-ADUser -Filter {AdminCount -eq 1} -Properties AdminCount
|
清理不必要的 ACL
1
2
3
4
5
6
7
8
9
10
11
| # 找出對 Domain Admins 有危險權限的帳戶
Import-Module ActiveDirectory
# 取得 Domain Admins 的 ACL
$domainAdmins = Get-ADGroup "Domain Admins"
$acl = Get-Acl "AD:\$($domainAdmins.DistinguishedName)"
# 分析權限
$acl.Access | Where-Object {
$_.ActiveDirectoryRights -match "GenericAll|GenericWrite|WriteDacl|WriteOwner"
} | Format-Table IdentityReference, ActiveDirectoryRights, AccessControlType
|
限制橫向移動
1
2
3
4
5
6
7
8
9
10
11
| # 限制 WMI 存取
# 設定 DCOM 權限限制本地管理員的橫向移動能力
# 啟用 Windows Firewall 規則
New-NetFirewallRule -DisplayName "Block WMI" -Direction Inbound -LocalPort 135 -Protocol TCP -Action Block
# 限制 PsExec 和類似工具
# 透過 GPO 限制 ADMIN$ 共享的存取
# 啟用 Credential Guard
# 需要在 GPO 中設定 Device Guard
|
偵測 SharpHound 活動
LDAP 查詢監控
SharpHound 會產生大量的 LDAP 查詢,可以透過以下方式偵測:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 啟用 LDAP 查詢日誌
# Event ID 2889: LDAP 簽章警告
# Event ID 1644: LDAP 查詢資訊(需要額外設定)
# 啟用 LDAP 查詢記錄
$baseDN = "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=corp,DC=local"
Set-ADObject -Identity $baseDN -Replace @{
"15 Field Engineering" = 5
}
# 監控異常的 LDAP 查詢模式
# 查詢所有使用者的 servicePrincipalName 屬性
# 查詢所有群組的成員
# 查詢 ACL 資訊
|
Session 列舉偵測
1
2
3
4
5
6
7
8
| # 監控 Event ID 4624(登入成功)和 4648(使用明確憑證登入)
# 監控 NetSessionEnum 呼叫
# 使用 Sysmon 監控
# Event ID 18: PipeEvent (Pipe Connected) - 監控 \PIPE\srvsvc
# 啟用 Object Access 稽核
auditpol /set /subcategory:"Handle Manipulation" /success:enable /failure:enable
|
網路流量監控
1
2
3
4
5
6
| 監控指標:
1. 短時間內大量 LDAP 查詢
2. 對多台電腦的 NetSessionEnum 呼叫
3. 對多台電腦的 NetLocalGroupGetMembers 呼叫
4. 異常的 SAMR 查詢模式
5. 對 Domain Controller 的密集連線
|
安全強化建議
Active Directory 強化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # 1. 啟用 Protected Users 群組
Add-ADGroupMember -Identity "Protected Users" -Members "sensitive_account"
# 2. 設定 AdminSDHolder
# 限制對特權物件的權限修改
# 3. 啟用 LAPS(Local Administrator Password Solution)
# 自動管理本地管理員密碼
# 4. 限制 Kerberos 委派
# 審計無限制委派的電腦
Get-ADComputer -Filter {TrustedForDelegation -eq $true}
# 使用限制委派替代無限制委派
Set-ADComputer -Identity "server1" -TrustedForDelegation $false
# 5. 啟用 Kerberos AES 加密
Set-ADUser -Identity "service_account" -KerberosEncryptionType AES256
# 6. 設定密碼原則
# 要求複雜密碼,定期更換
# 7. 停用 LLMNR 和 NetBIOS
# 透過 GPO 設定
|
監控和警報
1
2
3
4
5
6
7
8
| 重要事件監控:
1. Event ID 4769 - Kerberos 服務票證請求(監控 Kerberoasting)
2. Event ID 4768 - Kerberos TGT 請求(監控 AS-REP Roasting)
3. Event ID 4662 - 目錄服務存取(監控 DCSync)
4. Event ID 4672 - 特權指派(監控特權帳戶使用)
5. Event ID 4624/4625 - 登入成功/失敗
6. Event ID 4728/4732/4756 - 群組成員變更
7. Event ID 5136 - 目錄服務變更(監控 ACL 修改)
|
SIEM 查詢範例(Splunk):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 偵測 Kerberoasting
index=windows EventCode=4769 Ticket_Encryption_Type=0x17
| stats count by Account_Name, Service_Name, Client_Address
| where count > 10
# 偵測 DCSync
index=windows EventCode=4662
Access_Mask="0x100" OR Access_Mask="0x80"
Properties="*1131f6aa-9c07-11d1-f79f-00c04fc2dcd2*" OR
Properties="*1131f6ad-9c07-11d1-f79f-00c04fc2dcd2*"
| stats count by Account_Name, Object_Name
# 偵測密碼噴灑攻擊
index=windows EventCode=4625
| bucket _time span=5m
| stats count dc(TargetUserName) as unique_users by _time, IpAddress
| where count > 20 AND unique_users > 10
# 偵測異常 LDAP 查詢
index=windows EventCode=1644
| stats count by Src_IP, Filter
| where count > 1000
|
定期安全評估
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| 建議的評估項目:
1. 路徑分析
- 定期執行 BloodHound 收集和分析
- 追蹤攻擊路徑的數量和長度變化
- 識別新增的危險路徑
2. 權限審計
- 審計特權群組成員
- 審計危險的 ACL 設定
- 審計 Kerberos 委派設定
3. 配置審查
- 審計 GPO 設定
- 審計服務帳戶權限
- 審計共享資料夾權限
4. 漏洞評估
- 檢查 Kerberoastable 帳戶
- 檢查 AS-REP Roastable 帳戶
- 檢查弱密碼
5. 改進追蹤
- 記錄修復的問題
- 追蹤改進效果
- 更新基準線
|
使用 BloodHound 進行防守
防守方可以主動使用 BloodHound 來識別和修復問題:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| 防守使用案例:
1. 識別高風險路徑
- 執行 "Find Shortest Paths to Domain Admins"
- 優先處理最短的攻擊路徑
2. 識別過度授權
- 查詢不必要的 GenericAll 權限
- 查詢危險的群組成員關係
3. 監控變更
- 定期收集資料並比較差異
- 追蹤新增的危險配置
4. 報告生成
- 產生管理層報告
- 追蹤修復進度
5. 紅隊模擬
- 使用 BloodHound 規劃紅隊路徑
- 驗證偵測能力
|
總結
BloodHound 是內網滲透測試和 Active Directory 安全評估中不可或缺的工具。本文涵蓋了以下主要內容:
- BloodHound 工具概述:了解 BloodHound 的核心概念和架構組成
- SharpHound 資料收集:學習如何使用 SharpHound 和 BloodHound.py 收集 AD 環境資料
- Neo4j 資料庫設定:安裝和配置 Neo4j 圖形資料庫
- BloodHound GUI 使用:掌握 BloodHound 介面的基本操作和分析功能
- 常見攻擊路徑分析:識別和理解典型的 AD 攻擊路徑模式
- 自訂 Cypher 查詢:編寫進階查詢進行深入分析
- BloodHound CE 社群版:使用新一代的 Web 介面版本
- 防禦與偵測策略:從防守角度使用 BloodHound 並實施安全控制
最佳實踐建議
- 攻擊方:善用 BloodHound 識別攻擊路徑,結合其他工具進行路徑利用
- 防守方:定期執行 BloodHound 評估,主動識別和修復問題
- 合規性:將 BloodHound 評估納入定期安全審計流程
- 持續監控:建立偵測機制,監控攻擊者可能的 BloodHound 活動
參考資源