在 Windows 后滲透過程中,攻擊者經常會遇到各種加密字符串或數據,這些數據通常用于存儲敏感信息,如憑據、會話票據或配置數據。理解這些加密字符串的類型、加密機制、存儲位置以及解密方法,對于權限提升、橫向移動和持久化至關重要。本文將詳細分析 Windows 系統中常見的加密字符串類型,包括 PSCredential
、以 01000000d 開頭的字符串
(通常與 DPAPI 相關)、SecureString
、DPAPI
、GPP
,并補充其他類型(如 LSA Secrets、SAM Hashes、Kerberos Tickets 等)。通過優化分類和結合實際后滲透場景,提供一個全面的參考框架。
1. 分類與概述
Windows 系統中的加密字符串通常與憑據存儲、身份驗證或敏感數據保護相關。這些字符串的加密機制、存儲方式和解密條件各不相同。以下是對常見加密字符串的分類:
分類 | 加密機制 | 典型存儲位置 | 解密條件 | 后滲透工具 | 標志性特征 |
---|---|---|---|---|---|
PSCredential | DPAPI + SecureString | PowerShell 腳本、內存 | 用戶上下文或 SYSTEM 權限 | Mimikatz, PowerShell 反射 | System.Management.Automation.PSCredential |
SecureString | DPAPI | 內存、序列化文件 | 用戶上下文或 SYSTEM 權限 | Mimikatz, PowerShell 反射 | System.Security.SecureString |
DPAPI Blob | DPAPI | 文件、注冊表、內存、憑據管理器 | DPAPI 主密鑰 + 用戶/SYSTEM 權限 | Mimikatz, SharpDPAPI | 01000000d 開頭的十六進制 |
GPP (Group Policy Preferences) | AES-256 (固定密鑰) | SYSVOL 的 XML 文件 | 訪問 SYSVOL 權限(默認可讀) | Get-GPPPassword, Metasploit | cpassword 的 Base64 編碼 |
LSA Secrets | DPAPI + 注冊表加密 | 注冊表(HKLM\SECURITY) | SYSTEM 權限 | Mimikatz, lsadump | 注冊表中的加密二進制數據 |
SAM Hashes | NTLM/SYSKEY 加密 | 注冊表(HKLM\SAM) | SYSTEM 權限 | Mimikatz, secretsdump | NTLM 哈希(十六進制) |
Kerberos Tickets | Kerberos 協議加密 | 內存(LSASS 進程) | SYSTEM 權限或用戶會話 | Mimikatz, Rubeus | TGT/TGS 票據(內存中) |
2. 詳細分析
2.1 PSCredential
定義
PSCredential
是 PowerShell 中的 .NET 對象(System.Management.Automation.PSCredential
),用于安全地存儲和傳遞用戶名和密碼。密碼部分以 SecureString
形式存儲,底層依賴 Windows 的 DPAPI(Data Protection API)進行加密。
加密機制
- 加密方式:密碼通過
SecureString
加密,DPAPI 使用用戶或機器的加密密鑰進行保護。 - 密鑰綁定:加密數據與當前用戶上下文或機器綁定,只有同一用戶在同一機器上才能解密。
- 序列化:如果
PSCredential
被序列化(如通過Export-Clixml
保存到文件),會生成 DPAPI 加密的二進制數據。
存儲位置
- 內存:運行中的 PowerShell 進程(如通過
Get-Credential
創建)。 - 文件:腳本中保存的序列化憑據(如
.xml
文件)。 - 注冊表:某些自動化腳本可能將憑據存儲在注冊表中。
后滲透利用
- 提取方法:
- 如果有用戶上下文,可以通過 PowerShell 反射直接解密
PSCredential
中的密碼。 - 使用 Mimikatz 的
sekurlsa::logonpasswords
或dpapi::cred
模塊從內存中提取。
- 如果有用戶上下文,可以通過 PowerShell 反射直接解密
- 工具:
- Mimikatz
- PowerShell 腳本(如
Get-DecryptedPSCredential
)
- 限制:需要目標用戶上下文或 SYSTEM 權限。
標志性特征
- PowerShell 腳本中出現
Get-Credential
或System.Management.Automation.PSCredential
。 - 序列化后可能以
01000000d
開頭的 DPAPI 數據形式存儲。
2.2 SecureString
定義
SecureString
(System.Security.SecureString
)是 .NET Framework 中的數據類型,用于在內存中以加密形式存儲敏感數據(如密碼),減少明文暴露時間。
加密機制
- 內存加密:數據在輸入時逐字符加密,存儲在內存中時保持加密狀態。
- DPAPI 依賴:底層使用 DPAPI 加密,密鑰與用戶或機器綁定。
- 序列化:通過
ConvertFrom-SecureString
序列化后,生成 DPAPI 加密的字符串(可能以01000000d
開頭)。
存儲位置
- 內存:PowerShell 腳本運行時(如
ConvertTo-SecureString
)。 - 文件:序列化后的文件(如
.txt
或.xml
)。 - 注冊表:某些應用程序可能將序列化的
SecureString
存儲在注冊表中。
后滲透利用
- 提取方法:
- 通過反射 API(如
System.Runtime.InteropServices.Marshal
)從內存中解密。 - 如果序列化到文件,結合 DPAPI 主密鑰解密。
- 通過反射 API(如
- 工具:
- Mimikatz(
dpapi::blob
) - SharpDPAPI
- Mimikatz(
- 限制:需要用戶上下文或 SYSTEM 權限。
標志性特征
- PowerShell 腳本中出現
ConvertTo-SecureString
或ConvertFrom-SecureString
。 - 內存中看到
System.Security.SecureString
類型。
2.3 DPAPI Blob(以 01000000d
開頭的字符串)
定義
以 01000000d
開頭的字符串是 DPAPI 加密后的二進制數據(BLOB
)的十六進制表示,廣泛用于 Windows 系統中的憑據保護。它是 PSCredential
、SecureString
和其他憑據(如 Credential Manager)的底層加密格式。
加密機制
- DPAPI:Windows 提供的加密 API,使用用戶或機器的加密密鑰。
- 數據格式:
01000000d
是 DPAPI 數據塊的頭部標識符,表示加密數據的版本或格式。 - 保護級別:
- 用戶級別:只有同一用戶能解密。
- 機器級別:同一機器上的所有用戶都能解密。
存儲位置
- 文件:序列化的憑據文件(如
.xml
)。 - 注冊表:某些應用程序存儲的加密數據(如
HKCU\Software
)。 - 憑據管理器:Windows Credential Manager 中的網絡憑據、RDP 憑據等。
- 瀏覽器:如 Chrome、Edge 的密碼數據庫。
后滲透利用
- 提取方法:
- 獲取 DPAPI 主密鑰(
C:\Users\<User>\AppData\Roaming\Microsoft\Protect
)。 - 使用 Mimikatz 的
dpapi::blob
或dpapi::masterkey
模塊解密。
- 獲取 DPAPI 主密鑰(
- 工具:
- Mimikatz
- SharpDPAPI
- DPAPIck
- 限制:需要目標用戶的 DPAPI 主密鑰或 SYSTEM 權限。
標志性特征
- 以
01000000d
開頭的長十六進制字符串。 - 出現在文件、注冊表或內存中。
2.4 GPP (Group Policy Preferences)
定義
組策略首選項(GPP)是 Windows 組策略的一部分,允許管理員配置用戶或計算機設置(如本地管理員賬戶、計劃任務)。早期版本(Windows Server 2008 及之前)的 GPP 憑據以弱加密形式存儲。
加密機制
- AES-256:使用固定密鑰(微軟公開的硬編碼密鑰)加密。
- 存儲格式:加密后的密碼以 Base64 編碼存儲在 XML 文件的
cpassword
屬性中。 - 位置:SYSVOL 共享文件夾(
\\<Domain>\SYSVOL
)中的 XML 文件,如Groups.xml
、ScheduledTasks.xml
。
存儲位置
- SYSVOL:域控制器上的共享文件夾,默認所有域用戶可讀。
- 文件類型:
.xml
文件,包含cpassword
屬性。
后滲透利用
- 提取方法:
- 訪問 SYSVOL,提取 XML 文件中的
cpassword
。 - 使用公開的 AES 密鑰解密(無需額外權限)。
- 訪問 SYSVOL,提取 XML 文件中的
- 工具:
- PowerSploit 的
Get-GPPPassword
- Metasploit 的
post/windows/gather/credentials/gpp
- PowerSploit 的
- 限制:僅適用于未修補的舊系統(2014 年微軟修復了此漏洞,移除了固定密鑰)。
標志性特征
- XML 文件中的
cpassword
屬性,值為 Base64 編碼的加密字符串。
2.5 LSA Secrets
定義
LSA(Local Security Authority)Secrets 是 Windows 系統存儲在注冊表中的加密憑據,用于支持系統服務和身份驗證(如服務賬戶密碼、自動登錄憑據)。
加密機制
- 加密方式:結合 DPAPI 和系統密鑰(SYSKEY)加密。
- 存儲位置:
HKLM\SECURITY\Policy\Secrets
(需要 SYSTEM 權限訪問)。 - 內容:
- 服務賬戶密碼(如用于計劃任務或服務的賬戶)。
- 自動登錄憑據(如
DefaultPassword
)。 - 遠程桌面服務的密碼。
存儲位置
- 注冊表:
HKLM\SECURITY\Policy\Secrets
。 - 內存:LSASS 進程中可能緩存相關數據。
后滲透利用
- 提取方法:
- 使用 Mimikatz 的
lsadump::secrets
模塊直接從注冊表提取。 - 從 LSASS 進程內存中 dump 數據。
- 使用 Mimikatz 的
- 工具:
- Mimikatz
- lsadump
- 限制:需要 SYSTEM 權限。
標志性特征
- 注冊表中的加密二進制數據。
- Mimikatz 輸出中以
LSA Secrets
標識。
2.6 SAM Hashes
定義
SAM(Security Accounts Manager)存儲本地用戶賬戶的 NTLM 哈希,用于本地身份驗證。
加密機制
- NTLM 哈希:用戶密碼的 NTLM 哈希存儲在 SAM 數據庫中。
- SYSKEY 加密:SAM 數據庫整體通過 SYSKEY 加密。
- 存儲位置:
HKLM\SAM\SAM\Domains\Account\Users
。
存儲位置
- 注冊表:
HKLM\SAM
。 - 文件:SAM 文件(
C:\Windows\System32\config\SAM
)。
后滲透利用
- 提取方法:
- 使用 Mimikatz 的
lsadump::sam
模塊提取。 - 從注冊表或 SAM 文件 dump 哈希。
- 使用哈希進行 Pass-the-Hash 攻擊。
- 使用 Mimikatz 的
- 工具:
- Mimikatz
- secretsdump(Impacket)
- 限制:需要 SYSTEM 權限。
標志性特征
- NTLM 哈希格式(十六進制)。
- 注冊表中的加密二進制數據。
2.7 Kerberos Tickets
定義
Kerberos Tickets 是 Windows 域環境中用于身份驗證的票據,包括 TGT(Ticket Granting Ticket)和 TGS(Ticket Granting Service)。
加密機制
- Kerberos 協議:使用域控制器的密鑰加密票據。
- 存儲位置:LSASS 進程內存中。
存儲位置
- 內存:LSASS 進程中緩存的票據。
- 文件:通過導出(如
.kirbi
文件)保存。
后滲透利用
- 提取方法:
- 使用 Mimikatz 的
sekurlsa::tickets
或kerberos::list
提取票據。 - 使用 Rubeus 導出票據或進行 Pass-the-Ticket 攻擊。
- 使用 Mimikatz 的
- 工具:
- Mimikatz
- Rubeus
- 限制:需要 SYSTEM 權限或用戶會話。
標志性特征
- 內存中以 Kerberos 票據格式存儲(如
.kirbi
文件)。 - Mimikatz 輸出中以
TGT
或TGS
標識。
3. 后滲透中的操作建議
3.1 識別加密字符串
- 文件系統:檢查
.xml
、.ps1
、.txt
文件,尋找cpassword
、01000000d
或SecureString
相關內容。 - 注冊表:檢查
HKLM\SAM
、HKLM\SECURITY
、HKCU\Software
。 - 內存:dump LSASS 進程或 PowerShell 進程內存。
- 網絡共享:訪問 SYSVOL 共享,提取 GPP 相關 XML 文件。
3.2 解密方法
- PSCredential/SecureString:
- 使用 PowerShell 反射或 Mimikatz 解密內存中的數據。
- 序列化數據需要 DPAPI 主密鑰。
- DPAPI Blob:
- 獲取主密鑰(
C:\Users\<User>\AppData\Roaming\Microsoft\Protect
)。 - 使用 Mimikatz 或 SharpDPAPI 解密。
- 獲取主密鑰(
- GPP:
- 提取 SYSVOL 中的 XML 文件,使用公開的 AES 密鑰解密。
- LSA Secrets/SAM Hashes:
- 獲取 SYSTEM 權限,dump 注冊表或 SAM 文件。
- Kerberos Tickets:
- 從 LSASS 內存中提取票據,導出為
.kirbi
文件。
- 從 LSASS 內存中提取票據,導出為
3.3 工具推薦
- Mimikatz:支持 DPAPI、LSA Secrets、SAM Hashes、Kerberos Tickets 提取。
- SharpDPAPI:輕量級 DPAPI 解密工具。
- PowerSploit:
Get-GPPPassword
用于 GPP 密碼提取。 - Rubeus:Kerberos 票據提取和利用。
- Impacket:
secretsdump
用于 SAM Hashes 提取。