传递哈希攻击的原理详解
发布时间:2022-07-11 15:13:37 所属栏目:安全 来源:互联网
导读:在渗透测试期间,为了提高审核员对信息系统的权限,很多人都会选择横向移动方法。在这种情况下,称为Pass The Hash(传递哈希)的技术被广泛应用,使审核员成为计算机上的管理员。 NTLM协议 NTLM协议是在Microsoft环境中使用的一种身份验证协议,特别是,它
在渗透测试期间,为了提高审核员对信息系统的权限,很多人都会选择横向移动方法。在这种情况下,称为Pass The Hash(传递哈希)的技术被广泛应用,使审核员成为计算机上的管理员。 NTLM协议 NTLM协议是在Microsoft环境中使用的一种身份验证协议,特别是,它允许用户向服务器证明自己是谁,以便使用该服务器提供的服务。 注意:在本文中,术语“服务器”是在客户端/服务器意义上使用的,“服务器”很可能是一个工作站。 有两种可能的情况: 1. 用户使用服务器的本地帐户的凭据,在这种情况下,服务器在其本地数据库中便含有用户的秘密,将能够对用户进行身份验证。 2. 在Active Directory环境中,用户在身份验证期间使用域帐户,在这种情况下,服务器必须要求域控制器验证用户提供的信息。 在这两种情况下,身份验证都是从客户端和服务器之间的挑战/响应阶段开始的。 挑战/响应 使用挑战/响应原则,以便服务器验证用户是否知道他正在验证的帐户的秘密,而不需要通过网络传递密码。这被称为零知识证明。整个过程分3步: 1.协商:客户端告诉服务器它想要对其进行身份验证(NEGOTIATE_MESSAGE)。 2.挑战:服务器向客户端发送一个挑战。这只不过是一个64位的随机值,随每个身份验证请求而变化(CHALLENGE_MESSAGE)。 3.响应:客户端使用其密码的哈希版本作为密钥加密先前接收到的挑战,并将此加密版本连同其用户名和域(AUTHENTICATE_MESSAGE)返回给服务器。 你可以看到用户管理员试图连接到计算机LKAPP01.lion.king。 NTLM交换框顶部是红色的,底部是服务器响应CHALLENGE_MESSAGE中包含的信息。在这些交换之后,服务器拥有两件东西: 1. 发送给客户端的挑战; 2. 客户端的响应被自身的秘密加密了。 要完成身份验证,服务器只需检查客户端发送的响应的有效性。但在那之前,让我们来检查一下客户的秘密。 身份验证的秘密 我们说过,客户端使用一个哈希版本的密码作为密钥,原因如下:为了避免在服务器上以明文形式存储用户密码,它是存储的密码的哈希值。现在,此哈希是NT哈希,它不过是MD4函数的结果,不含盐值。 1. 综上所述,当客户端进行身份验证时,它使用其密码的MD4指纹来加密挑战。然后,让我们看看接收到此响应后服务器端会发生什么。 身份验证 如前所述,有两种不同的身份验证情况。首先,用于身份验证的帐户是一个本地帐户,因此服务器知道这个帐户,并拥有该帐户的秘密副本。第二种是使用域帐户,在这种情况下服务器不知道这个帐户或它的秘密,它必须将身份验证委托给域控制器。 本地帐户 在使用本地帐户进行身份验证的情况下,服务器将使用用户的密钥(更确切地说是用户秘密的MD4哈希) 对发送给客户端的挑战进行加密。然后,它将检查其操作的结果是否等于客户端的响应,从而证明用户拥有正确的秘密。如果没有,则用户使用的密钥不是正确的,因为挑战的加密没有给出预期的密钥。 为了执行此操作,服务器需要存储本地用户及其密码的哈希。这个数据库的名称是SAM(安全帐户管理器)。可以在注册表中找到SAM,特别是使用regedit工具时,但只能作为系统访问。不过,还可以使用psexec打开: 1. 副本也位于C:WindowsSystem32SAM的磁盘上,因此,它包含本地用户列表及其哈希密码,以及本地组列表。更准确地说,它包含了哈希的加密版本。但是,由于解密它们所需的所有信息也在注册表(SAM和SYSTEM)中,所以我们可以肯定地说哈希存储在其中。如果你想了解解密机制是如何工作的,你可以查看secretsdump.py代码或Mimikatz代码。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |