首页
社区
课程
招聘
[原创]MS08-067漏洞分析(20081025)
发表于: 2008-10-25 21:56 29114

[原创]MS08-067漏洞分析(20081025)

2008-10-25 21:56
29114
收藏
免费 7
支持
分享
最新回复 (73)
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
51
牛牛。。。学习了
2008-10-31 16:19
0
雪    币: 203
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
52
必须顶帖!!!!!!!!www.jiluai.com    www.f2ma.com
2008-10-31 19:47
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
53
没看的懂还是以下简单一点:

微软史上最严重漏洞--MS08-067漏洞分析

来源:瑞星公司 时间:2008-10-31 11:10:05

  近日,微软打破常规发布了MS08-067漏洞补丁。使用该漏洞,黑客可以在远程发动类似“冲击波”病毒一样的攻击。

  下面是瑞星互联网攻防实验室做的漏洞分析报告,下午会发布一个瑞星提供的内存补丁,该补丁可以检查异常RPC请求,阻断黑客利用该漏洞的攻击。暂时不愿意打微软补丁的用户,可以用这个补丁来应急。(瑞星防火墙2009体验版也升级了针对该漏洞的异常请求过滤,大家可以下载来试试看。)

MS08-067漏洞分析

netapi32.dll!NetpwPathCanonicalize在解析路径名时存在堆栈上溢的漏洞,攻击者可以传入精心构造的路径参数来覆盖掉函数的返回地址,从而执行远程代码。攻击者可以通过RPC发起请求,该请求的处理在svchost.exe中实现,导致svchost.exe发生远程溢出。

下面以 5.1.2600.2180 版本为例分析该漏洞的成因:

.text:5B86A259 NetpwPathCanonicalize proc near
...
.text:5B86A2AF push edi ; int
.text:5B86A2B0 push [ebp+arg_8] ; int
.text:5B86A2B3 mov [esi], di
.text:5B86A2B6 push esi ; int
.text:5B86A2B7 push [ebp+pPolicyChain] ; pathname
.text:5B86A2BA push ebx ; int
.text:5B86A2BB call CanonicalizePathName
.text:5B86A2C0 cmp eax, edi
.text:5B86A2C2 jnz short @@Return
...
.text:5B86A2D2 NetpwPathCanonicalize endp

.text:5B86A2E0 CanonicalizePathName proc near
...
.text:5B86A37D push eax ; str
.text:5B86A37E call DoCanonicalizePathName
.text:5B86A383 test eax, eax
.text:5B86A385 jz short @@Return_0x7B
...
.text:5B86A3C7 CanonicalizePathName endp

Netapi32.dll!NetpwPathCanonicalize函数通过内部函数CanonicalizePathName来处理传入的路径。该函数又调用内部函数DoCanonicalizePathName来实现真正的处理过程,该漏洞的溢出点则是出现在DoCanonicalizePathName函数中:

该函数首先把路径中的’/’全部转成’\’,然后试图修改传入的路径缓冲区来得到相对路径。比如:
.\\abc\123\..\a\..\b\.\c
将被处理成:
\abc\b\c

该函数在处理相对路径时,使用两个指针分别保存前一个斜杠(后面用’\’表示)和当前’\’的指针,如下所示:
\abc\a\..\b
^ ^
| |
| +--- 当前’\’指针(后文表示为CurrentSlash)
+----- 前一个’\’指针(后文表示为PrevSlash)

当该函数扫描到’..\’时,会把CurrentSlash开始的数据复制到PrevSlash开始的内存空间处,然后(!漏洞就在这里!)从当前的PrevSlash指针减1的位置开始向前(低地址处)搜索’\’来重新定位PrevSlash,搜索截止条件为PrevSlash等于路径缓冲区的起始地址。

下面是该函数的处理过程:

.text:5B87879C @@LoopSearchSlash:
.text:5B87879C mov [ebp+PrevSlash], edi
.text:5B87879F mov esi, edi
.text:5B8787A1 lea eax, [edi-2]
.text:5B8787A4 jmp short @@IsSlash?
.text:5B8787A6
.text:5B8787A6 @@LoopSearchBack:
.text:5B8787A6 cmp eax, [ebp+BufferStart]
.text:5B8787A9 jz short @@EndOfSearch
.text:5B8787AB dec eax
.text:5B8787AC dec eax
.text:5B8787AD
.text:5B8787AD @@IsSlash?:
.text:5B8787AD cmp word ptr [eax], '\'
.text:5B8787B1 jnz short @@LoopSearchBack
.text:5B8787B3
.text:5B8787B3 @@EndOfSearch:

考虑下面的情况:

\..\a
^ ^
| |
| +--- CurrentSlash
+------ PrevSlash

当完成对’..\’的替换后,缓冲区的内容为:’\a’。这时,按照该函数的算法,把PrevSlash减1并开始向前搜索’\’,此时PrevSlash已经向前越过了路径缓冲区的起始地址,所以该函数的截止条件失效,导致该函数会一直向堆栈的低地址空间搜索(上溢出)。如果在低地址处正好搜到一个’\’,则会把CurrentSlash之后的数据复制到堆栈中’\’开始的地方,并覆盖掉堆栈中的正常数据。攻击者可以通过传入精心构造的路径数据来覆盖掉函数的返回地址来执行代码。
2008-11-1 22:56
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
樓主你這個exploit run完後會出現什么呀?
我run完後出現ret = 7b 不知道是什么意思?
攻擊成功會出現什么的?

