声明:本文仅面向授权场景,如企业内网取证、应急响应或红队演练。任何未经授权的凭据窃取或入侵行为均违法!以下技术细节旨在帮助安全从业者(取证工程师、蓝队、红队)理解浏览器凭据存储机制、复现攻击路径并完善防御策略。非授权环境下严禁尝试!
Microsoft Edge(基于 Chromium)以加密方式存储用户密码、Cookie 和敏感令牌,依赖 Windows 的 DPAPI(Data Protection API)和 OSCrypt 机制来保护数据。这听起来很安全,但实际场景中,攻击者(或红队)常通过内存提取、DPAPI 主密钥窃取或会话劫持来解密这些凭据,进而实现内网横向移动。本文将深入剖析 Edge 的凭据存储机制,结合取证、红队和蓝队视角,拆解如何采集证据、复现攻击链以及设计防御策略。
关键点:
离线文件难直接解密:单独拿到 Edge 的Login Data文件无法直接获取明文,需用户上下文或 DPAPI 主密钥。
内存提取更高效:活体取证(内存快照)能直接捕获明文凭据或解密密钥。
防御重点:监控 DPAPI 调用、进程内存访问和异常文件操作,结合 Credential Guard 和 MFA 降低风险。
Chromium 系列浏览器(包括 Edge)为了用户体验,会将密码、Cookie、表单数据甚至信用卡信息存储在本地。这些数据通常位于用户 Profile 下的 SQLite 数据库或 JSON 文件中。为了防止简单文件窃取,Edge 使用了双层加密机制:
数据层加密:密码等敏感数据通过 AES-256-GCM 加密,生成加密 blob。
密钥层保护: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 主密钥,进而解密浏览器凭据。
在 Windows + Edge 环境下,取证和信息收集的重点位点如下(优先级从高到低):
内存(重中之重)
Edge 进程(msedge.exe)在运行时可能保留明文密码、Cookie 或解密后的 AES 密钥。内存快照是取证的首选,能直接捕获高价值数据。
通过 LSASS 进程内存提取,还可能获取用户登录凭据(如 NTLM hash 或明文密码),这些是解密 DPAPI 的关键。
用户 Profile 文件(磁盘层)
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data:SQLite 数据库,logins表存储用户名、URL 和加密后的密码 blob(password_value)。

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

Login Data的password_value使用 AES-256-GCM 加密,nonce 和 tag 也存储在数据库中,解密需要先从Local State获取 AES 密钥。
DPAPI Master Keys
位于%APPDATA%\Microsoft\Protect\<SID>\,以 GUID 命名的文件存储 masterkey,解密需要用户密码、NTLM hash 或域备份密钥。
某些攻击工具(如 Mimikatz)可通过提权后从 LSASS 提取 masterkey,或者利用域环境中 DPAPI 的备份密钥(roaming/domain backup)进行离线解密。
注册表与系统文件
提取NTUSER.DAT、SYSTEM或SAMhive,可能获取用户 NTLM hash 或 DPAPI 配置信息。
注册表路径HKLM\SECURITY\Policy\Secrets可能包含 LSA 秘密,结合 Mimikatz 可提取 DPAPI 相关密钥。
浏览器扩展与网络缓存
Cookie 文件(%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Cookies)可能包含 session token 或 OAuth token,可用于横向访问。
某些扩展可能存储未加密的 token,攻击者可通过扩展配置文件直接提取。
书面授权:明确 scope,记录授权文件。
证据链:每次采集记录时间、工具版本、操作者、文件/镜像的 SHA256 哈希。
优先级:内存 > 磁盘 > 网络日志。内存采集能获取最多明文,机器重启可能丢失会话密钥。
记录上下文:目标机器的用户名、主机名、登录会话状态、时间戳。
内存采集:
使用winpmem、DumpIt或FTK Imager捕获内存镜像,记录镜像文件哈希。
若目标机器已提权,可用 Mimikatz 的sekurlsa::logonpasswords提取 LSASS 中的 NTLM hash 或明文密码,辅助 DPAPI 解密。
磁盘文件采集:
复制%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data和Local State。
提取%APPDATA%\Microsoft\Protect\<SID>\的 masterkey 文件。
备份NTUSER.DAT和注册表 hive(SYSTEM、SAM)。
注意检查Cookies文件,某些 session token 可直接用于服务认证。
网络流量:捕获代理日志或局域网流量,分析异常访问。
事件日志:导出 Windows 安全日志,关注 DPAPI 相关事件(如 4692)。
内存分析:
用 Volatility 或 Rekall 定位msedge.exe进程,搜索 URL/用户名/密码三元组。
结合 YARA 规则扫描内存中的明文模式(如正则http.*@.*),或直接提取 LSASS 进程中的凭据。
磁盘分析:
从Local State提取os_crypt.encrypted_key,Base64 解码后用CryptUnprotectData解密获取 AES 密钥。
用 AES 密钥解密Login Data中logins表的password_value。
若有 NTLM hash,可用 Mimikatz 的dpapi::masterkey解密 masterkey,再解密 AES 密钥。离线分析需用户密码或域备份密钥。
时间线构建:
用plaso或log2timeline整合 SQLite 时间戳、浏览器历史和事件日志,构建凭据创建/使用时间线。
验证凭据有效性(能否登录目标服务,是否触发 MFA)。
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
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 "解密失败"

