【漏洞分析】MS16-124:微软内核整型溢出漏洞
2016-11-03 14:59:09
来源:安全客 作者:scriptkid
阅读:1009次
点赞(0)
收藏
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.
Image may be NSFW.
Clik here to view.![【漏洞分析】MS16-124:微软内核整型溢出漏洞]()
Image may be NSFW.
Clik here to view.![【漏洞分析】MS16-124:微软内核整型溢出漏洞]()
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blog.fortinet.com/2016/10/31/microsoft-kernel-integer-overflow-vulnerability
2016-11-03 14:59:09
来源:安全客 作者:scriptkid
阅读:1009次
点赞(0)
收藏
Image may be NSFW.
Clik here to view.

翻译:scriptkid
预估稿费:100RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
前言
上个月我发现并报告了一个windows注册表整型溢出漏洞,上星期二(2016.10.25)微软发布了该漏洞的修复补丁MS16-124并对该漏洞编号CVE-2016-0070。该漏洞可以导致本地权限提升,影响到多个版本的Windows,因此微软定义为“重要更新”,并建议用户及时安装本次更新。接下来的内容中将对该漏洞的详细信息进行介绍。
漏洞复现
复现该漏洞只需要以下几步:
1. 以非管理员用户登录Windows7
2. 运行regedit.exe打开注册表编辑器
3. 选择注册表编辑器左边的“HKEY_USERS”
4. 点击菜单“文件”=>“加载配置单元”
5. 选择POC文件POC.hiv并打开
6. 在弹出框中的“键值”中输入随意字符
7. 接着你就可以看到蓝屏了,如下图
Image may be NSFW.
Clik here to view.

漏洞分析
该漏洞主要在解析构造的POC.hiv文件时触发,所以,我们先来瞧瞧这个文件长什么样,下图为POC.hiv文件的主要结构
Image may be NSFW.
Clik here to view.

正如图中标明部分所示,整型溢出发生在NKCELL结构中的ValueCount处,构造的值为0x80000001。根据本人的分析,漏洞存在于函数"CmpCheckKey"处,下面为该函数的代码片段:
PAGE:82C10E9B;int__thiscallCmpCheckKey(int,char,int,int,ULONG_PTRBugCheckParameter3,PRTL_BITMAPBitMapHeader) PAGE:82C10E9B_CmpCheckKey@24procnear ... PAGE:82C114C0loc_82C114C0:;CODEXREF:CmpCheckKey(x,x,x,x,x,x)+60Fj PAGE:82C114C0movedx,[ebp+var_14];edx值为从POC偏移0x1048处获取的0x80000001 PAGE:82C114C3shledx,2;edx乘4,这里导致整型溢出,然后edx值变为4 PAGE:82C114C6cmpedx,4 PAGE:82C114C9jbshortloc_82C11512;比较的结果为false PAGE:82C114CBmovecx,[ebp+BugCheckParameter3] PAGE:82C114CEmoveax,esi PAGE:82C114D0call_HvGetCellSize@8;HvGetCellSize(x,x) PAGE:82C114D5cmpedx,eax;eax(0xc)与edx(4)进行比较 PAGE:82C114D7jashortloc_82C11512;比较结果为false PAGE:82C114D9leaeax,[ebp+var_C] PAGE:82C114DCpusheax PAGE:82C114DDpush[ebp+arg_4] PAGE:82C114E0moval,[edi+2] PAGE:82C114E3push[ebp+var_14];构造的ValueCount值0x80000001入栈 PAGE:82C114E6shral,4 PAGE:82C114E9andal,1 PAGE:82C114EBpushecx PAGE:82C114ECmovecx,[ebp+BitMapHeader] PAGE:82C114EFmovzxeax,al PAGE:82C114F2pusheax PAGE:82C114F3pushesi PAGE:82C114F4leaedx,[ebp+var_10] PAGE:82C114F7call_CmpCheckValueList@32;调用函数触发windows内核错误检查 PAGE:82C114FCtesteax,eax …下面是函数“_CmpCheckValueList@32”的代码片段
PAGE:82C11F24;__stdcallCmpCheckValueList(x,x,x,x,x,x,x,x) PAGE:82C11F24_CmpCheckValueList@32procnear ... PAGE:82C17253loc_82C17253:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+32Bj PAGE:82C17253movecx,[ebp+var_44] PAGE:82C17256cmp[ecx],eax PAGE:82C17258jnbshortloc_82C1725C PAGE:82C1725Amov[ecx],eax PAGE:82C1725C PAGE:82C1725Cloc_82C1725C:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+334j PAGE:82C1725Cinc[ebp+var_20];[ebp+var_20]的值在第一次循环中变为1 PAGE:82C1725Fadd[ebp+var_38],4 PAGE:82C17263jmploc_82C16F89;跳转到第二层循环 ... PAGE:82C173FFloc_82C173FF:;CODEXREF:CmpCheckValueList(x,x,x,x,x,x,x,x)+4D3j PAGE:82C173FFpush0 PAGE:82C17401push[ebp+arg_10] PAGE:82C17404moveax,esi PAGE:82C17406call_HvMarkCellDirty@12;HvMarkCellDirty(x,x,x) PAGE:82C1740Btestal,al PAGE:82C1740Djzloc_82C175B8 PAGE:82C17413push0 PAGE:82C17415pushdwordptr[edi+28h] PAGE:82C17418moveax,esi PAGE:82C1741Acall_HvMarkCellDirty@12;HvMarkCellDirty(x,x,x) PAGE:82C1741Ftestal,al PAGE:82C17421jzloc_82C175B8 PAGE:82C17427decdwordptr[edi+24h] PAGE:82C1742Adec[ebp+arg_C];[ebp+arg_C]是作为调用的一个参数传进来的,值为0x80000001,这里减1 PAGE:82C1742Dmoveax,[ebp+arg_C] PAGE:82C17430subeax,[ebp+var_20];[ebp+var_20]是从上面的第一层循环中得到的,值为1.0x80000000减一得到0x7fffffff PAGE:82C17433shleax,2;eax乘4,得到0xfffffffc PAGE:82C17436pusheax;构造的memcpy大小0xfffffffc入栈 PAGE:82C17437moveax,[ebp+var_38] PAGE:82C1743Aleaecx,[eax+4] PAGE:82C1743Dpushecx;void* PAGE:82C1743Epusheax;void* PAGE:82C1743Fcall_memmove;调用函数触发堆溢出 PAGE:82C17444movesi,[esi+28h] ...下面是函数"_memmove"的代码片段:
... .text:82A7C6ABandedx,3 .text:82A7C6AEcmpecx,8;switch8cases .text:82A7C6B1jbshortloc_82A7C6DC; .text:82A7C6B3repmovsd;最后在这里因为复制内存大小过大堆溢出 .text:82A7C6B5jmpds:off_82A7C7CC[edx*4] ...总结
该漏洞是在执行内存复制操作时由于整型溢出带动堆溢出造成的,成功利用该漏洞可以导致本地权限提升。
Image may be NSFW.
Clik here to view.

Image may be NSFW.
Clik here to view.

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blog.fortinet.com/2016/10/31/microsoft-kernel-integer-overflow-vulnerability