MS17-010漏洞分析与复现

  一名网络空间安全专业学生所做的漏洞复现实验,如有错误或有待改进的地方,还请大家多多指教。

MS17-010漏洞分析与复现

  • 1 前置知识
  • 2 漏洞简介
  • 3 漏洞代码简析
  • 4 复现
  • 5 可能遇到的问题
    • 5.1 在Meterpreter中开启vnc后无法控制目标计算机,只能监视。

1 前置知识

  SMB(Server Message Block,服务器消息块): 一个网络文件共享协议,它允许应用程序和终端用户从远端的文件服务器访问文件资源,能被用于Web链接和客户端与服务器之间的信息沟通。该协议提供了Windows远程文件与打印机共享网络服务。SMB作为应用层协议,直接运行在TCP 445端口上。
  SMB消息结构: SMB 消息通过一系列的命令与服务器进行交互。SMB 消息的结构可以分成三个部分:定长的消息头部、变长的参数区块、变长的数据区块。消息头部用来指示当前发送的消息为 SMB 消息,并指定当前需要执行的命令以及上下文。当 SMB 消息的命令为 TRANSACTION2 的时候,可以通过 Setup 字段指定需要执行的子命令,如果指定子命令为 TRANS2_OPEN2(0x00) ,会在请求数据包传输完成的时候调用 srv!SrvSmbOpen2 函数,该函数会调用 srv!SrvOs2FeaListToNt 函数,在这个函数里面会将请求数据包中的 FEA 信息进行转换,而漏洞就发生在转换的过程中。
  FEA(File Extended Attributes,扩展文件属性): 文件系统的一个功能。它允许用户将计算机文件与未被文件系统所解释的元数据关联起来。与之相对应的是正规文件属性,其具有经文件系统严格定义的意义(例如文件系统权限或者文件创建以及修改时间等)。与通常能具有最大文件大小的forks不同,扩展文件属性通常被限制为远小于最大文件大小。其典型应用包括存储文档作者、普通文本文件的字符编码或者校验码。
  Large Non-Paged Kernel Pool,大非分页池: 系统资源主要包括分页池、未分页池、系统分页表和系统缓存,系统地址空间分为分页池和非分页池,是所有程序的核心模式组件是用到的内存部分,分页池是指映射到分页文件的虚拟地址,当要使用该地址时才交换到物理内存中,由系统来调度;非分页池是指直接在物理内存中分配的内存。非分页池是一个包含各种系统虚拟地址范围的内存池,这些地址范围可以保证始终驻留在物理内存中,因此从任何地址空间均可进行访问,而不会产生页面输入/输出 (I/O)。非页面缓冲池在系统初始化期间创建,内核模式组件用它来分配系统内存。

2 漏洞简介

  MS17-010漏洞即臭名昭著的EternalBlue永恒之蓝所利用的最主要的漏洞。2017年4月14日晚,黑客组织Shadow Brokers(影子经纪人)公布了一大批网络攻击工具,其中即包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限,“永恒之蓝”的爆发源于5月12日不法分子改造该工具后制作了Wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。
  漏洞出现在Windows SMB v1中的内核态函数srv!SrvOs2FeaListToNt在处理FEA(File Extended Attributes)转换时,在大非分页池(内核的数据结构,Large Non-Paged Kernel Pool)上存在缓冲区溢出。函数srv!SrvOs2FeaListToNt在将FEA list转换成NTFEA(Windows NT FEA) list前会调用srv!SrvOs2FeaListSizeToNt去计算转换后的FEA lsit的大小。然后会进行如下操作:
  1.srv!SrvOs2FeaListSizeToNt计算FEA list的大小并更新待转换的FEA list的大小
  2.错误地使用WORD强制类型转换,导致计算出来的待转换的FEA list的大小比真正的FEA list大
  3.因为原先的总大小计算错误,导致当FEA list被转化为NTFEA list时,会在非分页池导致缓冲区溢出。

3 漏洞代码简析

  使用IDA Pro打开C:\Windows\System32\drivers\下的srv.sys,自动下载对应的符号表pdb文件并加载,搜索SrvOs2FeaListToNt函数,双击跳转。
MS17-010漏洞分析与复现_第1张图片
  SrvOs2FeaListToNt函数的参数FEA_list即攻击者构造好之后传送过来的数据结构。这个函数会将请求数据包中的FEA信息进行转换,而在转换前先会调用SrvOs2FeaListSizeToNt函数计算需要分配的内存长度。
  这里我们首先需要了解一下FEA与FEA_list的数据结构。
