如何破解128位密码
Sally Vandeven//
TL;DR - 即使密码非常长(如128位),如果使用可逆加密存储,攻击者也能轻松解密。
密码破解是件令人愉悦的事。启动Hashcat、扔进一堆哈希值,然后看着进度条从几分钟变成几小时甚至几天,这种感觉非常满足。你可以一边做其他测试、遛狗,甚至在海滩上喝鸡尾酒,而它就在后台默默工作。
密码破解器的工作原理是获取一个潜在密码(比如Autumn2018
),计算其哈希值,然后将新计算的哈希值与提供的哈希列表进行比对。如果找到匹配项,就意味着这些账户使用了相同的密码。
从域控制器提取哈希
整个过程通常从域控制器提取哈希开始。大多数情况下,我们会提升到域管理员权限,登录域控制器获取所需文件。
小提示:有时甚至更简单。某些情况下,低权限账户可以访问包含Active Directory(AD)数据库的备份文件。
由于无法直接复制正在运行的AD数据库(它会被锁定),我们会创建一个VSS快照,并复制ntds.dit
文件以及包含BOOTKEY的SYSTEM注册表配置单元。通常使用内置的ntdsutil
命令完成:
|
|
然后使用Impacket的secretsdump
Python脚本从数据库中提取哈希:
|
|
意外的明文密码
通常我们会看到包含NTLM哈希的.NTDS
文件,但在最近的一次测试中,脚本还输出了一个扩展名为.CLEARTEXT
的文件(为了保护客户,这是在实验室重现的,但确实发生在实际测试中)。
secretsdump
脚本将所有哈希输出到以breakme
为前缀的文件中。这次它找到了NTLM哈希、明文哈希和Kerberos密钥。.CLEARTEXT
文件包含了相关用户的明文密码,包括几个长达128字符的密码!
可逆加密的机制
需要注意的是,“明文"并不完全意味着密码以原始形式存储。它们实际上是用RC4加密的,加密和解密的密钥是SYSKEY(存储在注册表中,可由域管理员提取)。这意味着哈希可以轻松解密为明文值,因此称为"可逆加密”。
在Active Directory用户和计算机(ADUC)中,如果账户配置为使用可逆加密存储密码,账户属性会显示"使用可逆加密存储密码"选项。
检测可逆加密账户
可以使用以下PowerShell命令查询AD中设置了可逆加密标志的用户:
|
|
为什么需要可逆加密?
主要原因是某些应用程序需要它。微软提供了这种机制,以便需要知道用户密码值的应用程序能够验证用户身份。已知需要可逆加密的应用程序包括MS CHAP、SASL摘要认证以及需要验证Windows域的旧版MacOS主机。可能还有其他第三方应用程序也使用它。
安全建议
微软关于此设置的最佳实践建议是:除非应用程序需求超过保护密码信息的需求,否则不要启用此策略。
关键要点
即使需要域管理员权限才能使用上述方法从AD数据库中提取哈希,这也意味着域管理员(或被窃取的域管理员账户)可以轻松获取其他用户的密码。这违反了不可否认性原则(即用户不能否认其在信息系统中的活动)。
我们经常发现包含VSS快照的备份集,这些备份集通常可由低权限账户甚至所有域用户访问。在这种情况下,任何域用户都可能轻松访问使用可逆加密存储的任何账户密码。
技术细节
UserAccountControl
属性是Active Directory中与用户账户设置相关的32位属性。每个位代表特定设置。对于可逆加密,第8个低位被设置为"1",对应的十进制值为128。要访问这些位的值,需要使用逻辑位级操作。
在PowerShell中,-band 128
表示使用位与操作来确定第8个低位是否被设置(无论32位数字中的其他位如何设置)。这基本上只隔离了一个位并允许你检查它。
如果使用LDAPFilter
,位操作通过等效的LDAP语法1.2.840.113556.1.4.803
指定。通过指定值128,我们要求返回所有第8个低位设置为"1"的记录。
输出格式
Get-ADUser
命令默认检索的属性集不包括UserAccountControl
属性,因此需要使用-Properties
参数显式请求它。Format-Table
命令告诉PowerShell如何格式化输出以及显示哪些属性。你也可以使用Format-List
来垂直列出结果。
当然,你也可以将所有输出写入文件以便进一步处理:
|
|