CVE-2015-0057内核破绽剖析及应用 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

CVE-2015-0057内核破绽剖析及应用

申博_安全防护 申博 102次浏览 已收录 0个评论

破绽概述

CVE-2015-0057是影响Windows XP到Windows 10(预览版)的Windows内核破绽,而形成该破绽的函数是win32k!xxxEnableWndSBArrows 函数。win32k!xxxEnableWndSBArrows 函数在触发 user-mode callback 后,实行完响应操纵后从用户层返回到内核层,对接下来操纵的对象未能考证其是不是已开释(变动),而继承对其举行操纵,从而致使UAF。

破绽剖析

在win32k!xxxEnableWndSBArrows函数中经由过程xxxDrawScrollBar函数层层的函数挪用末了挪用KeUserModeCallback函数返回到用户层实行,从用户层返回到内核层实行时致使UAF。这个破绽会致使write操纵,可以或许修正相邻的对象。这个破绽应用scrollbar对象,然后经由过程一个新的对象(巨细雷同)替代开释的对象,新对象的header可以或许被背面的修正。CVE-2015-0057内核破绽剖析及应用经由过程对代码跟踪看出在xxxDrawScrollBar中进入用户形式,如果在用户形式将tagWND对象中的pSBInfo构造开释,在返回内核形式后没有对pSBInfo举行推断,会继承实行背面的代码。CVE-2015-0057内核破绽剖析及应用pSBInfo是tagWND对象中偏移0xb0的数据。CVE-2015-0057内核破绽剖析及应用在psbInfo存储滚动条的相干信息,界说的构造以下:CVE-2015-0057内核破绽剖析及应用破绽的应用思绪就是在 win32k!xxxEnableWndSBArrows 函数实行到症结代码之前,触发某个函数回调,用户可以或许掌握这个函数回调,假定这个函数回调为fakeCallBack,在fakeCallBack函数内里运用DestoryWindow(hwndVulA), 如许就可以够使psbInfo内存块为free状况,运用堆喷手艺可以或许修正psbInfo的值,背面会继承对该值(修正后的值)举行操纵。

某fishcms 背景存在恣意文件删除+getshell

