第 72 章 DPAPI 凭据链(Windows 秘密解密)
DPAPI(Data Protection API)是 Windows 保护"本地秘密"的机制:浏览器密码、WiFi 密码、凭据管理器、Vault、各类加密文件。拿到 DPAPI 主密钥(Master Key)→ 解开该用户的所有本地秘密。本章覆盖 DPAPI 原理、主密钥获取、凭据解密全流程。
📍 知识点地图 | 主题:DPAPI凭据 | 前置:第61章 | 后续:— | 核心概念:Master Key、Mimikatz、浏览器密码、备份密钥
72.1 DPAPI 原理(先懂加密架构)
DPAPI 分层:
用户秘密(浏览器密码/凭据)→ 用"用户密钥"加密
用户密钥 → 用"DPAPI Master Key"加密
Master Key → 用"用户密码哈希/域备份密钥"保护(储存在 %APPDATA%\Microsoft\Protect\<SID>\)
两层结构:
1. Blob(密文文件/数据): 由 GUID 指向某个 Master Key
2. Master Key(主密钥): 解锁所有 Blob 的钥匙
解锁 Master Key 需要:
□ 用户登录密码的 SHA1(本地)
□ 域备份密钥(域控恢复)
□ 或从 LSASS 内存中直接提取(Mimikatz)
72.2 高价值目标(什么被 DPAPI 保护)
□ 浏览器密码/凭据:
Chrome/Edge: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data
(数据库加密,key 在 Local State 文件 → 用 DPAPI 保护)
□ Windows 凭据管理器: cmdkey /list(普通凭据)
□ Credential Vault: %LOCALAPPDATA%\Microsoft\Vault\
□ WiFi 密码: 无线配置文件(WLAN)
□ Outlook/邮件凭据
□ 应用自定义 DPAPI 加密(备份工具/密码管理器本地库)
□ 域凭据(域备份密钥可解所有用户!)
72.3 凭据获取(拿 Master Key 的三种途径)
途径 1:当前用户上下文(最简单)
已登录/有权限访问该用户文件 → 用当前会话直接解密:
使用 DPAPI 的 CryptUnprotectData(用户本身能解密自己的数据)
工具: 各类解密脚本(浏览器密码提取器)
途径 2:Mimikatz 从内存提取(需 SYSTEM/高权限)
mimikatz "privilege::debug" "sekurlsa::dpapi" exit
# 输出: 所有 Master Key(带 GUID)
# 然后用 master key 离线解密 Blob
途径 3:域备份密钥(域控权限)
域备份密钥(DPAPI_SYSTEM): 可解锁"任何域用户"的 Master Key
获取:
mimikatz "lsadump::backupkeys /system:<DC> /export"
secretsdump.py -ntds ntds.dit -system SYSTEM -hashes <HASH>
利用:
离线解密所有用户的 Master Key → 所有用户的浏览器密码/凭据
72.4 解密流程(Master Key → 秘密)
# 1. 收集目标文件
# 浏览器数据库(Login Data)+
# Local State(Chrome 加密 key)+
# 用户的 Master Key 目录
# %APPDATA%\Microsoft\Protect\<SID>\<GUID>
# 2. 用工具解密(dploot 是新主力)
# dploot(Impacket 同作者风格,现代版):
python dploot.py user -nt <NTHASH> -target <IP> -dc-ip <DC> all
# 自动: 提取 Master Key → 解密浏览器密码/凭据/Vault
# 3. 或手工流程(Mimikatz/其他工具)
# 拿 Master Key → 指定 GUID → 解密 Blob
mimikatz "dpapi::blob /in:<blob> /masterkey:<KEY>"
完整实战链(域环境)
1. 拿到域用户哈希/会话(第 62 章)
2. dploot 提取该用户 Master Key
3. 解密浏览器密码/凭据管理器(该用户的所有本地秘密)
4. 收集到的密码 → 撞其他系统(密码复用)
5. 提权到 SYSTEM → 更多 Master Key / LSASS 提取
6. 域控 → 域备份密钥 → 解密所有用户(横向的钥匙库)
72.5 浏览器密码提取(最常用场景)
# Chrome/Edge 密码库解密(用 dploot 或专用脚本):
# 1. 拿 Local State 里的 encrypted_key → DPAPI 解密 → AES key
# 2. 用 AES key 解 Login Data 数据库里的密码
# dploot 一键(已登录环境):
python dploot.py chrome -local
# 输出: 所有 Chrome 保存的密码
# 离线(有 Master Key):
python dploot.py chrome -local -masterkeys <KEY_FILE>
72.6 DPAPI 攻击检查清单
□ 权限评估: 当前用户? SYSTEM? 域管?
□ 目标文件盘点(浏览器/凭据/Vault/WiFi)
□ Master Key 获取:
□ 当前上下文(直接解)
□ Mimikatz sekurlsa::dpapi(内存)
□ 域备份密钥(域控)
□ 解密 Blob(dploot/Mimikatz)
□ 密码复用评估(收集的密码撞其他系统)
□ 报告: 解密了哪些凭据/影响
72.7 防御与检测
防御:
□ 域备份密钥保护(控制域控访问 = 控制一切 DPAPI)
□ 最小权限(LSASS/域控访问管控)
□ 监控: 大量 DPAPI 调用/凭据文件批量访问
□ 浏览器: 禁用密码保存(企业策略)
检测信号:
□ 异常访问 Protect 目录/浏览器数据库
□ Mimikatz 类工具行为
□ 凭据文件批量复制
动手练习
- 在 Windows 测试机保存一个 Chrome 密码,用 dploot 本地提取(体验完整链)。
- 用 Mimikatz sekurlsa::dpapi 提取 Master Key,离线解密一个 Blob。
- 搭一个域环境,用域备份密钥解密"另一个用户"的凭据(体会横向价值)。
- 盘点你自己测试机的 DPAPI 保护面:列出所有受保护的目标类型。
深入阅读
- 仓库:
CTF-Sandbox-Orchestrator/competition-dpapi-credential-chain/(DPAPI CTF 子技能) - 仓库:
CTF-Sandbox-Orchestrator/competition-lsass-ticket-material/(LSASS 材料) - 仓库:
CTF-Sandbox-Orchestrator/competition-identity-windows/(Windows 身份 CTF) - 仓库:
skills/pentest-tools/references/network-attack-defense.md(凭证获取章节) - 外部: dploot(GitHub)、Mimikatz 文档