CVE-2020-0796 SMB漏洞本地提权分析
字数 1435 2025-08-25 22:58:34

CVE-2020-0796 SMB漏洞本地提权分析教学文档

漏洞概述

CVE-2020-0796是Windows SMBv3协议中的一个严重漏洞,微软于2020年3月12日发布补丁。该漏洞存在于srv2.sys驱动中,由于SMB没有正确处理压缩数据包,导致整数溢出和内存破坏,最终可实现本地提权或远程代码执行。

漏洞原理

根本原因

漏洞发生在SMB处理压缩数据包的过程中,具体问题点:

  • 解压数据包时使用客户端提供的长度参数而未进行充分验证
  • OriginalCompressedSegmentSizeOffsetOrLength两个32位参数相加时产生整数溢出

关键函数调用链

  1. Srv2ReceiveHandler
  2. Srv2DecompressMessageAsync
  3. Srv2DecompressData

漏洞触发机制

Srv2DecompressData函数中:

  1. 攻击者可以控制OriginalCompressedSegmentSizeOffsetOrLength参数
  2. 这两个参数相加时可能产生整数溢出
  3. 导致后续内存分配和拷贝操作出现异常

调试分析

关键调试点

  1. Srv2!Srv2DecompressData函数中:

    • 在add指令执行前,rcx寄存器值为0x10
    • 执行add后变为0xf(整数溢出)
  2. 内存操作:

    • 调用rvnet!SrvNetAllocateBuffer申请内存
    • 调用nt!RtlDecompressBufferXpressLz进行内存拷贝
    • buf+1108+10指向了buf的地址

利用过程

  1. 攻击者发送1108个'a'字符进行压缩传输
  2. 覆盖buf指针的地址,将其修改为SEP_TOKEN_PRIVILEGES的地址
  3. 查看token权限:SEP_TOKEN_PRIVILEGES位于token+0x40地址
  4. 通过任意写修改这个指针为system权限的TOKEN_PRIVILEGES

利用代码分析

参考项目:https://github.com/danigargu/CVE-2020-0796

关键操作:

  1. 修改SEP_TOKEN_PRIVILEGES的值为0x0000001ff2ffffbc
  2. 将当前进程权限提升至system进程权限
  3. 执行进程注入,弹出cmd shell

漏洞影响

受影响系统:

  • Windows 10版本1903/1909
  • Windows Server版本1903/1909

防御措施

  1. 及时安装微软发布的补丁
  2. 禁用SMBv3压缩功能
  3. 在网络边界阻止TCP 445端口

技术细节补充

内存布局

+---------------------+
| Original Buffer     |
+---------------------+
| buf pointer         | ← 被覆盖的目标
+---------------------+
| ...                 |
+---------------------+
| Compressed Data     | ← 1108字节的'a'
+---------------------+

权限提升机制

  1. 定位当前进程的token结构
  2. 找到SEP_TOKEN_PRIVILEGES偏移量(token+0x40)
  3. 将其修改为system进程的权限值
  4. 权限值设置为0x0000001ff2ffffbc(完全特权)

参考资源

  1. 微软安全公告:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796
  2. 利用代码仓库:https://github.com/danigargu/CVE-2020-0796
  3. SMB协议文档:https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2
CVE-2020-0796 SMB漏洞本地提权分析教学文档 漏洞概述 CVE-2020-0796是Windows SMBv3协议中的一个严重漏洞,微软于2020年3月12日发布补丁。该漏洞存在于 srv2.sys 驱动中,由于SMB没有正确处理压缩数据包,导致整数溢出和内存破坏,最终可实现本地提权或远程代码执行。 漏洞原理 根本原因 漏洞发生在SMB处理压缩数据包的过程中,具体问题点: 解压数据包时使用客户端提供的长度参数而未进行充分验证 对 OriginalCompressedSegmentSize 和 OffsetOrLength 两个32位参数相加时产生整数溢出 关键函数调用链 Srv2ReceiveHandler → Srv2DecompressMessageAsync → Srv2DecompressData 漏洞触发机制 在 Srv2DecompressData 函数中: 攻击者可以控制 OriginalCompressedSegmentSize 和 OffsetOrLength 参数 这两个参数相加时可能产生整数溢出 导致后续内存分配和拷贝操作出现异常 调试分析 关键调试点 Srv2!Srv2DecompressData 函数中: 在add指令执行前,rcx寄存器值为0x10 执行add后变为0xf(整数溢出) 内存操作: 调用 rvnet!SrvNetAllocateBuffer 申请内存 调用 nt!RtlDecompressBufferXpressLz 进行内存拷贝 buf+1108+10 指向了buf的地址 利用过程 攻击者发送1108个'a'字符进行压缩传输 覆盖buf指针的地址,将其修改为 SEP_TOKEN_PRIVILEGES 的地址 查看token权限: SEP_TOKEN_PRIVILEGES 位于 token+0x40 地址 通过任意写修改这个指针为system权限的 TOKEN_PRIVILEGES 利用代码分析 参考项目:https://github.com/danigargu/CVE-2020-0796 关键操作: 修改 SEP_TOKEN_PRIVILEGES 的值为 0x0000001ff2ffffbc 将当前进程权限提升至system进程权限 执行进程注入,弹出cmd shell 漏洞影响 受影响系统: Windows 10版本1903/1909 Windows Server版本1903/1909 防御措施 及时安装微软发布的补丁 禁用SMBv3压缩功能 在网络边界阻止TCP 445端口 技术细节补充 内存布局 权限提升机制 定位当前进程的token结构 找到 SEP_TOKEN_PRIVILEGES 偏移量(token+0x40) 将其修改为system进程的权限值 权限值设置为 0x0000001ff2ffffbc (完全特权) 参考资源 微软安全公告:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0796 利用代码仓库:https://github.com/danigargu/CVE-2020-0796 SMB协议文档:https://docs.microsoft.com/en-us/openspecs/windows_ protocols/ms-smb2