天创培训:您身旁的信息安全培训专家!金莎娱乐官网
栏目列表
澳门金沙官方网站com
开班方案
2019年1月CISP培训开班告诉
主讲教师   张教师、王教师等
开课工夫   2019年1月8日-13日
培训方法   实地/面授
讲课天次   培训5天+测验半天
上课工夫   09:00 -- 16:30
课程引见 在线报名
手艺中心您当前位置: > 资本专区 > 手艺中心

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

作者:天创培训  滥觞:px.tcnet.com.cn  更新工夫:2017-11-14  关键词:EternalBlue,永恒之蓝,东西破绽4166.com金沙

媒介

EternalBlue(永恒之蓝)据称是方程式构造在其破绽操纵框架中一个针对SMB服务停止进犯的模块,因为其触及破绽的影响广泛性及操纵稳定性,在被公然当前为破坏性宏大的讹诈蠕虫 WannaCry所用而名噪一时。360要挟情报中心关于WannaCry的活动连续地停止着监控,我们看到的趋向是 WannaCry的传染量还在增长,阐明作为蠕虫次要传布手腕的EternalBlue响应的破绽还大量存在着。可是,关于EternalBlue 这个进犯利器自己的手艺阐发在公然渠道上看到的会商实在其实不充实,本文测验考试经由过程一个较完整的阐发梳理相干的细节,提醒其成因和响应的操纵本领。

测试情况

关于EternalBlue的阐发是在一个相对简朴的情况中停止的,施行进犯的体系为一个Win7机械,目的机械也是 Win7 32位体系,没有安装EternalBlue相干的补钉,srv.sys文件的版本为 6.1.7601.17514,srvnet.sys的版本为 6.1.7601.17514 。本文中所有的调试器中代码截图都对应上述的版本,差别版本的文件在代码自己或偏移能够差别,但团体的施行逻辑该当差不多。

破绽

按照我们的阐发,EternalBlue到达其进犯目标事实上操纵了3个自力的破绽:第一个也就是 CVE-2017-0144被用于激发越界内存写;第二个破绽则用于绕过内存写的长度限定;第三个破绽被用于进犯数据的内存规划。上面重点引见一下前两个破绽,第三个破绽会在内存规划的历程中提到。

破绽1

起首是EternalBlue东西中利用到的主体破绽,该破绽也是Eternalblue的焦点部门,编号为 CVE-2017-0144。破绽经由过程SMB和谈的SMB_COM_TRANSACTION2 号令触发,该号令阐明以下所示:

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

当该数据包中包罗对应的FEA LIST时,SMB服务中会将 FEA LIST转换为对应的NTFEA LIST,其对应的数据结构其实不公然,以下所示为趋向团队分析出的对应的FEALIST 构造。

4166.com金沙

入口处置函数为SrvSmbOpen2,此中破绽呈现在函数SrvOs2FeaListToNt 中:

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

以下所示为对应的破绽函数SrvOs2FeaListToNt,用于实现 FEA LIST转换为对应的NTFEA LIST,函数挪用SrvOs2FeaListSizeToNt 计较 FEALIST的长度,可是该函数存在破绽招致在特定的状况下,攻击者能够假造超长的size,从而招致在以后的 SrvOs2FeaToNt 转换中招致 pool溢出。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

进入招致破绽的SrvOs2FeaListSizeToNt函数,该函数会计较对应的 FEA LIST的长度并随后对长度停止更新,该长度一开始为DWORD范例的,以后的长度更新代码中计算出的size 拷贝归去的时分是按 WORD停止的拷贝,此时只要原变量a中的初始值大于FFFF ,即为 10000+,该函数的计较成果就会增大。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

该赋值中以下所示esi 变成了si,此时假如eax高位中的数据不为zero,则将返回的超长的size 。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

如下图所示为对应发送的该数据包,能够看到该恳求数据包的长度为 103d0,此中对应的FEALIST的长度为10000。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

如下图所示, eax为链表的开首,其指向了FEA LIST的总长度,即10000, esi为遍历以后的链表尾部,eax-esi=ff5d,为实践对应的长度,可是更新长度的mov 指令中 esi变成了si,因为eax 中的值为 10000 ,本来该当被赋值为ff5d的eax ,变成了 1ff5d 。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

以后在紧接着的函数 SrvOsFeaToNt中,因为利用了毛病的长度停止memmove从而招致溢出。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

下图为其中的复制招致越界写,长度为a8,能够看到一般恳求应该是在86535000这个srv.sys工具SMB buffer中,因为长度太长招致对srvnet.sys分派的buffer越界写。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

