[ffffffff0x] Windows认证原理 网络认证(进阶篇)

2021-01-11 10:10:12 浏览数 (1)

前言

在上一篇浅谈windows认证原理中,我们介绍了windows认证的基本流程和加密的hash原理。本文我们将通过抓包分析,进一步了解windows网络认证相关的知识。


网络认证

NTLM

NTLM 是一种网络认证协议,以 NTLM Hash 作为凭证进行认证。NTLM Hash 长度为32位,由数字和字母组成,采用挑战/响应(Challenge/Response)的消息交换模式,

这个协议只支持 Windows.

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

  • 协商 : 主要用于确认双方协议版本
  • 质询 : 就是挑战(Challenge)/响应(Response)认证机制起作用的范畴
  • 验证 : 验证主要是在质询完成后,验证结果,是认证的最后一步。

Challenge/Response

  1. 客户端需要访问服务器的某个服务(前提是要知道服务器的用户名和密码),所以得进行身份认证。于是,客户端输入服务器的用户名和密码进行验证后会缓存服务器密码的 NTLM-Hash 值。客户端发送 TYPE 1 Negotiate 协商消息去协商需要认证的主体,用户(服务器端的用户名),机器以及需要使用的安全服务等等信息。
  2. 服务端接收到客户端发送过来的 TYPE 1 消息,会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等等。然后传入 NTLM SSP,得到 NTLM_CHALLENGE 消息(被称为 TYPE 2 消息,Challenge 挑战消息),并将此 TYPE 2 消息发回给客户端。此TYPE 2消息中包含了一个由服务端生成的 16 位随机值,此随机值被称为 Challenge,服务器将该 Challenge 保存起来。
  3. 客户端收到服务端返回的 TYPE 2 消息, 读取出服务端所支持的内容,并取出其中的随机值 Challenge,用缓存的服务器端密码的哈希值 NTLM-Hash 对其进行加密,得到 Net NTLM-Hash(加密后的 Challenge),并且将 Net NTLM-Hash 封装到 NTLM_AUTH 消息中(被称为 TYPE 3 消息, Authenticate 认证消息),发往服务端。
  4. 服务器在收到 Type3 的消息之后,用自己的密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配。如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败。

详细过程

下面抓包进行分析

192.168.141.1(WIN10)——>192.168.141.139(WIN2008)

  • type 1 协商
代码语言:txt复制
这个过程是客户端向服务器发送 type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表。
代码语言:txt复制
主要包含以下结构
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/4.png)
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/5.png)
  • type 2 质询
代码语言:txt复制
这个过程是服务器用 type 2 消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的 Challenge。
代码语言:txt复制
主要包含以下结构
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/6.png)
代码语言:txt复制
其中最主要的信息是 challenge。后面加密验证依赖于 challenge
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/7.png)
  • type 3 身份验证
