关于哈希攻击的原理介绍
在内部入侵测试期间,横向移动是白帽子黑客技术人员寻求信息以提高他或他对信息系统的特权的重要组成部分。在这种情况下,被称为“传递哈希”的技术就非常有用,可以成为一组计算机上的管理员。我们将在这里详细介绍这种技术的工作原理。
NTLM协议
NTLM协议是Microsoft环境中使用的身份验证协议。特别是,它允许用户证明自己对服务器的身份,以便使用该服务器提供的服务。
注意:在本文中,术语“服务器”在客户端/服务器的意义上使用。“服务器”很可能是工作站。
image有两种可能的方案:
(1)用户使用服务器本地帐户的凭据,在这种情况下,服务器在其本地数据库中具有用户的机密,并且能够对用户进行身份验证;
(2)或在Active Directory环境中,用户在身份验证过程中使用域帐户,在这种情况下,服务器将不得不要求域控制器验证用户提供的信息。
在这两种情况下,身份验证都从客户端和服务器之间的质询/响应阶段开始。
挑战-回应
使用质询/响应原则,以便服务器验证用户是否知道他要进行身份验证的帐户的机密,而无需通过网络传递密码。这就是所谓的零知识证明。交换过程分为三个步骤:
- 协商:客户端告诉服务器它想对其进行身份验证(NEGOTIATE_MESSAGE)。
- 质询:服务器向客户端发送质询。这不过是随每个身份验证请求(CHALLENGE_MESSAGE)而变化的64位随机值。
- 响应:客户端使用其密码的哈希版本作为密钥来加密先前收到的质询,并将此加密版本以及其用户名以及可能的域(AUTHENTICATE_MESSAGE)返回给服务器。
如下图:
image你可以看到用户管理员试图连接到计算机LKAPP01.lion.king。
imageNTLM交换的顶部用红色框起来,底部是服务器响应中包含的信息CHALLENGE_MESSAGECHALLENGE_MESSAGE。在这里您将找到挑战。
在进行这些交换之后,服务器拥有两件事:
1.发送给客户的挑战;
2.用他的秘密加密的客户响应;
要完成身份验证,服务器只需检查客户端发送的响应的有效性。但是在此之前,让我们先检查一下客户的秘密。
认证机密
客户端使用密码的哈希版本作为密钥的原因如下:为了避免在服务器上以明文形式存储用户密码。它是存储的密码的哈希值。现在,此哈希是NT哈希,它不过是MD4函数的结果,不含盐值。
NThash = Md4(password)
综上所述,当客户端进行身份验证时,它使用其密码的MD4指纹来加密挑战。然后,让我们看一下收到此响应后在服务器端发生的情况。
认证方式
如前所述,有两种不同的方案。首先是用于身份验证的帐户是本地帐户,因此服务器知道此帐户,并且具有该帐户的机密副本。第二个是使用域帐户,在这种情况下,服务器不知道该帐户或其秘密。它必须将身份验证委派给域控制器。
本地帐号
在使用本地帐户进行身份验证的情况下,服务器将使用用户的私钥或用户密钥的MD4哈希对发送给客户端的质询进行加密。然后,它将检查其操作结果是否等于客户端的响应,从而证明用户具有正确的秘密。如果不是,则用户使用的密钥不是正确的密钥,因为挑战的加密无法提供预期的密钥。
为了执行此操作,服务器需要存储本地用户及其密码的哈希。该数据库的名称是SAM(安全帐户管理器)。可以在注册表中找到SAM,尤其是使用该regedit工具作为系统访问。可以使用psexec作为SYSTEM打开:
psexec.exe -i -s regedit.exe
副本也位于磁盘中:C:\Windows\System32\SAM。因此,它包含本地用户列表及其哈希密码,以及本地组列表。更准确地说,它包含哈希的加密版本。但是因为解密它们所需的所有信息也都在注册表中(SAM和SYSTEM),所以我们可以肯定地说哈希存储在其中。如果你想了解解密机制的工作原理,可以查看secretsdump.py代码或Mimikatz代码都是可以的。
可以备份SAM和SYSTEM数据库以提取用户的哈希密码数据库。
首先,我们将两个数据库保存在一个文件中。
reg.exe save hklm\sam save.save
reg.exe save hklm\system system.save
然后,我们可以使用secretsdump.py提取这些哈希。
secretsdump.py -sam sam.save -system system.save LOCAL
综上所述,这是验证过程。
image由于服务器发送质询并且客户端使用其秘密的哈希值对该挑战进行加密,然后使用其用户名将其发送回服务器,因此服务器将在其SAM中查找用户密码的哈希值数据库。收到挑战后,它还将加密先前使用该哈希发送的挑战,并将其结果与用户返回的挑战进行比较。如果相同,则说明用户已通过身份验证!否则,用户无法提供正确的机密。
域帐号
使用域帐户完成身份验证后,用户的NT哈希不再存储在服务器上,而是存储在域控制器上。用户想要对其进行身份验证的服务器会收到其质询的答案,但是无法检查该答案是否有效。它将把这个任务委托给域控制器。
为此,它将使用Netlogon服务,该服务能够与域控制器建立安全连接。此安全连接称为安全通道。之所以可以进行这种安全连接,是因为服务器知道自己的密码,而域控制器也知道服务器密码的哈希值。他们可以安全地交换会话密钥并安全地进行通信。
我不会详细介绍,但是想法是服务器将以NETLOGON_NETWORK_INFO的结构将不同的元素发送到域控制器:
(1)客户的用户名(身份)
(2)先前发送给客户的挑战(LmChallenge)
(3)客户端发送的对挑战的响应(NtChallengeResponse)
域控制器将在其数据库中查找用户的NT哈希。对于域控制器,它不在SAM中,因为它是试图进行身份验证的域帐户。这次它位于一个名为NTDS.DIT的文件中,该文件是所有域用户的数据库。检索NT哈希后,它将使用此哈希和质询计算预期的响应,并将此结果与客户端的响应进行比较。
然后,一条消息将发送到服务器(NETLOGON_VALIDATION_SAM_INFO4),指示客户端是否已通过身份验证,并且还将发送一堆有关用户的信息。这与使用Kerberos身份验证时在PAC中找到的信息相同。
综上所述,这是域控制器的验证过程。
image与之前相同,
(1)服务器发送质询
(2)客户端使用其秘密的哈希值对该挑战进行加密,并将其连同用户名和域名一起发送回服务器。这次,服务器将使用Netlogon服务,
(3)在安全通道中将此信息发送到域控制器。
(4)拥有此信息后,域控制器还将使用在其NTDS.DIT数据库中找到的用户哈希来对质询进行加密,然后将其结果与用户返回的结果进行比较。如果相同,
(5)对用户进行身份验证。否则,用户未提供正确的机密。在两种情况下,域控制器都将信息发送到服务器。
NT哈希所存在的安全隐患
在这些交换中从来不是用明文密码,而是使用名为NT哈希的哈希密码,他就是明文密码的简单哈希。
仔细想想,窃取纯文本密码或窃取哈希值是完全相同的。因为它是用于响应质询/响应的哈希,因此拥有哈希可以使用户向服务器进行身份验证。所以说将密码以明文显示根本没用。甚至可以说,在大多数情况下,拥有NT哈希与使用明文密码是相同的。
传递哈希
如果攻击者知道计算机本地管理员的NT哈希,则他可以使用此哈希轻松地向该计算机进行身份验证。同样,如果他具有主机上本地管理组成员的域用户的NT哈希,则他还可以作为本地管理员向该主机进行身份验证。
本地管理员
现在,让我们看看它在实际环境中如何工作:一位新员工到来,IT为他/她提供了一个工作站。IT部门没有足够的时间为每个员工从头开始安装和配置Windows系统。因此先设置一个安装和配置Windows系统的版本,以满足新员工的所有基本需求。这个称为master的基本版本保存在某处,并且该版本的副本提供给每个新手。
这意味着在使用同一主服务器初始化过的所有工作站上,本地管理员帐户都相同。如果这些主机之一受到攻击,并且攻击者从工作站的本地管理员帐户提取NT哈希,因为所有其他工作站都具有相同的管理员帐户和相同的密码,那么它们也将具有相同的NT哈希。然后,攻击者可以使用在受感染主机上找到的哈希,并在所有其他主机上重播该哈希以在它们上进行身份验证,以上的整个过程就叫做传递哈希。
image例如,我们发现用户管理员的NT哈希20cc650a5ac276a1cfc22fbc23beada1。我们可以在另一台计算机上重播它,并希望这台计算机以同样的方式配置。以下示例使用来自Impacket套件的psexec.py工具:
image此哈希也可以在新主机上使用,并且我们在它上面有一个管理员shell.
特权域帐户
还有另一种使用通过哈希技术的方法。假设对于远程公园管理,Active Directory中有一个“ HelpDesk”组。为了使该组的成员能够管理用户的工作站,将该组添加到每个主机的本地“管理员”组中。此本地组包含对计算机具有管理权限的所有实体。
你可以使用以下命令列出它们:
# Machine française
net localgroup Administrateurs
# ~Reste du monde
net localgroup Administrators
结果将是这样的:
Nom alias Administrateur
Commentaire Les membres du groupe Administrateurs disposent d'un accès complet et illimité à l'ordinateur et au domaine
Membres
-------------------------
Administrateur
ADSEC\Admins du domaine
ADSEC\HelpDesk
因此,我们拥有ADSEC\HelpDesk域组,该域组是主机的本地管理员组的成员。如果攻击者从该组成员之一中窃取了NT哈希,则他可以ADSEC\HelpDesk在管理员列表中的所有主机上进行身份验证。
与本地帐户相比,其优势在于,无论使用什么主服务器来设置计算机,该组都将由GPO添加到主机的配置中。该帐户具有独立于操作系统和计算机设置过程的更广泛的管理权限的可能性更大了。因此,当请求身份验证时,服务器会将身份验证委派给域控制器,如果身份验证成功,则域控制器将向服务器发送有关用户的信息,例如用户名,用户所属的组列表,密码到期日期等
然后,服务器将知道该用户是HelpDesk组的一部分,并向该用户授予管理员访问权限。
然后,服务器将知道该用户是HelpDesk组的一部分,并向该用户授予管理员访问权限。
另一个示例:我们发现用户的NT哈希jsnow为89db9cd74150fc8d8559c3c19768ca3f。此帐户是HelpDesk组的一部分,该组是所有用户工作站的本地管理员。让我们在另一台主机上使用他的哈希。
image同样,身份验证有效,我们成为了目标的管理员。
自动化
既然我们已经了解了NTLM身份验证的工作原理,以及为什么可以使用NT哈希对其他主机进行身份验证,则能够在不同目标上自动进行身份验证以通过并行化任务来获取尽可能多的信息将非常有用。
在此,建议使用CrackMapExec工具。CrackMapExec工具带有清晰密码或NT哈希的目标,凭据列表作为输入,并且可以在已对其进行身份验证的目标上执行命令。
# Compte local d'administration
crackmapexec smb --local-auth -u Administrateur -H 20cc650a5ac276a1cfc22fbc23beada1 10.10.0.1 -x whoami
# Compte de domaine
crackmapexec smb -u jsnow -H 89db9cd74150fc8d8559c3c19768ca3f -d adsec.local 10.10.0.1 -x whoami
以下是以simba用户为管理员的示例说明:
image传递哈希是在一些计算机上执行,然后计算机随后遭到破坏。已经向CrackMapExec传递了一个参数,来列出当前登录到这些计算机上的用户。
我们从连接的用户中检索所有NT哈希。由于我们已经是这些机器的管理员,因此不会显示这些机器帐户中的帐户,因此它们对我们没有用的。
通过哈希限制
传递散列是一项在服务器上启用NTLM身份验证时始终有效的技术,默认情况下,该技术是有效的。但是,Windows中有一些机制可以限制或可能限制管理任务。
在Windows上,使用Access令牌执行权限管理,这使得知道谁有权执行操作成为可能。“管理员”组的成员具有两个令牌。一个具有标准用户权限,另一个具有管理员权限。默认情况下,当管理员执行任务时,它是在标准的受限上下文中完成的。另一方面,如果需要管理任务,那么Windows将显示的这个此称为UAC(用户帐户控制)。
image可以看到出现用户警告:该应用程序请求管理权限。
那么远程执行哪些管理任务?两种情况是可能发生的。
1.属于主机“Administrators”组成员的域帐户都可以请求它们,在这种情况下,不会为此帐户激活UAC,他可以执行管理任务。
2.或者,它们是由主机“管理员”组成员的本地帐户请求的,在这种情况下,某些情况下(但并非始终)启用UAC。
为了了解第二种情况,让我们看一下两个注册表项,它们有时是未知的,但是在尝试使用本地管理帐户进行NTLM身份验证之后尝试执行管理任务时,它们起着关键作用。(LocalAccountTokenFilterPolicy、FilterAdministratorToken)
这里可以找到第一个注册表项:
HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System
可以是0或1。
默认情况下不存在,表示它是0。
(1)如果将其设置为“ 0”(默认值),则只有内置管理员帐户(RID 500)能够在没有UAC的情况下执行管理任务。由于将启用UAC,因此其他管理员帐户(即由用户创建然后添加为本地管理员的管理员帐户)将无法执行远程管理任务,因此它们只能使用其受限的访问令牌。
(2)如果将其设置为1,则“管理员”组中的所有帐户都可以执行内置或不内置的远程管理任务。
总结一下,这是两种情况:
1)LocalAccountTokenFilterPolicy = 0:仅RID 500“管理员”帐户可以执行远程管理任务
2)LocalAccountTokenFilterPolicy = 1:“管理员”组中的所有帐户都可以执行远程管理任务
FilterAdministratorToken
第二个注册表项位于注册表中的同一位置:
HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \ System
也可以是0或1。
默认情况下,它也默认为“ 0”。
(1)如果为0,则内置管理员帐户(RID 500)可以在没有UAC的情况下执行管理任务。该密钥不影响其他帐户。
(2)如果将其设置为1,则内置管理员帐户(RID 500)也将受UAC的约束,并且除非已将第一个密钥设置为,否则它将不再能够执行远程管理任务1。
总结一下,这是两种情况:
1)FilterAdministratorToken = 0:内置的管理员帐户可以执行远程管理任务
2)FilterAdministratorToken = 1:内置帐户Administrator不能执行远程管理任务,除非LocalAccountTokenFilterPolicy将其设置为1。
概要
这是一个小的汇总表。对于两个注册表项的每种组合,此表指示是否可以使用内置管理员帐户和非本机管理员帐户进行远程管理任务。粗体为默认值。
image结论
如今,NTLM身份验证仍在公司中广泛使用。以过往的经验来说,也从未见过能够在整个网络上禁用NTLM的环境。那这就这意味着,传递哈希的攻击仍然非常有效的。
此技术是NTLM协议固有的,但是可以通过避免在所有工作站上使用相同的本地管理密码来限制损坏。Microsoft的LAPS解决方案是其中一种解决方案,可以通过确保所有工作站上的密码(以及NT哈希值)都不同来自动管理本地管理员密码。
参考及来源:https://en.hackndo.com/pass-the-hash/
免责申明:本文由互联网整理翻译而来,仅供个人学习参考,如有侵权,请联系我们,告知删除。