- MS08-068:Vulnerability in SMB Could Allow Remote Code Execution
- Synacktiv:CVE-2025-33073 Analysis
- Synacktiv:CVE-2026-24294 Analysis
三个漏洞最终都将一份 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 | Victim Attacker Target |
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 | Network NTLM: |
如果 Client 是 NT AUTHORITY\SYSTEM,最终得到的就是 SYSTEM Token。后两个漏洞要制造的错位是:
LSASS 认为认证发生在本机,认证流量却经过攻击者控制的端点
2. MS08-068
MS08-068 是最直接的 SMB → SMB Reflection:
1 | Windows SMB Client |
如果被反射用户是本地管理员,攻击者可在该用户上下文访问管理共享、命名管道等高权限 SMB 资源。
微软给出的根因是:SMB 没有正确 opt-in 到 NTLM Credential Reflection Protection。
补丁使本机 LSASS 记录即将发送的正确 NTLM Response。如果本机 SMB Server 随后收到相同 Response,就将其识别为本机刚刚生成的响应并按 Replay 拒绝:
1 | SMB Client generates Response |
这里的保护边界是标准网络 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 | Full Target Name |
攻击者收到高权限服务的 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 的问题可以先拆成三个约束:
- 攻击者需要在非 445 端口启动一个本地 SMB Server。
- 诱导 LSASS 访问 SMB 的接口通常只接受 UNC 路径,不能写入 TCP 端口。
- 普通用户预先建立的 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 | 本机恶意 SMB Server:12345 |
这里的 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 | 连接 C:127.0.0.1:12345 |
这一步是整个漏洞的核心:复用的是 TCP Connection,不是普通用户的认证状态。SYSTEM 仍然要独立完成一次认证,因此 Session B 的安全上下文仍然是 SYSTEM。
由于认证目标是 127.0.0.1,NTLM 会进入 Local NTLM 流程。攻击者控制的 SMB Server 收到这次 SYSTEM 认证后,再把它转发到本机真正的 SMB Server:
1 | LSASS/SYSTEM |
完整攻击链可以按时间顺序写成:
1 | 1. 攻击者在本机 12345 端口启动 SMB Server |
“相同的共享路径”是必要条件。若第二次访问使用不同的 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 | Keep original fields -> Target 不认识该 Session |
攻击者可以转发 NTLM 身份,但不知道认证双方派生出的会话密钥,因此无法为自己构造的 TREE_CONNECT、CREATE、WRITE 或 IOCTL 请求生成有效签名。