Jcxp's blog

CVE-2020-0796 SMB漏洞分析

Word count: 422Reading time: 1 min
2020/03/31 Share

前言

微软安全中心在北京时间3月12日23时发布了影响Windows 10 等系统用户的SMBv3远程代码执行漏洞补丁

漏洞原因

漏洞发生在srv2.sys中,由于SMB没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法.最终导致整数溢出。

漏洞分析

看一下调用过程:
Srv2ReceiveHandler调用Srv2DecompressMessageAsync

Srv2DecompressMessageAsync 调用Srv2DecompressData

漏洞在Srv2DecompressData函数中

攻击者可以控制OriginalCompressedSegmentSizeOffsetOrLength这两个参数。OriginalCompressedSegmentSize用来描述压缩前的数据大小,1OffsetOrLength1用来描述压缩数据的长度或者片偏移,这两个都是32位的长度,相加产生整数溢出

调试分析

这里通过本地提权调试一下该漏洞的原因,项目地址:

1
https://github.com/danigargu/CVE-2020-0796

Srv2!Srv2DecompressDataadd之前rcx0x10

add之后为0xf,整数溢出

然后调用rvnet!SrvNetAllocateBuffer 申请内存,调用nt!RtlDecompressBufferXpressLz进行内存拷贝,

buf+1108+10指向了buf的地址

在压缩传输时发送1108a然后就可以覆盖buf指针的地址,作者利用下面代码,修改buf的指针为SEP_TOKEN_PRIVILEGES的地址:

修改后buf的地址为:

我们查看一下token

权限:

SEP_TOKEN_PRIVILEGEStoken+0x40的地址,这个地址就是前面buffer指针覆盖的地址

通过任意写修改这个指针为system的权限,查看一下systemTOKEN_PRIVILEGES

所以作者在代码里修改了SEP_TOKEN_PRIVILEGES的值为0x0000001ff2ffffbc

此时程序的权限变成了system进程的权限,后面就是常规的进程注入,弹cmd了

CATALOG
  1. 1. 前言
  2. 2. 漏洞原因
  3. 3. 漏洞分析
  4. 4. 调试分析