zoukankan      html  css  js  c++  java
  • windows认证过程

    更新_2020_01_16

    NTLM简介:

    NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中(Kerberos用在域模式下)。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。较之Kerberos,基于NTLM的认证过程要简单很多。NTLM采用一种质询/应答(Challenge/Response)消息交换模式。

    NTLM协议的认证,包括 NTLMv1 和 NTLMv2 两个版本。涉及到NTLM的认证全过程,以及NTLM的EPA(Extended Protection for Authentication)实现。

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

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

    这个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(Unicode编码) = 610064006d0069006e00
    610064006d0069006e00 -> MD4(MD4算法加密) = 209c6174da490caeb422f3fa5a7ae634(NTLM Hash)
    

    本地认证流程:

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

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

    Windows Logon Process(即 winlogon.exe):是Windows NT 用户登陆程序,用于管理用户登录和退出。

    LSASS:用于微软Windows系统的安全机制。它用于本地安全和登陆策略


    LM Hash 和 NTLM的关系:

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

    不同点:加密算法

    相同点:认证机制,就是上文中说的认证流程

    目前大多数的Windows都采用NTLM协议认证,LM协议已经基本淘汰了,这里讲就是当作了解。

    LM Hash的加密:

    将所有小写字母转换为大写字母
    • >123ABC // 未达到7个字符
    • 将密码转化为16进制,分两组,填充为14个字符,空余位使用0x00字符填补
    • >31323341424300000000000000
    • 将密码分割为两组7个字节的块
    • >31323341424300 00000000000000 // 16进制
    • 将每组转化为比特流,不足56Bit则在左边加0
    • >31323341424300 ->(转换为二进制) 110001001100100011001101000001010000100100001100000000-> (补 足56Bit) 00110001001100100011001101000001010000100100001100000000
    • 将比特流按照7比特一组,分出8组,末尾加0
    
    由于后者都为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
    

    LM HASH的特点和问题:

    1、口令不区分大小写
    2、口令长度最大为14字节,另外如果口令长度不超过7字节,则LM Hash的后8字节是固定值
    3、DES算法强度不够

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


    LM协议

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

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

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

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

    2、Server B -- 8bytes Challenge --> Client A,Server B向Client A发送了一个8字节挑战码 "0001020304050607"

    3、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)
    

    简单的概述就是:首先A保留了自己给B发送的明文密码通过算法生成的LM-HASH,由于A向B发起请求,B会给A返回一个8字节的挑战码,然后A再把自己生成的LM-HASH拆分三组,每组7字节,然后对每组的LM-HASH用挑战码进行DES加密,再把这个值发送给B,B也同样跟A一样用挑战码进行同样的操作,这里B不同的是,缓存的LM-HASH是自己服务器中存储的,而不是A的,这样就起到了区分的作用,然后再比较,如果一样则通过,反之。


    NTLM 协议:

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

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

    1、协商:主要用于确认双方协议版本(NTLM v1/NTLM V2)
    2、质询:就是挑战(Chalenge)/响应(Response)认证机制起作用的范畴,本小节主要讨论这个机制的运作流程。
    3、验证:验证主要是在质询完成后,验证结果,是认证的最后一步。

    质询的完整过程:

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

    2、服务器接受到请求,生成一个16位的随机数,被称之为Challenge, 使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Response,并且保存到内存中(这里的Response可以称之为Net NTLM Hash)。同时,生成Response后,将Challenge(16位随机字符)发送给客户端。

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

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

    验证: 服务器端收到客户端的Response后,比对两边的Response是否相等,若相等,则认证通过。

    注意:

    1.Chanllenge是Server产生的一个16字节的随机数,每次认证随机数都不同

    2.Response的表现形式是Net-NTLM Hash,它是由客户端 提供的密码Hash加密Server返回的Chanllenge产生的结果。


    Net-NTLMv1和Net-NTLMv2的加密方法:

    Net-NTLMv1

    客户端向服务器发送一个请求
    服务器接收到请求后,生成一个8位的Challenge,发送回客户端
    客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,作为response发送给服务器
    服务器校验response
    

    Net-NTLMv2:

    客户端向服务器发送一个请求
    服务器接收到请求后,生成一个16位的Challenge,发送回客户端
    客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,作为response发送给服务器
    服务器校验response
    

    总结:

    对于Net-NTLMv1的利用方法可以参考:https://xz.aliyun.com/t/2205

    两者的流程相同,但加密算法不同,Net-NTLMv1相对脆弱。

    技巧:根据LM Hash特征,LM Hash的后8字节是固定值,也能够判断用户的密码是否是大于等于7位,是的话则小于,不是的话则大于

    小知识点:自Windows Vista/Server2008开始,系统默认禁用Net-NTLMv1,使用Net-NTLMv2

    前面三个,当密码超过14位时候会采用NTLM加密 test:1003:E52CAC67419A9A22664345140A852F61:67A54E1C9058FCA16498061B9 6863248:::

    前一部分是LM Hash,后一部分是NTLM Hash 当LM Hash是 AAD3B435B51404EEAAD3B435B51404EE 这表示空密码或者是未使用LM_HASH

    Hash一般存储在两个地方: 1、SAM文件,存储在本机 对应本地用户 2、NTDS.DIT文件,存储在域控上 对应域用户

    文章参考:https://www.t00ls.net/articles-53261.html

  • 相关阅读:
    电脑分屏鼠标移不到另一个电脑上
    jquery datetimepicker 配置参数
    js获取前n天或者后n天的天数
    mysql查看变量
    Underscore _.template 方法使用详解
    sql优化
    echart图表demo
    jquery预加载的几种例子
    树莓派搭建服务器
    Thymeleaf标签学习
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11738923.html
Copyright © 2011-2022 走看看