永恒之蓝网络部分的分析

基本原理说明

SMB协议中存在的漏洞

1.SMB协议介绍与分析:

SMB(全称是Server Message Block)是一个协议服务器信息块,它是一种客户机/服务器、请求/响应协议,通过SMB协议可以在计算机间共享文件、打印机、命名管道等资源,电脑上的网上邻居就是靠SMB实现的;SMB协议工作在应用层和会话层,可以用在TCP/IP协议之上,SMB使用TCP139端口和TCP445端口。其工作原理如下

1.首先客户端发送一个SMB negport 请求数据报,,并列出它所支持的所有SMB的协议版本。服务器收到请求消息后响应请求,并列出希望使用的SMB协议版本。如果没有可以使用的协议版本则返回0XFFFFH,结束通信。

2.协议确定后,客户端进程向服务器发起一个用户或共享的认证。客户端发送一对用户名和密码或一个简单密码到服务器,然后通过服务器发送一个SessetupX应答数据包来允许或拒绝本次连接。

3.当客户端和服务器完成了磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问的网络资源的名称,之后会发送一个TconX应答数据报以表示此次连接是否接收或拒绝。

4.连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。

2.SMB相关漏洞一

根据MSDN, Transaction SMB命令是通用操作。它们提供扩展子命令集的传输,这些子命令又允许CIFS客户端访问服务器上的高级功能。CIFS支持三种不同的事务消息(SMB的子命令中存在一个名为TRANSACTION系列的命令)。

1.NT_TRANSACT (用于打开或创建一个文件或文件夹,并应用扩展属性EA或安全描述符SD);

2.TRANSACTION (或Trans、用于和邮槽、命名管道进行通信);

3.TRANSACTION2 (用于打开或创建一个共享文件或文件夹,设置它们的扩展属性)。

对于TRANSACTION系列的命令如果发送的长度过大,SMB会将该请求包拆分成Second的形式进行发送。服务端根据SMB请求头部的TIP,PID,UID,MID确定哪一个Second属于对应的transtion。

永恒之蓝这个漏洞产生的原因之一就是错误的将NT_TRANSACT (类型:DWORD)转换为TRANSACTION2(类型WORD)。

3.SMB相关漏洞二

协议识别出两个分开的子命令已被接收到,其分配的类型和尺寸的数据包(并相应地分配内存)仅基于接收到的最后一个数据包的类型。

当使用NT_TRANSACT发送第一个请求包并标志一个较大的总大小后使用TRANSACTION2发送后续的数据包(此时不会检测包的内容等),只有当最后一个数据包接受到最后才会对这个数据包进行处理。

此时构造一个较长的结束包即可触发缓冲区溢出(由于它会把最开始的NT_TRANSACT当作TRANSACTION2结构来处理)使得会返回溢出错误,而此时的缓冲区结构几经被中间特殊构造的包给修改。

4.SMBv1的BUG

SMB_COM_SESSION_SETUP_ANDX命令中:该命令的请求依赖于WordCount的值来确定具体的请求格式,当为12时和为13时红框中的变量会有所区别,利用该漏洞将12类型的请求包通过13类型进行处理,由于两种类型的请求包格式不一致,通过控制请求包指定偏移的数据,即可以控制SrvAllocateNonPagedPool创建的pool的大小,实现堆喷射,导致在指定地址分配内存,使得攻击者可以编写和执行Shellcode来控制系统。

流程图

使用msfconsle进行攻击

环境:

虚拟环境搭建:VirtualBox

网络模式:NAT

攻击机:Kubuntu 2021 IP:192.168.3.184

靶机:Windows 7 ultimate sp1 x64 IP:192.168.3.176

使用nmap对靶机进行扫描

使用nmap -sV -A -t 192.168.3.184对windows进行扫描.

image-20211219121718126

使用Metasploit对目标进行监听与攻击

过程在此省略(网上有很多教程),结果如下

图片

数据包分析

1.通过SMB_COM_NT_TRANSACT发送一段FEA LIST长度满足0x10000(66512)的数据包。
image-20211219121928228

2.发送后续的SMB_COM_TRANSACTION2_SECONDARY,这将导致smb服务将SMB_COM_NT_TRANSACT当做SMB_COM_TRANSACTION2处理,但是最后一个SMB_COM_TRANSACTION2_SECONDARY留置最后。

image-20211219122054844

3.发送格式错误的SMB_COM_SESSION_SETUP_ANDX请求,这将导致NonPagedPool分配指定大小的buffer。

image-20211219122112201

4.通过smb 2协议的TCP请求方式进行srvnet对象的spray(堆喷射),每次请求都会导致在NonPagedPool中分配大小为0x11000字节的SRVNet块。

image-20211219122128387

5.发送格式错误的SMB_COM_SESSION_SETUP_ANDX请求,这将导致在srvnet对象之后分配一段大小和srv对象大小几乎一致的pool内存,它负责对溢出目标NTFea列表要申请的buffer进行占位。

6.通过smb 2协议的TCP请求方式继续进行srvnet对象的spray(堆喷射),以确保srvnet位于srv对象之后。
image-20211219122202103

7.发送最后一个SMB_COM_TRANSACTION2_SECONDARY,由于大小一致,该数据包会填补生成的hole,并触发漏洞导致之后的srvnet对象buffer中的MDL和指针被修改,此时后续发送的数据将拷贝到ffdff000的位置。(Windows内存分配器通常以后进先出的方式工作。因此,最近释放的Hole就会分配给NTFea列表,导致溢出,从而修改SRVNet块相应的某些字段)。

image-20211219122220346

image-20211219122236166

最终执行第四步第五步部署在内存里的shellcode(这里只介绍网络相关的)。