初探栈溢出(下)

0x04 漏洞利用

作为脚本小子,先跑一下写好了的exploit脚本。

打开HackSysEVDExploit.sln文件,直接在vs2019上编译即可。

初探栈溢出(下)_第1张图片

将生成的HackSysEVDExploit.exe拷贝至win7,执行如下命令

初探栈溢出(下)_第2张图片

直接可以获取system权限。

那么只跑一下脚本肯定不行,一起分析一下他是如何做到的。

首先,栈溢出了,我们最希望控制的就是EIP,通过栈溢出的漏洞将原来函数返回的地址覆盖为我们自己希望执行代码的地址。那么应该弄清楚一点,返回地址在哪?

可以在ida上找到答案,通过stack窗口可以看到TriggerBufferOverflowStack的堆栈图:

初探栈溢出(下)_第3张图片

我们可以通过kernelBuffer溢出来覆盖r的值,r相对KernelBuffer的偏移为820h。

所以我们可以申请一块0x824大小的空间,然后将我们要执行函数或者shellcode的地址填入0x820的位置,即可覆盖返回地址。

TriggerBufferOverflowStack执行结束后就会执行我们自己的代码。

这里有一个小问题需要注意,执行完我们自己的代码以后我们需要让程序能够继续正常执行,那么需要做平衡堆栈的动作

初探栈溢出(下)_第4张图片

最终我们自己编写的exp为:

初探栈溢出(下)_第5张图片

初探栈溢出(下)_第6张图片

payload解读

其中TokenStealingPayloadWin7为payload函数。

在ring3,fs:[0]指向TEB,在ring0,fs:[0]指向KPCR。

然后通过KPCR+124h获取CurrentThread,CurrentThread结构体为EThread,EThread的第一个成员KThread+40为APC_STATE结构,其中包含当前线程的“养父母”进程。

初探栈溢出(下)_第7张图片

初探栈溢出(下)_第8张图片

初探栈溢出(下)_第9张图片

EPROCESS+0xb8指向的是一个链表,串着所有进程的信息,我们可以通过遍历这个链表获取pid为4(EPROCESS+0xb4),system进程的EPROCESS信息。

初探栈溢出(下)_第10张图片

最后将当前进程的token(EPROCESS+0xf8)的值替换为system进程的token的值,让当前进程权限为system。达到权限提升的作用。

初探栈溢出(下)_第11张图片

最后需要平衡堆栈,以及将返回后的两句代码添上。

初探栈溢出(下)_第12张图片

其余代码

将相对kernelBuffer偏移0x820字节返回位置进行覆盖,改为我们自己函数的地址。

初探栈溢出(下)_第13张图片

创建设备与驱动通信

IoControlCode要为2236419才会执行BufferOverflowStackIoctlHandler,这一点我们前面也已经分析过了。

初探栈溢出(下)_第14张图片

由于当前进程具有system令牌,我们通过当前进程创建的cmd.exe拥有system权限。

最后执行我们自己的exp,成功弹出system权限的cmd。

初探栈溢出(下)_第15张图片

0x05 修复

Size改为sizeof(KernelBuffer),达到一个限制大小的作用,这一点在SECURE(安全的代码)代码中也有体现。初探栈溢出(下)_第16张图片

你可能感兴趣的:(安全)