首页
社区
课程
招聘
[原创]CVE-2020-1301 SMBLost漏洞分析
发表于: 2020-6-27 18:07 8534

[原创]CVE-2020-1301 SMBLost漏洞分析

2020-6-27 18:07
8534

Microsoft Windows的所有版本均附带服务器消息块(SMB)协议的实现。 SMB是本机Windows网络框架,支持文件共享,网络打印,远程过程调用和其他功能。在Windows系统上,SMB协议通过附加的安全性,文件和磁盘管理支持扩展了CIFS协议。 通过各种SMB命令和子命令类型提供这些功能。

该漏洞利用需要攻击者拥有一个经过认证的账户,通过向目标server发送特制的SMBv1消息来触发漏洞。成功利用该漏洞的攻击者可以实现任意代码执行。

• Microsoft Windows 7
• Microsoft Windows 8.1
• Microsoft Windows 10
• Microsoft Windows RT 8.1
• Microsoft Windows Server 2008
• Microsoft Windows Server 2008 R2
• Microsoft Windows Server 2012
• Microsoft Windows Server 2012 (Server Core installation)
• Microsoft Windows Server 2012 R2
• Microsoft Windows Server 2012 R2 (Server Core installation)
• Microsoft Windows Server 2016
• Microsoft Windows Server 2016 (Server Core installation)
• Microsoft Windows Server 2019
• Microsoft Windows Server 2019 (Server Core installation)
• Microsoft Windows Server version 1803 (Server Core Installation)
• Microsoft Windows Server version 1903 (Server Core installation)
• Microsoft Windows Server version 1909 (Server Core installation)
• Microsoft Windows Server version 2004 (Server Core installation)

微软官方已针对该漏洞发布了安全更新补丁,补丁地址如下: https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-1301

靶机:win7_sp1_x86

攻击机:win10

靶机特定文件开启SMB共享,并创建对应的访问用户,用户权限任意。

在攻击机中运行poc:

靶机crash:

crash

SMB_COM_NT_TRACSACT子命令扩展了SMB_COM_TRANSACTION2命令的文件系统功能访问,允许传输非常大的参数和数据块。SMB_COM_NT_TRANSACT 消息可以超过单个SMB消息的最大大小(由MaxBufferSize会话参数的值确定)。 在这种情况下,client将会使用一个或多个SMB_COM_NT_TRANSACT_SECONDARY消息来传输DataParameters相关字节数据。

SMB_COM_NT_TRANSACT命令请求消息与其他两种SMB的transaction请求message存在一定不同。 尽管有几个公共字段,但SMB_COM_NT_TRANSACT消息会重新排列字段以提供更好的字节对齐。 其他transaction类型使用16位大小的字段来提供参数和数据的大小和偏移量, SMB_COM_NT_TRANSACT使用32位大小的字段,主要目的就是为了更大的数据传输。 此外SMB_COM_NT_TRANSACT还包含一个Function字段,其中包含子命令代码。SMB_COM_NT_TRANSACT 结构如下:

本漏洞的触发主要与Function字段相关,使用的子命令为NT_TRANSACT_IOCTL。该子命令允许将文件系统控制和设备控制功能从客户端透明地传输到服务器,并用于向服务器发送特定于平台或特定于实现的信息,其结构如下:

前面SMB_Parameters部分:

Setup字段的格式如下:

与本漏洞相关的是FSCTL_SIS_COPYFILE,code为0x90100。该请求消息会请求server使用single instance storage(SIS) fileter来copy文件,该消息包含一个SI_COPYFILE data元素。 如果服务器上安装了SIS fileter,将通过创建SIS link的方式来替代实际复制文件数据的方式,将指定的源文件复制到指定的目标文件。 FSCTL_SIS_COPYFILE请求结构如下:

Windows SMB server的内核驱动在处理NT_TRANSACT_IOCTL子命令中的FSCTL_SIS_COPYFILE命令请求时,由于验证不充分产生了一个整数溢出漏洞。

