NTLM认证协议

发布时间 2023-09-18 22:04:30作者: ntrack

NTLM认证协议

介绍

NTLM(NT LAN Manager)最早使用在Windows NT操作系统,被广泛应用于工作组和域环境。现在在一些旧系统或者老的应用程序可能还在使用,用于用户身份验证(在网络上验证用户的身份,以便他们可以访问共享资源,如文件、打印机和应用程序)。NTLM协议的认证, 包括 NTLMv1 和 NTLMv2 两个版本。

认证原理

NTLM的认证原理主要通过对比客户端和服务端加密后的数据,判断其是否一致,以确定用户身份。即NTLM通过挑战-响应机制来工作,服务器向客户端发送随机挑战,客户端使用用户密码的散列值生成响应,服务器验证响应以确定用户的身份。

在C:\Windows\System32\config目录下的SAM文件(可视为一个数据库)是操作系统存储用户名、密码哈希值以及帐户等各种属性的地方,这里保留了计算机本地所有用户的凭证信息。(Windows本身不保存明文密码,只保留密码的Hash)

NTLM和SAM的交互:

当用户登录Windows计算机需要输入密码的时候,操作系统会使用SAM的信息来验证用户的真实性,如果通过验证则可以访问其用户下被授权的资源。

验证的过程是NTLM协议来验证,但NTLM不存储信息,需要依靠SAM提供信息

大概交互过程:

winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)

首先,用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,接收输入后,将密码交给lsass进程这个进程中会存一份明文密码,将明文密码加密成NTLM Hash,对SAM数据库比较认证。

NTLM Hash与NTLM

NTLM Hash是NTLM协议中的一个关键概念(NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议),用于存储用户密码的散列值。NTLM Hash是密码的散列表示,而不是明文密码。

NTLM Hash的产生

需要经过3次不同的加密,分别是十六进制编码、unicode转化,MD4加密,最后的十六进制加密结果就是NTML Hash

admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

hash密码格式

Windows环境下hash密码格式为:用户名称:SID:LM-HASH值:NT-HASH值

Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::
用户名:Administrator
SID:500
LM-HASH:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH:683020925C5D8569C23AA724774CE6CC

Windows下LM Hash值生成原理

  1. 密码准备:首先,将用户的密码转换为大写字母。LM Hash 不区分大小写,所以所有的字符都被强制转换为大写。
  2. 密码填充:如果密码的长度不足 14 个字符,会用空格字符填充至 14 个字符。
  3. 密码分割:然后,将这 14 个字符的密码分成两个 7 字符的块。
  4. 字符转换:将每个 7 字符块转换为 56 位的二进制数值。这是通过将每个字符转换为 8 位 ASCII 码值,并将其合并成一个 56 位的二进制数。
  5. 创建两个 56 位块:将第一个 7 字符块的 56 位数分成两个 32 位块和一个 8 位块。将第二个 7 字符块的 56 位数分成两个 32 位块。
  6. 使用 DES 加密:使用两个 DES 密钥(通常是固定的)对这两个 32 位块进行分别加密。这将生成两个 64 位的二进制数。
  7. 合并两个 64 位块:将这两个 64 位块合并成一个 128 位的 LM Hash 值。

Windows下NTLM Hash生成原理:

  1. 密码准备:首先,将用户的密码转换为 Unicode 格式。Unicode 是一种字符编码,它支持更广泛的字符集,而不仅仅是 ASCII 字符。NTLM 使用 Unicode 编码来处理密码。

  2. 创建密码的散列值:接下来,使用密码的 Unicode 编码形式来创建密码的散列值。通常,这个过程涉及到以下步骤:

  • 使用 UTF-16 编码(Unicode 编码的一种形式)将密码转换为字节序列。UTF-16 使用 2 个字节来表示每个字符。

  • 对密码的字节序列应用一种哈希函数,通常使用 MD4(Message Digest Algorithm 4)算法。这将生成一个固定长度的散列值(通常是 16 字节,即 128 位)。

  1. 得到 NTLM Hash:生成的散列值就是 NTLM Hash。这个 128 位的散列值被用于在 Windows 中验证用户的身份。

NTLM认证过程

NTLM协议的认证过程分为三步:

  • 协商

    主要用于确认双方协议版本

  • 质询

    挑战(Chalenge)/响应(Response)认证机制起作用的范畴

  • 验证

    主要是在质询完成后,验证结果,是认证的最后一步

完整过程

协商

  • 客户端向服务器发送登录请求。

质询

  • 服务器生成一个随机的挑战(challenge)并将其发送给客户端。

  • 客户端接收挑战后,使用用户的密码和一些其他信息(如用户名和域名)来计算一个响应(response)。

  • 客户端将响应发送回服务器。

验证

  • 服务器接收响应后,使用相同的信息和存储在数据库中的用户密码的哈希值来计算一个期望的响应。

  • 服务器将期望的响应与客户端发送的响应进行比较。如果它们匹配,客户端被授权访问请求的资源。

参考资料

PTH(Pass The Hash)哈希传递攻击手法与防范

responder介绍和教程

域环境搭建