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)
微软官方已针对该漏洞发布了安全更新补丁,补丁地址如下: 3feK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8%4u0@1j5h3I4Q4x3X3g2E0M7%4u0U0i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8Y4y4W2j5%4g2J5K9i4c8&6i4K6u0V1k6%4g2A6k6r3q4F1j5$3g2Q4x3V1k6S2k6s2k6A6M7$3!0J5P5g2)9J5c8V1y4h3c8g2)9J5k6o6t1H3x3U0m8Q4x3X3b7I4x3K6l9I4
靶机:win7_sp1_x86
攻击机:win10
靶机特定文件开启SMB共享,并创建对应的访问用户,用户权限任意。
在攻击机中运行poc:
靶机crash:
SMB_COM_NT_TRACSACT
子命令扩展了SMB_COM_TRANSACTION2
命令的文件系统功能访问,允许传输非常大的参数和数据块。SMB_COM_NT_TRANSACT
消息可以超过单个SMB消息的最大大小(由MaxBufferSize
会话参数的值确定)。 在这种情况下,client将会使用一个或多个SMB_COM_NT_TRANSACT_SECONDARY
消息来传输Data
和Parameters
相关字节数据。
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
命令请求时,会分配一个内核内存池用作缓冲区,来存储处理文件系统请求时产生的中间数据。其存储方式如下:
absoluteSourceFileName
和absoluteDestinationFileName
字符串与SMB连接的共享路径(取决于SMB_COM_TREE_CONNECT_ANDX
请求中的Path
字段)以及FSCTL_SIS_COPYFILE
请求中的各自SourceFileName
和DestinationFileName
字段串联在一起。在复制这些绝对文件名时就会产生漏洞。
为了将文件名创建到前面说到的内核内存池中,首先将共享路径复制到内存池中,然后检查共享文件名是否以'\'结尾。如果是,进一步检查SourceFileName
或DestinationFileName
的第一个字符是否位'\'或'\0';如果是,就使用memcpy
函数从SourceFileName
或DestinationFileName
的第二个字符开始复制,复制的长度为SourceFileNameLength - 2
或DestinationFileNameLength - 2
。漏洞触发主要由于没有检查这两个长度是否大于1。如果SourceFileNameLength
或者DestinationFileNameLength
的值为1,那么就会发生整数溢出,复制长度变为了0xffffffff,从而会溢出前面分配的内存池缓冲区。
此处使用的srv.sys
软件版本为:6.1.7601.17514。
首先将SI_COPYFILE
结构各字段值设置如下:
查看SrvSmbNtIoctl()
函数如下:
相关的关键代码在图中已做了注释,容易看出,整数溢出的位置有两处,都可以产生0xffffffff的值。该值随后传入到后续的内存分配代码:
在使用memcpy()
进行内存分配时,会尝试将0xffffffff字节从目标文件名(或者源文件名)复制到先前分配的SMB1缓冲区,因此会发生溢出崩溃。
栈回溯结果:
栈回溯结果显示关键函数在srv!SrvSmbNtIoctl+0x7a4()
,而该位置恰好为memcpy()
函数执行完返回的地址:
此处没有找到对应版本的源码,使用一个近似版本的源码:
执行poc,抓取到的流量如下所示:
该漏洞的poc代码已在互联网中公开,可自行网上进行搜索。此处给出关键字段的数值构造:
上面触发漏洞的关键数据的构造中使用的是SourceFileNameLength
为0x0000000a,DestinationFileNameLength
为1的情况。如前面静态分析所知,也可以使用SourceFileNameLength
为1,DestinationFileNameLength
为0x0000000a的组合来触发漏洞。因为关键点是执行-2
操作来触发整数溢出。
这种漏洞的检测一般很难做到无损检测,目前还没有很好的检测思路,大家可以互相交流一下。
造成crash的实现很简单,但是想实现稳定rce还是有很大难度,目前来看主要因素是分配的缓冲区位于内核,很难精准控制和适配。而且该漏洞利用需要有经过验证的共享账户,限制了漏洞利用范围,所以该漏洞总体评估威胁中等。
[1]. e68K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2K9i4u0T1N6i4y4Q4x3X3c8U0P5h3u0W2M7W2)9J5k6s2y4W2j5%4g2J5K9i4c8&6i4K6u0W2j5$3!0E0i4K6u0r3k6r3W2$3K9h3&6Y4i4K6u0V1K9h3&6@1L8#2)9J5k6s2c8Z5k6g2)9J5k6s2y4E0j5X3I4G2M7%4c8Q4x3X3c8$3N6h3I4F1k6i4u0S2j5X3W2D9K9i4c8&6i4K6u0V1j5%4k6W2i4K6u0V1x3U0l9J5x3q4)9J5k6o6p5K6x3o6p5`. [2]. 微软SMB协议官方文档
论坛内部共享,未经允许,请勿转载,谢谢
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2020-6-27 18:16
被有毒编辑
,原因: