使用可逆加密存储的密码,即使它们非常长,也可以被攻击者轻易的逆向破解。
破解密码是一个非常有趣的挑战,Hashcat系列软件是非常强大的开源的密码破译软件,号称世界上最快的密码破解软件。Hashcat是基于GPGPU规则引擎,免费多GPU(高达128个GPU),多哈希,多操作系统(Linux和Windows本地二进制文件),多平台(OpenCL和CUDA支持),多算法,资源利用率低,支持分布式破解等,配合强大的字典,可以破译超过百分之九十的密码。启动Hashcat意味着密码破解的成功率超过了一半,该工具分析一堆哈希的时间仅需几分钟。目前最新版本为4.01,Hashcat目前支持各类公开算法高达247类,市面上公开的密码加密算法基本都支持!
hashcat系列软件在硬件上支持使用CPU、NVIDIA GPU、ATI GPU来进行密码破解。在操作系统上支持Windows、Linux平台,并且需要安装官方指定版本的显卡驱动程序,如果驱动程序版本不对,可能导致程序无法运行。NVIDIA users GPU破解驱动需要ForceWare 331.67以及更高版本,AMD用户则需要Catalyst 14.9以及更高版本,可以通过Catalyst自动侦测和下载检测工具来检测系统应该下载那个版本,点此下载。
简而言之,密码破解工具的破解原理都是通过获取潜在密码(例如Autumn2018),然后计算对应的哈希值。之后,Hashcat将新计算的代表Autumn2018的哈希值与你给出的哈希值列表进行比较。如果找到一个或多个匹配项,则表示这些帐户使用的是密码Autumn2018。
一切提取工作都开始于从域控制器中提取哈希值。通常情况下,提取者会提升到域管理并登录到域控制器以获得所需的文件。
有时甚至更容易,只要有一个备份文件可供较低权限的帐户访问,且该文件包含Active Directory(AD)数据库即可。
由于提取者无法复制活动且正在运行的AD数据库(它在使用时被锁定),因此提取者会创建一个VSS快照并将ntds.dit文件与包含提取哈希所需的BOOTKEY的SYSTEM注册表配置单元一起复制。本文所讲样本的研究者通常使用内置的ntdsutil命令执行此操作,然后再使用Impacket secretsdump Python脚本来实际从数据库中提取哈希值。
secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL -outputfile breakme
虽然以上的操作经常会出现包含NTLM哈希值的* .NTDS文件,但在最近的测试中,脚本还会输出扩展名为“.CLEARTEXT”的文件。(为了保护测试者的隐私,有些样本是在实验室中重新创建的,但这确实发生在实际测试中。)
secretsdump脚本使用outputfile参数指定的前缀“breakme”将所有哈希值写入文件,在本文列举的案例中,发现了NTLM哈希,明文哈希和Kerberos密钥。事实证明,“CLEARTEXT”文件包含相关用户的明文密码,其中包括几个长度为128个字符的密码!所以,这篇文章主要讲的是CLEARTEXT文件。
CLEARTEXT文件实际上有一个包含每个用户帐户和相应的明文密码的输出文件,不需要破解。当然,研究者立即抽查了其中的一些账户(一个域管理帐户),看看密码是否有效,经过一番调查,研究人员了解到至少有几种不同的机制会强制存储明文凭据。
注意:Cleartext并不真正意味着密码按原样存储,它们使用RC4加密以加密形式存储。用于加密和解密的密钥是SYSKEY,它存储在注册表中,可以由域管理员提取。这意味着哈希值可以简单地逆向为明文值,因此称为“可逆加密”。
对于使用可逆加密存储密码的帐户,Active Directory Users and Computers (ADUC)中的帐户属性可能会显示使用可逆加密检查存储密码的复选框。
研究人员可以使用以下PowerShell命令,为UserAccountControl属性中设置了可逆加密标志的任何用户查询AD。
Get-ADUser -Filter ‘useraccountcontrol -band 128’ -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol
如果你想要了解有关此命令语法的详细信息,请向下滚动到标题为In the Weeds的底部。否则,只需说上面的命令就可以获得所有已配置为使用可逆加密存储密码的帐户。
也许你会好奇,为什么会以这种方式存储凭据呢?答案是某些应用程序需要这种存储机制。为此,微软为需要知道用户密码值的应用程序提供了这种机制,以强制存储可逆加密的密码,以便对用户进行身份验证。目前我所知道的需要可逆加密的应用程序是MS CHAP,SASL摘要式身份验证,需要对Windows域进行身份验证的旧MacOS主机。不过,也很可能还有其他第三方应用程序也使用它。
以下是Microsoft关于此设置的最佳实践提示:
1.尽管需要域管理员使用上面所示的方法从Active Directory数据库中提取散列,但这意味着DA(或被盗的DA帐户)可以轻松的学习其他用户的密码。这违反了不可否认(non-repudiation )原则,该原则会防止用户对信息系统内的活动进行有争议的活动。
2.研究人员经常找到包含VSS快照的备份集,这些快照提供对AD数据库的访问。备份集通常可以被较低权限的帐户访问,甚至可以被所有域用户访问。在这种情况下,任何域用户都可以轻松访问使用可逆加密存储的任何帐户密码。
下面是使用PowerShell从Active Directory中提取使用可逆加密存储密码的用户的命令:
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相同,它的功能与Filter相同,但是使用的是LDAP查询语法。找到所需UserAccountControl值的正确语法是:
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”。在可逆加密的情况下,第8个低阶位将被设置为“1”。第8位低阶位对应于十进制值128位。
要访问此特定值中特定位的值,必须使用逻辑位级操作。要了解有关位级操作的更多信息,你可以在此处或点此查看。在本文的案例中,-band 128表示使用值为128的位级AND运算来确定是否设置了第8个低位(无论在32位值内设置了哪些其他位)。
如果使用得是LDAPFilter,则通过使用按位操作符(Bitwise operators) 的等效LDAP语法1.2.840.113556.1.4.803来指定按位操作。
通过指定值128,研究人员请求返回第8个低阶位设置为“1”的所有记录。最困难的部分结束了,命令的其余部分实际上只是格式化输出。
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制数值。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。
Properties useraccountcontrol:由于Get-ADUser命令检索不包含UserAccountControl属性的默认属性集,因此必须使用-Properties参数在结果中明确询问它。
Format-Table name, samaccountname,useraccountcontrol:Format-Table命令会告诉PowerShell如何将输出格式化以及要显示哪些属性。如果希望垂直列出而不是在表中列出结果,可以使用Format-List而不是Format-Table。当然,你可以将其全部输出到文件中以供进一步处理。
Get-ADUser -Filter ‘useraccountcontrol -band 128’ -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol | Out-File -Encoding ascii MyOutput.txt