请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。 来源:Medium,作者:@David Azria、@Zur Ulianitzky 现在只对常读和星标的公众号才展示大图推送,建议大家把潇湘信安“设为星标”,否则可能看不到了! 0x00 概述我们一直在努力研究攻击者用来攻击您的 VMware 环境的技术,您将要阅读的内容是我们持续研究的成果。 您可能认为您的 VMware 密码是安全的。但对于经验丰富的黑客来说,即使是这些也是可以争夺的。 当您从 VMware Workstation 连接到 ESXi 或 Vsphere 服务器时,您可以选择在计算机上保存连接详细信息,包括密码。下次连接到服务器时,您无需再次输入凭据。 经典的“记住我”功能。 ![]() 使用逆向工程的方法,我们分析了解密流程,发现我们可以自行解密保存的 VMware 凭据。如果我们能做到,那么经验丰富的黑客也能做到。 在此博客中,我们将逐步向您展示黑客如何窃取您的 VMware 凭据。最后,我们将向您展示我们创建的工具,它可以做到这一点,让红队队员的生活更轻松。 让我们进入研究。 0x01 解密流程我们通过假设凭据保存在本地文件或注册表项中来开始研究。为了准确找到位置,我们使用了 SysInternals 工具中的 Procmon。 我们可以看到,当我们通过工作站添加或删除凭据时,会访问以下文件: ![]() 我们来看看这两个文件: %AppData%\VMware\preferences-private.ini ![]() %AppData%\VMware\ace.dat ![]() 这些文件似乎已加密。所以我们需要了解如何,以及到解密它们。我们将从 preferences-private.ini 文件开始。 0x02 preferences-private.ini 该文件包含以下属性:.encoding encryption.userKeyencryption.keySafeencryption.data encryption.userKey 值使用数据保护 API (DPAPI) 加密,可通过第一个常量 ~60 字节元数据识别。 ![]() DPAPI 允许使用来自当前用户的信息加密数据。因此,只有执行加密的用户才能解密数据。 让我们编写一个使用 Unprotect 函数并尝试解密数据的简单 .Net 应用程序: ![]() 我们执行应用程序并获得解密数据: ![]() 我们得到了一种加密算法类型 AES-256——我们也得到了一个密钥。我们称它为 KEY_1。 我们现在需要解密在 preferences-private.ini 文件中找到的其他属性的值,即 encryption.keySafe 和 encryption.data。为此,我们需要知道每个属性、使用的算法、初始化向量 (IV) 和密钥。 为了找到这些未知数,我们将使用静态和动态逆向工程分析技术。查看 Procmon 中的调用堆栈向我们展示了哪些 DLL 文件和函数需要访问加密文件。 ![]() 我们在vmwarebase.dll文件中找到了对BCryptDecrypt函数的调用,这是一个用于解密数据的 WinAPI 函数: https://learn.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptdecrypt ![]() 就在函数调用之前,我们可以看到 IV,以及发送到函数的加密数据和返回的解密数据,它们被推送到堆栈。查看 MSDN 文档告诉我们,发送给函数的最后一个参数 hKey 是用于解密数据的密钥的句柄。 https://learn.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgeneratesymmetrickey 这个句柄是从BCryptGenerateSymmetricKey密钥创建函数中获得的: ![]() pbSecret 参数包含用于加密和解密过程的密钥(在 base64 解码之后)。 动态分析应该可以帮助我们获得实际的 IV 和密钥值,并了解完整的解密流程。 下面我们用WinDBG调试vmware.exe,用IDA同步地址基础镜像,插入断点,分析流程。 我们在BCryptGenerateSymmetricKey函数调用上插入断点,然后我们在栈上显示第五个参数pbSecret的内容,也就是秘钥。 ![]() 经过base64编码后,我们得到: mXhLLOJnBFo0tNr7PVaxuzmaxwOsWsR/i0k8RAJf9cs= 这就是我们的KEY_1,由上面的DPAPI解密得到。 现在我们在 BCryptDecrypt 函数调用上插入一个断点,然后我们将看到使用此密钥解密了哪个有效负载以及使用了哪个 IV: ![]() 堆栈上的第二个参数是加密的有效负载,第五个是 IV: ![]() 经过base64编码后,我们可以看到这个数据对应于preferences-private.ini文件中的encryption.keySafe值。前 16 个字节是 IV,其余是加密数据。 解密结果为: ![]() 简而言之,KEY_1 用于解密 encryption.keySafe 值,解密后的值是另一个密钥,我们称之为 KEY_2: ![]() 接下来,我们可以使用相同的方法,调试对 BCryptDecrypt 函数的调用,以完成我们对解密流程的理解。 使用 KEY_2,我们能够解密 encryption.data 属性。同样,前 16 个字节是 IV,使用 AES-256 算法,解密后的值为: ![]() 很好,我们成功解密了配置,我们有了主机名和用户名。但是……密码仍然是加密的。密码的解密密钥是什么? 为此,我们将继续处理工作站保存的第二个文件 ace.dat。 0x03 ace.dat这是文件的内容: %AppData%\VMware\ace.dat ![]() 您可以看到数据值已加密。我们将其称为 DATA_1。 跟踪对 BCryptGenerateSymmetricKey 函数的堆栈调用会将我们带到 vmwarebase.dll 文件中的硬编码密钥。此密钥用于解密 ace.dat 文件内容: ![]() 让我们使用它并解密 DATA_1 值,这是解密后的数据: ![]() 数据包含密钥派生函数 PBKDF2-HMAC-SHA-1、盐和加密数据值,我们称之为 DATA_2。 PBKDF2 算法用于根据秘密值和盐生成密钥。秘密值硬编码在 vmwarebase.dll 文件中: ![]() 让我们生成密钥并将其命名为 KEY_3: ![]() 使用 KEY_3,我们将解密 DATA_2 值,这是解密后的数据: ![]() 我们得到另一把钥匙,使用此密钥,我们从上面解密的配置中解密密码。 ![]() 使用的 IV 是加密密码的前 16 个字节。 最后,这是明文密码! ![]() 0x04 工具解密上面的解密流程很长很复杂,所以我们也写了一个工具来完成这项工作;只需运行它,它就会解密 VMware Workstation 配置文件,包括密码。 它还可以通过尝试连接到服务器来验证提取的凭据是否有效。 ![]() 点击下方名片进入公众号 回复关键字【230429】获取工具链接 信 安 考 证 需要考以下各类安全证书的可以联系我,价格优惠、组团更便宜,还送【潇湘信安】知识星球1年! CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001... 推 荐 阅 读 ![]() ![]() ![]() |
|