內網 BloodHound 攻擊路徑分析

BloodHound Attack Path Analysis in Active Directory

BloodHound 工具概述

BloodHound 是一款強大的 Active Directory(AD)安全分析工具,由 @_wald0、@CptJesus 和 @harmj0y 共同開發。它利用圖論(Graph Theory)來揭示 Active Directory 環境中隱藏的、經常被忽略的關係,這些關係可能被攻擊者利用來進行權限提升和橫向移動。

BloodHound 的核心價值

BloodHound 的主要功能包括:

  • 視覺化攻擊路徑:將複雜的 AD 關係轉換為直觀的圖形展示
  • 自動化路徑發現:自動識別從低權限使用者到高價值目標的攻擊路徑
  • 關係映射:揭示群組成員關係、ACL 權限、Session 資訊等
  • 風險評估:幫助防守方識別和修復潛在的攻擊路徑

BloodHound 的架構組成

BloodHound 生態系統由以下主要元件組成:

元件功能
SharpHoundWindows 環境的資料收集器(C# 編寫)
BloodHound.pyLinux/跨平台的 Python 資料收集器
Neo4j圖形資料庫,用於儲存和查詢資料
BloodHound GUI圖形使用者介面,用於視覺化和分析
BloodHound CE社群版,提供 Web 介面的新版本

為什麼選擇 BloodHound

在傳統的內網滲透測試中,分析 AD 關係是一項繁瑣且容易遺漏的工作。BloodHound 透過以下方式解決這個問題:

  1. 自動化收集:快速收集整個網域的關係資料
  2. 圖形化分析:將數千個物件和關係轉換為可理解的圖形
  3. 路徑計算:使用 Dijkstra 等演算法找出最短攻擊路徑
  4. 預定義查詢:提供常用的攻擊路徑查詢模板

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 後,需要進行初始設定:

  1. 開啟瀏覽器,訪問 http://localhost:7474
  2. 使用預設帳號密碼登入:neo4j / neo4j
  3. 系統會要求設定新密碼(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 資料庫:

  1. 在登入介面輸入 Neo4j 連線資訊:

    • Bolt URL: bolt://localhost:7687
    • Username: neo4j
    • Password: bloodhound(或您設定的密碼)
  2. 點擊 “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取得所有密碼雜湊
GPLinkGPO 連結可能影響連結的物件
Contains包含關係OU 包含的物件
GpLinkGPO 連結到 OUGPO 套用範圍
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 使用

初次登入

  1. 開啟瀏覽器,訪問 http://localhost:8080
  2. 使用初始帳號和密碼登入(從日誌中取得)
  3. 系統會要求設定新密碼

上傳資料

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 安全評估中不可或缺的工具。本文涵蓋了以下主要內容:

  1. BloodHound 工具概述:了解 BloodHound 的核心概念和架構組成
  2. SharpHound 資料收集:學習如何使用 SharpHound 和 BloodHound.py 收集 AD 環境資料
  3. Neo4j 資料庫設定:安裝和配置 Neo4j 圖形資料庫
  4. BloodHound GUI 使用:掌握 BloodHound 介面的基本操作和分析功能
  5. 常見攻擊路徑分析:識別和理解典型的 AD 攻擊路徑模式
  6. 自訂 Cypher 查詢:編寫進階查詢進行深入分析
  7. BloodHound CE 社群版:使用新一代的 Web 介面版本
  8. 防禦與偵測策略:從防守角度使用 BloodHound 並實施安全控制

最佳實踐建議

  • 攻擊方:善用 BloodHound 識別攻擊路徑,結合其他工具進行路徑利用
  • 防守方:定期執行 BloodHound 評估,主動識別和修復問題
  • 合規性:將 BloodHound 評估納入定期安全審計流程
  • 持續監控:建立偵測機制,監控攻擊者可能的 BloodHound 活動

參考資源

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy