CVE-2020-0796本地提权利用深入分析

前言

2020年3月份,微软发布了关于SMBv3协议的远程代码执行漏洞(CVE-2020-0796),攻击者可通过发送构造的恶意数据包,执行任意代码。近日网上出现了本地提权利用,借用这个机会,深入分析下漏洞的具体细节。
此漏洞是由于SMB不能正确处理压缩数据包造成的,已确定漏洞存在于文件srv2.sys中。srv2.sys中处理压缩包数据的函数srv2!Srv2DecompressData没有正确校验数据包中OriginalCompressedSegmentSize和Offset/Length字段,导致整数溢出,触发漏洞。

压缩数据包解析

根据微软给的SMB2协议文档,COMPRESSION_TRANSFORM_HEADER的结构如下图
在这里插入图片描述
ProtocolId:4字节,固定为0x424D53FC
OriginalComressedSegmentSize:4字节,原始的未压缩数据大小
CompressionAlgorithm:2字节,压缩算法
Flags :2字节
Offset/Length:根据Flags的取值为Offset或者Length,Offset表示数据包中压缩数据相对于当前结构的偏移

此次构造的压缩数据包分为4个部分:
在这里插入图片描述
压缩数据包具体内容如下:
在这里插入图片描述
OriginalComressedSegmentSize设置为0Xffffffff
Offset为0x10
其中两个8字节的0xFFFFFFFFFF就是未压缩数据,表示将要修改的权限值。
最后为0x1108字节‘A’+token地址。

动态分析

Windbg双机调试,在函数srv2!Srv2DecompressData处下断点,并运行本地提权程序。找到出现整数溢出位置:
在这里插入图片描述
由于OriginalComressedSegmentSize为0xffffffff,与Offset相加后,结果变小,两者相加的和作为参入进入srvnet!SrvNetAllocateBuffer函数,申请一段内存空间。
在这里插入图片描述
记住这些返回的地址,对下面的分析很重要。
接着运行到解压数据的函数srvnet!SmbCompressionDecompress,就会发现解压的数据并没有放到返回的地址起始处
在这里插入图片描述
可以看到的是解压出来的数据是0x1108字节‘A’+token地址。接着向下运行
在这里插入图片描述
这里检查了Offset字段,条件成立进入srv2!memcpy函数,观察srv2!memcpy函数的参数发现这两个地址分别是两个8字节的0xFFFFFFFFFF的地址和tocken地址。步过此函数发现tocken已经改变
在这里插入图片描述
这里具体是怎么实现的呢,通过对比发现,在解压压缩数据后,token地址覆盖了另一个地址。而这个地址就是压缩数据的标志位
在这里插入图片描述
srv2!memcpy函数是为了将未压缩的部分放到原位,由于申请的空间太小,解压出来的数据和token地址将原来的地址覆盖,就完成了权限的提升。

SrvNetAllocateBuffer函数分析

函数分析主要部分:
在这里插入图片描述
在这里插入图片描述
根据实际情况,传入的参数位0xf,则使用SrvNetBufferLookasides分配内存,这个函数用于有效地为驱动程序保留一组可重用的、固定大小的缓冲区。而SrvNetBufferLookasides函数初始化在SrvNetCreateBufferLookasides中,而SrvNetCreateBufferLookasides又调用了SrvNetBufferLookasideAllocate分配内存,SrvNetBufferLookasideAllocate根据参数分配一些固定的内存空间,[‘0x1100’,‘0x2100’,‘0x4100’,‘0x8100’,‘0x10100’,‘0x20100’,‘0x40100’,‘0x80100’,‘0x100100’]
压缩出来的数据和分配的内存空间布局可参考下图:
在这里插入图片描述

提权方法解析

在Windows中运行的每个进程都与一个访问令牌相关联,该令牌决定允许进程做什么。令牌是一个复杂的数据结构,具有一个关键部分,它决定允许给定进程执行哪些操作.
这里使用的是修改令牌以提高权限,在windbg中查看结构
在这里插入图片描述
在这里插入图片描述
在偏移0x40处的_SEP_TOKEN_PRIVILEGES这个结构表示了所有权限,置1表示启用权限,置0表示禁用权限。如果能够写0xffffffffffffffff在结构的所有三个字段中,当前进程都将获得所有权限,任何子进程都将继承这些权限。
想要修改权限就要找到这些令牌的位置,API NtQuerySystemInformation可获取到句柄关联的每个内核对象的地址信息,根据当前进程句柄查找令牌句柄的信息条目,并获取内核地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值