NTLM基础学习

Windows 认证

介绍

  • Windows 系统内部不保存⽤户的明⽂密码,只保存密码的 Hash 值
  • 本机⽤户 的密码 Hash 是存放 SAM( C:/Windows/System32/config/SAM )⽂件中
  • 域内⽤户 的密码 Hash 是存在域控的 NTDS.DIT ⽂件中

Windows 系统导出密码的格式如下:

⽤户名:RID:LM-Hash:NTLM-Hash

image-20220219220317422

当 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 值

image-20220219220634249

LM加密算法存在一些固有的漏洞

  1. 首先,密码长度最大只能为14个字符
  2. 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
  3. 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
  4. 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于img14个字符的密码的理论强度。
  5. Des密码强度不高

NTLM Hash

  • 为了解决 LM 加密和身份验证⽅案中固有的安全弱点,Microsoft 于 1993 年在 Windows NT 3.1 中引⼊了 NTLM 协议
  • 通常是指 Windows 系统下 Security Account Manager 中保存的⽤户密码 Hash
  • 可以直接⽤于 PTH(Pass The Hash),并且通常存在于 LSASS 进程中,便于 SSP(NTLM 安全⽀持提供程 序)使⽤

image-20220219221338432

也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。(因此后面我们介绍身份认证的时候只介绍Net-ntlm,不再介绍net-lm)如果空密码或者不储蓄LM Hash的话,我们抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE。

NTLM-Hash ⽣成步骤

image-20220219221529586

1.先将用户密码转换为十六进制格式。

2.将十六进制格式的密码进行Unicode编码。

3.使用MD4摘要算法对Unicode编码数据进行Hash计算

NTLM 本地认证

image-20220219221635959

  1. Windows 调⽤ winlogon.exe 进程(也就是我们平常⻅到的登录框)接收⽤户的密码,之后将密码传送给 lsass.exe 进程

  2. 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 机制

image-20220219222855462

  • 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)中完成验证

image-20220219223830895

  • 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

image-20220219225838549

  • SSPI(Security Support Provider Interface)

这是 Windows 定义的一套接口,此接口定义了与安全有关的功能函数, 用来获得验证、信息完整性、信息隐私等安全功能,就是定义了一套接口函数用来身份验证,签名等,但是没有具体的实现。

  • SSP(Security Support Provider)

SSPI 的实现者,对SSPI相关功能函数的具体实现。微软自己实现了如下的 SSP,用于提供安全功能:

  1. 1.

    NTLM SSP

  2. 2.

    Kerberos

  3. 3.

    Cred SSP

  4. 4.

    Digest SSP

  5. 5.

    Negotiate SSP

  6. 6.

    Schannel SSP

  7. 7.

    Negotiate Extensions SSP

  8. 8.

    PKU2U SSP

在系统层面,SSP就是一个dll,来实现身份验证等安全功能,实现的身份验证机制是不一样的。比如 NTLM SSP 实现的就是一种 Challenge/Response 验证机制。而 Kerberos 实现的就是基于 ticket 的身份验证机制。我们可以编写自己的 SSP,然后注册到操作系统中,让操作系统支持更多的自定义的身份验证方法。

这个地方可以用于留作后门。

参考:https://www.anquanke.com/post/id/193149#h2-9


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!