Windows认证机制和协议---NTLM详解

一、Windows本地认证

1、本地认证概述

在本地登录Windows的情况下,通常需要输入用户名和密码,如果用户名和密码正确那么可以进入桌面,如果错误则无法进入桌面,在这个过程中我们的电脑上存储着自己的账号密码,无论电脑是否联网,只要能开机,就可以输入账号和密码登录到电脑中,这个认证过程就称为本地认证,工作组就是采用本地认证。那么操作系统是如何完成这个认证过程的呢?
Windows本地认证大致可以分为以下三个流程:

1) 由 winlogon.exe(Windows Logon Process)进程接受用户输入的密码

winlogon.exe进程是Windows NT用户登陆程序,用于管理用户登录和退出,用户注销、重启、锁屏后,操作系统会让winlogon.exe显示登录界面。

2) 调用lsass.exe(Local Security Authority Service)进程对用户输入的密码进行加密,将其转换为NTLM Hash

lsass.exe进程是一个系统进程,用于微软Windows系统的安全机制。它应用于本地安全和登录策略,这些策略包括密码策略、账户策略、用户权限、域策略等等。同时它还负责对用户进行身份验证以确保只有授权的用户才能访问系统资源。

除此之外lsass.exe进程的另一个作用是将收到的明文账号密码在本地内存中保留一份用作备份,这也就是为什么mimikatz可以抓取低版本系统中的明文密码,但是当系统为Win10Win server 2012R2以上时,默认在内存缓存中禁止保存明文密码

3) 将转换成的NTLM Hash与SAM(Security Account Manager)文件中存储的NTLM Hash进行比较,如相同,将GroupSid与UserSid发送给winlogon.exe准备登陆,如不同则登陆失败

SAM文件是Windows对用户账户的安全管理使用的安全账号管理器,即账号密码数据库文件,存储本地所有用户的凭证信息。但是这并不代表你可以随意的查看系统密码,普通人不能删,不能改,不能看,不能复制。

SAM文件是位于C:\windows\system32\config目录下面

在这里插入图片描述

2、LM HASH和NTLM HASH

1) 简介

Windows操作系统通常使用两种方法对用户的明文密码进行加密处理。一部分为LM HASH,另一部分为NTML HASH。在Windows操作系统中,HASH的结构通常如下:username:RID:LM-HASH:NTLM-HASH

  • LM HASH
    LM HASH的全名LAN Manager Hash是微软为了提高Windows操作系统的安全性而采用的散列加密算法,其本质是DES加密。尽管LM HASH比较容易被破解,但为了保证系统的兼容性。Windows只是将LM HASH禁用了(从Windows Vista和Windows 2008版本开始,Windows操作系统默认禁用LM HASH),LM HASH的明文密码被限定在14位以内,也就是说,如果要停止使用LM HASH,将用户的密码设置为14位以上即可。如果LM HASH被禁用了,攻击者通过工具抓取到的LM HASH通常为aad3b435b51404eead3b435b51404ee(表示LM HASH为空或被禁用)。
  • NTLM HASH
    NTLM HASH是微软为了提高安全性的同时保证兼容性而设计的散列加密算法,NTLM HASH是基于MD4加密算法进行加密,个人版从Windows Vista以后,服务器从Windows Server 2003以后,Windows操作系统的认证方式均为NTLM HASH。

2) LM HASH加密步骤

这里我们使用Windows Server 2003,将其Administrator用户的密码设置为Admin@123作为演示,通过手工计算LM HASH值和工具抓取的LM HASH值进行对比,验证其加密步骤的正确性,这里抓取密码使用的工具是Quarks PwDump。

  • 将明文口令转换为其大写形式
    以明文Admin@123为例,转换为大写格式:ADMIN@123

  • 将字符串大写后转换为16进制字符串
    ADMIN@123转换为16进制字符串为:41 44 4d 49 4e 40 31 32 33
    在这里插入图片描述

  • 密码不足14字节要求用0x00补齐
    以上密码转换之后只有9字节,所以需要使用0x00作为填充补齐到14字节,填充后为:41 44 4d 49 4e 40 31 32 33 00 00 00 00 00

  • 将上述编码分为两组,每组7个字节
    第一组:41 44 4d 49 4e 40 31
    第二组:32 33 00 00 00 00 00

  • 将每一组7个字节的十六进制转换为二进制,每7bit一组末尾加0,再转换成十六进制组成2组8字节的编码
    第一组:01000000 10100010 00010010 10101000 10010100 01110010 00000000 01100010
    转换为对应的十六进制:40 A2 12 A8 94 72 00 62
    第二组:00110010 00011000 11000000 00000000 00000000 00000000 00000000 00000000
    转换为对应的十六进制:32 18 C0 00 00 00 00 00

  • 将以上步骤得到的两组8字节编码,分别作为DES加密的key,为魔术字符KGS!@#$%进行加密
    魔术字符串KGS!@#$%对应的十六进制为:4B47532140232425
    在这里插入图片描述
    将两组编码加密后得到的结果进行拼接得到的就是LM HASH值:6F08D7B306B1DAD4B75E0C8D76954A50,下面是我们使用工具抓取到的Win Server2003的LM HASH和NTLM HASH,可以发现和我们手工计算的值是一样的
    在这里插入图片描述