remote時 用net use \\IP\ipc$ "" /user:""  空連接足夠嗎?
2008-11-4 20:19
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
55
膜拜,学习学习~
2008-11-8 21:01
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
56
抓狂。。。
不知道为什么楼主的本地溢出代码在我的机器上无效,
用VC6,DEBUG编译,用OD跟了几遍都找不到堆栈溢出点。

我的机器是XP SP2,NETAPI32.DLL 版本是 5.1.2600.2976

哪为老大给点提示!!!
2008-11-9 08:51
0
雪    币: 347
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
57
将楼主的BUG代码整合一起分析:
#include <windows.h>
#include <stdio.h>

LPWSTR BackUpPath(IN  LPWSTR  Stopper,IN  LPWSTR  Path);
BOOL ConvertPathMacros(IN OUT  LPWSTR  Path);

int main() {

        WCHAR instr[] = L".\\\\x\\..\\..\\aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        if(!(ConvertPathMacros(instr))){
        printf ("failed\n");
        }
        printf ("succ!\n");

   

}
        //ConvertPathMacros(szBuffer);
        //printf("%S\n", szBuffer);
LPWSTR BackUpPath(IN  LPWSTR  Stopper,IN  LPWSTR  Path)
{
        while ((*Path != L'\\') && (Path != Stopper)) {
                --Path;
        }
        return (*Path == L'\\') ? Path : NULL;
}

BOOL ConvertPathMacros(IN OUT  LPWSTR  Path)
{       
        LPWSTR  ptr = Path;
        LPWSTR  lastSlash = NULL;
        LPWSTR  previousLastSlash = NULL;
        WCHAR   ch;

        //当传入的路径是个UNC路径时如:\\computername\shared,跳过computername

        if ((Path[0] == L'\\') && (Path[1] == L'\\')) {
                Path += 2;
                while (!(*Path == L'\\') && *Path) {
                        ++Path;
                }
                if (!*Path) {
                        return FALSE;   //传入的是 \\computername ,无效
                }
                ++Path;
                if ((*Path) == L'\\') {
                        return FALSE;   //传入的是 \\computername\\ ,无效
                }
        }

        ptr = Path;

        //下面循环有溢出漏洞
        //该循环作用是去掉路径中的宏:\..和\.
        //如路径 "D:\alpha\beta\..\delta\..\..\aa\.\foo\bar" 将会标准化为 "D:\aa\foo\bar"
        //精心构造一个Evil路径将使漏洞触发

        while ((ch = *ptr) != 0) {
                if (ch == L'\\') {
                        if (lastSlash == ptr - 1) {
                                return FALSE;
                        }
                        previousLastSlash = lastSlash;
                        lastSlash = ptr;
                } else if ((ch == L'.') && ((lastSlash == ptr - 1) || (ptr == Path))) {
                        WCHAR   nextCh = *(ptr + 1);

                        if (nextCh == L'.') {
                                WCHAR   nextCh = *(ptr + 2);

                                if ((nextCh == L'\\') || (nextCh == L'.')) {
                                        if (!previousLastSlash) {
                                                return FALSE;
                                        }
                                        wcscpy(previousLastSlash, ptr + 2);
                                        if (nextCh == 0) {
                                                break;
                                        }
                                        ptr = lastSlash = previousLastSlash;
                                        previousLastSlash = BackUpPath(Path, ptr - 1);
                                }
                        } else if (nextCh == L'\\') {
                                LPWSTR  src = lastSlash ? ptr + 1 : ptr + 2;
                                LPWSTR  dst = lastSlash ? lastSlash : ptr;

                                wcscpy(dst, src);
                                continue;
                        } else if (nextCh == 0) {
                                *(lastSlash ? lastSlash : ptr) = 0;
                                break;
                        }
                }
                ++ptr;
        }
        return TRUE;       
}
2008-11-9 19:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
谁给编个漏洞溢出工具啊
2008-11-9 21:23
0
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
59
谢谢分享,学习了
2008-12-20 16:47
0
雪    币: 1309
活跃值: (232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
60
发现漏洞的才叫牛
2008-12-20 17:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
61
谢谢楼主
2008-12-21 12:19
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
62
看也是白看 ````
2008-12-21 13:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
63
学习价值不可估量呐。。。
2009-1-12 01:26
0
雪    币: 224
活跃值: (15)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
64
强酣之致!!!
2009-1-14 23:20
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
65
佩服的五体投地   收藏了
2009-1-20 12:32
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
66
书上见过,佩服了
2009-1-20 13:07
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
67
看到到处都是转载!
2009-2-4 15:07
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
68
if ( *PathType || (result = NetpwPathType(PathName, (int)&Prefix, 0), !result) )
这行没看明白,||后面是(result=NetpwPathType(),!result),算出来也是bool值吗,是不是这个||后面一定非零?
2009-2-4 15:16
0
雪    币: 146
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
69
特厉害哈
2009-2-9 10:48
0
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
70
学习。。。!!!1
2009-3-30 15:27
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
71
谢谢楼主,佩服了
2009-4-22 09:02
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
72
Mark~
2009-10-10 13:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
73
作个记号,慢慢再看
2011-10-27 00:13
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
74
嘎嘎好东西哇
2011-10-27 07:51
0
游客
登录 | 注册 方可回帖
返回
//