NTLM基础学习
Windows 认证
介绍
- Windows 系统内部不保存⽤户的明⽂密码,只保存密码的 Hash 值
- 本机⽤户 的密码 Hash 是存放 SAM( C:/Windows/System32/config/SAM )⽂件中
- 域内⽤户 的密码 Hash 是存在域控的 NTDS.DIT ⽂件中
Windows 系统导出密码的格式如下:
⽤户名:RID:LM-Hash:NTLM-Hash
当 Windows ⽤户密码 ≤ 14 个字符,SAM ⽂件中是 LM-Hash 值 + NTLM-Hash 值
当 Windows ⽤户密码 >14 个字符,SAM ⽂件中是 NTLM-Hash 值
LM Hash & NTLM Hash
LM Hash
全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。
Windows XP、Windows 2000、Windows 2003 系统默认使⽤ LM Hash 加密 Windows 2008、Windows 7、Windows Vista、Windows 8、Windows 10、Windows 2016 禁⽤了 LM Hash, 默认使⽤ NTLM Hash
LM-Hash ⽣成步骤:
- 1.⽤户⼝令全部转为⼤写
- 2.⽤户⼝令转为 16 进制之后不⾜ 14 个字符(28 位)⻓度,⽤ 0 补⾜
- 3.把密码的 16 进制字符串分成两个 7 byte 部分
- 4.每部分转换成⽐特流,并且⻓度为 56 bit,⻓度不⾜使⽤ 0 在左边补⻬⻓度
- 5.再分 7 bit 为⼀组末尾加 0,转换为 16 进制,组成新的编码
- 6.分别⽤ key 为“KGS!@#$%”(4B47532140232425)进⾏ DES 加密
- 7.最后将⼆组 DES 加密后的编码拼接,获得 LM-Hash 值
LM加密算法存在一些固有的漏洞
- 首先,密码长度最大只能为14个字符
- 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
- 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
- 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于14个字符的密码的理论强度。
- Des密码强度不高
NTLM Hash
- 为了解决 LM 加密和身份验证⽅案中固有的安全弱点,Microsoft 于 1993 年在 Windows NT 3.1 中引⼊了 NTLM 协议
- 通常是指 Windows 系统下 Security Account Manager 中保存的⽤户密码 Hash
- 可以直接⽤于 PTH(Pass The Hash),并且通常存在于 LSASS 进程中,便于 SSP(NTLM 安全⽀持提供程 序)使⽤
也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。(因此后面我们介绍身份认证的时候只介绍Net-ntlm,不再介绍net-lm)如果空密码或者不储蓄LM Hash的话,我们抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE。
NTLM-Hash ⽣成步骤
1.先将用户密码转换为十六进制格式。
2.将十六进制格式的密码进行Unicode编码。
3.使用MD4摘要算法对Unicode编码数据进行Hash计算
NTLM 本地认证
Windows 调⽤ winlogon.exe 进程(也就是我们平常⻅到的登录框)接收⽤户的密码,之后将密码传送给 lsass.exe 进程
lsass.exe 进程会先在内存中存储⼀份明⽂密码,然后将明⽂密码加密为 NTLM-Hash 后,与Windows 本地的 SAM 数据库中该⽤户的 NTLM-Hash 对⽐,如果⼀致则通过认证
Net-NTLM Hash
- Net-NTLM Hash 指⽹络环境下 NTLM 认证中的 Hash
- Net-NTLM Hash 是 Challenge/Response 认证机制中客户端发往服务端的 Response
- Net-NTLM Hash 不能直接获取,可通过 Responder ⼯具进⾏拦截获取,此 Hash 不能进⾏PTH(Pass The Hash),但可进⾏中继转发
NTLM 认证机制
NTLM 是⼀种⽹络认证协议,采⽤ Challenge/Response 机制
- 1.⾸先客户端向服务端发送⽤户名以及本机的⼀些信息
- 2.服务端接收到客户端的⽤户名后,先⽣成⼀个随机的 16 位的 Challenge(挑战随机数),本地储存后将 Challenge 返回给客户端
- 3.客户端接收到服务端发来的 Challenge 后,使⽤⽤户输⼊密码的 NTLM Hash 对 Challenge 进⾏加密⽣成 Response(也叫 Net-NTLM Hash),将 Response 发送给服务端
- PS:经过NTLMHash加密的Challenge称为NetNTLM Hash。
- 4.服务端接收到客户端发来的 Response,使⽤数据库中对应⽤户的 NTLM Hash 对之前存储的 Challenge 进⾏ 加密,得到的结果与接收的 Response 进⾏对⽐,如果⼀致则通过认证
NTLM 认证缺陷
- 在认证过程中⽤户的明⽂密码并没有在客户端和服务端之间传输,取⽽代之的是 Net-NTLM Hash
- 如果攻击者得到了⽤户的 NTLM Hash,那么便可以冒充该⽤户通过身份验证,即 Hash 传递攻击(Pass The Hash,PTH)
NTLM 认证协议
- 在 NTLM 认证中,分为 Net-NTLM v1、Net-NTLM v2 两种协议
- 不同协议使⽤不同格式的 Challenge 和加密算法
- 所以存在不同协议的 Net-NTLM Hash,即 Net-NTLM v1 Hash、Net-NTLM v2 Hash 两种协议
- Net-NTLM v1:DES 加密、8 位 Challenge
- Net-NTLM v2:HMAC-MD5 加密、16 位 Challenge
NTLM 域认证
域认证默认⾸选是 Kerberos 认证,但是也可以使⽤ NTLM 来进⾏认证
NTLM 在域环境中区别主要是最终在域控(DC)中完成验证
- 1.客户端向服务端发送⽤户名等信息
- 2.服务端返回随机 16 位 Challenge
- 3.客户端⽤本地 NTLM Hash 加密⽣成 Response,并将 Response 发送给服务端
- 4.服务端向域控(DC)发送⽤户名、之前返回给客户端的 Challenge、客户端发来的 Response
- 5.域控(DC)⽤本地数据库(NTDT.DIT)⾥的 NTLM Hash 加密 Challenge,将结果与 Response 对⽐,然后 将验证结果返回给服务端
- 6.服务端再将结果消息返回给客户端
Net-NTLM Hash 获取
利⽤ Responder ⼯具,配合⼀些中间⼈或者其他技巧,它可以通过设置多个模拟的恶意进程(如 SQL 服务器、 FTP、HTTP 和 SMB 服务器等)来直接模拟凭据或模拟 Challenge/Response 验证的过程,并捕获客户端发送的 Net-NTLM Hash
项⽬地址:https://github.com/SpiderLabs/Responder
SSP & SSPI
- SSPI(Security Support Provider Interface)
这是 Windows 定义的一套接口,此接口定义了与安全有关的功能函数, 用来获得验证、信息完整性、信息隐私等安全功能,就是定义了一套接口函数用来身份验证,签名等,但是没有具体的实现。
- SSP(Security Support Provider)
SSPI 的实现者,对SSPI相关功能函数的具体实现。微软自己实现了如下的 SSP,用于提供安全功能:
1.
NTLM SSP
2.
Kerberos
3.
Cred SSP
4.
Digest SSP
5.
Negotiate SSP
6.
Schannel SSP
7.
Negotiate Extensions SSP
8.
PKU2U SSP
在系统层面,SSP就是一个dll,来实现身份验证等安全功能,实现的身份验证机制是不一样的。比如 NTLM SSP 实现的就是一种 Challenge/Response 验证机制。而 Kerberos 实现的就是基于 ticket 的身份验证机制。我们可以编写自己的 SSP,然后注册到操作系统中,让操作系统支持更多的自定义的身份验证方法。
这个地方可以用于留作后门。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!