在授权红队演练中,浏览器凭据是内网渗透的高价值目标。以下是概念性攻击链:
初始进入:通过钓鱼、漏洞利用或后门进入目标主机。
内存提取:在用户会话中抓取msedge.exe内存,提取明文密码或 Cookie。
Mimikatz 可提取 LSASS 中的 NTLM hash,解锁 DPAPI。
横向移动:用窃取的凭据访问内部服务(如管理面板、邮件系统)。
Cookie(如 OAuth token)可直接复用,绕过密码认证。
持久化:导出 session token 或 refresh token,在攻击者环境复用,维持长期访问。
注意:这些步骤常与 Kerberos 攻击、NTLM relay 或社会工程结合。红队需严格遵守授权范围,避免真实危害。
蓝队的目标是检测和阻止浏览器凭据滥用。以下是防御策略:
最小权限:限制本地管理员账户,减少高权限会话。
Credential Guard:启用 Windows Credential Guard,保护 LSASS 和 DPAPI 主密钥。
MFA:对关键服务强制多因素认证,降低单点凭据泄露风险。
密码管理器:鼓励使用企业级密码管理器,禁用浏览器密码保存。
API 监控:告警非典型进程调用CryptUnprotectData或CryptProtectData。
内存保护:检测进程间内存读取或注入(如msedge.exe被访问)。
文件监控:告警%APPDATA%\Microsoft\Protect的异常访问或复制。
网络基线:异常流量(如新目标服务或协议)触发排查。
监控 LSASS 进程的内存 dump 行为,Mimikatz 等工具常以此提取凭据。
短期:冻结受影响账户,重置密码,强制 MFA。
中期:回溯日志,定位横向移动痕迹,清理持久化后门。
长期:评估是否禁用浏览器密码存储,推广企业密码管理器。
以下是合规场景下常用的取证与分析工具(需授权使用):
内存采集:winpmem、DumpIt、FTK Imager。
内存分析:Volatility、Rekall,配合 YARA 规则搜索明文。
磁盘解析:sqlite3(查询Login Data)、Python 解析Local State、plaso构建时间线。
DPAPI 分析:Elcomsoft 工具(合规取证)、SpecterOps 的 DPAPI 研究文档。
Mimikatz(需谨慎,仅限授权红队场景)可提取 NTLM hash 和 masterkey。
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 文件操作和异常网络流量。这些是凭据窃取的核心环节。
取证:优先内存采集,结合磁盘文件和日志构建时间线,确保证据链完整。
红队:在授权演练中测试凭据窃取路径,验证防御漏洞,但严禁非授权操作。
蓝队:部署 Credential Guard、MFA,监控 DPAPI 调用和内存访问,定期演练凭据泄露场景。
企业建议:在隔离环境定期复现凭据窃取,优化 SIEM/EDR 规则,推广密码管理器,禁用浏览器密码保存。
尾声:浏览器凭据看似不起眼,却是内网渗透的“金钥匙”。通过内存提取、DPAPI 解密或 Cookie 复用,攻击者可能轻松横向移动。蓝队需要更敏锐的检测,红队需要更严谨的授权,而我们每个人都该重新审视浏览器“记住密码”的便利性与风险。你准备好保护自己的数字钥匙了吗?