专栏首页信安之路轻松理解 NTLM 协议工作流程

轻松理解 NTLM 协议工作流程

NTLM 使用在 Windows NT 和 Windows 2000 Server(or later)工作组环境中(Kerberos 用在域模 式下)。

在 AD 域环境中,如果需要认证 Windows NT 系统,也必须采用 NTLM。相比 Kerberos,基于 NTLM 的认证过程要简单很多。NTLM 采用一种质询/应答(Challenge/Response)消息交换模式,下图是 NTLM 的认证过程:

NTLM 认证协议可以使用在各种协议中,比如 HTTP、SMB 等等,下面以 HTTP 来说明其具体认证流 程:

先来找个目标吧,也可以自己搭建一个基于域的 401 认证服务,我这里测试就找个实际的环境来吧,通 常 exchange 的邮件服务器都会有 ews 的接口,我们可以随便找一个做测试。

在 bing 上使用语法搜一下:

/owa/auth/logon.aspx

找一个邮件服务器是用 exchange 搭建的,并且支持 http 的,因为转包查看的话,https 经过加密的包不太好看,我这找了一个:

http://ex.myhosting.com/ews

开启 wireshark,然后访问上面的连接,随便输入账号和密码,点击登录之后,会得到一些 http 的数据包,如图:

验证流程分三步

第一步:获取服务器的一些基本信息,比如:认证的协议、服务器版本,如图:

第二步:获取服务器返回给客户端的 challenge 值,如图:

这个值在后面的数据校验中会使用,这里先不做过多介绍

第三步:根据前面获取的数据,组合之后提交给服务器,在服务器端进行验证

这里的 NTProofStr 是一个用做数据验签的 hash 值,为了保证前面获取的 challenge 和后面的数据是完整的未经过修改的。

我们把上图中 NTLMv2 的 Response 数值复制处理如下:

c9ce34e95466b7e956dd63da0b17e2e801010000000000008351a367173bd601afd3469d61d432470000000002000800430041004500580001000e0045005800430041005300310032000400140063006100650078002e006c006f00630061006c000300240045005800430041005300310032002e0063006100650078002e006c006f00630061006c000500140063006100650078002e006c006f00630061006c00070008008351a367173bd601060004000200000008003000300000000000000001000000002000002cd5deecf08e9ba9b3e2e91b120999526fba9ded3b72687fcae5218d3b4301120a0010000000000000000000000000000000000009002a0048005400540050002f00650078002e006d00790068006f007300740069006e0067002e0063006f006d000000000000000000

最前面的 32 个字符就是验证数据完整性的 hash 值,也就是 NTProofStr 的值,后面的数据中包含了一些服务器的信息,如图:

这些数据是第三步的请求阶段,也就是客户端提交给服务器的数据,服务器会拿这些数据进行验证,判断是否验证通过。

验签 hash 如何产生

从上面我们没有看到账号密码信息在哪里发挥作用,下面我们来看看具体账号密码在哪里被使用,在哪里发挥作用的。

我们在内网渗透的时候,经常会抓本地密码,本地存储的 hash 就是用户密码经过一系列加密后的结果,具体加密方式如下:

NTLM hash = md4(unicode(hex(password)))

函数解释:hex 为将字符串转为 hex 值、unicode 是将字符串转为双字节字符串、md4 为 md4 hash

用 python 为例来编写关键函数的代码如下:

hex 函数:

def str_to_hex(s):
  return ' '.join([hex(ord(c)).replace('0x', '') for c in s])

转双字节函数:

def hex_to_unicode(hex_str):
  hex_str_ = hex_str.replace(" ","00")+"00"
  return hex_str_

md4 hash 函数:

from Crypto.Hash import MD4
def str_to_md4(str_):
  m = MD4.new()
  m.update(str_)
  return m.hexdigest()

只有密码不行,怎么把用户名和域信息给用上呢?这里就涉及了一个 NTLMv2 HASH ,具体算法如下:

NTLMv2 hash = md5(unicode(hex(upper(username+domain))), ntlm)

关键函数:upper 是将字符串都转为大写字母、md5 就是将 ntlm 的 hash 作为 salt,对用户名和域组合的信息进行 md5 hash

md5 hash 函数:

import hmac
import hashlib
def str_to_hmac_md5(passwd_,salt_):
  h_md5 = hmac.new(salt_, passwd_, hashlib.md5).hexdigest()
  return h_md5

从上面的过程来看,最后得到的 NTLMv2 HASH 就包含了账号、密码、域的信息,有一个因素有问题,那么整个验证就不成功,那么这 hash 在后面怎么用?

服务器如何验证客户端提交的信息

最后一步,客户端提交的信息包括:

签名 hash NTProofStr 用来验证数据完整性,数值为:c9ce34e95466b7e956dd63da0b17e2e8

还有一串数据,在上面已经提供,前面的 32 位的字符串就是上面签名的 hash,去掉之后就是服务器相关的数据,提取出来之后如下:

01010000000000008351a367173bd601afd3469d61d432470000000002000800430041004500580001000e0045005800430041005300310032000400140063006100650078002e006c006f00630061006c000300240045005800430041005300310032002e0063006100650078002e006c006f00630061006c000500140063006100650078002e006c006f00630061006c00070008008351a367173bd601060004000200000008003000300000000000000001000000002000002cd5deecf08e9ba9b3e2e91b120999526fba9ded3b72687fcae5218d3b4301120a0010000000000000000000000000000000000009002a0048005400540050002f00650078002e006d00790068006f007300740069006e0067002e0063006f006d000000000000000000

在之前第二步的时候,获得了一个 challenge 的值: e8fd1257ab09ae57

到这里,该有的数据都有了,那么如何这些数据之间又有什么关系?主要是签名的获取算法,公式如下:

