Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

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

$
0
0

SMBv3远程拒绝服务(BSOD)漏洞分析,这个SMBv3漏洞是由lgandx爆出的一个未被微软修复的漏洞(暂未发布补丁),漏洞出来后我进行了一定的分析,花了很多时间,这个漏洞有一些意思,但是对于SMB的整个协议通信过程非常庞大,所以没有进行非常细致的跟踪,包括一些不透明的结构体让我感到晕头转向,但到最后还是有了一些结果。


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

这个SMB漏洞可以看作是被动的,需要用户主动去访问445端口才可以触发,而不像ms08067一样主动攻击别人,所以需要运行漏洞脚本在操作系统上。

终于赶在元宵节这天完成了这个任务,也在这里,祝大家元宵节快乐!

这个漏洞在twitter爆出来之后,很多老外也在微博下面问是否可以RCE,包括国内的预警中也有人问到。

那么很多人看到PoC中的关键部分,就会想:有填充数据,会不会是缓冲区溢出!

## 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)

答案是否定的,至少在我看来,大量的数据目的并非是为了填充缓冲区,而是为了绕过tcpip.sys的某处判断,从而进入漏洞出发的函数调用逻辑。

问题出现在smbv2后的一个特性Tree Connect,用来处理共享服务的特性,opcode:0x03,而整个问题,确是多个地方导致的。下面我们就一起来进入今天的旅程吧!

Github地址:https://github.com/lgandx/PoC/tree/master/SMBv3%20Tree%20Connect

漏洞复现

首先,网上关于这个漏洞的触发方法有很多,比较通用的是twitter中某老外提到的Powershell的方法,最为简单,首先我们调试的环境是:windows 10 x64 build 1607


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

接下来我们在kali2.0里运行漏洞脚本。


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

随后执行"dir \ip\PATH",漏洞触发,通过windbg双机联调,此时捕捉到了BSOD。


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

可以看到提示此时问题出现在mrxsmb20.sys中,问题函数是Smb2ValidateNegotiateInfo,来看一下触发位置的代码。

kd> p

mrxsmb20!Smb2ValidateNegotiateInfo+0x17:

fffff803`1869c7d7 66394114 cmp word ptr [rcx+14h],ax

kd> r rcx

rcx=0x00000000`00000000

此时rcx的值为0x0,是一处无效地址,因此这是由于空指针引用导致的BSOD,接下来继续执行可以看到Windows 10引发蓝屏。


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

回溯及数据包分析(important!)

我们来看一下mrxsmb20.sys关于Tree Connect特性的一些内容,代码逻辑相对简单。


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

可以看到执行到Smb2ValidateNegotiateInfo函数有两条逻辑调用,一个是Smb2TreeConnect_CopyData,一个是Smb2TreeConnect_Receive,这里我就把我回溯的结果和大家分享一下,首先,通过Smb2TreeConnect_Receive来接收smb的Tree Connect数据,这个是通过opcode来决定的。

正常情况下不会进入Smb2TreeConnect_CopyData,但一旦由不正常(后面会提到)数据包执行,则会在Receive之后进入CopyData函数的处理逻辑,从而引发漏洞。

这里数据包分析很关键,因为在漏洞触发过程中,就是由于数据包的问题导致的。

Viewing all articles
Browse latest Browse all 12749

Trending Articles