代码语言:txt复制
这个过程客户端接收到 challenge 之后,使用用户 hash 与 challenge 进行加密运算得到 response,将 response,username,challenge 发给服务器。消息中的 response 是最关键的部分,因为它向服务器证明客户端用户已经知道帐户密码。
代码语言:txt复制
主要包含以下结构
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/8.png)
代码语言:txt复制
这里的 Challeng 不同于 type2 的 Challenge,这里的 Challenge 是一个随机的客户端 nonce。
代码语言:txt复制
MIC 是校验和,设计 MIC 主要是为了防止这个包中途被修改
代码语言:txt复制
sessionkey 是在要求进行签名的时候用的,用来进行协商加密密钥,可能有些文章会说 sessionkey 就是加密密钥,需要拥有用户 hash 才能计算出来,因此攻击者算不出来,就无法加解密包。但是想想就不可能,这个 session_key 已经在流量里面明文传输,那攻击者拿到之后不就可以直接加解密包了。
代码语言:txt复制
![](https://gitee.com/asdasdasd123123https://img.yuanmabao.com/zijie/pic/raw/master/img/19/9.png)

注意点:

  1. Chanllenge 是 Server 产生的一个 16 字节的随机数,每次认证都不同
  2. Response 的表现形式是 Net-NTLM Hash,它是由客户端提供的密码 Hash 加密 Server 返回的 Chanllenge 产生的结果。

NTLMv2

NTLMv1 和 NTLMv2 的加密因素都是 NTLM Hash,而最显著的区别就是 Challenge 和加密算法不同,共同点就是加密的原料都是 NTLM Hash。

  • Challage: NTLMv1 的 Challenge 有 8 位,NTLMv2 的 Challenge 为 16 位。
  • Net-NTLM Hash:NTLMv1 的主要加密算法是 DES,NTLMv2 的主要加密算法是 HMAC-MD5。

设置系统使用 LM 还是 NTLM 还是 NTLMv2,需要修改 Local Security Policy 中的 LmCompatibilityLevel 选项

Net-NTLM hash

在 type3 中的响应,有六种类型的响应

  1. LM(LAN Manager)响应 - 由大多数较早的客户端发送,这是“原始”响应类型。
  2. NTLM v1 响应 - 这是由基于 NT 的客户端发送的,包括 Windows 2000 和 XP。
  3. NTLMv2 响应 - 在 Windows NT Service Pack 4 中引入的一种较新的响应类型。它替换启用了 NTLM 版本 2 的系统上的 NTLM 响应。
  4. LMv2 响应 - 替代 NTLM 版本 2 系统上的 LM 响应。
  5. NTLM2 会话响应 - 用于在没有 NTLMv2 身份验证的情况下协商 NTLM2 会话安全性时,此方案会更改 LM NTLM 响应的语义。
  6. 匿名响应 - 当匿名上下文正在建立时使用; 没有提供实际的证书,也没有真正的身份验证。“存 根”字段显示在类型 3 消息中。

这六种使用的加密流程一样,都是 Challenge/Response 验证机制,区别在 Challenge 和加密算法不同。

在以上流程中,登录用户的密码 hash 即 NTLM hash。其中,经过 NTLM Hash 加密 Challenge 的结果在网络协议中称之为 Net NTLM Hash,response 中包含 Net-NTLM hash.

在 NTLM 认证中,NTLM 响应分为 NTLM v1,NTLMv2,NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法.所以也就存在不同协议的 Net-NTLM hash,即 Net-NTLM v1 hash,Net-NTLM v2 hash

Net-NTLM v1 hash

v1 是将 16字节的 NTLM hash 空填充为 21 个字节,然后分成三组,每组7比特,作为 3DES 加密算法的三组密钥,加密 Server 发来的 Challenge。 将这三个密文值连接起来得到 response。

Net-NTLM v2 hash

v2 将 Unicode 后的大写用户名与 Unicode 后的身份验证目标(在 Type 3 消息的”TargetName”字段中指定的域或服务器名称)拼在一起。请注意,用户名将转换为大写,而身份验证目标区分大小写,并且必须与“TargetName”字段中显示的大小写匹配。使用 16 字节 NTLM 哈希作为密钥,得到一个值。

建一个 blob 信息

使用 16 字节 NTLMv2 哈希作为密钥,将 HMAC-MD5 消息认证代码算法加密一个值(来自 type 2 的 Challenge 与 Blob 拼接在一起)。得到一个 16 字节的 NTProofStr。

将 NTProofStr 与 Blob 拼接起来形成得到 response。至于选择哪个版本的响应由 LmCompatibilityLevel 决定。

Challenge/Response 验证机制里面 type3 response 里面包含 Net-ntlm hash,NTLM v1 响应和 NTLMv2 响应对应的就是 Net-ntlm hash 分为 Net-ntlm hash v1 和 Net-ntlm hash v2。

Net-ntlm hash v1 的格式为:

username::hostname:LM response:NTLM response:challenge

Net-ntlm hash v2 的格式为:

username::domain:challenge:HMAC-MD5:blob

下面演示从 response 里面提取 NTLMv2

这里的 challenge 是 type2 服务器返回的 challenge 不是 type3 流量包里面的 client Challenge

就是 18f77b6fe9f8d876

HMAC-MD5 对应数据包中的 NTProofSt : 0ecfccd87d3bdb81713dc8c07e6705b6

blob 就是 response 减去 NTProofStr。(因为在计算 response 的时候,response 就是由 NTProofStr 加上 blob)

  • username(要访问服务器的用户名):Administrator
  • domain(访问者主机名或者 ip):DESKTOP-QKM4NK7
  • challenge(数据包 2 中服务器返回的 challenge 值):18f77b6fe9f8d876
  • HMAC-MD5(数据包 3 中的 NTProofStr): 0ecfccd87d3bdb81713dc8c07e6705b6
  • blob(blob 对应数据为 NTLMv2 Response 开头去掉 NTProofStr 的后半部分):01010000000000002a470d3bc233d6017eb1f527b5e7bd4d0000000002001e00570049004e002d0041003500470050004400430050004a0037004f00540001001e00570049004e002d0041003500470050004400430050004a0037004f00540004001e00570049004e002d0041003500470050004400430050004a0037004f00540003001e00570049004e002d0041003500470050004400430050004a0037004f005400070008002a470d3bc233d601060004000200000008003000300000000000000001000000002000003737fbe7dbcbd2c8e5d7a030f44586c91423d9c5202f827f3f6cf26f69adbfe80a001000000000000000000000000000000000000900280063006900660073002f003100390032002e003100360038002e003100340031002e003100330039000000000000000000

所以最后,Net-NTLM v2 Hash 值为:

代码语言:txt复制
Administrator::DESKTOP-QKM4NK7:18f77b6fe9f8d876:0ecfccd87d3bdb81713dc8c07e6705b6:01010000000000002a470d3bc233d6017eb1f527b5e7bd4d0000000002001e00570049004e002d0041003500470050004400430050004a0037004f00540001001e00570049004e002d0041003500470050004400430050004a0037004f00540004001e00570049004e002d0041003500470050004400430050004a0037004f00540003001e00570049004e002d0041003500470050004400430050004a0037004f005400070008002a470d3bc233d601060004000200000008003000300000000000000001000000002000003737fbe7dbcbd2c8e5d7a030f44586c91423d9c5202f827f3f6cf26f69adbfe80a001000000000000000000000000000000000000900280063006900660073002f003100390032002e003100360038002e003100340031002e003100330039000000000000000000

上面的 Net-NTLM v2 Hash 值若使用 hashcat 爆破应为 Abcd1234

LM

LM 与 NTLM 协议的认证机制相同,但是加密算法不同。目前大多数的 Windows 都采用 NTLM 协议认证,LM 协议已经基本淘汰了。

总结

本文通过抓包分析讲解了ntlm的协商、质询、身份验证等过程,演示了从 response 里面提取 NTLMv2的 Net-NTLM hash。由于篇幅所限,windows域认证kerberos过程将在下一篇文章中讲解。


本文作者 r0fus0d

0 人点赞