如何破解128位密码:可逆加密的安全隐患

本文详细介绍了作者在渗透测试中发现Active Directory中存储的可逆加密密码,即使长度达128位也可被轻易解密,并探讨了其安全风险、检测方法和最佳实践。

如何破解128位密码

TL;DR – 即使密码非常长,如果使用可逆加密存储,攻击者也可以轻松地将其反转回明文。

密码破解非常有趣。启动Hashcat,扔一堆哈希值给它,然后看着进度从几分钟变成几小时,再到几天,这非常令人满足。这一切都在您进行另一个测试、遛狗或在海滩上喝鸡尾酒时发生。

密码破解器的工作原理是获取一个潜在的密码,例如Autumn2018,并计算其哈希值。然后,Hashcat将新计算的代表Autumn2018的哈希值与您提供的哈希列表进行比较。如果找到一个或多个匹配项,则意味着这些账户正在使用密码Autumn2018

找到一个…

找到另一个…

…依此类推。

这一切都从从域控制器提取哈希开始。大多数情况下,我们提升到域管理员权限并登录到域控制器以获取所需文件。

嘘!有时甚至更容易。有时,有一个备份文件,可以通过低权限账户访问,其中包含Active Directory(AD)数据库。

由于您无法复制正在运行的AD数据库(在使用时被锁定),我们创建一个VSS快照并复制ntds.dit文件以及包含提取哈希所需的BOOTKEY的SYSTEM注册表配置单元。我们通常使用内置的ntdsutil命令来完成此操作:

然后,我们可以使用Impacket的secretsdump Python脚本从数据库中实际提取哈希。

1
secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL -outputfile breakme

我习惯于看到包含NTLM哈希的*.NTDS文件,但在最近的一次测试中,脚本还输出了一个扩展名为“.CLEARTEXT”的文件,这让我非常惊讶。(为了保护无辜者,这是在实验室中重新创建的,但这确实发生在实际测试中。)

secretsdump脚本使用outputfile参数指定的前缀“breakme”将所有哈希写入文件。在这种情况下,它找到了NTLM哈希、明文哈希和Kerberos密钥。结果发现,“CLEARTEXT”文件包含了相关用户的明文密码,包括几个长度 literally 为128个字符的密码!

对于这篇博客文章,我们当然要重点关注CLEARTEXT文件:

我以前从未见过这种情况。这是传说中的事情。 literally 有一个输出文件包含每个用户账户和相应的明文密码。不需要破解。当然,我立即抽查了一些这些账户(咳咳,一个域管理员账户)以查看密码是否有效,它们确实有效!!经过一些调查,我了解到至少有几种不同的机制强制存储明文凭据。

注意:明文并不真正意味着密码按原样存储。它们使用RC4加密以加密形式存储。用于加密和解密的密钥是SYSKEY,它存储在注册表中,可以由域管理员提取。这意味着哈希可以轻松地反转回明文值,因此称为“可逆加密”。

对于使用可逆加密存储密码的账户,Active Directory用户和计算机(ADUC)中的账户属性可能显示“使用可逆加密存储密码”复选框已勾选。它看起来像这样:

您可以使用命令行查询AD中任何在UserAccountControl属性中设置了可逆加密标志的用户,使用以下PowerShell命令:

1
Get-ADUser -Filter 'useraccountcontrol -band 128' -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol

如果您想了解此命令语法的详细细节,请滚动到底部标题为“深入细节”的部分。否则, suffice it to say that the above command will get you all the accounts that have been configured to store passwords using reversible encryption.

所以最大的问题是为什么。为什么需要以这种方式存储凭据?答案是一些应用程序需要它。因此,Microsoft提供了一种机制,供需要知道用户密码值的应用程序强制存储可逆加密密码以验证用户。我知道需要可逆加密的应用程序包括MS CHAP、SASL摘要认证、需要验证到Windows域的旧版MacOS主机。很可能还有其他第三方应用程序也使用它。

以下是Microsoft关于此设置的最佳实践提示:

https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/store-passwords-using-reversible-encryption

要点

  • 即使需要使用域管理员权限使用我们上面展示的方法从Active Directory数据库提取哈希,这也意味着DA(或被盗的DA账户)可以轻松了解其他用户的密码。这违反了不可否认性原则,该原则防止用户争议信息系统内的活动。
  • 我们经常发现包含VSS快照的备份集,提供对AD数据库的访问。备份集通常可由低权限账户甚至所有域用户访问。在这种情况下,任何域用户都可以轻松访问任何使用可逆加密存储的账户密码。

深入细节

我承诺提供更多关于上面显示的命令语法的细节。作为复习,以下是使用PowerShell从Active Directory提取密码使用可逆加密存储的用户的命令:

1
Get-ADUser -Filter 'useraccountcontrol -band 128' -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol

让我们逐部分分解:

  • Get-ADUser是ActiveDirectory PowerShell模块中的一个cmdlet,默认安装在Windows Server 2008 R2及更高版本上。可以使用Import-Module命令导入。

  • Filter – 使用PowerShell表达式告诉cmdlet搜索参数是什么。在这种情况下,我们正在搜索具有特定UserAccountControl属性值的用户账户(稍后详述)。

您也可以使用LDAPFilter代替Filter。它与Filter做同样的事情,但使用LDAP查询语法。找到所需UserAccountControl值的正确语法是:

1
Get-ADUser -LDAPFilter "(&(objectCategory=Person)(UserAccountControl:1.2.840.113556.1.4.803:=128))" -Properties useraccountcontrol | Format-Table name,samaccountname
  • useraccountcontrol -band 128

Active Directory中的UserAccountControl属性是一个与用户账户设置相关的属性,长度为32位。每个位代表该用户账户的特定设置。例如,当账户被禁用时,第二个低序位设置为“1”。在可逆加密的情况下,第八个低序位将设置为“1”。第八个低序位对应于十进制值128。(我告诉过您我们会深入细节。)

要访问此数字中特定位的值,您必须使用逻辑位级操作。要了解更多关于位操作的信息,您可以查看这里或这里。在我们的例子中,-band 128意味着使用位与操作与值128来确定第八个低序位是否设置(无论32位数字中设置了哪些其他位)。这基本上隔离了一个位,并允许您像这样检查它:

如果您使用LDAPFilter,位操作通过使用等效的LDAP语法1.2.840.113556.1.4.803来指定。通过指定值128,我们请求返回所有第八个低序位设置为“1”的记录。

哇,困难的部分结束了。命令的其余部分实际上只是关于格式化输出。

  • Properties useraccountcontrol

因为Get-ADUser命令检索一组默认属性,不包括UserAccountControl属性,所以您必须使用-Properties参数显式请求它。

  • Format-Table name, samaccountname,useraccountcontrol

Format-Table命令告诉PowerShell您希望如何格式化输出以及显示哪些属性。如果您希望结果垂直列出而不是在表格中,可以使用Format-List代替Format-Table

当然,您可以将所有输出到文件以进行进一步处理…

1
Get-ADUser -Filter 'useraccountcontrol -band 128' -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol | Out-File -Encoding ascii MyOutput.txt

** Bravo! 您坚持到了最后。**

感谢阅读,一如既往,如果您有与此主题相关的评论或精彩故事,请告诉我们!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计