在 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 提取。