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协议连接流程
- 客户端建立与服务器的连接
- 在该连接上建立经过身份验证的上下文
- 发出各种请求访问文件、打印机和命名管道
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 (解压数据)
漏洞点:
SrvNetAllocateBuffer的参数为OriginalSize + Offset,未检查整数溢出- 攻击者可控制这两个值,导致分配过小内存
- 解压时数据超出分配内存,导致缓冲区溢出
2.3 漏洞利用技术
2.3.1 本地提权利用
利用思路:
- 通过整数溢出控制内存分配
- 覆盖Srvnet Buffer Header中的User Buffer指针
- 实现任意内存写入
- 修改SEP_TOKEN_PRIVILEGES提升权限
关键代码:
// 设置要写入的内核地址(SEP_TOKEN_PRIVILEGES)
*(uint64_t*)(buffer + 0x1108) = ktoken + 0x40;
2.3.2 远程利用配合
需要配合信息泄露漏洞(CVE-2020-1206):
- 设置Offset为0,OriginalSize为较大值
- 越界读取内核数据
- 获取内核地址信息
- 结合任意写实现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函数中:
- 分配新缓冲区存储文件名
- 释放旧缓冲区
- 仍尝试使用已释放的缓冲区拷贝数据
- 导致UAF条件
关键代码:
if (*(_BYTE *)(v6 + 114))
ExFreePoolWithTag(*(PVOID *)(v6 + 400), 0); // 释放旧缓冲区
if (v11)
memmove(v13, *(const void **)(v6 + 400), 2i64 * v11); // 使用已释放缓冲区
4. 防御与缓解措施
- 及时安装微软官方补丁
- 禁用SMBv3压缩功能
- 关闭不必要的445端口
- 使用网络隔离限制SMB访问
- 启用内存保护机制(如CFG, DEP)
5. 研究资源
- 微软官方文档:[MS-SMB2]协议规范
- 调试工具:WinDbg, IDA Pro
- 测试框架:Windows Protocol Test Suites
- 参考实现:srv2.sys, srvnet.sys
6. 总结
SMB协议漏洞研究要点:
- 深入理解协议规范和实现细节
- 关注内存管理相关操作
- 分析异常处理路径
- 注意整数溢出等边界条件
- 综合利用信息泄露和内存破坏漏洞
通过分析这些漏洞,可以更好地理解Windows内核和网络协议的安全机制,为发现和防御类似漏洞提供参考。