Enternalblue 中经由过程内存规划,将srvnet工具buffer不变的分派到srv 拷贝工具 buffer以后,如下图所示为越界写时的内存状况。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

Srvnet 工具buffer中包罗两个主要的域:

1. 一个指向指定构造(srvnet_recv)的指针(即上图中的8834e4c0,被ffdff020笼盖),该指针将会在smb(srnet)毗连完毕或断开时被用于寻址函数地址。

2. 一个用于领受缓冲区的MDL(即上图中的86546160,被ffdfef80笼盖)

因而笼盖并掌握MDL将招致以后的tcp 栈实现随便写入假造工具的操纵,笼盖并掌握该指针可用于将其指向一个攻击者掌握的假造工具,此时断开smb(srvnet)毗连便可招致代码施行。

如下图所示,MDL复写为ffdfef80后,紧接着Eternalblue发送的shellcode就会被写入到ffdfef80+0×80的位置,即ffdff000。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

能够看到此时的挪用栈:

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

写入的地址ffdff000是体系预留的用于保留体系信息的地址,而且可执行。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

被写入到 ffdff000地址的是一个srvnet_recv的构造(该构造不公然)和紧随厥后的shellcode ,该构造用于 smb(srnet)完毕或断开毗连的时分经由过程SrvNetWskReceiveComplete挪用 SrvNetCommonReceiveHandler 。SrvNetCommonReceiveHandler 按照srv_recv 中的指针此处为下图中的 poi (ffdff190(ffdff020 (被覆盖的对应指针) +0x16c )+4)获得到对应的函数并挪用,地址即我们假造的 shellcode 的地址( ffdff1f1 )。

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

破绽2

如上述破绽所示能够招致一次越界写,但其前提是FEA LIST的长度必需大于10000,经由过程阐发能够发明FEA LIST只存在于SMB_COM_TRANSACTION2号令的子号令中,而该号令的数据结构以下:

EternalBlue(永恒之蓝)东西破绽操纵细节阐发

TotalDataCount(数据包总长度)是USHOER范例的,即最大值只能为FFFF,那在这个地方 EternalBlue是如何发送的长度大于FFFF的SMB_COM_TRANSACTION2 子号令恳求的呢?

经由过程抓包能够发明此处发送的其实不是SMB_COM_TRANSACTION2子号令的恳求包,而是SMB_COM_NT_TRANSACT子号令的恳求包:

金莎娱乐官网



如下图所示SMB_COM_NT_TRANSACT子号令中TotalDataCount的范例为ULONG,撑持发送大于FFFF长度的数据包。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



可是SMB_COM_NT_TRANSACT自己是不支持FEA LIST的,这里就涉及到 EternalBlue 中利用到的第二个破绽。



SMB的子号令中存在一个名为TRANSACTION系列的号令:



Ø  SMB_COM_TRANSACTION: 用于和邮槽、定名管道停止通讯



Ø  SMB_COM_TRANSACTION2: 用于翻开或创立一个同享文件或文件夹,设置它们的扩大属性



Ø  SMB_COM_NT_TRANSACT: 用于翻开或创立一个文件或文件夹,并使用扩大属性EA或安全形貌符SD



此中发生破绽的即为对应的SMB_COM_TRANSACTION2号令。


关于TRANSACTION系列的号令假如发送的长度过大,SMB会将该恳求包拆分成**Second的情势停止发送,以下所示为其响应的**Second系列的号令:



SMB_COM_TRANSACTION



SMB_COM_TRANSACTION_SECONDARY



SMB_COM_TRANSACTION2



SMB_COM_TRANSACTION2_SECONDARY



SMB_COM_NT_TRANSACT



SMB_COM_NT_TRANSACT_SECONDARY


服务端按照SMB恳求头部的TIP, PID,UID,MID肯定哪一个 **Second 属于对应的transtion,而服务端按照最初一个**Second 肯定对应的 transtion 范例,即假如最初一个**Second为SMB_COM_TRANSACTION2_SECONDARY ,就按 SMB_COM_TRANSACTION2 来处置。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



如下图为处置对应**Second的逻辑,关于一个transaction ,假如没有发送完,后续会跟上对应的**Second数据包,服务端不会查抄对应的**Second范例,只要包管其 TIP ,PID,UID, MID 婚配,服务端就会将这些数据从头组装复原成一个 transaction,而范例由最初一个**Second 决议。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