3) NTLM HASH加密步骤

这里仍然以上面Windows Server 2003的Administrator用户的密码作为演示,通过Quarks PwDump工具我们已经获得密码Admin@123对应的NTLM HASH值:570a9a65db8fba761c1008a51d4c95ab,其加密流程为NTLM Hash = md4(unicode(hex(password))),现在进行计算:

  • 将明文口令转换为十六进制
    以明文Admin@123为例,转换为十六进制:41 64 6d 69 6e 40 31 32 33
  • 将上一步得到的16进制转换为Unicode格式,即在每个字节之后添加0x00
    将上一步得到的十六进制每个字节后后面添加0x00:41 00 64 00 6d 00 69 00 6e 00 40 00 31 00 32 00 33 00
  • 对得到的Unicode字符串作MD4单向哈希加密
    生成的32位十六进制字符串就是NTLM HASH值,可以看到和使用Quarks PwDump工具获得的密码相同
    在这里插入图片描述

二、网络认证

1、网络认证概述

Windows网络认证是指在Windows操作系统中进行网络通信和资源访问时,验证用户身份和授予权限的过程。它确保只有经过身份验证的用户能够访问网络资源,并根据其权限级别进行授权操作
Windows网络认证的方式主要有两种:一种是NTLM认证,另一种是Kerberos认证,这里讲解NTLM认证,下一期讲解Kerberos认证。

  • NTLM认证:NTLM(NT LAN Manager)是一种早期的Windows网络协议认证,它使用基于挑战-响应的方式进行身份验证。尽管Kerberos已成为首选的认证协议,但NTLM仍然在某些情况下使用,特别是在与旧版Windows系统或者非Windows系统进行互操作时。
  • Kerberos认证:Kerberos是一种网络身份验证协议,在Windows域环境中广泛使用。它通过使用票据和票据授予票据(TGT)来验证用户身份,并生成会话密钥用于加密通信。

2、NTLM挑战响应协议认证机制

1) 概述

NTLM身份认证协议是一种基于 Challenge/Response 质询响应验证机制,由三种类型消息组成:

  • type 1(协商,Negotiate):主要用于确认双方协议版本、加密等级等。
  • type 2(质询,Challenge):服务器在收到客户端的协商消息之后, 会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等等。并生成一个随机数Challenge, 然后生成Challenge消息返回给客户端。该消息就是挑战/响应认证机制的主要功能体现。
  • type 3(认证,Auth):验证主要是在挑战完成后,验证结果,是认证的最后一步。

NTLM协议针对用户进行身份验证时,有两种可能的情况,一种情况是工作组环境,另一种是域环境。

2) NTML挑战响应协议在工作组的认证

  • 当客户端需要访问服务器的某个服务时,就需要进行身份认证。于是,当客户端输入服务器的用户名和密码进行验证的时候,客户端就会缓存服务器密码的NTLM Hash值。然后,客户端会向服务端发送一个请求,该请求利用NTLM SSP 生成NTLMSSP_NEGOTIATE消息(被称为Type 1 NEGOTIATE 协商消息)。
  • 接下来是Challenge/Response认证机制的关键。服务端接收到客户端发送过来的Type 1消息后,会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等。然后传入NTLM SSP,得到NTLMSSP_CHALLENGE 消息(被称为Type 2 Challenge 质询消息),并将此Type 2消息发回给客户端。此Type 2消息中包含了一个由服务端生成的16位随机值,此随机值被称为Challenge质询值,服务端会将该Challenge质询值缓存起来。
  • 客户端收到服务端返回的Type 2消息后,读取出服务端所支持的内容,并取出其中的Challenge质询值,用缓存的服务器密码的NTLM Hash对其进行加密得到 Response消息。最后将Response和一些其他信息封装到NTLMSSP_AUTH认证消息中(被称为Type 3 Authenticate认证消息),发往服务端。
  • 服务端在收到Authenticate认证消息后,从中取出Net-NTLM Hash。然后用自己密码的NTLM Hash 对Challenge质询值进行一系列加密运算,得到自己计算的Net-NTLM Hash。并比较自己计算出的Net-NTLM Hash 和客户端发送的Net-NTLM Hash是否相等。如果相等,则证明客户端输入的密码正确,从而认证成功,反之则认证失败。
    在这里插入图片描述

