SMB协议漏洞分析
字数 1449 2025-08-18 11:35:59

SMB协议漏洞分析与利用技术详解

1. SMB协议基础

1.1 SMB协议概述

SMB(Server Message Block)协议是一种用于在网络中共享文件、打印机和其他资源的通信协议。关键点:

  • SMB 1.0必须实现CIFS协议,CIFS基于TCP实现
  • 默认使用445端口
  • SMB2和SMB3是对SMB1的扩展,增加了安全性和管理功能
  • Windows实现模块为srv2.sys

1.2 SMB协议连接流程

  1. 客户端建立与服务器的连接
  2. 在该连接上建立经过身份验证的上下文
  3. 发出各种请求访问文件、打印机和命名管道

2. CVE-2020-0796漏洞分析

2.1 漏洞背景

  • 漏洞存在于SMBv3的压缩功能中
  • 影响模块:srv2.sys
  • 漏洞类型:整数溢出导致缓冲区溢出

2.2 漏洞原理

2.2.1 SMB2压缩包结构

压缩包结构定义在SMB2 COMPRESSION_TRANSFORM_HEADER中:

ProtocolId (4 bytes)
OriginalCompressedSegmentSize (4 bytes)
CompressionAlgorithm (2 bytes)
Flags (2 bytes)
Offset (4 bytes)

关键字段:

  • OriginalCompressedSegmentSize:原始未压缩数据大小
  • Offset:压缩数据相对于当前结构的偏移

2.2.2 漏洞函数分析

主要漏洞函数Srv2DecompressData调用链:

Srv2DecompressData 
-> SrvNetAllocateBuffer (分配内存)
-> SmbCompressionDecompress (解压数据)

漏洞点:

  1. SrvNetAllocateBuffer的参数为OriginalSize + Offset,未检查整数溢出
  2. 攻击者可控制这两个值,导致分配过小内存
  3. 解压时数据超出分配内存,导致缓冲区溢出

2.3 漏洞利用技术

2.3.1 本地提权利用

利用思路:

  1. 通过整数溢出控制内存分配
  2. 覆盖Srvnet Buffer Header中的User Buffer指针
  3. 实现任意内存写入
  4. 修改SEP_TOKEN_PRIVILEGES提升权限

关键代码:

// 设置要写入的内核地址(SEP_TOKEN_PRIVILEGES)
*(uint64_t*)(buffer + 0x1108) = ktoken + 0x40;

2.3.2 远程利用配合

需要配合信息泄露漏洞(CVE-2020-1206):

  1. 设置Offset为0,OriginalSize为较大值
  2. 越界读取内核数据
  3. 获取内核地址信息
  4. 结合任意写实现RCE

2.4 漏洞验证与调试

调试关键点:

  • 漏洞触发点在nt!RtlDecompressBufferXpressLz+0x50
  • 内存分配大小检查:0x1100字节边界
  • 调用栈分析:
nt!RtlDecompressBufferXpressLz+0x50
srvnet!SmbCompressionDecompress+0xdd
srv2!Srv2DecompressData+0xe1
srv2!Srv2DecompressMessageAsync+0x1e

3. CVE-2020-1206漏洞分析

3.1 漏洞概述

  • 类型:UAF(Use-After-Free)
  • 涉及SMB2 SET_INFO消息处理
  • 可用于信息泄露,配合CVE-2020-0796实现RCE

3.2 漏洞原理

Smb2UpdateLeaseFileName函数中:

  1. 分配新缓冲区存储文件名
  2. 释放旧缓冲区
  3. 仍尝试使用已释放的缓冲区拷贝数据
  4. 导致UAF条件

关键代码:

if (*(_BYTE *)(v6 + 114))
    ExFreePoolWithTag(*(PVOID *)(v6 + 400), 0); // 释放旧缓冲区
if (v11)
    memmove(v13, *(const void **)(v6 + 400), 2i64 * v11); // 使用已释放缓冲区

4. 防御与缓解措施

  1. 及时安装微软官方补丁
  2. 禁用SMBv3压缩功能
  3. 关闭不必要的445端口
  4. 使用网络隔离限制SMB访问
  5. 启用内存保护机制(如CFG, DEP)

