前言
微软安全中心在北京时间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了