前言 这两天挑了款 cms 审计了一下。还是 tcl ,没审计出什么很厉害的洞。分享一下挖的思路 漏洞分析 找了一圈关键字,找到一处: 后台的删除幻灯片处: 我们看到有一句: @unlink(APP_PATH . ‘..’. DS . $yfile); 而 $yfile 是哪里来的呢? $yfile = str_replace($yuming[‘option_value’],”,$slide[‘slide_pic’]); $slide 是从数据库里查出来的。 临时跳一下,跳到 添加幻灯片 处。看看我们的 slide_pic 是怎么加进去的。 可以看到是获取了 slideshow 这个参数。这里并没有任何检查 我们再跳回 removeSlide 这个函数。 我们会发现在 unlink 前有个 if: if(!empty($yfile) && $this->isLegalPicture($slide[‘slide_pic’])){ 没错,isLegalPicture 这个函数就是检查函数,这个函数大概做了两件事: 判断文件名后缀是否为图片(白名单 判断文件名是否带有 /data/ 这里第二个条件,是要 dirname 含有 /data/,不能是 /data/a.jpg ,但可以是 /data/a/a.jpg 现在知道变量来源了,我们再精简一下代码,把关键代码剪出来: $yfile = str_replace($yuming[‘option_value’],”,$slide[‘slide_pic’]);
if($this->isLegalPicture($slide[‘slide_pic’])){
@unlink(APP_PATH . ‘..’. DS

破绽应用

以是起首要完成掌握回调函数,对回调函数举行HOOK。先要找到一个对应的回调函数,并HOOK该回调函数使其指向我们本身写的回调函数,在本身的回调函数内里就可以够经由过程DestoryWindow(hwndVulA)函数来举行开释。
关于怎样去找该HOOK的函数,可以或许想到一个函数nt!KeUserModeCallback,任何的user-mode callback流程终究内核到用户层的进口点都会是 nt!KeUserModeCallback。而函数名带有”xxx”和”zzz”前缀的一样平常都可以或许触发该函数。nt!KeUserModeCallback函数界说以下。CVE-2015-0057内核破绽剖析及应用这里的ApiNumber是透露表现函数指针表(USER32!apfnDispatch)项的索引,在指定的历程中初始化 USER32.dll时期该表的地点被拷贝到历程环境变量块(PEB.KernelCallbackTable)中。 KernelCallbackTable是回调函数数组指针表,可以或许经由过程peb来索引。CVE-2015-0057内核破绽剖析及应用从上面的剖析晓得xxxEnableWndSBArrows函数会经由过程xxxDrawScrollBar函数进入用户空间实行代码,而跳转到用户空间必然会挪用函数nt!KeUserModeCallback。可以或许在挪用xxxDrawScrollBar函数的地点FFFFF9600012745A和下条指令地点FFFFF9600012745F下断。
CVE-2015-0057内核破绽剖析及应用再在nt!KeUserModeCallback函数下断,经由过程观察ApiNumber的值来推断会挪用哪些回调函数。
CVE-2015-0057内核破绽剖析及应用可以或许看到上面是索引为2的函数,也就是函数fnDWORD。
CVE-2015-0057内核破绽剖析及应用在这儿拔取的回调函数为USER32!_ClientLoadLibrary,可以或许看到在win7 sp1x64的体系上USER32!_ClientLoadLibrary的索引为0x41。
CVE-2015-0057内核破绽剖析及应用可以或许运用以下的汇编代码来猎取该USER32!_ClientLoadLibrary的地点。
CVE-2015-0057内核破绽剖析及应用经由过程以下代码把USER32!_ClientLoadLibrary的地点换成HOOK后函数的地点。
CVE-2015-0057内核破绽剖析及应用在HOOK函数中要做的就是经由过程DestroyWindow函数来开释psbInfo构造,在经由过程堆喷来掩盖开释的空间。个中的hookedFlag和hookCount重要用来掌握流程,在hook函数以后回调函数极可以或许被体系的其他局部运用,但想掌握的只是由xxxDrawScrollBar触发的时刻, 以是要肯定哪一次才是由xxxDrawScrollBar触发的。在EnableScrollBar函数实行前在修正hookedflag为TRUE。CVE-2015-0057内核破绽剖析及应用同时引见一个很好用的函数HmValidateHandle,给HmValidateHandle函数供应一个Window句柄,它会返回桌面堆上用户映照的tagWND对象,然则该函数HmValidateHandle并未被user32导出。从一大堆公然的诠释中发明HmValidateHandle与导出的User32::IsMenu函数近来,可以或许经由过程User32::IsMenu来查找HmValidateHandle函数的地点。
CVE-2015-0057内核破绽剖析及应用
从上面的代码可以或许看出须要做的就是猎取User32::IsMenu运转时地点,寻觅第一个0xE8字节(call xxx)并攫掏出HmValidateHandle的指针,这个函数猎取的是用户态的tagWND对象。同时用户态的tagWND构造中tagWND->THRDESKHEAD->pSelf是一个指向内核态的tagWND的指针,这里就可以够经由过程内核tagWND的地点减去用户tagWND的地点来计算出ulClientDelta。
CVE-2015-0057内核破绽剖析及应用如今可以或许在xxxEnableWndSBArrows函数下断点来检察tagWND对象,然则在举行调试发明xxxEnableWndSBArrows函数要挪用屡次,不容易辨别是不是是本身函数在挪用xxxEnableWndSBArrows函数,以是最幸亏挪用xxxDrawScrollBar函数处下断。经由过程浏览汇编代码发明,在挪用xxxDrawScrollBar函数处,rcx生存的是tagWND指针,rbx中生存的为pSBInfo指针。
CVE-2015-0057内核破绽剖析及应用可以或许看到实行到用户态之前pSBInfo构造的信息,然则当xxxDrawScrollBar函数实行完,从用户态返回到内核态时,在挪用xxxDrawScrollBar函数的下句代码下断,也就是hook函数实行完后在检察该地点的值。
CVE-2015-0057内核破绽剖析及应用可以或许看到在hook函数中该处的值已被开释,为了准确的掌握添补的值,要晓得构造的巨细,pSBInfo构造巨细巨细为0x24,因为在x64的体系会按8字节对齐,以是该构造现实占用巨细0x28,再加上_HEAP_ENTRY,统共巨细为0x30。堆头是0x10字节巨细,前8字节如果有对齐的须要就寄存上一个堆块的数据,因为前8字节寄存的上一个堆块的数据以是统共巨细为0x30。
CVE-2015-0057内核破绽剖析及应用为了准确的添补数据这里选用了函数SetPropA,该函数的定于以下。第一次挪用SetPropA的时刻,起首会分派一个堆用于存储天生的tagPropLIST构造体。厥后的挪用时如果lpString在之前没有声明过,那末会增加一个tagPROP构造体(0x10),以是在前面界说的0x7和0x8。
CVE-2015-0057内核破绽剖析及应用这两个构造体加起来恰好0x28,再加上其_HEAP_ENTRY,统共巨细也为0x30恰好可以或许掩盖开释的pSBInfo空间。
CVE-2015-0057内核破绽剖析及应用当把开释后的pSBInfo掩盖为tagPropLIST构造后,因为UAF破绽顺序会继承运用pSBInfo的WSBflags字段(现实运用的字段为添补的tagPropLIST构造的cEntries字段),代码会把cEntries字段的值修正为0xe。
CVE-2015-0057内核破绽剖析及应用从上面的剖析晓得可以或许经由过程UAF破绽修正tagPropLIST构造的cEntries字段,继承看tagPropLIST构造中各项字段代表的值和SetPropA函数对应的干系。
CVE-2015-0057内核破绽剖析及应用晓得cEntries字段透露表现tagPROP构造的数目,应用破绽增加了tagPROPLIST.cEntries 巨细,内核会以为一共有0xe个tagPROP。可以或许在背面继承挪用setProp()掩盖背面的数据,可以或许应用 SetProp() 对tagPROPLIST 相邻内存举行越界写,可写的局限是(0xe-0x2)*0x10

堆应用结构

tagPROLIST 有两个成员属性,cEntries和iFirstFree离别透露表现tagPROP的数目和指向以后正在增加的tagPROP的地位。当插进去新的tagPROP时会先对已有的tagPROP条目举行扫描直到抵达iFirstFree指向的地位,这里并没有搜检iFirstFree是不是超过了 cEntries,但如果扫描中发明了响应的atomKey则会实行搜检确保iFirstFree反目cEntries相称,然后新的tagPROP才会增加到iFirstFree索引的地位,如果iFirstFree和cEntries相称的话注解空间不敷用了,就分派一个新的能包容所插进去条目标属性列表,同时原有的项被复制过去并插进去新的项。
而tagPROP构造和SetProp()函数相干联,hData 成员对应SetProp的HANDLE hData参数,atomkey对应lpString参数,且属于我们可控的领域,依据文档的申明,我们可以或许用这个参数通报一个字符串指针或许16位的atom值,当通报字符串指针时会自动转化为atom值,如许我们可以或许通报任何atom值来掌握两个字节的数据。不外照样有一些限定,当我们增加新的条目到列表中时,atomKey不克不及反复,不然新的条目会把旧的给替代掉。别的另有一点值得注意的是tagPROP只要0xc字节巨细,不外体系分派的是0x10字节用来对齐。CVE-2015-0057内核破绽剖析及应用这里在对相邻块举行覆写时要注意连结别的构造的完整性,如果只是掩盖相邻块开首的8字节就可以发生结果就还行,但如果继承今后掩盖背面的字段才能发生结果就会不可避免的损坏一些底本的值,可以或许形成蓝屏。幸亏这有个不错的构造对象,就是 tagWND 构造体的 strName 成员,该成员的构造范例是_LARGE_UNICODE_STRINGCVE-2015-0057内核破绽剖析及应用如果可以或许掩盖到 Buffer 字段就可以够经由过程窗体字符串指针恣意读写 MaximumLength 巨细字节的数据。如今晓得了如何用 tagPROPLIST 来修正数据,也晓得哪些局部能掌握,和有哪些限定,接下来我们要做的就是想设施用这局部修正数据的才能取得恣意地点读写的才能。
然则写的数据局限是(0xe-0x2)*0x10,而在tagWND中strName.Buffer的偏移是0xd8,并且在strName之前tagWND另有许多别的的构造,以是不克不及直接举行掩盖 。在这里只要想别的的设施,在前面晓得在tagPropLIST构造之前有一个_HEAP_ENTRY构造,重要用来堆内存的治理,标识堆块的巨细与是不是余暇的状况。CVE-2015-0057内核破绽剖析及应用堆头是0x10字节巨细,前8字节如果有对齐的须要就寄存上一个堆块的数据,size域和prevsize域寄存的是正本数值除以0x10,Flags域用来透露表现以后堆块是余暇状况照样运用状况,SmallTagIndex域则是用来做平安搜检的,寄存一个异或加密过的值就像stack cookie那样检测是不是有溢出。
虽然不克不及直接掩盖strName.Buffer,然则可以或许斟酌修正_HEAP_ENTRY,并且SetPROP恰好可以或许完整掌握下一个堆块_HEAP_ENTRY症结的数据构造,经由过程修正_HEAP_ENTRY的巨细让其包罗tagWND构造,然后开释掉它再分派一个tagPROP + tagWND巨细的堆块,如许就可以够掌握堆块的内容来修正tagWND。如今调解一下风水结构,用window text构造可以或许恣意分派内存巨细,新的堆结构以下:CVE-2015-0057内核破绽剖析及应用重要的完成代码以下CVE-2015-0057内核破绽剖析及应用触发uaf破绽后tagSBINFO地位处会被替代成tagPROPLIST构造,然后挪用setPROP修正相邻window text的_HEAP_ENTRY将其size域掩盖成sizeof(overlay1) + sizeof(tagWND) + sizeof(_HEAP_ENTRY),然后开释掉,接着分派一个新的window text来操纵内里的数据。CVE-2015-0057内核破绽剖析及应用重要代码以下:CVE-2015-0057内核破绽剖析及应用CVE-2015-0057内核破绽剖析及应用如今能用任何想要的数据掩盖strName.Buffer的指针,然则tagWND的其他数据须要修复,这可以或许从用户空间读取,桌面堆会映照到用户空间,准备好tagWND的悉数数据,把Buffer指针的值修正成目标地点,然后请求这局部内存。CVE-2015-0057内核破绽剖析及应用在可以或许掌握strName.Buffer指针后,在应用tagWnd.strNam相干的函数InternalGetWindowText()和NtUserDefSetText()可以或许离别取得恣意地点读和恣意地点写的才能。如今就是斟酌要掩盖哪一个地点,经常使用的地点就是HalDispatchTable+0x8(32位+4,64位+8)的地点。因为NtQueryIntervalProfile终究会挪用一个在内核效劳函数指针表HalDispatchTable+0x8处的指针。如果可以或许掩盖该指针使其指向shellcode,那末当挪用NtQueryIntervalProfile时shellcode就可以够在内核层运转。CVE-2015-0057内核破绽剖析及应用以是应用是经由过程把strName.Buffer的指针修正成HalDispatchTable +8的地点,再经由过程strName.Buffer指针来修正HalDispatchTable +8地点的值,末了经由过程挪用NtQueryIntervalProfile函数来完成挪用shellcode。CVE-2015-0057内核破绽剖析及应用末了在0xf0000地点上部署提权的shellcode,实行后完成提权。CVE-2015-0057内核破绽剖析及应用CVE-2015-0057内核破绽剖析及应用


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明CVE-2015-0057内核破绽剖析及应用
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址