前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ffffffff0x] Windows认证原理 网络认证(进阶篇)

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

原创
作者头像
r0fus0d
修改2021-01-11 10:10:12
1.2K0
修改2021-01-11 10:10:12
举报
文章被收录于专栏:ffffffff0xffffffff0x

前言

在上一篇浅谈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/asdasdasd123123/pic/raw/master/img/19/4.png)
代码语言:txt
复制
![](https://gitee.com/asdasdasd123123/pic/raw/master/img/19/5.png)
  • type 2 质询
代码语言:txt
复制
这个过程是服务器用 type 2 消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的 Challenge。
代码语言:txt
复制
主要包含以下结构
代码语言:txt
复制
![](https://gitee.com/asdasdasd123123/pic/raw/master/img/19/6.png)
代码语言:txt
复制
其中最主要的信息是 challenge。后面加密验证依赖于 challenge
代码语言:txt
复制
![](https://gitee.com/asdasdasd123123/pic/raw/master/img/19/7.png)
  • type 3 身份验证
代码语言:txt
复制
这个过程客户端接收到 challenge 之后,使用用户 hash 与 challenge 进行加密运算得到 response,将 response,username,challenge 发给服务器。消息中的 response 是最关键的部分,因为它向服务器证明客户端用户已经知道帐户密码。
代码语言:txt
复制
主要包含以下结构
代码语言:txt
复制
![](https://gitee.com/asdasdasd123123/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/asdasdasd123123/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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 网络认证
    • NTLM
      • Challenge/Response
      • NTLMv2
      • Net-NTLM hash
    • LM
    • 总结
    相关产品与服务
    网站渗透测试
    网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档