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

本文详细描述了作者在渗透测试中发现Active Directory使用可逆加密存储密码的过程,包括提取NTDS数据库、使用Impacket工具解密密码的技术细节,以及如何检测和防范此类安全风险。

如何破解128位密码

Sally Vandeven//

TL;DR - 即使密码非常长(如128位),如果使用可逆加密存储,攻击者也能轻松解密。

密码破解是件令人愉悦的事。启动Hashcat、扔进一堆哈希值,然后看着进度条从几分钟变成几小时甚至几天,这种感觉非常满足。你可以一边做其他测试、遛狗,甚至在海滩上喝鸡尾酒,而它就在后台默默工作。

密码破解器的工作原理是获取一个潜在密码(比如Autumn2018),计算其哈希值,然后将新计算的哈希值与提供的哈希列表进行比对。如果找到匹配项,就意味着这些账户使用了相同的密码。

从域控制器提取哈希

整个过程通常从域控制器提取哈希开始。大多数情况下,我们会提升到域管理员权限,登录域控制器获取所需文件。

小提示:有时甚至更简单。某些情况下,低权限账户可以访问包含Active Directory(AD)数据库的备份文件。

由于无法直接复制正在运行的AD数据库(它会被锁定),我们会创建一个VSS快照,并复制ntds.dit文件以及包含BOOTKEY的SYSTEM注册表配置单元。通常使用内置的ntdsutil命令完成:

1
ntdsutil "ac i ntds" "ifm" "create full C:\temp" q q

然后使用Impacket的secretsdump Python脚本从数据库中提取哈希:

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

意外的明文密码

通常我们会看到包含NTLM哈希的.NTDS文件,但在最近的一次测试中,脚本还输出了一个扩展名为.CLEARTEXT的文件(为了保护客户,这是在实验室重现的,但确实发生在实际测试中)。

secretsdump脚本将所有哈希输出到以breakme为前缀的文件中。这次它找到了NTLM哈希、明文哈希和Kerberos密钥。.CLEARTEXT文件包含了相关用户的明文密码,包括几个长达128字符的密码!

可逆加密的机制

需要注意的是,“明文"并不完全意味着密码以原始形式存储。它们实际上是用RC4加密的,加密和解密的密钥是SYSKEY(存储在注册表中,可由域管理员提取)。这意味着哈希可以轻松解密为明文值,因此称为"可逆加密”。

在Active Directory用户和计算机(ADUC)中,如果账户配置为使用可逆加密存储密码,账户属性会显示"使用可逆加密存储密码"选项。

检测可逆加密账户

可以使用以下PowerShell命令查询AD中设置了可逆加密标志的用户:

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

为什么需要可逆加密?

主要原因是某些应用程序需要它。微软提供了这种机制,以便需要知道用户密码值的应用程序能够验证用户身份。已知需要可逆加密的应用程序包括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来垂直列出结果。

当然,你也可以将所有输出写入文件以便进一步处理:

1
Get-ADUser -Filter 'useraccountcontrol -band 128' -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol | Out-File -Encoding ascii MyOutput.txt
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计