欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2019-0708 metasploit EXP分析

来源:本站整理 作者:佚名 时间:2019-09-17 TAG: 我要投稿

0x00 漏洞背景
2019年09月07日rapid7在其metasploit-framework仓库公开发布了CVE-2019-0708的利用模块,漏洞利用工具已经开始扩散,已经构成了蠕虫级的攻击威胁。这里对该漏洞利用的原理做一个技术分析。
 
0x01 利用分析
漏洞原理部分就不再赘述了,简单来说就是由于UAF漏洞IcaChannelInputInternal->IcaFindChannel会返回一个指向的内容已经被释放了的指针,随后有一处间接调用,通过喷射占位让这里的rax寄存器指向我们的shellcode就可以RCE。


在windows 7上,非分页内存的起始地址是固定的。在虚拟机中可能由于环境不同导致该地址不同,由于EXP中硬编码了这个地址,所以可能导致漏洞利用失败。可以按照下面的方法自己修改这个硬编码的地址。
如果是virtualbox虚拟机,先使用下面的命令dump虚拟机的内存:

然后下载安装google的内存取证工具rekall(https://github.com/google/rekall/releases/download/1.7.2rc1/Rekall_1.7.2.p1_Hurricane.Ridge_x64.exe),扫描得到的memdump文件得到非分页内存的起始地址:

如果是vmware虚拟机创建一个快照使用同样的命令扫描得到的快照文件即可。如果你是按照默认步骤创建的,那么非分页内存的起始地址应该和这里一样都是0xfffffa8001802000。windows 7虚拟机的默认内存是2GB,这个值比真实机器的内存小,所以把GROOMSIZE从250 MB修改为50MB。此时,应该可以直接使用该EXP在虚拟机上实现稳定的RCE了。
EXP编写主要的两个问题就是如何喷射占位和如何编写shellcode。下面我们来看代码。

回顾一下RDP协议的流程,client收到这个PAKID_CORE_CLIENTID_CONFIRM之后应该发送client device list announce request包,发送这个包之后执行exploit代码。


非分页内存的起始地址是0xfffffa8001802000,我们希望call [rax]时rax的值是0xfffffa8004a02048,0xfffffa8004a02048中的值是0xfffffa8004a02058,0xfffffa8004a02050处开始payload。因为payload以查找其的标志USERMODE_EGG/KERNELMODE_EGG开始(egg hunting),所以将0xfffffa8004a02048中的值设置为0xfffffa8004a02058刚好可以从payload真正的功能处开始。

payload分为kernel mode payload和user mode payload,kernel mode payload由两个部分组成:KERNELMODE_EGG和(kernel mode 的)payload;user mode payload由四个部分组成:USERMODE_EGG,egg_loop,USERMODE_EGG和(user mode 的)payload。egg_loop用来查找KERNELMODE_EGG并跳转到(kernel mode 的)payload;(user mode 的)payload才是真正在用户态运行的反弹shell的payload(egg_loop其实也是在内核态运行的)。
准备好payload之后伪造UAF的结构体,在IcaChannelInputInternal中的ExAllocatePoolWithTag中可以看到,实际分配的内存会比发送的数据多0x38个字节。

考虑进去这0x38个字节,又因为间接调用的偏移是0x100个字节,所以需要在第0xC8个字节放上0xfffffa8004a02048。

做好这些准备工作之后就可以开始pool spray了。首先发送大量大小为0x128的spray_channel包(分配0x128+0x38=0x160字节大小的内存),再发送触发漏洞的包释放MS_T120 channel,由于其大小也是0x160字节,所以此时再发送大量和前面相同的spray_channel包就会占据被释放的MS_T120 channel的内存。


之后发送大量含有kernel mode payload或者user mode payload的包占据从0xfffffa8001802000开始到0xfffffa8004a02000的非分页内存,因为header的大小是0x48,所以最终0xfffffa8004a02048中的值是0xfffffa8004a02058,后面可能是kernel mode payload或者user mode payload。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载