因而,为了发送一个长度为0×10000的SMB_COM_TRANSACTION2,起首发送一个长度为103d0(FEA LIST:1000)SMB_COM_NT_TRANSACT,以后发送一系列SMB_COM_TRANSACTION2_SECONDARY数据包,只要包管TIP,PID,UID,MID分歧,服务端最初就会将其当作一个SMB_COM_TRANSACTION2来处置,而此时其长度103d0。



因为SMB会等候最初一个**SECOND数据包到来才天生最初的transaction ,因而EternalBlue能够在此期间发包对目的装备的内存停止布置,以后再发送最初一个数据包从而触发破绽越界写。



内存规划的构建



如上述阐发,操纵破绽会触发溢出招致越界写,而EternalBlue中关于该破绽的操纵思绪和大多数的pool越界写是分歧的:



1.      在内存中spray一系列srvnet的工具buffer



2.      开释掉其中的空间,以便于srv的工具buffer停止占位



3.      srv工具buffer占位



4.      发包越界写srvnet的工具buffer



5.      触发代码施行


srvnet工具spray



可是这里和普通的内核破绽的操纵存在一个很大的区分,就是我们的情况是长途的。凡是的当地内核破绽操纵的时分我们能够沉着地挑选停止spray的内核工具,可是关于长途的情况而言,内核工具的挑选及对应的掌握就要小许多。



EternalBlue顶用于被覆盖的工具为srvnetbuffer,其中的工具包罗两个主要的构造:



1.      一个指向指定构造的指针,经由过程笼盖它能够将其指向一个假造的构造,从而实现后续的代码施行。



2.      一个承受MDL的缓冲区,经由过程笼盖它能够包管将后续发送的假造构造及shellcode写到指定的地区。


微软供给了SMB 2间接撑持TCP的通讯方法,能够经由过程该方法来创立srvnet 缓冲区。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



如下图所示srvnet工具的spray历程,天生的巨细依赖于前四字节。



www.00mm8332.com



srv工具spray



srv工具是经由过程开释后重申请的方法获得的地址空间,可是SMB中如何经由过程长途方法不变的申请并开释一段pool内存了?这就涉及到EternalBlue中利用的第3个破绽。





该破绽呈现在SMB_COM_SESSION_SETUP_ANDX号令中:



该号令的恳求依赖于WordCount的值来肯定详细的恳求格局,当为12时格局如下图所示,当为13时红框中的变量会有所区分。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



间接借用网上逆向简化后的一段代码,以下所示:假如发送的代码中WordConut为12,包罗 CAP_EXTENDED_SECURITY字段,但却没有FLAGS2_EXTENDED_SECURITY字段,将会招致服务器将以处置13范例恳求的方法去处置范例 12的恳求包,从而进入毛病的函数GetNtSecurityParameters流程中。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



GetNtSecurityParameters会查抄对应的恳求中的参数,函数参数中的v70为经由过程 wordcount 和Bytecount计较出来的一个size。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



GetNtSecurityParameters函数中的计较以下所示:



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



该参数返回后作为SrvAllocateNonPagedPool的参数分派一段pool 。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



因而操纵该破绽将12范例的恳求包经由过程13范例停止处置,因为两品种型的恳求包格局不一致,经由过程掌握恳求包指定偏移的数据,便可以掌握SrvAllocateNonPagedPool创立的pool的巨细,能够利用以下的断点监控该历程:



bp GetNtSecurityParameters+0x1AC”.printf\”GetNtSecurityParameters1\\n\”;r;.echo;?cx-si+bx+1d;g;”



bp SrvAllocateNonPagedPool+0×10″.printf\”SrvAllocateNonPagedPool NonPageSize:%p\\n\”,ecx;g;”



bp SrvAllocateNonPagedPool+0x15C”.printf\”SrvAllocateNonPagedPool allocNopage:%p\\n\”,eax;g;”



bp BlockingSessionSetupAndX+0x7C0″.printf\”BlockingSessionSetupAndX double\\n\”;g;”




如下图所示即为经由过程断点监控到的不法size天生的历程,经由过程机关畸形数据包,包罗数据87f8,破绽触发后辨认出该毛病的偏移,计较最初会分派一段巨细为 10fec巨细的pool。



EternalBlue(永恒之蓝)东西破绽操纵细节阐发



0

推荐浏览

 |  关于天创 |  课程体系 |  最新动态 |  联络我们 |  网站舆图 |  二维码
版权所有:江苏天创科技有限公司 苏ICP备16028135号-2
姑苏总部地址:江苏省苏州市十梓街327号 电话:0512-65129087 传真:0512-65157410 邮编:215000
南京分公司地址:南京珠江路88号新世界中心A座 电话:025-84533276 传真:025-84533286 邮编:210000