赛虎学院信息安全: SMB远程代码执行漏洞 CVE-2020-0796 复现与分析
一、前言
2020年3月10日,自思科talos泄露了一个微软smb v3.1协议漏洞,随即在3月12日,微软公布了紧急修复补丁。
该漏洞编号为CVE-2020-0796,名称为“smbghost”。是一个针对Windows的 SMBv3 客户端与服务端远程代码执行漏洞。其漏洞原理是Microsoft服务器消息块3.1.1(即SMBv3)协议处理某些请求的方式中存在一个远程执行代码漏洞。成功利用此漏洞的攻击者可以获得在目标服务器或客户端上执行代码的能力。SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码。攻击者利用该漏洞无须权限即可实现远程代码执行,受黑客攻击的目标系统只需开机在线即可能被入侵。
二、漏洞影响
三、漏洞复现
使用一台安装Windows 10 专业版(版本为1909 Build 18363)的虚拟机作为被攻击机。
首先复现该漏洞的蓝屏POC脚本 ↓
(https://github.com/eerykitty/CVE-2020-0796-PoC)
接下来复现利用该漏洞的编写的本地权限提升EXP 。此EXP利用smbghost漏洞将shellcode注入winlogon.exe。在本地执行后可以用来提权。↓
(https://github.com/danigargu/CVE-2020-0796/)
四、漏洞检测
方法一:
https://github.com/ollypwn/SMBGhost/blob/master/scanner.py
使用socket发送数据包
注:但这种检测方法经过测试,针对微软官方补丁,存在误报。
方法二:
通过检测检测系统版本和补丁情况判断 ↓
(https://github.com/T13nn3s/CVE-2020-0796)*
下面分析代码中的功能模块:
判断系统版本模块:
经过测试本方法非常可靠,基本不会误报。
五、漏洞 分析
漏洞位置:
根据分析,漏洞存在于srv2.sys文件中。并涉及到以下函数:
可以看到,标头中有两个参数:
OriginalCompressedSegmentSize和Offset / Length。
攻击者可以控制这两个参数,其中,第一个参数为压缩前的数据大小。第二个为压缩数据的长度或者偏移。
攻击发生时,srv2.sys中处理SMBv3压缩数据包的解压函数
Srv2DecompressData
未严格校验数据包中
OriginalCompressedSegmentSize和Offset/Length
字段的合法性。就直接将其相加后作为内存分配的参数。从而在后续调用解压函数SmbCompressionDecompress过程中引发越界。
此处参考360博客上分析的代码:根据代码分析,a2的值为OriginalCompressedSegmentSize,v21的值为从smb数据包中解析的解压缩数据的大小,由于该值可由攻击者控制,若该大小大于OriginalCompressedSegmentSize,则会返回0xC0000242错误。由于之前对长度没有检查,如果我们传入一个很大的OriginalCompressedSegmentSize触发整数溢出,同时v21就可以设置一个极大值,而依然可以通过对decompress size的判断,最终调用qmemcpy拷贝一个极大的size导致缓冲区溢出。
六、漏洞修复
- 更新微软官方补丁KB4551762(推荐)↓
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0618