解锁 Edge 密码宝库:内网取证与横向渗透的技术拆解
文章探讨了Microsoft Edge基于Chromium的浏览器如何通过DPAPI和OSCrypt加密存储用户密码和敏感数据,并分析了内存提取、DPAPI主密钥窃取等常见攻击手段及其防御策略。 2025-11-5 08:29:40 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

声明:本文仅面向授权场景,如企业内网取证、应急响应或红队演练。任何未经授权的凭据窃取或入侵行为均违法!以下技术细节旨在帮助安全从业者(取证工程师、蓝队、红队)理解浏览器凭据存储机制、复现攻击路径并完善防御策略。非授权环境下严禁尝试!


摘要

Microsoft Edge(基于 Chromium)以加密方式存储用户密码、Cookie 和敏感令牌,依赖 Windows 的 DPAPI(Data Protection API)和 OSCrypt 机制来保护数据。这听起来很安全,但实际场景中,攻击者(或红队)常通过内存提取、DPAPI 主密钥窃取或会话劫持来解密这些凭据,进而实现内网横向移动。本文将深入剖析 Edge 的凭据存储机制,结合取证、红队和蓝队视角,拆解如何采集证据、复现攻击链以及设计防御策略。

关键点

  • 离线文件难直接解密:单独拿到 Edge 的Login Data文件无法直接获取明文,需用户上下文或 DPAPI 主密钥。

  • 内存提取更高效:活体取证(内存快照)能直接捕获明文凭据或解密密钥。

  • 防御重点:监控 DPAPI 调用、进程内存访问和异常文件操作,结合 Credential Guard 和 MFA 降低风险。


1. 背景技术概览

Chromium 系列浏览器(包括 Edge)为了用户体验,会将密码、Cookie、表单数据甚至信用卡信息存储在本地。这些数据通常位于用户 Profile 下的 SQLite 数据库或 JSON 文件中。为了防止简单文件窃取,Edge 使用了双层加密机制:

  1. 数据层加密:密码等敏感数据通过 AES-256-GCM 加密,生成加密 blob。

  2. 密钥层保护:AES 密钥本身由 Windows DPAPI(CryptProtectData)加密,绑定到用户上下文或操作系统密钥存储。

换句话说,浏览器把“钥匙”交给了 Windows 系统。这既是优势(利用系统安全边界),也是风险点——如果攻击者能拿到用户登录会话、NTLM hash 或 DPAPI 主密钥,就能解锁这些凭据。

细节
Edge 的密码存储机制与 Chrome 高度一致,依赖Local State文件中的os_crypt.encrypted_key字段保存加密后的 AES 密钥。这个密钥通过 DPAPI 加密,解密需要用户 SID(Security Identifier)对应的 masterkey(位于%APPDATA%\Microsoft\Protect\<SID>\)。此外,52pojie 文章指出,某些情况下,攻击者可能通过 LSASS 进程(Local Security Authority Subsystem Service)内存提取用户 NTLM hash 或明文密码,进一步解密 DPAPI 主密钥,进而解密浏览器凭据。


2. 证据位点:从哪下手?

在 Windows + Edge 环境下,取证和信息收集的重点位点如下(优先级从高到低):

  1. 内存(重中之重)

    • Edge 进程(msedge.exe)在运行时可能保留明文密码、Cookie 或解密后的 AES 密钥。内存快照是取证的首选,能直接捕获高价值数据。

    • 通过 LSASS 进程内存提取,还可能获取用户登录凭据(如 NTLM hash 或明文密码),这些是解密 DPAPI 的关键。

  2. 用户 Profile 文件(磁盘层)

    • %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data:SQLite 数据库,logins表存储用户名、URL 和加密后的密码 blob(password_value)。

image.png

  • %LOCALAPPDATA%\Microsoft\Edge\User Data\Local State:JSON 文件,os_crypt.encrypted_key字段包含 Base64 编码的 AES 密钥(经 DPAPI 加密)。

