Microsoft Windows 7/2008 R2 - ‘EternalBlue’ SMB Remote Code Execution (MS17-010)“永恒之蓝”漏洞原理
一、漏洞概况
1、简介
永恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含“永恒之蓝”工具,“永恒之蓝”利用Windows系统的SMB漏洞可以获取系统最高权限。
恶意代码会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务器中植入勒索软件、远程控制木马、虚拟货币挖矿机等恶意程序。
2、相关协议
SMB协议:SMB(全称是Server Message Block)是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制的,其目的是将DOS操作系统中的本地文件接口“中断13”改造为网络文件系统。
(在进行漏洞利用时,可以配合远程桌面协议)
3、依托漏洞和利用过程
总体上,MS17-010是一个利用SMB协议的缓冲区溢出漏洞,通过覆盖其他内存区域,实现远程的命令注入。
还要依靠其他两个漏洞:
-用SMB_COM_NT_TRANSACT发送一个大事务,但作为SMB_COM_TRANSACTION2处理(需要触发bug)
-发送特殊的会话设置命令(SMB登录命令)来分配大的未分页池(用于创建漏洞)
利用思路:
1、缓冲区溢出利用
- srvnet缓冲区包含一个指针到另一个结构和MDL关于接收缓冲区
- 控制MDL值导致任意写入
- 控制指针假结构导致代码执行,因为有指针的功能
- srvnet缓冲区是在目标接收到前4个字节后创建的
- 前4个字节包含SMB消息的长度
- 可能的srvnet缓冲区大小是“…”
, 0x9000, 0x11000, 0x21000,…”
srvnet。
sys将选择足够大的大小。 - 在收到整个SMB消息或连接丢失后,服务器调用SrvNetWskReceiveComplete()来处理SMB消息
- SrvNetWskReceiveComplete()检查并设置一些值,然后将SMB消息传递给SrvNetCommonReceiveHandler()
- SrvNetCommonReceiveHandler()将SMB消息传递给SMB处理程序
如果srvnet缓冲区中的指针被修改为伪结构,我们可以让SrvNetCommonReceiveHandler()调用我们的外壳代码如果SrvNetCommonReceiveHandler()调用我们的shell代码,则不会调用任何SMB处理程序
2、注入命令
- 劫持系统调用是获取进程上下文代码执行的常用方法(IRQL是PASSIVE_LEVEL)
- 在Windows x64上,可以通过写入IA32_LSTAR MSR (0xc0000082)来修改系统调用目标地址
- IA32_LSTAR MSR范围是核心/线程/唯一取决于CPU模型
- 在多核处理器的空闲目标上,被劫持的系统调用可能需要一段时间(> 5分钟)
get调用,因为它是在其他处理器上调用的
当使用劫持系统调用方法时,Shellcode应该知道双覆盖系统调用目标地址 - 然后,在进程上下文中使用APC,让代码在用户空间执行(第3环)
4、漏洞原理
(1)srv.sys在处理SrvOs2FeaListSizeToNt的时候逻辑不正确导致越界拷贝。
(2)srvnet在接收包的时候就会在固定0xffdff000这个地址存入客户端发送来的数据。
(3)0xffdff1f1处为shellcode.最后在接收完成后,最终调到srvnet!SrvNetWskReceiveComplete.在这个函数中会调用最终的shellcode。
注:调用位置由精心设计的注入数据包决定。
二、攻击方法
1、命令注入方式
见代码
2、配合RDP的漏洞利用
见附录文章
引用
[1] http://blogs.360.cn/post/nsa-eternalblue-smb.html
[2]https://www.exploit-db.com/exploits/42031