Loading
0

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

fffff800`9464b922 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : mrxsmb!SmbWskReceiveComplete
fffff80a`7365aae7 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!IopfCompleteRequest+0x112
fffff80a`72c60d9d : fffff800`963d54a8 ffffc10c`9ed02780 fffff800`963d54b0 fffff800`963d547c : afd!WskProTLReceiveComplete+0x97
fffff80a`72c21860 : 00000000`00000002 ffffc10c`a0643d00 00000000`00000007 00000000`00000000 : tcpip!TcpSatisfyReceiveRequests+0x3cd
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : tcpip!TcpDeliverDataToClient+0xc0
之后参数会连续进行传递,首先会把当前rdx+b8存放的值交给r14,之后把r14+40位置的值交给r8,最后引用的就是r8+98位置的值。
kd> p
mrxsmb!SmbWskReceiveComplete+0x1d:
fffff80a`731d696d 488bda          mov     rbx,rdx
kd> p
mrxsmb!SmbWskReceiveComplete+0x20:
fffff80a`731d6970 4c8bb2b8000000  mov     r14,qword ptr [rdx+0B8h]
…………
kd> p
mrxsmb!SmbWskReceiveComplete+0x7f:
fffff80a`731d69cf 4d8b4640        mov     r8,qword ptr [r14+40h]//1
kd> dd r14+40
ffffc10c`a01ba168  9fdf3c58 ffffc10c
可以看到,这个过程并没有对这个值进行检查,由于结构体不透明,不能确定到底对应存放的是什么,但其实这个结构体的连续调用我们可以理解为KPCR -> KTHREAD -> _EPROCESS -> Token这种关系,在Windows内核有很多这样的域以及相关的结构体,而相互又是嵌套的。
这个结构体的值为0x0的原因可能就是由于这个complete部分的数据包是由于SMB Tree Connect过长引起的,而mrxsmb20.sys中却没有对相关结构体进行检查。
kd> p
mrxsmb!VctIndDataReady+0x36:
fffff80a`731d6a56 498bf8          mov     rdi,r8
…………
kd> p
mrxsmb!VctIndDataReady+0x146:
fffff80a`731d6b66 488bd7          mov     rdx,rdi
kd> p
mrxsmb!VctIndDataReady+0x149:
fffff80a`731d6b69 488bcb          mov     rcx,rbx
kd> p
mrxsmb!VctIndDataReady+0x14c:
fffff80a`731d6b6c ff15eeed0200    call    qword ptr [mrxsmb!_guard_dispatch_icall_fptr (fffff80a`73205960)]
kd> r rdx
rdx=ffffc10c9fdf3c58
kd> t
mrxsmb!guard_dispatch_icall_nop:
fffff80a`731d8a30 ffe0            jmp     rax
kd> p
mrxsmb20!Smb2TreeConnect_CopyData:
fffff80a`7546b6c0 48895c2410      mov     qword ptr [rsp+10h],rbx
最后进入CopyData后,会引用这个结构体+98偏移位置的值,进入漏洞触发的函数,而没有对这个值进行检查。
kd> p
mrxsmb20!Smb2TreeConnect_CopyData+0x32:
fffff80a`7546b6f2 488b8b98000000  mov     rcx,qword ptr [rbx+98h]
kd> p
mrxsmb20!Smb2TreeConnect_CopyData+0x39:
fffff80a`7546b6f9 e8c210ffff      call    mrxsmb20!Smb2ValidateNegotiateInfo (fffff80a`7545c7c0)
kd> dd rbx+98
ffffc10c`9fdf3cf0  00000000 00000000
最后在函数中引用空指针,引发了BSOD。
关于这个结构体的问题我还是比较在意的,希望未来能够更深入的分析SMB的各种机制,元宵快乐!新的一年,大家一起加油!谢谢大家!

分页阅读: 1 2 3 4 5
【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。