Windows数据保护接口(Data Protection Application Programming Interface,DPAPI),是Windows系统级对数据进行加解密的一种接口,自动实现加解密代码,微软已经提供了经过验证的高质量加解密算法,提供了用户态的接口,对密钥的推导、存储、数据加解密实现透明,并提供较高的安全保证。从Windows 2000开始,用户程序或操作系统程序就可以直接调用DPAPI来加密数据。由于DPAPI简单易用且加密功能强大,大量应用程序都采用DPAPI加密用户的私密数据,如Chrome浏览器的自动登录密码、远程桌面的自动登录密码、Outlook邮箱的账号密码等。
DPAPI提供了两个用户态接口,CryptProtectData用于加密数据,CryptUnprotectData用于解密数据,任何第三方程序均可以利用DPAPI来保护用户的数据。当一个程序调用DPAPI接口时,DPAPI接口会向Local Security Authority服务(LSASS)发起一个本地的远程过程调用(RPC Call),LSA会调用CryptoAPI完成对数据的加密解密并返回给应用程序。如图2-10所示。
图2-10 DPAPIRPC调用LSA加解密过程
DPAPI通过由512-bit伪随机数的Master Key派生的数据来进行加密保护。每个用户账户都有一个或者多个随机生成的Master Key,因为Master Key包含了可以解密用户敏感信息的数据,所以Master Key也是被加密保护的,它由账户登录密码的Hash和SID生成的Derived Key使用Triple-DES加密,所以DPAPI是一个基于密码的数据保护接口。事实上Master Key并没有直接用于加密数据,而是基于Master Key生成了一个symmetricsession key,symmetric session key用于保护数据,session key不会被保存,而Master Key会被保存,用户的Master Key存储位置位于%APPDATA%\Microsoft\Protect\{SID}\(系统隐藏文件),系统的Master Key的存储位置位于%WINDIR%\System32\Microsoft\Protect\S-1-5-18\User,机器的Master Key存储位置位于%WINDIR%\System32\Microsoft\Protect\S-1-5-18。
单纯使用用户的登录密码(Hash)来保护数据存在一个缺点,用户所使用的应用程序理论上可以访问并解密其他应用程序所保护的数据,这显然是不太安全的,所以DPAPI允许应用程序使用一个额外的密码来保护数据,这个密码称之为entropy,每个应用程序可以自定义自己所使用的entropy,并只有自己知道,这样其他应用程序在不知道entropy的前提下就无法调用DPAPI解密这些数据了。
出于安全考虑,Master Key会定期更新,默认更新频率为90天,在Master Key更新之后,为防止旧的加密数据无法解密,系统会永久保存旧的Master Key,在Master Key同目录下的Preferred文件会记录当前所使用的Master Key,而在DPAPI加密后的BLOB中会记录所使用的Master Key的GUID。当用户密码更改之后,系统会使用新的密码重新加密Master Key并存储,而系统会将旧的密码保存在Master Key存储位置的上级目录的CREDHIST文件中,并使用当前密码加密保护这个文件。
如果客户机加入了Windows域,DPAPI还会存在一个备份机制来解密Master Key,以防止用户忘记密码造成加密数据丢失。域控制器存在一个供全域DPAPI使用的RSA公私钥对,当客户机生成一个Master Key时,会向域控制器发起远程过程调用(RPC Call)获得公钥,使用公钥加密Master Key,这个称为Backup Master Key,Backup Master Key和使用密码加密的Master Key一同被存储在Master Key文件中。当用户的密码无法解密Master Key时,客户端会将Backup Master Key通过RPC发送给域控制器,域控制器使用私钥解密Backup Master Key后将Master Key返回给客户端。
如图2-11所示为DPAPI KEY关系图。
图2-11 DPAPI关系图
现实中,攻击者常使用Mimikatz工具中的DPAPI模块解密敏感数据,在解密之前需要先获取受害者机器内的Master Key、受害者的密码或者Hash、加密数据,必要情况下,还需获得entropy、SYSTEM文件、SECURITY文件、域控制器用于解密Backup Key的RSA私钥等。
1.使用Mimikatz解密并加载Master Key(如图2-12所示)
图2-12 Mimikatz解密加载MasterKey
2.使用Mimikatz加密字符串(entropy是可选参数,如图2-13所示)
图2-13 Mimikatz加密数据
3.使用Mimikatz解密blob(如果加密数据时指定了entropy,那么解密时同样需要,如图2-14所示)
图2-14 使用Mimikatz解密DPAPI加密的数据
4.使用Mimikatz解密保存的Windows凭据(如图2-15所示)
图2-15 使用Mimikatz解密DPAPI加密的Windows凭据