深入理解Win认证分享

举报
Jack20 发表于 2021/03/06 11:20:52 2021/03/06
【摘要】 本地认证基础知识在本地登录Windows的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,但是操作系统中的密码存储在%SystemRoot%\system32\config\sam当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行比对,如果相同,证明认证成功!Windows本身不保存明文密码,只保留密码的HashNTLM Hash与NT...

本地认证基础知识

在本地登录Windows的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,但是操作系统中的密码存储在

%SystemRoot%\system32\config\sam

image.png

当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行比对,如果相同,证明认证成功!

Windows本身不保存明文密码,只保留密码的Hash


NTLM Hash与NTLM

Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。

这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。

也就是说,NTLM与NTLM Hash相互对应。

在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。


NTLM Hash的产生

      假设我的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash。

admin -> hex(16进制编码) = 61646d696e

61646d696e -> Unicode = 610064006d0069006e00

610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

>>> from passlib.hash import nthash

>>> h = nthash.hash('admin')

>>> h

'209c6174da490caeb422f3fa5a7ae634'

本地认证流程

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

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

•Windows Logon Process(即 winlogon.exe),是Windows NT 用户登 陆程序,用于管理用户登录和退出。
•LSASS用于微软Windows系统的安全机 制。它用于本地安全和登陆策略

LM Hash

在NTLM协议问世之前,它对前身就是LM(LAN Manager)协议。

LM与NTLM协议的认证机制相同,但是加密算法不同。

目前大多数的Windows都采用NTLM协议认证,LM协议已经基本淘汰了。

LM协议认证过程中需要LM Hash作为根本凭证进行参与认证


       1.下面就简述一些LM Hash的产生:

(1)将所有小写字母转换为大写字母

• >123ABC // 未达到7个字符

• 将密码转化为16进制,分两组,填充为14个字符,空余位使用0x00字符填补

• >31323341424300000000000000

• 将密码分割为两组7个字节的块

• >31323341424300 00000000000000 // 16进制

• 将每组转化为比特流,不足56Bit则在左边加0

• >31323341424300 ->(转换为二进制) 110001001100100011001101000001010000100100001100000000-> (补 足56Bit) 00110001001100100011001101000001010000100100001100000000

• 将比特流按照7比特一组,分出8组,末尾加0


(2)由于后者都为0,结果可想而知,那就都是0

• 将每组比特流转换为16进制作为被加密的值,使用DES加密,字符串 “KGS!@#$%”为Key(0x4B47532140232425),得到8个结果 ,每个 结果转换为16进制。

• -> 00110000100110001000110001101000000101000001001000001100 00000000

• ->30988C6814120C00 -> DES(30988C6814120C00) -> 48-D7-EB-91- 2F-5E-69-7C

• 由于我们的密码不超过7字节,所以后面的一半是固定的:

• AA-D3-B4-35-B5-14-04-EE

• 连接两个DES加密字符串。这是LM哈希。

• 48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE


在上面的产生过程中,脆弱点就在于DES的Key(KGS!@#$%)是固定的,也就是说,有了Key就能够解出原文。


2.LM Hash问题:

•口令不区分大小写

•口令长度最大为14字节,另外如果口令长度不超过7字节,则LM Hash的后8字节是固定值

•DES算法强度不够

•根据LM Hash特征,也能够判断用户的密码是否是大于等于7位。


网络认证

      假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。

      我们接触比较多的SMB共享文件,SMB的默认端口是445。

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

LAN Manager Challenge/Response

      LAN Manager Challenge/Response 验证机制,简称LM。该方案比NTLM响应时间更早,安全性更低。

      SMB通信,Client A访问Server B通过LM身份验证的过程

      首先我们假设Server B的密码为 "WELCOME" , Server B已经缓存了密码的LM-HASH (原始密码在任何情况下都不能被缓存) 我们通过上面的脚本计算"WELCOME"的LM-HASH为 "c23413a8a1e7665faad3b435b51404ee"

Server B -- 8bytes Challenge --> Client A

Server B向Client A发送了一个8字节挑战"0001020304050607"

      Client A会根据自己的访问Server B的密码明文计算并缓存密码的LM-HASH(Client A缓存输入密码的哈希值,原始密码会被丢弃,“原始密码在任何情况下都不能被缓存”,这是一条基本的安全准则) -然后在LM-HASH后加5个0x00变成 "c23413a8a1e7665faad3b435b51404ee0000000000" ,变为21字节,然后划分成三组,每组7字节

| C23413A8A1E766 | 5FAAD3B435B514 | 04EE0000000000 |

      每组7字节做为参数传递给str_to_key()函数,最终得到三组DESKEY,每组8字节

| C21A04748A0E9CCC | 5ED4B47642ACD428 | 0476800000000000 |

      分别用三组DESKEY对8字节挑战 "0001020304050607" 进行标准DES加密后得到

C21A04748A0E9CCC ---- 对0001020304050607进行标准DES加密 --> CA1200723C41D577

5ED4B47642ACD428 ---- 对0001020304050607进行标准DES加密 --> AB18C764C6DEF34F

0476800000000000 ---- 对0001020304050607进行标准DES加密 --> A61BFA0671EA5FC8

      Client A最终获得一个24字节响应应"CA1200723C41D577AB18C764C6DEF34FA61BFA0671EA5FC8"(这个结果被称为response)

      Client A 将"CA1200723C41D577AB18C764C6DEF34FA61BFA0671EA5FC8" 送往Server B,Server B会根据自己缓存的LM-HASH进行同样的计算,并将计算结果与来自A的响应进行比较,如果匹配则身份验证通过


C = 8-byte server challenge

K1 | K2 | K3 = LM-Hash | 5-bytes-0

response = DES(K1, C) | DES(K2, C) |  DES(K3, C

image.png


NTLM 协议

      NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。

这个协议只支持Windows Chalenge/Response

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

1.协商:主要用于确认双方协议版本(NTLM v1/NTLM V2)

2.质询:就是挑战(Chalenge)/响应(Response)认证机制起作用的范畴。

质询的完整过程:

      (1)客户端向服务器端发送用户信息(用户名)请求

      (2)服务器接受到请求,生成一个16位的随机数,被称之为“Challenge”, 使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1。同时,生成Challenge1后,将Challenge(16位随机 字符)发送给客户端。

      (3)客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。

      其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash。

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

      验证的完整过程:: 服务器端收到客户端的Response后,比对Chanllenge1与Response是否相等,若相等,则认证通过


NTLM v1与NTLM v2最显著的区别就是Challenge与加密算法不同,共同点就是加密的原料都是NTLM Hash。

(1)Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。

(2)Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。


挑战响应级别配置

gpedit.msc,设置之后通过gpupdate命令使其立即生效

image.png

Windows 2000 以及 Windows XP: 发送 LM & NTLM 响应

Windows Server 2003: 仅发送 NTLM 响应

Windows Vista、Windows Server 2008、Windows 7 以及 Windows Server 2008 R2: 仅发送 NTLMv2 响应

Windows10、Windows Server2016、Windows Server2019:仅发送NTLMv2响应。拒绝LM\仅发送NTLMv2响应。拒绝_LM和NTLM(&)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。