image.png

  • Login Datapassword_value使用 AES-256-GCM 加密,nonce 和 tag 也存储在数据库中,解密需要先从Local State获取 AES 密钥。
    image.png

  1. DPAPI Master Keys

    • 位于%APPDATA%\Microsoft\Protect\<SID>\,以 GUID 命名的文件存储 masterkey,解密需要用户密码、NTLM hash 或域备份密钥。

    • 某些攻击工具(如 Mimikatz)可通过提权后从 LSASS 提取 masterkey,或者利用域环境中 DPAPI 的备份密钥(roaming/domain backup)进行离线解密。

  2. 注册表与系统文件

    • 提取NTUSER.DATSYSTEMSAMhive,可能获取用户 NTLM hash 或 DPAPI 配置信息。

    • 注册表路径HKLM\SECURITY\Policy\Secrets可能包含 LSA 秘密,结合 Mimikatz 可提取 DPAPI 相关密钥。

  3. 浏览器扩展与网络缓存

    • Cookie 文件(%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Cookies)可能包含 session token 或 OAuth token,可用于横向访问。

    • 某些扩展可能存储未加密的 token,攻击者可通过扩展配置文件直接提取。


3. 取证流程:从理论到实战

3.1 准备工作

  • 书面授权:明确 scope,记录授权文件。

  • 证据链:每次采集记录时间、工具版本、操作者、文件/镜像的 SHA256 哈希。

  • 优先级:内存 > 磁盘 > 网络日志。内存采集能获取最多明文,机器重启可能丢失会话密钥。

3.2 采集步骤

  1. 记录上下文:目标机器的用户名、主机名、登录会话状态、时间戳。

  2. 内存采集

    • 使用winpmemDumpItFTK Imager捕获内存镜像,记录镜像文件哈希。

    • 若目标机器已提权,可用 Mimikatz 的sekurlsa::logonpasswords提取 LSASS 中的 NTLM hash 或明文密码,辅助 DPAPI 解密。

  3. 磁盘文件采集

    • 复制%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login DataLocal State

    • 提取%APPDATA%\Microsoft\Protect\<SID>\的 masterkey 文件。

    • 备份NTUSER.DAT和注册表 hive(SYSTEMSAM)。

    • 注意检查Cookies文件,某些 session token 可直接用于服务认证。

  4. 网络流量:捕获代理日志或局域网流量,分析异常访问。

  5. 事件日志:导出 Windows 安全日志,关注 DPAPI 相关事件(如 4692)。

3.3 分析要点

  • 内存分析

    • 用 Volatility 或 Rekall 定位msedge.exe进程,搜索 URL/用户名/密码三元组。

    • 结合 YARA 规则扫描内存中的明文模式(如正则http.*@.*),或直接提取 LSASS 进程中的凭据。

  • 磁盘分析

    • Local State提取os_crypt.encrypted_key,Base64 解码后用CryptUnprotectData解密获取 AES 密钥。

    • 用 AES 密钥解密Login Datalogins表的password_value

    • 若有 NTLM hash,可用 Mimikatz 的dpapi::masterkey解密 masterkey,再解密 AES 密钥。离线分析需用户密码或域备份密钥。

  • 时间线构建

    • plasolog2timeline整合 SQLite 时间戳、浏览器历史和事件日志,构建凭据创建/使用时间线。

    • 验证凭据有效性(能否登录目标服务,是否触发 MFA)。


4. 复现

1、首先读取 Local State提取主密钥:

def get_master_key(local_state_path):
    # 读取Local State文件
    with open(local_state_path, 'r', encoding='utf-8') as f:
        local_state = json.load(f)

    # 提取并解码加密的主密钥
    encrypted_key = base64.b64decode(local_state['os_crypt']['encrypted_key'])
    # 移除DPAPI前缀
    encrypted_key = encrypted_key[5:]

    # 使用DPAPI解密获取主密钥
    master_key = win32crypt.CryptUnprotectData(
        encrypted_key, None, None, None, 0)[1]
    return master_key

2、解密

def decrypt_password(encrypted_password, master_key):
    try:
        # 检查是否为新版本的AES加密
        if encrypted_password.startswith(b'v10'):
            # 提取nonce、密文和认证标签
            nonce = encrypted_password[3:15]
            ciphertext = encrypted_password[15:-16]
            tag = encrypted_password[-16:]

            # 使用AES-GCM解密
            cipher = AES.new(master_key, AES.MODE_GCM, nonce=nonce)
            decrypted = cipher.decrypt_and_verify(ciphertext, tag)
            return decrypted.decode('utf-8')
        else:
            # 旧版本使用DPAPI直接解密
            return win32crypt.CryptUnprotectData(
                encrypted_password, None, None, None, 0)[1].decode()
    except Exception as e:
        print(f"解密失败: {e}")
        return "解密失败"

