首页
社区
课程
招聘
[原创]cve-2016-0051简要分析
发表于: 2016-3-8 23:24 8191

[原创]cve-2016-0051简要分析

2016-3-8 23:24
8191

cve-2016-0051为基于webdav的windows本地提权漏洞

先大概描述一下漏洞。

漏洞是在mrxdav.sys这个驱动程序里面的mrxdav!MRxDAVDevFcbXXXControlFile函数。

在发送畸形的web请求时候,这个函数里面验证不严的话会调用这个函数MRxDAVCreateContinuation,大概是在MRxDAVCreateContinuation+0x254位置处。会造成固定地址写入固定值类型的漏洞,具体看ida的代码吧。

-----------------------------------------------------------------------------------------------------

代码片段1:

  

  DevObj__ = *(v5 + 104);

    if ( !*(pRelevantSrvOpen + 32) )
    {
         v21 = ExAllocatePoolWithTag(v14, 0x40ui64, 0x6F535644u);
         *(pRelevantSrvOpen + 32) = v21;

         if ( !v21 )
         {
               v8 = -1073741670;
               v18 = &WPP_GLOBAL_Control;

               if ( WPP_GLOBAL_Control == &WPP_GLOBAL_Control )
                      return v8;

               if ( !_bittest(WPP_GLOBAL_Control + 11, 0xDu) )
                      goto LABEL_254;

               LODWORD(v19) = PsGetCurrentThreadId(v17, v16);
               v20 = 61i64;
               goto LABEL_15;
         }

         memset(v21, 0, 0x40ui64);
   if ( !*(*(pprx_context + 80) + 40i64) )
    {
         *(*(pprx_context + 80) + 40i64) =  ExAllocatePoolWithTag(PagedPool, 0x820ui64, 0x6F465644u);
         v100 = *(*(pprx_context + 80) + 40i64);

         if ( v100 )
         {
                memset(v100, 0, 0x820ui64);
         }
   v68 = ExAllocatePoolWithTag(PagedPool, 0x40ui64, 0x69465644u);
    v31 = 0;
    v9 = v68;

    if ( !v68 )
    {
           v8 = -1073741670;
           v17 = &WPP_GLOBAL_Control;

           if ( WPP_GLOBAL_Control != &WPP_GLOBAL_Control &&  
                    _bittest(WPP_GLOBAL_Control + 11, 0xDu) )
           {
                  LODWORD(v69) = PsGetCurrentThreadId(&WPP_GLOBAL_Control, v16);
                  WPP_SF_qd(*(WPP_GLOBAL_Control + 3), 65i64, &qword_3207580, v69);
           }

           goto LABEL_245;
    }
    memset(v68, 0, 0x40ui64);

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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 229
活跃值: (94)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
调试时候,直接在bp mrxdav!MRxDAVDevFcbXXXControlFile,MRxDAVCreateContinuation,MrxDAVEfsControl三个函数上面下断,找到rx_context结构体,然后就在pRelevantSrvOpen这个指针上面下写入断点,在到它的设备链表上面下断点,就行了,就可以找到做手脚的地方,shellcode做的假的device_object是放在00地址处,这个结构体有指向shellcode的提权函数指针,64位是在d8处指向提权代码,我的exp,shellcode不兼容,可以进提权函数,但是提权函数会在内核里面崩溃,源作者的在32位里面可以完美提权
2016-3-8 23:29
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
3
楼主调整下帖子格式哈
2016-3-12 09:33
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
4
把后续的格式调整调整完毕后,给你精华,妥妥的
2016-3-12 09:33
0
雪    币: 229
活跃值: (94)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
改好了,行不行啊
2016-3-13 22:42
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
6
替你简单的修改了一下代码格式,已经精华了,恭喜楼主!
2016-3-14 18:47
0
雪    币: 199
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看了下说明,好像不影响win2003,看来这系统已经淘汰了
2016-5-20 22:11
0
雪    币: 229
活跃值: (94)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
win2003好像和xp一样不支持此功能,不过Windows Server 2012存在这方面的拒绝服务,他这个漏洞其实是两个漏洞,一个是路径名字没有找到,设备对象被写成null了,他当成成功继续调用null的设备对象指针,验证不严,还有一个问题就是00地址,内核照样可以执行,win7以后就00地址内核也不可以读取执行什么什么了,所有win7以后只能拒绝服务,
2016-5-24 17:26
0
雪    币: 635
活跃值: (1016)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
NtAllocateVirtualMemory(new  IntPtr(-1),  ref  addr,  0,  ref  size,  MemoryAllocationType.RESERVE  |  MemoryAllocationType.COMMIT,  PageProtection.READWRITE);这里是倒着分配么?我怎么看糊涂了,这样写为什么会覆盖到null地址啊
2017-12-8 18:24
0
雪    币: 229
活跃值: (94)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
10
这里其实是前面点的地方找设备驱动,没找到,指针置0了,但是他依旧拿着0的指针用所以出问题了、
2018-2-1 18:42
0
游客
登录 | 注册 方可回帖
返回
//