3) NTLM挑战响应协议在域环境下的认证

NTLM在域环境下的认证和在工作组认证前三步没有什么区别,只是认证的过程需要发送数据到域控上进行认证,所以就有了后面三步,这里只说明后三步:

  • 服务端接收到客户端发送来的 NTLMSSP_AUTH 认证消息后,通过Netlogon协议与域控建立一个安全通道,将验证消息发给域控。
  • 域控收到服务端发来的验证消息后,从中取出Net-NTLM Hash。然后从数据库中找到该用户的NTLM Hash,对Challenge进行一系列加密运算,得到自己计算的Net-NTLM Hash。并比较自己计算出的Net-NTLM Hash和服务端发送的Net-NTLM Hash是否相等,如果相等,则证明客户端输入的密码正确,认证成功,反之认证失败,域控将验证结果发给服务端。
  • 服务端根据DC返回的结果,对客户端进行回复。
    在这里插入图片描述

4) 通过抓包从流量层面分析NTML协议

接下来我们从数据包的层面看看“NTML挑战响应协议”的认证过程。使用两台Win10的机器进行NTLM认证抓包分析

IP地址机器
192.168.206.175Windows Server 2008
192.168.206.176Windows Server 2008
  • 首先使用以下命令创建共享访问,在Windows网络环境中,当客户端尝试访问SMB共享资源时,通常会使用NTLM进行身份验证,此时,同时打开Wireshark进行抓包

    net use \\IP /u:账号名 密码
    
  • 我们先看前四个数据包,这个前四个数据包主要是用来协商的
    在这里插入图片描述

  • 第五个包是NTLM的Negotiate协商包,也就是Type 1,是从客户端发送到服务器以启动NTLM身份验证的包。其主要目的是通过Flag指示支持的选项来验证基本规则,并且可选的,它还可以向服务器提供客户端的工作站名称和客户端工作站具有成员身份的域;服务器使用此信息来确定客户端是否有资格进行本地身份验证。

    在这里插入图片描述

  • 第六个包是Type 2 Challenge质询消息,是服务端发送给客户端的,包含服务器支持和同意的功能列表,最核心的是包含Challenge质询值,在NTLM v2版本中,Challenge质询值是一个随机的16字节的字符串。

    在这里插入图片描述

  • 第七个包是Auth 认证消息,是客户端发给服务端的认证消息。此消息包含客户端对Type 2质询消息的响应,这表明客户端知道帐户密码。Auth消息还指示身份验证帐户的身份验证目标(域或服务器名)和用户名,以及客户端工作站名。Auth认证消息中最主要的便是Type 3 Response响应消息。Response响应消息是用服务器密码的NTLM Hash加密Challenge质询值后经过一系列运算得到的,Response响应消息中可以提取出Net-NTLM Hash。

    在这里插入图片描述

  • 第八个数据包就是返回验证结果,成功或者失败。

5) Challenge和Respone分析

Challenge是服务端发送给客户端的一串随机的字符,NTLM v1协议中是8位,NTLM v2协议中是16位,自从Windows vista之后就开始默认使用V2协议了。Response值是客户端生成的发送给服务端,用来进行校验的。那么Response是如何生成的呢?

Response由两部分组成,由NTProofStrBlob拼接组成。其中NTProofStr是以用户的NTLMv2 Hash值作为Key将 Challenge + Blob 进行HMAC-MD5加密得到的结果;而NTLMv2 Hash由大写的用户名拼接域名,然后将其编码成 unicode 格式,然后以密码的 NTLM Hash 值作为 Key,将 Unicode 格式进行 HMAC-MD5 加密得到;最后,Blob由时间、目标信息、随机填充字符等生成。

NTProofStr = HMAC-MD5(challenge + blob, NTLMv2 Hash)
NTLMv2 Hash = HMAC-MD5(unicode(hex((upper(UserName)+DomainName))), NTLM Hash)

以上就是NTLM v2版本Response消息的生成。我们平时在使用如工具(Responder、Inveigh等)抓取NTLM Response消息的时候,都是抓取的Net-NTLM hash格式的数据,其数据格式为username::domain:challenge:NTProofStr:blob,以以上认证过程为例抓取Net-NTLM hash,如下所示:

在这里插入图片描述

administrator::WIN-2008PC1:19E5C2959055E0F2:0E97CA7FC432ED1C57443906451E0768:0101000000000000D61B2FEB9153DA010F07D4CFA041319E0000000002001600570049004E002D00320030003000380050004300320001001600570049004E002D00320030003000380050004300320004001600570049004E002D00320030003000380050004300320003001600570049004E002D00320030003000380050004300320007000800D61B2FEB9153DA01060004000200000008003000300000000000000000000000003000005153988DB76D4524B5E6FEF4D1BC1A20B84030E42508A3488B4E10BFC3B94A240A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003200300036002E00310037003600000000000000000000000000

