0x04 漏洞利用
作为脚本小子,先跑一下写好了的exploit脚本。
打开HackSysEVDExploit.sln文件,直接在vs2019上编译即可。
将生成的HackSysEVDExploit.exe
拷贝至win7,执行如下命令
直接可以获取system权限。
那么只跑一下脚本肯定不行,一起分析一下他是如何做到的。
首先,栈溢出了,我们最希望控制的就是EIP,通过栈溢出的漏洞将原来函数返回的地址覆盖为我们自己希望执行代码的地址。那么应该弄清楚一点,返回地址在哪?
可以在ida上找到答案,通过stack窗口可以看到TriggerBufferOverflowStack
的堆栈图:
我们可以通过kernelBuffer
溢出来覆盖r的值,r相对KernelBuffer
的偏移为820h。
所以我们可以申请一块0x824大小的空间,然后将我们要执行函数或者shellcode的地址填入0x820的位置,即可覆盖返回地址。
当TriggerBufferOverflowStack
执行结束后就会执行我们自己的代码。
这里有一个小问题需要注意,执行完我们自己的代码以后我们需要让程序能够继续正常执行,那么需要做平衡堆栈的动作
最终我们自己编写的exp为:
payload解读
其中TokenStealingPayloadWin7
为payload函数。
在ring3,fs:[0]指向TEB,在ring0,fs:[0]指向KPCR。
然后通过KPCR+124h获取CurrentThread
,CurrentThread结构体为EThread,EThread的第一个成员KThread+40为APC_STATE结构,其中包含当前线程的“养父母”进程。
EPROCESS+0xb8指向的是一个链表,串着所有进程的信息,我们可以通过遍历这个链表获取pid为4(EPROCESS+0xb4),system进程的EPROCESS信息。
最后将当前进程的token(EPROCESS+0xf8)的值替换为system进程的token的值,让当前进程权限为system。达到权限提升的作用。
最后需要平衡堆栈,以及将返回后的两句代码添上。
其余代码
将相对kernelBuffer偏移0x820字节返回位置进行覆盖,改为我们自己函数的地址。
创建设备与驱动通信
IoControlCode要为2236419才会执行BufferOverflowStackIoctlHandler,这一点我们前面也已经分析过了。
由于当前进程具有system令牌,我们通过当前进程创建的cmd.exe拥有system权限。
最后执行我们自己的exp,成功弹出system权限的cmd。
0x05 修复
将Size
改为sizeof(KernelBuffer)
,达到一个限制大小的作用,这一点在SECURE(安全的代码)代码中也有体现。