MS17-010漏洞分析与复现_第2张图片
  SrvOs2FeaListToNt函数代码如下所示。
MS17-010漏洞分析与复现_第3张图片
  在指定FEA的位置后,通过长度和相对偏移来确定vbValue和cbName(即Value字节长度和Name字节长度),而Name的数据和Value的数据之间会间隔1个字节,因此FEA+cbName+cbValue+4+1则指向了FEA_list中的下一个FEA结构,如19行所示,16行也以此和end比较判断是否遍历完了所有FEA结构。如果满足if条件(遍历完FEA),则跳出while循环,执行第23行代码更新FEA_list的长度字段cbList,但要注意,无论是第1行参数所示还是前面所了解到的FEA_list结构,cbList的数据类型应该是DWORD,即32位长度,而在第23行代码更新长度的时候,却是以WORD数据类型(即16位长度)来更新的,也就是说更新cbList时,只更改了低16位(两个字节)内容,而高16位保持不变,因此,如果将原来cbList字段值(即FEA_list长度)设置为大于等于0x10000,这就可能导致更新完后cbList值变得更大(当然,计算的需要内存空间长度length是正常正确的)。
  再回到SrvOs2FeaListToNt函数。
MS17-010漏洞分析与复现_第4张图片
  首先利用调用SrvOs2FeaListSizeToNt函数返回的length值申请了一段非分页池内存,然后进入while循环,调用SrvOs2FeaToNt函数对每个FEA结构进行转换,并将转化结果存储在申请的内存中(v7),而要注意的是,循环结束条件是fea>end,end由FEA_list结构的cbList计算所得,而cbList值可能远大于真实值,这便导致了循环转化FEA结构并写入内存的操作会出现溢出。

4 复现

攻击端OS: Kali 2021.2
攻击端IP: 192.168.197.129
在这里插入图片描述
被攻击端OS: Windows XP Professional SP3
被攻击端IP: 192.168.197.130
在这里插入图片描述

  先尝试ping被攻击端,测试网络连通性。
MS17-010漏洞分析与复现_第5张图片
  使用nmap扫描目标主机存在的SMB相关漏洞。

MS17-010漏洞分析与复现_第6张图片
MS17-010漏洞分析与复现_第7张图片
  扫描目标计算机系统指纹。
MS17-010漏洞分析与复现_第8张图片
  在开始的信息搜集这一步,也可以使用msf的扫描模块。
MS17-010漏洞分析与复现_第9张图片
  search scanner查看扫描模块(非常多),search portscan查看端口扫描器,这里就使用syn扫描模块。
在这里插入图片描述
MS17-010漏洞分析与复现_第10张图片
MS17-010漏洞分析与复现_第11张图片
  查看漏洞利用模块。
MS17-010漏洞分析与复现_第12张图片
  auxiliary开头的为辅助模块,exploit开头的为攻击模块,可先加载辅助扫描模块扫描目标系统是否易被攻击。
在这里插入图片描述
  加载攻击模块,有3个可用的攻击模块,由于目标系统为Windows XP,因此需要使用ms17_010_psexec模块。
在这里插入图片描述
在这里插入图片描述
MS17-010漏洞分析与复现_第13张图片
  填好要求的参数后,使用run或exploit命令执行渗透。
MS17-010漏洞分析与复现_第14张图片
  ps查看进程列表。
MS17-010漏洞分析与复现_第15张图片
  刚获得Meterpreter shell时,该shell极其脆弱,很容易被关闭,因此攻击渗透成功后要尽快将shell绑定到目标机器的一个稳定进程上,即使用migrate [PID]命令进行进程迁移,而PID=688的services.exe是一个常见的稳定进程,可捆绑到该进程上。
MS17-010漏洞分析与复现_第16张图片
  接下来便可进行任何想做的事,比如使用shell命令调用目标系统cmd,或run vnc开启远程控制。
MS17-010漏洞分析与复现_第17张图片
MS17-010漏洞分析与复现_第18张图片

5 可能遇到的问题

5.1 在Meterpreter中开启vnc后无法控制目标计算机,只能监视。

——需要修改配置文件vnc.rb
在这里插入图片描述
  在下图代码段添加pay.datastore[‘ViewOnly’] = false,设置“仅监视”为否。
MS17-010漏洞分析与复现_第19张图片
  按ESC,输入“:wq!”保存修改并退出。

你可能感兴趣的:(漏洞复现实验,网络空间安全,系统安全,安全)