以以上两台主机进行NTML挑战响应协议认证的过程为例,我们计算一下Response的值,是否和工具抓取到的一致:

计算NTLMv2 Hash

  • 首先将用户名administrator转成大写:ADMINISTRATOR

  • 然后将用户名和域名WIN-2008PC1拼接起来:ADMINISTRATORWIN-2008PC1

  • 转成16进制:41444D494E4953545241544F5257494E2D32303038504331

  • 转成unicode格式:410044004D0049004E004900530054005200410054004F005200570049004E002D003200300030003800500043003100

  • 使用密码的NTLM-Hash值: 8443248E2EB382500141A033F4AD5534(作为key) 将上述得到的unicode值进行HMAC-MD5加密

    在这里插入图片描述

  • 得到NTLMv2 Hash结果:2cc7ba8618dca34dbffb2edbb3d6de1d

计算NTProofStr

  • 将challenge和blob拼接起来
    19E5C2959055E0F20101000000000000D61B2FEB9153DA010F07D4CFA041319E0000000002001600570049004E002D00320030003000380050004300320001001600570049004E002D00320030003000380050004300320004001600570049004E002D00320030003000380050004300320003001600570049004E002D00320030003000380050004300320007000800D61B2FEB9153DA01060004000200000008003000300000000000000000000000003000005153988DB76D4524B5E6FEF4D1BC1A20B84030E42508A3488B4E10BFC3B94A240A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003200300036002E00310037003600000000000000000000000000
    
  • 将NTLMv2 Hash作为key对上述数据进行HMAC-MD5进行加密,得到0e97ca7fc432ed1c57443906451e0768(NTProofStr),和使用工具得到的一样。
    在这里插入图片描述
  • 得到responde
    0e97ca7fc432ed1c57443906451e07680101000000000000D61B2FEB9153DA010F07D4CFA041319E0000000002001600570049004E002D00320030003000380050004300320001001600570049004E002D00320030003000380050004300320004001600570049004E002D00320030003000380050004300320003001600570049004E002D00320030003000380050004300320007000800D61B2FEB9153DA01060004000200000008003000300000000000000000000000003000005153988DB76D4524B5E6FEF4D1BC1A20B84030E42508A3488B4E10BFC3B94A240A001000000000000000000000000000000000000900280063006900660073002F003100390032002E003100360038002E003200300036002E00310037003600000000000000000000000000
    

6) NTMLv1和NTLMv2的区别

NTLM v1身份认证协议和NTLM v2身份认证协议是NTLM身份认证协议的不同版本。目前使用最多的是NTLM v2版本。NTLM v1与NTLM v2最显著的区别就是Challenge质询值的位数与加密算法不同,共同之处就是都是使用的 NTLM Hash进行加密。

  • Challenge质询值
    NTLM v1:8位
    NTLM v2:16位
  • NTLM Hash使用的加密算法
    NTLM v1:DES加密算法
    NTLM v2:HMAC-MD5加密算法

7) NTML协议存在的安全问题

从NTLM认证的流程中我们可以看到,在Type 3 Auth认证消息中是使用用户密码的Hash计算的。因此当我们没有拿到用户密码的明文而只拿到Hash的情况下,我们可以进行Pass The Hash(PTH)攻击,也就是哈希传递攻击。同样,还是在Type3消息中,存在Net-NTLM Hash,当攻击者获得了Net-NTLM Hash后,可以进行中间人攻击,重放Net-NTLM Hash,这种攻击手法也就是大家所说的NTLM Relay(NTLM 中继)攻击。并且由于NTLM v1版本协议加密过程存在天然缺陷,可以对Net-NTLM v1 Hash进行爆破,得到NTLM Hash。拿到NTLM Hash后即可进行横向移动。

  • Pass The Hash

    Pass The Hash(PTH)哈希传递攻击是内网横向移动的一种方式。主要原因是NTLM认证过程中使用的是用户密码的NTLM Hash来进行加密。因此当我们获取到了用户密码的NTLM Hash而没有解出明文时,我们可以利用该NTLM Hash进行哈希传递攻击,对内网其他机器进行Hash碰撞,碰撞到使用相同密码的机器。然后通过135或445端口横向移动到使用该密码的其他机器;

  • NTLM Relay

    NTLM Relay其实严格意义上并不能叫NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在NTLM认证的第三步,在 Response消息中存在Net-NTLM Hash,当攻击者获得了Net-NTLM Hash后,可以进行中间人攻击,重放Net-NTLM Hash,这种攻击手法也就是大家所说的NTLM Relay(NTLM 中继)攻击。

参考文档:
https://cloud.tencent.com/developer/article/2227928
https://xz.aliyun.com/t/1943
https://blog.csdn.net/CoreNote/article/details/120929806

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值