再聊 NTLM Reflection:MS08-068 & CVE-2025-33073 & CVE-2026-24294

三个漏洞最终都将一份 NTLM 认证送回了认证来源主机,但操纵的对象不同:

漏洞 攻击位置 被操纵的对象 主要结果
MS08-068 / CVE-2008-4037 远程 SMB 认证响应 以被反射用户访问原主机
CVE-2025-33073 远程 Target Name 远程获得 SYSTEM SMB Session
CVE-2026-24294 本地 SMB Transport Connection 本地普通用户提升到 SYSTEM

1. Reflection & Local NTLM

NTLM Relay 中,攻击者将 Target 生成的 Challenge 交给 Victim,再把 Victim 计算的 Response 交回 Target。

1
2
3
4
Victim                  Attacker                  Target
|--- NEGOTIATE ---------->|--- NEGOTIATE --------->|
|<-- CHALLENGE -----------|<-- CHALLENGE ----------|
|--- AUTHENTICATE ------->|--- AUTHENTICATE ------>|

Relay 的认证来源与目标不同:

Machine A -> Attacker -> Machine B

Reflection 则是将认证送回来源机器:

Machine A -> Attacker -> Machine A

CVE-2025-33073 和 CVE-2026-24294 还依赖一种特殊情况:Local NTLM Authentication。

当 NTLM Client 与 Server 位于同一台机器时,Server 可以在 NTLM_CHALLENGE 中设置 NTLMSSP_NEGOTIATE_LOCAL_CALL,创建一个 Server Context,并把 Context ID 交给 Client。Client 不再计算普通网络 Response,而是将自己的 Token 写入同一个 lsass.exe 中的 Server Context。

1
2
3
4
5
Network NTLM:
Account Key + Challenge -> Response -> Server Verification

Local NTLM:
Client Token -> LSASS Shared Context -> Server Context

如果 Client 是 NT AUTHORITY\SYSTEM,最终得到的就是 SYSTEM Token。后两个漏洞要制造的错位是:

LSASS 认为认证发生在本机,认证流量却经过攻击者控制的端点

2. MS08-068

MS08-068 是最直接的 SMB → SMB Reflection:

1
2
3
4
5
6
7
Windows SMB Client
| NTLM
v
Malicious SMB Server
| reflect
v
SMB Server on the original client

如果被反射用户是本地管理员,攻击者可在该用户上下文访问管理共享、命名管道等高权限 SMB 资源。

微软给出的根因是:SMB 没有正确 opt-in 到 NTLM Credential Reflection Protection。

补丁使本机 LSASS 记录即将发送的正确 NTLM Response。如果本机 SMB Server 随后收到相同 Response,就将其识别为本机刚刚生成的响应并按 Replay 拒绝:

1
2
3
4
5
SMB Client generates Response
-> LSASS caches Response
-> Attacker reflects Response
-> Local SMB Server cache hit
-> Reject

这里的保护边界是标准网络 NTLM Challenge/Response 的重放。MS08-068 依赖 SMB/LSASS 对本机生成的 NTLM Response 进行关联和缓存,并在服务端再次收到相同认证材料时将其判定为 Replay。

而Local NTLM 虽然仍然交换 NTLMSSP_AUTHENTICATE 消息,但在 NEGOTIATE_LOCAL_CALL 分支中,NT/LM Challenge Response 字段可以视为置空,服务端改为通过 LSASS 的 Loopback Context 获取客户端 Access Token。

后续的 CVE-2025-33073 和 CVE-2026-24294 将这条 Local NTLM 认证路径导向攻击者控制的 SMB Server,从而绕过了 MS08-068 的 Fix。

3. CVE-2025-33073

《也聊 CVE-2025-33073 NTLM Reflection 攻击》 中聊过,这里只关注 Reflection 机制。

漏洞使用的特殊主机名类似:

localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA

后半部分是通过 CredMarshalTargetInfo 编码的 CREDENTIAL_TARGET_INFORMATION。不同组件对这个 Target Name 的处理不同:

组件 看到的 Target 判断
DNS / SMB 网络连接 完整特殊主机名 根据 DNS 记录连接攻击者
LSASS / Negotiate 移除 Marshaled Target Information 后的名称 Target 是 localhost 或本机名

攻击者将完整 DNS 记录指向自己的 SMB Server。网络连接会到达攻击者,但 LSASS 通过 CredUnmarshalTargetInfo 移除附加信息后,认为认证目标是本机:

1
2
3
4
5
Full Target Name
|-> DNS / SMB Client -> Attacker IP
|
|-> CredUnmarshalTargetInfo -> localhost
-> Local NTLM Authentication

攻击者收到高权限服务的 Local NTLM,再将其反射回目标真实 SMB Service;它没有破解或修改 NTLM Response,而是让两个组件对“认证目标是谁”得出了不同答案:

Physical Endpoint: Attacker
Logical Target: Local Machine

公开攻击链通常要求普通域用户能够写入对应 DNS 记录、目标可被 Coercion、目标未安装 2025 年 6 月补丁且没有强制 SMB Signing。

官方 FIX 位于 SMB Client。Synacktiv Diff 发现微软修改了 mrxsmb!SmbCeCreateSrvCall,在建立连接前使用 CredUnmarshalTargetInfo 检查 Target Name。如果 Target Name 中存在合法 Marshaled Target Information,SMB Client 直接拒绝连接。

