译者:myswsun
预估稿费:200RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
0x00 前言
在4月14日,一个称为Shadow Brokers的组织因为发布了一系列武器化漏洞利用工具而引起安全界的关注。不久之后,这些利用中的一个被用于创建了蠕虫式恶意软件(即WannaCrypt),其目标是大量的过时系统并加密文件勒索。
尽管利用在新版本系统中失效了,或者试图利用已经修补的漏洞,他们依然提供了一个机会来分析和评估在Windows 10 创新者更新上面的漏洞利用技术是否依然有效。
在Windows10中,使用Device Guard提供的关键的安全增强,如内核地址空间随机布局(KASLR)、内核数据执行保护(DEP)和基于虚拟化的安全(VBS),将有助于阻止现有的漏洞利用技术。通过CPU hypervisor的VBS的使用,基于Device Guard的系统能验证并加强内核地址空间映射的代码的完整性。在Windows 10创新者更新,和Device Guard一起的还有新的内核控制流保护(KCFG),KCFG阻止了很多依赖破环函数指针来执行代码的漏洞利用技术。
在本文中,我们深入分析Shadow Brokers泄漏的两种利用。它们都允许通过服务器消息块(SMBv1)的漏洞来执行代码。
下面我们将讨论Device Guard和KCFG如何阻止这些利用,并且阻止其他漏洞利用在内核内存中安装后门。
0x01 利用工具包
工具包的目录结构展示了模块化的漏洞利用框架(payload和exploit分离)。
所有的二进制文件包含多个字符串来描述他们的目的。而且,工具包通过DLL文件导出了常用的功能,通过相关的函数名字表明了额外的信息。尽管字符串和函数调用对于我们检查工具包是不必要的,但是能帮助我们做初始分析。
关于工具包中的针对微软产品的独立的利用的更多信息,参见这里。
0x02 ETERNALROMANCE SMB exploit
ETERNALROMANCE是一个针对SMBv1文件共享协议的远程代码执行(RCE)漏洞利用。它利用了CVE-2017-0145,在MS17-010的安全公告中被补丁修复。通过SMB的文件共享通常只位于本地网络,并且基本上SMB端口都会被防火墙阻止,如果一个攻击者可以访问运行SMB的有漏洞的终端,就可以在远程机器的内核上下文中运行任意代码。
1. 得到一个可靠的堆布局
利用开始于通过多个并发的SMB_COM_TRANSACTION实例来进行堆喷射。漏洞利用二进制支持3种不同的堆喷射方式,使得其能处理不同Windows版本的内存池行为。区别于开始的一些分配(其他的依赖与内存池状态),transaction对象是固定分配的,相互之间的位置可预测。在喷射完成之后,利用使用在TRANS_PEEK_NMPIPE中的一个信息泄漏。它使用信息泄漏来确定目标运行的Windows版本(32或者64),并且得到多个SMB对象的内核指针。
网络痕迹如下:
2. 构建堆的读写原语
喷射已经在堆上放置了很多TRANSACTION对象,并且相对位置已知。因为利用已经泄露了指针的大小,这样能够知道TRANSACTION对象中所有字段的偏移。现在利用可以使用精心构造的偏移,并从一个对象中使用类型混淆越界写来破环相邻的对象。
通过使用硬编码的0来覆盖受害对象相关的ID,现在对象将不知道原始的ID是什么。
继续使用多种方式破环transaction对象,构造任意读写原语。它写入额外的字段来阻止transaction被释放,使得利用能继续复用相同的transaction,而不需要选择新的目标来破环。
3. 安装内存后门
此时,利用代码试图在SMB驱动中植入后门代码。这个步骤包括了拷贝shellcode到非分页内存,破环函数指针指向shellcode和执行函数指针。注意从Windows 8开始,SMB被移到了不可执行内存,这个方法在新平台上将失效。
为了找到函数指针的好的切入点,漏洞利用在堆上面找到了一个指针到达数据段。扫描数据段,能找到一个函数指针是用来派遣不同的SMB_COM_TRANSACTION2的子命令到不同函数的。
当找到了函数指针后,漏洞利用覆盖了这个表中14号入口,即TRANS2_SESSION_SETUP。MSDN描述这个子命令是保留的,使得它成为一个理想的候选者,用来触发后门,因为它在SMB流量中几乎从不被使用。
当SMB数据包使用这个子命令ID发送给目标设备时,函数指针得到执行,触发shellcode。这个机制和后门代码不是固定的,他们需要一个固定的二级组件来保证重启生效。
0x03 ETERNALBLUE SMB exploit
WannaCrypt使用改写的ETERNALBLUE漏洞利用来传播。这个bug的目标是不同的SMBv1漏洞,是一个内存池中的线性的缓冲区溢出。
当将扩展属性(EA)的列表转化为另一种格式时,这种bug才会发生。如果这个列表包含的EA超过了包缓存,列表将被截断,只包含最后一个条目。
当更新列表长度时,大小被写入,即使实际是32位的ulong也被作为16位的ushort。这意味着高16位不能更新,列表被截断了:
代码计算大小分配了一个缓冲区来填充所有的EA来达到截断。但是因为列表大小是增长的,这导致了攻击者可控数据的线性堆缓冲区溢出。
和之前的很相似,还是堆喷射,但是这次使用的SMBv2协议的srvnet!SRVBUFFER对象。这个对象包含两个关键的指针:一个接收网络数据包payload的MDL指针和一个srvnet!SRVNET_CONNECTION对象指针。所有指针都能被覆盖,因此它们指向HAL区域中固定的地址(通过硬件抽象层)。
因为破坏的MDL指针,下个包payload将写入HAL区域。这个payload包含shellcode和一个假的srvnet!SRVNET_CONNECTION对象的初始内存结构。这个连接对象有一个指向srvnet!SRVNET_CLIENT_CONNECTION_DISPATCH结构的指针,其包含函数指针。
在收到数据包payload后,SRVNET_RECEIVE_HANDLER函数指针从攻击者控制的srvnet!SRVNET_CLIENT_CONNECTION_DISPATCH结构执行,跳转到shellcode。
在Windows 7(是目标系统)中,HAL区域被映射为可读可写可执行。在新版中HAL区域不再是可执行的,意味着执行shellcode时CPU将出错。而且,HAL区域和其他的内核区域(如页表)在64位的Windows10中也是随机的,将阻止ETERNALBLUE生效。
0x04 基于虚拟化的安全的缓解措施
Windows 10中Device Guard提供的基于虚拟化的安全(VBS)和创新者更新提供的KCFG增强功能能阻止常见的漏洞利用技术,包括ETERNALROMANCE和ETERNALBLUE。
1. 使用W^X增强阻止shellcode执行
在有Device Guard的系统中,因为在hypervisor中的W^X策略,在内核中写入和执行shellcode(如ETERNALROMANCE后门)是不可能的。这些策略确保了内核内存页不可写和不可执行。
即使攻击者试图攻击页表,hypervisor也能够通过扩展页表(EPT)强制禁用执行。继而阻止了攻击者代码复用的方法,如ROP。因此,Shadow Brokers泄漏中的shellcode植入库在VBS保护的系统中是不适用的。
2. 使用KCFG阻止破环函数指针
在Windows 10创新者更新中,我们介绍了对于基于VBS的系统的内核空间中的一种新的安全缓解措施。内核也使用CFG(一种控制流完整性方案用于阻止依赖破环函数指针或者C++虚函数表的常见的栈转移技术)编译。
在内核中使用CFG旨在验证所有的间接调用。这使得攻击者通过滥用函数指针或者其他的间接调用来执行代码更加困难。
在ETERNALROMANCE的例子中,调用颠覆的函数指针将导致安全错误,使得功能失效。同样适用于ETERNALBLUE(依赖于破环函数指针执行代码)。
在创新者更新之前的Windows 10 中并且没有Device Guard,攻击HAL区域的页表是可能的,继而使用ETERNALBLUE的技术是能执行代码的。