5. 研究资源

  1. 微软官方文档:[MS-SMB2]协议规范
  2. 调试工具:WinDbg, IDA Pro
  3. 测试框架:Windows Protocol Test Suites
  4. 参考实现:srv2.sys, srvnet.sys

6. 总结

SMB协议漏洞研究要点:

  1. 深入理解协议规范和实现细节
  2. 关注内存管理相关操作
  3. 分析异常处理路径
  4. 注意整数溢出等边界条件
  5. 综合利用信息泄露和内存破坏漏洞

通过分析这些漏洞,可以更好地理解Windows内核和网络协议的安全机制,为发现和防御类似漏洞提供参考。

SMB协议漏洞分析与利用技术详解 1. SMB协议基础 1.1 SMB协议概述 SMB(Server Message Block)协议是一种用于在网络中共享文件、打印机和其他资源的通信协议。关键点: SMB 1.0必须实现CIFS协议,CIFS基于TCP实现 默认使用445端口 SMB2和SMB3是对SMB1的扩展,增加了安全性和管理功能 Windows实现模块为srv2.sys 1.2 SMB协议连接流程 客户端建立与服务器的连接 在该连接上建立经过身份验证的上下文 发出各种请求访问文件、打印机和命名管道 2. CVE-2020-0796漏洞分析 2.1 漏洞背景 漏洞存在于SMBv3的压缩功能中 影响模块:srv2.sys 漏洞类型:整数溢出导致缓冲区溢出 2.2 漏洞原理 2.2.1 SMB2压缩包结构 压缩包结构定义在SMB2 COMPRESSION_ TRANSFORM_ HEADER中: 关键字段: OriginalCompressedSegmentSize:原始未压缩数据大小 Offset:压缩数据相对于当前结构的偏移 2.2.2 漏洞函数分析 主要漏洞函数 Srv2DecompressData 调用链: 漏洞点: SrvNetAllocateBuffer 的参数为 OriginalSize + Offset ,未检查整数溢出 攻击者可控制这两个值,导致分配过小内存 解压时数据超出分配内存,导致缓冲区溢出 2.3 漏洞利用技术 2.3.1 本地提权利用 利用思路: 通过整数溢出控制内存分配 覆盖Srvnet Buffer Header中的User Buffer指针 实现任意内存写入 修改SEP_ TOKEN_ PRIVILEGES提升权限 关键代码: 2.3.2 远程利用配合 需要配合信息泄露漏洞(CVE-2020-1206): 设置Offset为0,OriginalSize为较大值 越界读取内核数据 获取内核地址信息 结合任意写实现RCE 2.4 漏洞验证与调试 调试关键点: 漏洞触发点在 nt!RtlDecompressBufferXpressLz+0x50 内存分配大小检查:0x1100字节边界 调用栈分析: 3. CVE-2020-1206漏洞分析 3.1 漏洞概述 类型:UAF(Use-After-Free) 涉及SMB2 SET_ INFO消息处理 可用于信息泄露,配合CVE-2020-0796实现RCE 3.2 漏洞原理 在 Smb2UpdateLeaseFileName 函数中: 分配新缓冲区存储文件名 释放旧缓冲区 仍尝试使用已释放的缓冲区拷贝数据 导致UAF条件 关键代码: 4. 防御与缓解措施 及时安装微软官方补丁 禁用SMBv3压缩功能 关闭不必要的445端口 使用网络隔离限制SMB访问 启用内存保护机制(如CFG, DEP) 5. 研究资源 微软官方文档:[ MS-SMB2 ]协议规范 调试工具:WinDbg, IDA Pro 测试框架:Windows Protocol Test Suites 参考实现:srv2.sys, srvnet.sys 6. 总结 SMB协议漏洞研究要点: 深入理解协议规范和实现细节 关注内存管理相关操作 分析异常处理路径 注意整数溢出等边界条件 综合利用信息泄露和内存破坏漏洞 通过分析这些漏洞,可以更好地理解Windows内核和网络协议的安全机制,为发现和防御类似漏洞提供参考。