补丁封住的是 CMTI(CredMarshalTargetInfo)Target Name → SMB Connection → Remote Local NTLM 这条路径。它没有删除 Local NTLM,也没有改变 LSASS 的 Loopback 判断。

这留下了一个问题:不用特殊 Target Name,能否让 Local NTLM 到达攻击者?

4. CVE-2026-24294

这个 CVE 只有 LPE 的攻击面。

CVE-2025-33073 的补丁封住了 CMTI 这条路径,但没有改变一个更底层的事实:只要攻击者能让本机 SMB Client 把 SYSTEM 的认证送到攻击者控制的 SMB Server,Local NTLM 仍然可以被反射。

CVE-2026-24294 的问题可以先拆成三个约束:

  1. 攻击者需要在非 445 端口启动一个本地 SMB Server。
  2. 诱导 LSASS 访问 SMB 的接口通常只接受 UNC 路径,不能写入 TCP 端口。
  3. 普通用户预先建立的 SMB 连接不能直接变成 SYSTEM 的 SMB Session。

漏洞利用的关键,是利用 SMB2 对 Transport Connection 和 Authenticated Session 的分离。普通用户只能预先占住一条 TCP 连接,但 SYSTEM 可以在这条连接上创建自己的新 Session。

Windows 11 24H2 与 Windows Server 2025 支持为 SMB 连接指定任意 TCP 端口:

1
net use \\127.0.0.1\test /tcpport:12345

这条命令的作用不是让普通用户获得 SYSTEM 权限,而是让系统 SMB Client 先建立并保留一条连接:

1
2
3
4
5
6
本机恶意 SMB Server:12345
^
| TCP Connection C
|
SMB Client ─┼─ Session A:普通用户
└─ Session B:稍后由 SYSTEM 创建

这里的 Session A 只是连接预热。它的作用是把连接 C 放进 SMB Client 的连接缓存,并不能让普通用户访问 SYSTEM 的 Session。

接下来,攻击者通过 PetitPotam 等机制让 LSASS 访问完全相同的共享路径:

1
强制访问:\\127.0.0.1\test

UNC 路径本身没有端口,因此单看这一步,SMB Client 似乎应该连接到本机的 445 端口。可是 SMB Client 发现相同的 Server、Share Path 已经存在一条可复用的连接 C,于是不会重新建立 445 连接,而是在 C 上发送新的 SMB2 SESSION_SETUP:

1
2
3
连接 C:127.0.0.1:12345
|-- 已有 Session A:普通用户
|-- 新建 Session B:NT AUTHORITY\SYSTEM

这一步是整个漏洞的核心:复用的是 TCP Connection,不是普通用户的认证状态。SYSTEM 仍然要独立完成一次认证,因此 Session B 的安全上下文仍然是 SYSTEM。

由于认证目标是 127.0.0.1,NTLM 会进入 Local NTLM 流程。攻击者控制的 SMB Server 收到这次 SYSTEM 认证后,再把它转发到本机真正的 SMB Server:

1
2
3
4
5
6
7
8
9
10
LSASS/SYSTEM
| 1. 对 \\127.0.0.1\test 发起认证
v
恶意 SMB Server:12345
| 2. 转发 NTLM 认证
v
本机 SMB Server:445
| 3. 建立 SYSTEM SMB Session
v
攻击者获得本地 SYSTEM 权限

完整攻击链可以按时间顺序写成:

1
2
3
4
5
6
7
8
1. 攻击者在本机 12345 端口启动 SMB Server
2. 普通用户使用 /tcpport:12345 访问 \\127.0.0.1\test
3. SMB Client 建立并缓存 TCP Connection C
4. 攻击者强制 LSASS 访问相同的 \\127.0.0.1\test
5. SMB Client 在 C 上为 SYSTEM 创建新的 SMB Session
6. 恶意 SMB Server 收到 SYSTEM 的 Local NTLM
7. 将认证反射到本机 445
8. 在本机 SMB 服务上得到 SYSTEM Session

“相同的共享路径”是必要条件。若第二次访问使用不同的 Server 或 Share Path,SMB Client 可能选择另一条连接,SYSTEM 的认证就不会到达攻击者监听的 12345 端口。

公开 PoC 中各组件的分工如下:

组件 作用
修改版 smbserver.py 在 12345 接收同一连接上的 SYSTEM 认证并交给 Relay
ntlmrelayx.py 将 Local NTLM 反射到本机 445
net.exe 预先建立带 /tcpport 的 TCP Connection
修改版 PetitPotam 让 LSASS 请求相同的 UNC Share Path

仓库见:0xNDI/CVE-2026-24294

5. SMB Signing

SMB Signing 阻止的不是 NTLM 三个认证消息被转发,而是攻击者在认证后控制 SMB Session。

Relay 两侧具有独立的 SessionId、TreeId 和消息状态。攻击者要把一侧 SMB 请求变成另一侧的请求,就需要修改 Header 或操作参数,并使用对应 Signing Key 重新签名:

1
2
3
Keep original fields -> Target 不认识该 Session
Rewrite fields -> 原签名失效
Remove signature -> Target 拒绝未签名请求

攻击者可以转发 NTLM 身份,但不知道认证双方派生出的会话密钥,因此无法为自己构造的 TREE_CONNECT、CREATE、WRITE 或 IOCTL 请求生成有效签名。