Windows SMBv3 远程拒绝服务(BSOD)漏洞

Posted by JenI on 2017-02-14 00:00:00+08:00

前言

这个 SMBv3 漏洞是由 lgandx 爆出的一个未被微软修复的漏洞(暂未发布补丁),此漏洞主要影响 Windows Server 2012/2016、Win8/8.1 以及 Win10 系统。攻击者可以模拟成一个 SMB 服务器,诱使客户端发起 SMB 请求来触发漏洞;攻击者也可以通过中间人方式“毒化” SMB 回应,插入恶意的SMB回复实现拒绝服务或控制受害系统。

漏洞原理

由于 Windows 处理 SMB 协议驱动 mrxsmb20.sys 在解析 Tree Connect Response 时,没有对包的大小做正确处理而导致的空指针引用。当 Tree Connect Response 包中 SMB 协议长度大于 1024时(实际上大于945便会触发漏洞),会导致系统蓝屏重启。

网上给出了针对这个漏洞详细的分析

链接:漏洞分析

漏洞复现

环境:

两台虚拟机网络同属于 vmnet9
虚拟机1:archlinux 192.168.1.1
虚拟机2:Win10 x64 192.168.1.2

首先将 linux 模拟成一台 SMB 服务器,下载该漏洞的 POC

Github地址

将下载下来的 Win10.py 和 odict.py 两个文件同时存在放 Linux 系统中。这里之所以不使用 windows 系统是因为 windows 系统默认监听了 445 端口,这种情况下 poc 会产生一个 socket 错误,手动关闭 445 端口的监听是个办法,但不如直接使用 Linux 系统方便。

运行脚本后,Linux 这台虚拟机便被模拟成一台 SMB 服务器。

python2 Win10.py

使用 Win10 访问 SMB 服务器

win10unc

触发漏洞,Win10 蓝屏崩溃

win10die

此时模拟的 SMB 服务器状态

win10py

POC分析

Win10.py 文件 408 到 416 行代码如下

## Tree Connect
if data[16:18] == "\x03\x00":
    head = SMBv2Header(Cmd="\x03\x00", MessageId=GrabMessageID(data), PID="\xff\xfe\x00\x00", TID="\x01\x00\x00\x00", CreditCharge=GrabCreditCharged(data), Credits=GrabCreditRequested(data), NTStatus="\x00\x00\x00\x00", SessionID=GrabSessionID(data))
    t = SMB2TreeData(Data="C"*1500)#//BUG <============这里控制数据长度
    packet1 = str(head)+str(t)
    buffer1 = longueur(packet1)+packet1
    print "[*]Triggering Bug; Tree Connect SMBv2 packet sent."
    self.request.send(buffer1)
    data = self.request.recv(1024)

其中 t = SMB2TreeData(Data="C"*1500) 是关键点,源码中发送了 1500 个 “C” ,head 长度为 80,所以packet1 总长度为 1580。经过测试,只要数据包超过 0x400(即十进制的1024) 便会触发漏洞,减去 head 长度,data 长度只要大于 945 便会引发蓝屏。

总结

目前还未提供针对此漏洞的补丁,建议用户暂时在防火墙处阻止TCP 端口 139 和 445,通过阻止入站和出站 SMB 流量,保护位于防火墙后面的系统防范此漏洞攻击造成的安全风险。


作者:   JenI   转载请注明出处,谢谢


Comments !