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

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

2008-10-25 21:56
29113

前天看到微软紧急发布了一个漏洞补丁,就去看了下,发现该漏洞影响覆盖面非常广,包括Windows 2000/XP/2003/Vista/2008的各个版本,甚至还包括测试阶段的Windows 7 Pre-Beta,并且漏洞存在于Windows系统默认开启的Server服务当中,而且超越了当年风靡一时的MS06-040漏洞(又想起当年用该漏洞。。。。。。。嘿嘿)。这也难怪微软打破周二发布补丁的惯例。于是下了补丁研究研究。

下完补丁,发现被打补丁的又是 Netapi32.dll,对比原文件和补丁中的文件,有问题的函数又是NetpwPathCanonicalize(MS06-040也是这个函数,具体信息请搜索)简单说下这个函数:
该函数用于标准化一个路径,一般用于本地调用,若调用者指定了一个远程计算机名将会使用RPC。

该函数能够处理的路径类型:
1.相对路径 e.g. foo\bar
2.绝对路径 e.g. \foo\bar  
3.UNC 路径 e.g. \\computer\share\foo 
4.全路径  e.g. d:\foo\bar

该函数声明如下:
DWORD 
NetpwPathCanonicalize(
LPWSTR PathName, //需要标准化的路径
LPWSTR Outbuf, //存储标准化后的路径的Buffer
DWORD OutbufLen, //Buffer长度
LPWSTR Prefix, //可选参数,当PathName是相对路径时有用
LPDWORD PathType, //存储路径类型
DWORD Flags // 保留,为0
)

该函数中在一个循环里使用wcscpy,恶意攻击者通过构造一个精心设计的路径将使漏洞触发。

结合IDA分析该函数:(F5 + 整理 + 主要代码)

int __stdcall NetpwPathCanonicalize(LPWSTR PathName, LPWSTR Outbuf, DWORD OutbufLen, LPWSTR Prefix, LPDWORD PathType, DWORD Flags)
{
  bool v7; 
  int result; 

  v7 = !Prefix || !*Prefix;
  Prefix = (LPWSTR)*PathType;

    if ( *PathType || (result = NetpwPathType(PathName, (int)&Prefix, 0), !result) )
    {
      if ( v7 || (result = NetpwPathType(Prefix, (int)&Flags, 0), !result) )
      {
        if ( OutbufLen != 0 )
        {
          *Outbuf = 0;
          result = CanonPathName(Prefix, PathName, Outbuf, OutbufLen, 0); //核心函数,主要处理在这里,问题也出在这里
          if ( !result )
            result = NetpwPathType(Outbuf, (int)PathType, 0);
        }
        else
        {
          result = 2123;
        }
      }
    }

  return result;
}

int __stdcall CanonPathName(LPWSTR PathPrefix, LPWSTR PathName, LPWSTR Buffer, DWORD BufferSize, LPDWORD RetSize)
{
  size_t preLen;
  size_t pathLen;
  wchar_t pathBuffer[MAX_PATH*2 + 1];

  if ( PathPrefix && *PathPrefix )
  {
    preLen = wcslen(PathPrefix);
    if ( preLen != 0)
    {
      if ( preLen > 520 ) //520 = sizeof(pathBuffer) - 1
        return 0x7Bu; // ERROR_INVALID_NAME
        
      wcscpy(pathBuffer, PathPrefix);
      
      if ( pathBuffer[preLen-1] != '\\' && pathBuffer[preLen-1] != '/') //判断前缀是否以'\'或'/'结尾
      {
          wcscat(pathBuffer, L"\\");
          ++preLen;
      }
      if ( PathName[0] == '\\' || PathName[0] == '/' )
        ++pathLen;
    }
  }
  else
  {
    pathBuffer[0] = 0;
  }
  pathLen = wcslen(PathName);

  if (pathLen + preLen > sizeof(pathBuffer) - 1)
    return 0x7Bu; // ERROR_INVALID_NAME

  wcscat(pathBuffer, PathName);

  if ( pathBuffer )
  {
    do //该循环把路径中的'/'转换成'\'
    {
      if ( *pathBuffer == '/' )
        *pathBuffer = '\\';
      ++pathBuffer;
    }
    while ( *pathBuffer );
  }
  if ( !sub_71C4A2CA() && !ConPathMacros(pathBuffer) ) //ConPathMacros中存在缓冲区溢出漏洞!!!
    return 0x7Bu;
  pathLen = 2 * wcslen(&pathBuffer) + 2;
  if ( pathLen > BufferSize )
  {
    if ( RetSize )
      *RetSize = pathLen;
    result = 0x84Bu; 
  }
  else
  {
    wcscpy(Buffer, &pathBuffer);
    result = 0;
  }
  return result;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (73)
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
在DEBUGMAN看到了 可惜没威望。
发到这里正好 
虽然不懂漏洞利用
2008-10-25 21:58
0
雪    币: 232
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不错的文章
简明扼要~
2008-10-25 22:56
0
雪    币: 216
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
还贴到这里了啊
2008-10-25 23:19
0
雪    币: 312
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
/////不顶实在不行了
----顶后悔了,加个注释
2008-10-25 23:59
0
雪    币: 190
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可否远程溢出??
2008-10-26 01:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可以 指那儿打那儿
2008-10-26 08:41
0
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
8
学习ing
2008-10-26 09:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看看 会编程就是好啊 ·~~~

抓紧学习去~~~~
2008-10-26 14:48
0
雪    币: 339
活跃值: (29)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
不顶不行。大牛这么快就出原理了。赞。

学习学习
2008-10-26 15:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
milw0rm都还没有呢,难道高手都写remote exploit去了?
2008-10-26 15:24
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
占个位慢慢看~
2008-10-26 15:55
0
雪    币: 233
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
收藏学习
2008-10-26 16:39
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
14
学习,lz的动作真快。
2008-10-26 20:51
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
强贴留名哈哈
2008-10-26 21:24
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
附件补上了。
2008-10-26 21:29
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
楼主给的地址http://www.microsoft.com/technet/sec.../MS08-067.mspx是如何变成
http://www.microsoft.com/technet/security/Bulletin/MS08-067.mspx 的呢?我直接复制
http://www.microsoft.com/technet/sec.../MS08-067.mspx到地址栏的话,访问不了。有人知道么?我用的是FireFox 3.0
2008-10-26 21:39
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
18
不要复制,直接点就是了。

用UBB代码插入一个超链接就行了。

至于显示的时候,过长的地址会自动省略掉的,论坛的程序就是这样的。
2008-10-26 22:05
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
浅显,不易懂,嘿嘿
2008-10-26 22:05
0
雪    币: 547
活跃值: (2195)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
这么强的漏洞还附带利用源码,真是高人啊
2008-10-26 22:27
0
雪    币: 138
活跃值: (108)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
顶···,看得真解渴!~
2008-10-26 23:26
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
22
咋没人解释一下怎么构造路径会溢出啊? 貌似楼主也没真正理解啊~~
2008-10-26 23:50
0
雪    币: 354
活跃值: (10)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
23
构造能够触发溢出的路径在附件中已经说得很清楚了,
楼上不明白的话可以自己调试跟踪一下附件中bug.cpp文件里的函数
2008-10-26 23:56
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
强,学习个...
2008-10-27 00:40
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
支持一个 DebugMan要声望才能看见是一件非常锤子的事情!!!!!!!!!!!!!!!!
2008-10-27 00:41
0
游客
登录 | 注册 方可回帖
返回
//