在ie8中操作ROP与Heap Spray操作反弹shell 8090安适门户
这个缝隙操作措施是针对Windows 7平台上的IE8浏览器开发的。我们存眷的焦点是一个使用了Java网络启动协议(JNLP)的插件,这个插件存在有溢露马脚。为了实现操作,我会使用Heaplib来结构ROP链以实现绕过DEP,并获取对方针机器的控制。
Did it Work?
我的exploit目前不能正常事情,我讨厌这个leave指令(如下图)
我进一步确认了一下反汇编。这个错误看起来是我没有访谒此DLL的权限,或者是违反了页面的读、写、执行权限。我进一步的研究了一下,并在运行了“!vprot 7c3411a4”命令之后确认了答案,这个命令可以显示我感兴趣的内存权限。
开发exploit
结构恶意输入
Java网络启动协议(JNLP)使应用措施能够在长途处事器上的客户端桌面上启动。事实上JNLP存在一个缓冲区溢露马脚,发送的请求的布局对付我们来说不是很重要,我们只需关心通报给JNLP导致溢出的docbase参数。
别的,我们将通过Javascript来触发这个操作是基于以下几个原因。首先,我们可以通过Javascript直接控制DOM。DOM是文档东西模型,它可以美化屏幕上显示的页面。它可以泛起HTML、CSS和Javascript,并且还可以访谒浏览器的“Syscalls”,好比QuickTime,Flash等。这使得在浏览器中实现这个exploit变得很便利。
这个exploit使用了很多我们已经见到过的操作技术,所以我不会进行详细介绍。但是需要知道,当我们拥有一个溢露马脚时,就意味着我们可以控制EIP和ESP处的内存。但是,我们还存在着DEP的问题 - 栈不成以执行。由于存在DEP掩护,我们被迫使用ROP来解决。我们之前在其他的缝隙操作中使用过ROP技术,即我们去寻找jump 4或其他对象的地点。我们找到有执行权限的处所,然后直接挪用这个地点的我们需要的OPCODE。这里的挑战是我们需要的指令可能不止是一、两条。一般来说ROP链会非常大,而且我们还要插入shellcode。令我担忧的是,栈可能没有足够的空间来安排我们的全部载荷,我的要领是通过堆,但是这带来了一些特别的挑战。
堆上的第一个挑战是如何定位我们安插的数据。幸运的是,这个问题可以通过Heaplib.js的辅佐来解决,它进行堆喷射并且保证地点对齐。堆喷射指的是将我们需要的内存数据放入堆中,以便我们有机会跳入我们需要的数据中。它看起来像这样:
(译注:这张图有误,DEP环境下不再需要NOP sled)
事实证明,Heaplib.js库可以供给非常精确的堆喷射,并且shellcode(译注:作者似乎分不清payload和shellcode的区别,之后也有几处混用。)存在于每间隔2000个字节的地点上,好比0020,2020,4020等(译注:Heaplib是一个用来进行精准堆喷射的库,作者初度提出并使用了Heap Fengshui技术。但因为存在Nozzle,自IE9之后就不能使用了。)
我们面临的第二个问题是怎么把堆转换成栈。这个听起来有点违反知识,但是相信我,顿时你就会大白我们为什么要这样做。很多人将这种做法称为“Stack Pivot”(栈翻转),为了说明堆是怎么转化成栈的,我们只需要转变ESP寄存器的值指向我们堆的地点(由堆喷射得来的,存有payload)。这凡是通过挪用指令
```
XCHNG EAX,ESP;
RET
```
交换EAX的值来实现,这两条指令自己就是一个ROP gadgets。然而,在这里我们不能控制到EAX寄存器,但是我们可以控制EBP寄存器,那么也能够用
```
LEAVE;
RET
```
指令做栈翻转(译注:因为leave即是mov esp,ebp;pop ebp)。我不雅察看了一下有哪些寄存器会被笼罩,发明只有EIP和EBP这两个。我们费这些麻烦的主要原因是因为RET指令会返回到ESP指向的地点,所以我们需要让ESP指向我们在堆上的数据。
下一个要解决的问题是如何执行我们放在堆中的shellcode。请记住,在执行了栈翻转之后,堆此刻成了“栈”,至少它看上去是这么一个对象。那我们如何执行shellcode呢?不幸的是此刻的Windows使用了DEP掩护(译注:准确的说是自IE8开始才启用,是IE版本的问题与Windows版本无关),这就是说某些处所的内存要么是可读、可写的,要么只是可执行的(互斥)。这是为了阻止我们想要做的事——执行存储在栈上的这些指令。事实上有一个要领可以绕过它。在Windows上,Kernel32.dll中的有一个名为VirtualProtect的函数用于变动内存的掩护属性。这对我们来说是很有用的,因为如果我们可以对我们shellcode的内存空间挪用这个函数,那么就可以将掩护从可读写改为可执行,然后执行shellcode。事实上Kernel32.dll是开启了ASLR的,但我们会在“确定使用的参数”部分中措置惩罚惩罚这个问题。只需要意识到我们有一种转变内存权限的要领 - 固然这需要通过一个ROP链实现。
确定使用的参数
我需要做的第一件事是弄清楚我们将通报给VirtualProtect函数的参数。Alex直接供给给了我们参数,我们可以结合堆喷射的特性直接使用它。
这些值将是我们安排在栈中以通报给VirtualProtect函数挪用的参数。
接下来,我得去寻找VirtualProtect的地点。为此,我使用Windbg来检察不撑持ASLR掩护的MSVCR71.DLL模块。通过运行命令:`dh msvcr71` 来dump出模块的头,这供给给我们一个VirtualProtect函数的地点表。接下来,我们执行:`dps msvcr71 + 3a000`,它在VirtualProtect之前的表中给出(可能需要多次执行dps)。最后,这给我们供给了一个地点,我们用u poi(7c37a140)确认是我们想要的地点。趁便说一下,这个地点已经在网上列出来了。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12534.html