CVE-2020-0796 SMBv3漏洞LPE利用调试分析

 

文章目录

  • 一 、概述
  • 二、配置调试环境
  • 三、调试BOSD
  • 四、LPE过程调试

一 、概述

网上已经有触发漏洞的POC和本地提权EXP,还有几篇从不同角度对漏洞进行阐述的文章(包括但不限于以下几篇),但是阅读后对内存的构造和利用过程并不理解,因此自己尝试从新调试走一遍,主要记录调试过程及其他文章中未能读懂的部分,基本原理,提权原理及协议结构等不再重复:

https://blog.zecops.com/vulnerabilities/exploiting-smbghost-cve-2020-0796-for-a-local-privilege-escalation-writeup-and-poc/

https://paper.seebug.org/1164/

https://mp.weixin.qq.com/s/rKJdP_mZkaipQ9m0Qn9_2Q

二、配置调试环境

需要配置双虚拟机windbg preview调试,配置内核调试(目标主机):管理员权限启动powershell或cmd,执行如下命令:

bcdedit /set dbgtransportkdnet.dll

bcdedit /dbgsettings NETHOSTIP:调试机IP PORT:50000

bcdedit /debug on

 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图调试机上的windbg设置:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(1)
 

加载符号表及:

sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

.reload重新加载符号表

Lml 查看加载了哪些符号表

Bp srv2!Srv2DecompressData+0xe0,此时找不到函数定义,需要.reload符号表

!sym noisy打开加载符号过程分析

.reload /f srv2.sys

windbg ERROR_INTERNET_CANNOT_CONNECT 是需要科学上网

发现错误,在system32下面寻找srv2.sys,但实际上该文件在system32/drivers,拷贝后再次加载:

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(2)三、调试BOSD
 

造成漏洞的代码位于:

Srv2.sys的Srv2DecompressData :

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(3)
 

前面2个变量相加的时候没做检查造成溢出分配一个较小的内存导致使用该内存时出现问题。

调试时使用ZecOps公开的BOSD poc,打开mem文件后,查看函数调用情况:

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(4)查看内存错误情况:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(5)
 

查看出错的内存,非法使用一块未调试

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(6)
CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(7)
 

对SrvNetAllocateBuffer附近下断点:

Add ecx,eax执行之前ecx=0xffffff,

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(8)执行后,ecx溢出为0×239
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(9)搜一下发现win64传参有好几种不同的说法,同过IDA查看函数的参数:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(10)再对比调试器中的参数:
CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(11)确认函数的传参顺序为ecx,edx,r8,r9.
 

四、LPE过程调试

依然使用ZecOps公开的 poc,但是为了方便观察内存数据变化,做了如下修改:

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(12)
分析如下关键点:

 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(13)多次调试分析结合其他文章的讲解后得出申请用于解压缩数据的内存结构如下:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(14)内存的申请过程也有点绕,调试后发现如下顺序:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(15)最终使用nt!ExAllocatePoolWithTag申请了一块0×1278大小的内存,地址开始值可以抽象为0×0000:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(16)
 

但是SrvNetAllocateBuffer成功后的返回值为0×0000+0×1150=0×1150(0xffffd888c577c150-0xffffd888c577b000=0×1150):

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(17)
 

,同时在0×1150的0×18出存放了0×0000+0×50(内存可以开始使用的地址)的地址

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(18)申请的内存从0×0050可以开始使用,前面部分用于放未压缩的数据,后面存放压缩的数据。未压缩数据大小来自smb数据包header中的offset(0×18)参数,那么SmbCompressionDecompress函数将压缩的数据解压到0×0050+offset(0×18)开始,如果大小能覆盖到0×1168那么就可以改写内存首地址,0×1168-0×0050-0×18=0×1100,看下poc代码:
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(19)
 

其中len(what)=0×18,因此写入的数据长度为0×1100。

在SmbCompressionDecompress调用前下断点,第4个参数为解压后存放数据的内容地址,0×0068(0×0000+0×50+offset(0×18)):

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(20)
 

同时记录0×1168地址处的内容:

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(21)
 

SmbCompressionDecompress调用完毕后,0×68处内容为poc想写入的0×41:

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(22)
 

同时0×1168处地址也被改写为token地址(0xFfffc7093924e0a0):

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(23)SmbCompressionDecompress完毕后只是处理了压缩的数据部分,未压缩的部分接下来用Memcpy函数拷贝到内存块的首部,长度为offset(0×18),但是此时0×1168存放的内存块首部地址已经被改为token地址(0xFfffc7093924e0a0),对应rcx。
 

CVE-2020-0796 SMBv3漏洞LPE利用调试分析插图(24)因此实现了对token的改写,提权成功。
 

*本文作者:kczwa1,转载请注明来自一一网络博客

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享