image.png


5. 红队视角:凭据窃取的攻击链

在授权红队演练中,浏览器凭据是内网渗透的高价值目标。以下是概念性攻击链:

  1. 初始进入:通过钓鱼、漏洞利用或后门进入目标主机。

  2. 内存提取:在用户会话中抓取msedge.exe内存,提取明文密码或 Cookie。

    • Mimikatz 可提取 LSASS 中的 NTLM hash,解锁 DPAPI。

  3. 横向移动:用窃取的凭据访问内部服务(如管理面板、邮件系统)。

    • Cookie(如 OAuth token)可直接复用,绕过密码认证。

  4. 持久化:导出 session token 或 refresh token,在攻击者环境复用,维持长期访问。

注意:这些步骤常与 Kerberos 攻击、NTLM relay 或社会工程结合。红队需严格遵守授权范围,避免真实危害。


6. 蓝队防御:如何挡住凭据窃取?

蓝队的目标是检测和阻止浏览器凭据滥用。以下是防御策略:

6.1 系统硬化

  • 最小权限:限制本地管理员账户,减少高权限会话。

  • Credential Guard:启用 Windows Credential Guard,保护 LSASS 和 DPAPI 主密钥。

  • MFA:对关键服务强制多因素认证,降低单点凭据泄露风险。

  • 密码管理器:鼓励使用企业级密码管理器,禁用浏览器密码保存。

6.2 检测规则

  • API 监控:告警非典型进程调用CryptUnprotectDataCryptProtectData

  • 内存保护:检测进程间内存读取或注入(如msedge.exe被访问)。

  • 文件监控:告警%APPDATA%\Microsoft\Protect的异常访问或复制。

  • 网络基线:异常流量(如新目标服务或协议)触发排查。

  • 监控 LSASS 进程的内存 dump 行为,Mimikatz 等工具常以此提取凭据。

6.3 应急响应

  • 短期:冻结受影响账户,重置密码,强制 MFA。

  • 中期:回溯日志,定位横向移动痕迹,清理持久化后门。

  • 长期:评估是否禁用浏览器密码存储,推广企业密码管理器。


7. 工具箱

以下是合规场景下常用的取证与分析工具(需授权使用):

  • 内存采集winpmemDumpItFTK Imager

  • 内存分析VolatilityRekall,配合 YARA 规则搜索明文。

  • 磁盘解析sqlite3(查询Login Data)、Python 解析Local Stateplaso构建时间线。

  • DPAPI 分析:Elcomsoft 工具(合规取证)、SpecterOps 的 DPAPI 研究文档。

  • Mimikatz(需谨慎,仅限授权红队场景)可提取 NTLM hash 和 masterkey。


8. 常见误区答疑

Q1:只拿Login Data能解密密码吗?
A:不行。password_value是 AES-256-GCM 加密的 blob,需从Local State获取 AES 密钥,而密钥又被 DPAPI 保护。离线解密需要用户密码、NTLM hash 或 masterkey。

Q2:能直接移植 Profile 到另一台机器用吗?
A:基本不可行。DPAPI 绑定用户上下文和机器,移植 Profile 需同时转移 masterkey 和登录凭据,且需相同用户环境。

Q3:最有效的检测点是什么?
A:监控CryptUnprotectData调用、LSASS 内存访问、masterkey 文件操作和异常网络流量。这些是凭据窃取的核心环节。


9. 结论与建议

  • 取证:优先内存采集,结合磁盘文件和日志构建时间线,确保证据链完整。

  • 红队:在授权演练中测试凭据窃取路径,验证防御漏洞,但严禁非授权操作。

  • 蓝队:部署 Credential Guard、MFA,监控 DPAPI 调用和内存访问,定期演练凭据泄露场景。

  • 企业建议:在隔离环境定期复现凭据窃取,优化 SIEM/EDR 规则,推广密码管理器,禁用浏览器密码保存。


尾声:浏览器凭据看似不起眼,却是内网渗透的“金钥匙”。通过内存提取、DPAPI 解密或 Cookie 复用,攻击者可能轻松横向移动。蓝队需要更敏锐的检测,红队需要更严谨的授权,而我们每个人都该重新审视浏览器“记住密码”的便利性与风险。你准备好保护自己的数字钥匙了吗?


文章来源: https://www.freebuf.com/articles/system/455759.html
如有侵权请联系:admin#unsafe.sh