当前位置: 首页 > 科技观察

pass-the-hash攻击原理介绍

时间:2023-03-22 10:27:10 科技观察

在渗透测试中,为了提高审计人员对信息系统的权限,很多人会选择横向移动的方式。在这种情况下,一种被称为传递哈希(PassTheHash)的技术被广泛使用,使审核员成为计算机上的管理员。NTLM协议NTLM协议是在Microsoft环境中使用的一种身份验证协议,具体来说,它允许用户向服务器证明他们是谁,以便使用该服务器提供的服务。注意:在本文中,术语“服务器”用于客户端/服务器意义上,“服务器”很可能是工作站。有两种可能的情况:1.用户使用服务器本地帐户的凭据,在这种情况下,服务器将在其本地数据库中拥有用户的秘密,并且能够对用户进行身份验证。2.在ActiveDirectory环境中,用户在认证时使用域帐户,在这种情况下,服务器必须要求域控制器验证用户提供的信息。在这两种情况下,身份验证都从客户端和服务器之间的质询/响应阶段开始。质询/响应使用质询/响应原则,以便服务器验证用户是否知道他正在验证的帐户的秘密,而无需通过网络传递密码。这称为零知识证明。整个过程分为3个步骤:1.协商:客户端告诉服务器它要对它进行身份验证(NEGOTIATE_MESSAGE)。2.挑战:服务器向客户端发送挑战。这只不过是一个随每个身份验证请求(CHALLENGE_MESSAGE)而变化的64位随机值。3.响应:客户端使用其密码的散列版本作为密钥对先前收到的质询进行加密,并将此加密版本连同其用户名和域(AUTHENTICATE_MESSAGE)一起返回给服务器。可以看到用户administrator正在尝试连接电脑LKAPP01.lion.king。NTLM交换框的顶部是红色的,底部是服务器对CHALLENGE_MESSAGE的响应中包含的信息。在这些交换之后,服务器有两件事:1.发送给客户端的挑战;2.客户端的响应用自己的秘密加密。为完成身份验证,服务器只需检查客户端发送的响应的有效性。但在此之前,让我们检查一下客户端机密。AuthenticationSecret我们说客户端使用密码的散列版本作为密钥,原因如下:为了避免在服务器上以明文形式存储用户密码,它是存储密码的散列。现在,这个散列是一个NT散列,它只是MD4函数的结果,没有加盐。NThash=MD4(password)综上所述,当客户端进行身份验证时,它使用其密码的MD4指纹来加密质询。然后,让我们看看服务器端收到这个响应后发生了什么。身份验证如前所述,有两种不同的身份验证方案。首先,用于身份验证的帐户是本地帐户,因此服务器知道它并拥有它的秘密副本。第二种是使用域帐户,在这种情况下服务器不知道该帐户或其机密,它必须将身份验证委托给域控制器。本地帐户在使用本地帐户进行身份验证的情况下,服务器将使用用户密钥(更准确地说,是用户秘密的MD4散列值)对发送给客户端的质询进行加密。然后它将检查其操作结果是否等于客户端的响应,从而证明用户拥有正确的秘密。如果不是,则用户没有使用正确的密钥,因为挑战的加密没有给出预期的密钥。为此,服务器需要存储本地用户的哈希值及其密码。该数据库的名称是SAM(安全帐户管理器)。SAM可以在注册表中找到,尤其是在使用regedit工具时,但只能作为系统访问。但是,它也可以用psexec打开:psexec.exe-i-sregedit.exe的副本也位于磁盘C:\Windows\System32\SAM,因此它包含本地用户列表及其散列密码,以及本地组列表。更准确地说,它包含哈希的加密版本。然而,由于解密它们所需的所有信息也在注册表中(SAM和SYSTEM),我们可以肯定地说哈希存储在那里。如果你想了解解密机制是如何工作的,你可以查看secretsdump.py代码或Mimikatz代码。可以备份SAM和SYSTEM数据库以提取用户的散列密码数据库。首先,我们将两个数据库保存在一个文件中。reg.exesavehklm\samsave.savereg.exesavehklm\systemsystem.save然后我们可以使用secretsdump.py来提取这些哈希值。上面的secretsdump.py-samsam.save-systemsystem.saveLOCAL就是整个验证过程。由于服务器发送质询(1),并且客户端使用其秘密的哈希值对该质询进行加密,并使用其用户名(2)将其发送回服务器,因此服务器将在其SAM哈希值中查找用户密码数据库(3)。当它收到质询时,它还会使用此哈希(4)加密先前发送的质询,并将其结果与用户返回的质询进行比较。如果相同(5),则用户通过身份验证!否则,用户没有提供正确的秘密。域帐户当使用域帐户进行身份验证时,用户的NT哈希不再存储在服务器上,而是存储在域控制器上。用户希望他们经过身份验证的服务器收到对他们质询的答复,但无法检查答复是否有效。它将此任务委托给域控制器。为此,它将使用Netlogon服务,该服务能够与域控制器建立安全连接。这种安全连接称为安全通道,这是可能的,因为服务器知道自己的密码,域控制器也知道服务器密码的哈希值,它们可以安全地交换会话密钥并安全地进行。沟通。具体我就不细说了,大意是服务器会在NETLOGON_NETWORK_INFO这个结构体中向域控制器发送不同的元素:1.客户端的用户名(Identity);2.之前发送给客户端的挑战(LmChallenge);3.客户端对端发送的挑战(NtChallengeResponse)的响应。域控制器将在其数据库中查找用户的NT哈希,在域控制器的情况下,它不在SAM中,因为它是一个试图进行身份验证的域帐户。这次它位于一个名为NTDS.DIT??的文件中,该文件是所有域用户的数据库。检索到NT散列后,它使用该散列和质询来计算预期的响应并将此结果与客户端的响应进行比较。然后将向服务器发送一条消息(NETLOGON_VALIDATION_SAM_INFO4),指示客户端是否已通过身份验证,它还将发送一组有关用户的信息。这与使用Kerberos身份验证时在PAC中找到的信息相同。以下是域控制器的身份验证方式:和以前一样,服务器发送质询(1),客户端使用其秘密哈希加密质询并将其与用户名和域名一起发送回服务器(2)。这次服务器将使用Netlogon服务(3)通过安全通道将此信息发送到域控制器。有了这些信息,域控制器还使用在其NTDS.DIT??数据库(4)中找到的用户哈希对质询进行加密,然后将其结果与用户返回的结果进行比较。如果相同(5),则用户已通过身份验证。否则,用户没有提供正确的秘密。在这两种情况下,域控制器都会将信息发送到服务器(6)。NT散列的安全隐患在这些交换中从不使用明文密码,而是使用称为NT散列的散列密码,它是明文密码的简单散列。仔细想想,窃取明文密码或窃取哈希是完全一样的事情。由于它是用于响应质询/响应的散列,因此让该散列对服务器进行身份验证。因此,以明文形式显示密码根本没有用。可以说在大多数情况下使用NT哈希与使用明文密码是一样的。传递哈希如果攻击者知道计算机本地管理员的NT哈希,他可以使用此哈希轻松验证该计算机。同样,如果他拥有作为主机上本地管理员组成员的域用户的NT哈希,他也可以作为本地管理员向主机进行身份验证。本地管理员现在,让我们看看它在真实环境中是如何工作的:一位新员工来到公司,公司为他/她提供了一个工作站。IT部门没有足够的时间为每位员工从头开始安装和配置Windows。因此,首先设置一个安装和配置Windows系统的版本,以满足新员工的所有基本需求和要求。然后,这个称为master的基础版本被保存在某个地方,这个版本的副本被发给每个新来的人。这意味着本地管理员帐户在使用同一主服务器初始化的所有工作站上都??是相同的。如果其中一台主机受到威胁并且攻击者从工作站的本地管理员帐户中提取NT哈希,由于所有其他工作站都具有相同的管理员帐户和相同的密码,因此它们也将具有相同的NT哈希。然后,攻击者可以使用在受感染主机上找到的哈希值,并在所有其他主机上重放该哈希值,以便在这些主机上进行身份验证,整个过程称为传递哈希值。例如,我们发现用户admin的NT哈希是20cc650a5ac276a1cfc22fbc23beada1。我们可以在另一台电脑上重播,希望这台电脑配置相同。以下示例使用Impacket套件中的psexec.py工具:是的,此哈希也适用于新主机,我们在其上有一个管理shell。特权域帐户还有另一种使用哈希传递技术的方法,假设对于远程公园管理,ActiveDirectory中有一个“HelpDesk”组。要使该组的成员能够管理用户的工作站,请将该组添加到每个主机的本地“管理员”组中。此时,该本地组包含在计算机上具有管理权限的所有对象中。你可以列出它们:#Machinefran?aisenetlocalgroupAdministrateurs#~ResedumondenetlocalgroupAdministrators结果将是这样的:AdminsdudomaineADSEC\HelpDesk所以我们有ADSEC\HelpDesk域组,它是主机本地管理员组的成员。如果攻击者从该组的一个成员那里窃取了NT哈希,他可以使用管理员列表中的ADSEC\HelpDesk在所有主机上进行身份验证。与本地帐户相比的优势在于,无论使用什么主机来设置计算机,GPO都会将该组添加到主机的配置中。无论操作系统和计算机设置过程如何,该帐户更有可能拥有更广泛的管理权限。所以当请求认证时,服务器会将认证委托给域控制器,如果认证成功,域控制器会向服务器发送有关用户的信息,例如用户名、用户所属的组列表、密码到期日期等。然后服务器将知道该用户是HelpDesk组的一部分,并授予该用户管理员访问权限。另一个例子:我们发现用户jsnow的NT哈希为89db9cd74150fc8d8559c3c19768ca3f。该帐户是HelpDesk组的一部分,该组是所有用户工作站的本地管理员,让我们在另一台主机上使用他的哈希值。同样,身份验证成功,我们成为目标设备的管理员。自动化既然我们已经了解了NTLM身份验证的工作原理,以及为什么可以使用NT哈希来验证其他主机,那么通过并行化任务来自动执行不同目标的身份验证过程以获取尽可能多的信息将非常有用。有用。在这里,我推荐使用CrackMapExec工具。#Comptelocald'administrationcrackmapexecsmb--local-auth-uAdministrateur-H20cc650a5ac276a1cfc22fbc23beada110.10.0.1-xwhoami#Comptededomainecrackmapexecsmb-ujsnow-H89db9cd74150fc8d8559c3c19768ca3f-dadsec.local10.10.0.1-xwhoami以下就是以simba用户为管理员的示例说明:传递哈希在一些计算机上执行,这些计算机随后遭到破坏。一个参数已传递给CrackMapExec以列出当前登录到这些计算机的用户。拥有已连接用户的列表很好,但拥有他们的密码或NT哈希值就更好了!为此,我开发了lsassy,一个远程提取lsass秘密的工具。我们从连接的用户那里检索所有NT哈希值,因为我们已经是这些计算机的管理员,所以不会显示来自计算机帐户的文件。哈希传递限制哈希传递是一种在服务器上启用NTLM身份验证时始终有效的技术,并且默认情况下有效。但是,Windows中有限制或可能限制管理任务的机制。在Windows上,访问令牌用于执行权限管理,以便可以知道谁有权做什么。“管理员”组的成员有两个令牌。一个具有标准用户权限,另一个具有管理员权限。默认情况下,当管理员执行任务时,它是在标准的、有限的上下文中执行的。另一方面,如果需要管理任务,Windows将显示这个众所周知的窗口,称为UAC(用户帐户控制)。可以看到出现用户警告:应用程序请求管理权限。那么远程执行的管理任务是什么?有两种可能性。1.作为主机“管理员”组成员的域帐户可以请求它们,在这种情况下,该帐户未激活UAC,他可以执行他的管理任务。2.由作为主机“管理员”组成员的本地帐户请求,在这种情况下,UAC在某些情况下启用,但并非总是如此。要了解第二种情况,让我们看一下两个注册表项,它们有时是未知的,但是当尝试使用本地管理帐户在NTLM身份验证后执行管理任务时,有两个项(LocalAccountTokenFilterPolicy、FilterAdministratorToken)起着关键作用。下表总结了可以对主机进行身份验证的这两个注册表项的每个组合。总结今天,NTLM身份验证在公司中仍然被广泛使用。根据我的经验,我从未见过可以在整个网络上禁用NTLM的环境。这意味着传递哈希攻击仍然非常有效。此技术是NTLM协议固有的,但可以通过避免在所有工作站上使用相同的本地管理密码来缓解。Microsoft的LAPS解决方案就是这样一种解决方案,它通过确保所有工作站上的密码(还有NT哈希值)不同来工作。本文翻译自:https://en.hackndo.com/pass-the-hash/如有转载请注明出处。