签名数据 NTProofStr = md5(challenge + 数据, NTLMv2 HASH)

理解上也简单,就是将第二步的 challenge 的值和服务器的数据连接起来,用包含账号密码域信息的 hash 作为 salt 进行 md5 哈希之后的结果就是签名的值,我们用一个小巧的计算器来计算下:

以上就是 NTLM 协议组成验证数据的过程,最后数据发送到服务器端,服务器根据提交的数据进行类似的加密验证,从而判断用户提交的凭证是否正确,整个过程保证了认证的安全性。

总结

在服务器端,保存的不是用户的明文密码,而是密码经过 NTLM 加密后的字符串,因为是 hash 算法,所以不可逆,对于 NTLM 的哈希只能进行暴力枚举无法进行解密。

如果 401 认证的服务是 http 的协议,我们可以在流量包中截获相关数据包,比如 challenge 的值、NTLMv2 的返回包、用户名、域名,有了这些信息,就可以通过暴力枚举的方式破解用户的密码,如果 https 协议,我们就无法通过数据包来截获明文的数据包了,所以 https 的是多么重要。

这不是一个攻击的文章,旨在理解 NTLM 这个协议的工作流程,也没有涉及某某字段的意思,想要深入理解的可以自己去找相关资料深入研究。

文章分享自微信公众号:
信安之路

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 三步轻松理解Kerberos协议

    Kerberos是一种身份验证协议,它作为一种可信任的第三方认证服务,通过使用对称加密技术为客户端/服务器应用程序提供强身份验证。在域环境下,AD域使用Kerb...

    Bypass
  • windows之NTLM认证

    比如当用户输入密码admin的时候,操作系统会将admin转换为16进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM...

    黑白天安全
  • ARP协议的工作流程

    通过ARP协议知道对方的mac地址,已经知道对方ip地址的情况下,不知道mac地址。定义了一个ARP协议来解决这个问题。

    清菡
  • windows的认证方式

    在本地登陆的情况下,操作系统会使用用户输入的密码作为凭据去与系统中的密码进行校验,如果成功的话表明验证通过。操作系统的密码存储在C盘的目录下:

    黑白天安全
  • [ffffffff0x] 浅谈windows认证原理

    在实战渗透中,常常存在把windows主机作为跳板以此进行横向移动的情况,其实际原理并不难。本篇来谈windows系统的认证原理,并演示抓取密码相关场景。

    r0fus0d
  • 你所不知道的NTLM Relay

    NTLM Relay其实严格意义上并不能叫NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在NTLM认证的第三步,在 Type3 Res...

    谢公子
  • 内网协议NTLM之NTLM基础

    我们知道windows系统自身是不会保存明文密码的,也就是说SAM中保存的不是明文而是Hash。在本地登陆的情况下,操作系统会使用用户输入的密码作为凭据去与系统...

    黑白天安全
  • 这是一篇“不一样”的真实渗透测试案例分析文章

    同时感谢n1nty、pr0mise、2月30日对本文提出的宝贵建议。文章内容较多,建议点击文末“阅读全文”,跳转到博客阅读。

    Gcow安全团队
  • 第四期学习活动—第二天优秀作业

    NTLM是NT LAN Manager的缩写,这也说明了协议的来源。NTLM 是指 telnet 的一种验证身份方式,即质询/应答身份验证协议

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

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

    r0fus0d
  • NTLM及Kerberos认证流程

    NTLM是NT LAN Manager的缩写,NTLM 是指 telnet 的一种验证身份方式,即问询/应答身份验证协议,是 Windows NT 早期版本的标...

    Y5neKO
  • 内网渗透 | Kerberos 协议与 Kerberos 认证原理

    如果你了解内网渗透,那么应该都对 IPC、黄金票据、白银票据、、PTT、PTK 这些老生常谈的词汇再熟悉不过了,对其利用也应该是了如指掌了吧。但是如果你对其背后...

    HACK学习
  • 基于service的远程主机os识别之抄个痛快

    这半个月我主要都在狂抄nessus/openvas/xxxx的os_finger/detect脚本,明天去叙利亚打暑假工了,做个最后总结。

    用户2202688
  • 域渗透之NTML-Hash

    早期SMB协议在网络上传输明文口令。后来出现"LAN Manager Challenge/Response"验证机制,简称LM,它是如此简单以至很容易被破解。...

    陈殷
  • 内网渗透|HASH与横向移动

    在内网渗透的过程中,最重要的就是信息搜集,但是在极端情况下我们找不到能够横或者跨域的机器,那么这时候我们就可以尝试做一个水坑,来尝试获取hash。当然这只是理想...

    HACK学习
  • 内网渗透横向移动之获取Net-NTLM Hash

    通过控制内网主机发送 NTLM 请求,我们可以使用 responder 等工具截获主机用户的 Net-NTLMHash,此 Hash 虽然不能进行哈希传递,但是...

    Gh0st1nTheShel
  • 基于 LLMNR 和 NetBIOS 欺骗的攻击利用

    链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,使得 IPv4 和 IPv6 的主机可以通过此协议对同一本地链路上的主机执行名称...

    信安之路
  • MITM6:用IPv6攻陷IPv4网络的工具

    随着IPv6概念的提出,互联网上针对IPv6协议的使用也日渐增多,但即便如此IPv6在公司内部却并不受欢迎,很少会有公司使用IPv6。然而,大多数公司可能都忽略...

    企鹅号小编
  • 如何使用RemotePotato0从普通用户提升至域管理员

    RemotePotato0是一款功能强大的Windows提权工具,本质上来说RemotePotato0是一个漏洞利用工具,可以帮助广大研究人员在Windows系...

    FB客服

扫码关注云+社区

领取腾讯云代金券