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处理压缩数据包的过程中,具体问题点:
- 解压数据包时使用客户端提供的长度参数而未进行充分验证
- 对
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端口
技术细节补充
内存布局
+---------------------+
| Original Buffer |
+---------------------+
| buf pointer | ← 被覆盖的目标
+---------------------+
| ... |
+---------------------+
| Compressed Data | ← 1108字节的'a'
+---------------------+
权限提升机制
- 定位当前进程的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