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%\system32\config\sam
当我们登录系统的时候,系统会自动地读取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
windows认证过程的更多相关文章
- asp.net权限认证:Windows认证
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- 7.内网渗透之windows认证机制
文章参考自三好学生域渗透系列文章 看了内网渗透第五篇文章,发现如果想要真正了解PTT,PTH攻击流程,还需要了解windows的认证机制,包括域内的kerberos协议. windows认证机制 在域 ...
- Windows认证 | 域认证
在Windows中的身份认证方式有很多,也在不断的升级,但是在域中,依旧使用的是Kerberos认证. Kerberos 是一种网络认证协议,它的实现不依赖于主机操作系统的认证,无需基于主机地址的信任 ...
- 彻底理解Windows认证1
彻底理解Windows认证 一.Windows本地认证 1. 我的密码在哪里? 路径:C:\Windows\System32\config\SAM 当我们登录系统的时候,系统会自动的读取SAM文件中的 ...
- 解读windows认证
0x00 前言 dll劫持的近期忙,没时间写,先给大家写个windows认证的水文. 0x01 windows认证协议 windows上的认证大致分为本地认证,ntlm协议,和Kerberos协议. ...
- windows认证解读
0x00 本地认证 本地认证基础知识 在本地登录Windows的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,但是操作系统中的密码存储在哪里呢? %SystemRoot%\sy ...
- 内网渗透-windows认证
前言:全国HW刚结束,加强一波内网概念,去年11月红队成绩并不理想,这次必拿下好成绩.冲!!! 0x00 本地认证 本地认证基础知识 在本地登录Windows的情况下,操作系统会使用用户输入的密码作为 ...
- Windows认证体系解读
目录 Windows认证方式 Windows本地认证 NTLM认证方式(工作组环境中) wiresharek抓包NTLMv2,使用Hashcat爆破 NTLM认证方式(域环境中) Kerberos认证 ...
- 内网渗透之Windows认证(二)
title: 内网渗透之Windows认证(二) categories: 内网渗透 id: 6 key: 域渗透基础 description: Windows认证协议 abbrlink: d6b7 d ...
随机推荐
- kafka 如何保证数据不丢失
一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会问到相关的问题.但凡遇到这种问题,是指3个方面的数据不丢失,即:producer consumer 端数据不丢失 b ...
- SSM学习系列
Spring+SpringMVC+MyBatis Spring+SpringMVC+MyBatis深入学习及搭建(一)——MyBatis的基础知识 Spring+SpringMVC+MyBatis深入 ...
- 【LeetCode】 #7:反转整数 C语言
目录 题目 思路 初步想法 进一步想法 总结 最近打算练习写代码的能力,所以从简单题开始做. 大部分还是用C语言来解决. @(解法) 题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...
- go开发环境
1.go 下载地址 https://studygolang.com/dl 根据操作系统 下载相应的安装包 2.设置环境变量 goroot gopath path 增加%goroot%\bin 3.开发 ...
- GoLang基础数据类型---字典
Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:make(map[Key ...
- 解决使用RabbitTemplate操作RabbitMQ,发生The channelMax limit is reached. Try later.问题
使用RabbitTemplate操纵RabbitMQ,每个RabbitTemplate等于一个connection,每个connection最多支持2048个channel,当hannel达到2048 ...
- win10下更新anaconda和pip源
第一步:更新anaconda源. anaconda的官方源太慢,推荐清华源:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 软件下载也可以在这个 ...
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- Spring-Cloud之Zuul路由网关-6
一.为什么需要Zuul? Zuul 作为微服务系统的网关组件,用于构建边界服务( Edge Service ),致力于动态路由.过滤.监控.弹性伸缩和安全.Zuul 作为路由网关组件,在微服务架构中有 ...
- 常见的python练习题
1.冒泡排序 def bubble_sort(lists): len_list=len(lists) for i in range(len_list): for j in range(len_list ...