当server在处理NT_TRANSACT_IOCTL命令请求时,会分配一个内核内存池用作缓冲区,来存储处理文件系统请求时产生的中间数据。其存储方式如下:

absoluteSourceFileNameabsoluteDestinationFileName字符串与SMB连接的共享路径(取决于SMB_COM_TREE_CONNECT_ANDX请求中的Path字段)以及FSCTL_SIS_COPYFILE请求中的各自SourceFileNameDestinationFileName字段串联在一起。在复制这些绝对文件名时就会产生漏洞。

为了将文件名创建到前面说到的内核内存池中,首先将共享路径复制到内存池中,然后检查共享文件名是否以'\'结尾。如果是,进一步检查SourceFileNameDestinationFileName的第一个字符是否位'\'或'\0';如果是,就使用memcpy函数从SourceFileNameDestinationFileName的第二个字符开始复制,复制的长度为SourceFileNameLength - 2DestinationFileNameLength - 2。漏洞触发主要由于没有检查这两个长度是否大于1。如果SourceFileNameLength或者DestinationFileNameLength的值为1,那么就会发生整数溢出,复制长度变为了0xffffffff,从而会溢出前面分配的内存池缓冲区。

此处使用的srv.sys软件版本为:6.1.7601.17514。

首先将SI_COPYFILE结构各字段值设置如下:

查看SrvSmbNtIoctl()函数如下:

static_ana

相关的关键代码在图中已做了注释,容易看出,整数溢出的位置有两处,都可以产生0xffffffff的值。该值随后传入到后续的内存分配代码:

static1_ana

在使用memcpy()进行内存分配时,会尝试将0xffffffff字节从目标文件名(或者源文件名)复制到先前分配的SMB1缓冲区,因此会发生溢出崩溃。

栈回溯结果:

crash_ana

栈回溯结果显示关键函数在srv!SrvSmbNtIoctl+0x7a4(),而该位置恰好为memcpy()函数执行完返回的地址:

static2_ana

此处没有找到对应版本的源码,使用一个近似版本的源码:

执行poc,抓取到的流量如下所示:

traffic1

traffic2

该漏洞的poc代码已在互联网中公开,可自行网上进行搜索。此处给出关键字段的数值构造:

上面触发漏洞的关键数据的构造中使用的是SourceFileNameLength为0x0000000a,DestinationFileNameLength为1的情况。如前面静态分析所知,也可以使用SourceFileNameLength为1,DestinationFileNameLength为0x0000000a的组合来触发漏洞。因为关键点是执行-2操作来触发整数溢出。

这种漏洞的检测一般很难做到无损检测,目前还没有很好的检测思路,大家可以互相交流一下。

造成crash的实现很简单,但是想实现稳定rce还是有很大难度,目前来看主要因素是分配的缓冲区位于内核,很难精准控制和适配。而且该漏洞利用需要有经过验证的共享账户,限制了漏洞利用范围,所以该漏洞总体评估威胁中等。

[1]. https://airbus-cyber-security.com/diving-into-the-smblost-vulnerability-cve-2020-1301
[2]. 微软SMB协议官方文档

论坛内部共享,未经允许,请勿转载,谢谢


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-6-27 18:16 被有毒编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (4)
雪    币: 214
活跃值: (147)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
2
赞!

这个漏洞应该是近期6月9日暴露出来的一个高危漏洞。
2020-6-27 20:15
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
3
Vagaeth 赞! 这个漏洞应该是近期6月9日暴露出来的一个高危漏洞。
是高危,毕竟影响全版本。但是利用条件还是有点苛刻,实战里可以当作一个辅助漏洞吧
2020-6-27 20:34
0
雪    币: 50
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好贴,高危漏洞,一旦利用稳定下来蠕虫又要出来了
2020-6-30 10:30
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
5
return 好贴,高危漏洞,一旦利用稳定下来蠕虫又要出来了
这个影响没有那么大,不会直接rce
2020-6-30 17:02
0
游客
登录 | 注册 方可回帖
返回
//