前言
微软安全中心在北京时间3月12日23时发布了影响Windows 10 等系统用户的SMBv3远程代码执行漏洞补丁
漏洞原因
漏洞发生在srv2.sys
中,由于SMB没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法.最终导致整数溢出。
漏洞分析
看一下调用过程:Srv2ReceiveHandler
调用Srv2DecompressMessageAsync
Srv2DecompressMessageAsync
调用Srv2DecompressData
漏洞在Srv2DecompressData
函数中
攻击者可以控制OriginalCompressedSegmentSize
和OffsetOrLength
这两个参数。OriginalCompressedSegmentSize
用来描述压缩前的数据大小,1OffsetOrLength1用来描述压缩数据的长度或者片偏移,这两个都是32位的长度,相加产生整数溢出
调试分析
这里通过本地提权调试一下该漏洞的原因,项目地址:
1 | https://github.com/danigargu/CVE-2020-0796 |
Srv2!Srv2DecompressData
在add
之前rcx
为0x10
add
之后为0xf
,整数溢出
然后调用rvnet!SrvNetAllocateBuffer
申请内存,调用nt!RtlDecompressBufferXpressLz
进行内存拷贝,
buf+1108+10
指向了buf
的地址
在压缩传输时发送1108
个a
然后就可以覆盖buf
指针的地址,作者利用下面代码,修改buf
的指针为SEP_TOKEN_PRIVILEGES
的地址:
修改后buf的地址为:
我们查看一下token
权限:
SEP_TOKEN_PRIVILEGES
在token+0x40
的地址,这个地址就是前面buffer指针覆盖的地址
通过任意写修改这个指针为system
的权限,查看一下system
的TOKEN_PRIVILEGES
所以作者在代码里修改了SEP_TOKEN_PRIVILEGES
的值为0x0000001ff2ffffbc
此时程序的权限变成了system进程的权限,后面就是常规的进程注入,弹cmd了