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

CVE-2019-0808内核破绽应用剖析

申博_新闻事件 申博 111次浏览 已收录 0个评论

破绽概述

CVE-2019-0808是微软在2019年3月修补的内核破绽,该破绽只影响Windows 7和Windows Server 2008,破绽许可攻击者提拔权限并在内核形式下实行恣意代码。在谷歌要挟剖析团队的申报中发明该破绽用于举行Chrome沙箱逃逸,和CVE-2019-5786 Chrome 长途代码实行破绽合营运用。

补钉剖析

经由历程对Win7上3月份的补钉举行对照能够晓得题目出如今xxxMNFindWindowFromPoint函数中,此次的补钉只要对xxxSendMessage函数的返回值举行了搜检,若是返回的不是菜单窗口就失利,还搜检了tagPOPUPMENU和tagPOPUPMENU中的spmenu是不是为空,为空则失利。以是致使破绽的缘由极能够就是tagPOPUPMENU也许tagPOPUPMENU中的spmenu为空。CVE-2019-0808内核破绽应用剖析CVE-2019-0808内核破绽应用剖析经由历程对xxxMNFindWindowFromPoint、NtUserMNDragOver和MNGetpItemFromIndex函数举行援用剖析,晓得能够经由历程拖动菜单项来触发相干破绽函数。破绽成因能够参考360的申报,这里不做详细剖析。

【JSP代码审计】从代码审计的角度看系统接口的安全性

0x00 前言 代码审计的系统为某计费系统,本着学习交流的态度对本系统进行了审计,在审计过程中发现了诸多安全问题,本文在此列出几项比较经典的漏洞。在此感谢花茶安全团队的天堂空气提供的源码。 0x01 XSS漏洞 在路由userdatachange中存在XSS漏洞,此路由为用户资料修改页面,在此路由中,并不存在XSS漏洞,原因是该系统存在XSS过滤器,但是并不会影响我们保存在数据库中的数据,此XSS代码会在其他地方被触发,造成二阶XSS漏洞。 首先我们来到userdatachange路由,在进入了该userDataChange()函数后,首先会进行登录判断,随后对相关的用户权限和用户信息进行校检,校检通过后进行下面流程。 接下来函数会把我们提交过来的数据进行赋值处理,这里调用了UserDataChangeReq这个接口类的数据,在赋完值后,进行后面处理 在处理完提交过来的数据后,将会调用接口commonService中的updata()这个函数把数据存入数据库中去,可以看到,这些地方没有对数据进行过滤处理,直接把原数据存入数据库 此XSS的触发点为后台某功能处,下面来看下 在后台路由/user/operator中,函数前面还是先对相关的登录用户进行信息和登录状态的检查,在没有问题了后,将组合相关的查询语句 这里调用了数据

破绽应用

可应用性剖析
经由历程剖析破绽触发流程晓得xxxMNUpdateDraggingInfo函数取得窗口对象后,会经由历程MNGetpItem函数接见其成员tagPOPUPMENU对象,MNGetpItem函数又会继承接见tagPOPUPMENU对象的spmenu成员,从而形成零指针解援用破绽。在MNGetpItem中会挪用函数MNGetpItemFromIndex,该函数接收菜单对象指针和要求的菜单项索引为参数,依据菜单对象供应的信息返回一个菜单项。
在MNGetpItem中挪用函数MNGetpItemFromIndex,而MNGetpItemFromIndex参数a1就是传入的tagPOPUPMENU对象的spmenu成员,spmenu成员是一个tagMENU构造。在破绽触发的情况下spmenu成员为空,以是MNGetpItemFromIndex中的*(_DWORD *)(a1 + 52)会触发零指针解援用破绽。在Windows7 32位的体系中还未引入零页内存保护机制,以是在Windows7 32位的体系中能够经由历程请求零地点并赋值来经由历程MNGetpItemFromIndex代码中的取值和后续代码取值和校验。CVE-2019-0808内核破绽应用剖析经由历程请求零地点能够对零地点的值举行掌握,也就可以够掌握*(_DWORD *)(a1 + 52)的值,a2的值也能够经由历程全局的音讯钩子函数来猎取也许修正值,抵达掌握MNGetpItemFromIndex返回恣意值的目标。关于请求零地点,通例的内存请求函数像VirtualAlloc是不许可在小于0x00001000的地点分派内存,只要运用函数NtAllocateVirtualMemory来完成对零地点的分派。CVE-2019-0808内核破绽应用剖析经由历程上面的剖析晓得MNGetpItemFromIndex返回值result是可控的,而返回的值又是一个菜单项,以是result是一个指向菜单项构造的指针。若是在后续的代码中能找到修正菜单项数据的代码,就可以够先经由历程修正零地点的值来掌握result指向恣意地点,再经由历程后续代码修正恣意地点的数据,来抵达恣意代码写的目标。
对MNGetpItemFromIndex后续的代码举行剖析,MNGetpItemFromIndex返回后回到MNGetpItem函数,在MNGetpItem函数中未对返回值举行任何操纵直接返回。MNGetpItem函数返回后回到xxxMNUpdateDraggingInfo函数,对xxxMNUpdateDraggingInfo函数举行剖析,只发明有对result指针举行取值推断的代码,没有发明对result指向数据举行修正的代码。CVE-2019-0808内核破绽应用剖析虽然没有直接修正的代码,然则剖析发明在xxxMNUpdateDraggingInfo函数的末端会挪用xxxMNSetGapState函数两次,在第二次会传入pMenuWnd的指针和*(v3 + 0x3C),而*(v3 + 0x3C)也是上图挪用MNGetpItem函数的参数。CVE-2019-0808内核破绽应用剖析在xxxMNSetGapState函数中会又会屡次挪用MNGetpItem函数,传入的第一个参数和xxxMNUpdateDraggingInfo函数中挪用MNGetpItem函数时传入的第一个参数一样,都是一样的一个tagPOPUPMENU构造指针。CVE-2019-0808内核破绽应用剖析经由历程对代码举行剖析晓得MNGetpItem的第二个参数是一个菜单项索引,在xxxMNSetGapState中的三次MNGetpItem函数挪用,第一次与xxxMNUpdateDraggingInfo中挪用MNGetpItem的索引一致,第二次索引加1,第三次索引减1。经由历程代码剖析发明在第二次挪用的时刻会把MNGetpItem返回值偏移4的数据与0x80000000举行或运算,第三次挪用的时刻会把MNGetpItem返回值偏移4的数据与0x40000000举行或运算。以第二次挪用为例,就找到了能够把恣意地点的数据与0x80000000举行或运算的代码,0和0x80000000或运算获得0x80000000。CVE-2019-0808内核破绽应用剖析走到这里已能够把恣意地点的数据与0x80000000举行或运算,然则由于前面的代码另有许多的考证,以是要想代码实行到这里还须要经由历程设置一些数据使考证经由历程,好比xxxMNSetGapState的第三个参数必需为6才能实行到与0x80000000举行或运算的代码,而6又是经由历程对xxxMNUpdateDraggingInfo中MNGetpItem返回值的数据举行推断获得2,再与4举行或运算获得的。CVE-2019-0808内核破绽应用剖析另有一些零地点偏移的值须要去设置,好比零地点偏移0x20和0x28地点的值。这些值会用来举行推断,推断经由历程后才能顺遂抵达与0x80000000举行或运算的代码,这里就不逐一举行申明,能够经由历程调试去考证后在去设置响应的值便可。CVE-2019-0808内核破绽应用剖析如今晓得了怎样修正数据,如今剖析怎样经由历程代码来正确的掌握result的值。经由历程MNGetpItemFromIndex函数晓得result的值是由两个变量运算后相加获得,而这两个变量都能够掌握,个中a1是菜单对象指针,a2是菜单项的索引。简朴的设法主意就是直接把a2设置为0,直接把恣意地点赋给*(a1 + 0x34),由于a1为零地点以是*(a1 + 0x34)的能够修正为恣意值。然则在现实的测试中发明如许做并不可,由于背面会对*(a1 + 0x34)当做菜单项指针猎取数据用于考证,若*(a1 + 0x34)为恣意地点则左近的数据不可控,如许能够致使背面的考证不经由历程。CVE-2019-0808内核破绽应用剖析最好的设施就是让*(a1 + 0x34)在零页内存上,如许能够掌握*(a1 + 0x34)的数据用于后续的考证。假定恣意地点的值为addr,能够按如下来设置a1和a2的值。CVE-2019-0808内核破绽应用剖析设置a1和a2的值后,还须要对后续一些考证地点的数据举行调解,在xxxMNSetGapState中挪用MNGetpItem时传入的是a2+1,要注意盘算a2的值。末了就可以顺遂实行到与0x80000000举行或运算的代码。CVE-2019-0808内核破绽应用剖析
恣意地点读写
上文的代码能够完成恣意地点与0x80000000举行或运算,直接看能够意义不大,然则能够把这个值转到别的数据构造中去看,好比能够用来修正别的构造透露表现巨细的字段,如许也许就可以使该构造掩盖别的数据,再经由历程一些构造的函数就可以够完成恣意读写。
在这里运用tagWND构造体的cbWNDExtra成员,该成员8字节透露表现窗口附加数据的巨细,默许情况下cbWNDExtra巨细为0。在之前须要猎取cbWNDExtra成员在内核中的偏移。为了猎取cbWNDExtra成员的偏移,能够建立了两个窗口WindowA和WindowB,将这两个窗口的窗口类的cbWndExtra成员设置为分歧的值。CVE-2019-0808内核破绽应用剖析而窗口类的cbWNDExtra恰好对应tagWND的 cbWNDExtra成员,建立窗口以后就是猎取cbWNDExtra成员在tagWND构造体中的偏移。起首就要猎取tagWND构造的地点,猎取tagWND能够运用HMValidateHandle函数,这个函数在许多内核破绽应用代码中都会运用,这里就不零丁举行申明。CVE-2019-0808内核破绽应用剖析在猎取tagWND的地点后,经由历程扫描WindowA和WindowB的cbWNDExtra成员的值来猎取cbWNDExtra成员的偏移。
猎取了cbWNDExtra的偏移,还须要猎取生存分外数据的偏移。能够运用SetWindowLong函数向窗口写入分外数据,在运用与猎取cbWNDExtra偏移雷同的方法来扫描写入的分外数据,进而猎取分外数据的偏移。CVE-2019-0808内核破绽应用剖析晓得这两个主要的偏移后,就可以够最先背面的应用历程。为了抵达掩盖数据的目标,能够先建立两个窗口,一个作为触发破绽窗口,一个作为应用窗口,cbWNDExtra运用默许的值0。建立好后就可以够经由历程触发破绽能够修正触发破绽窗口cbWNDExtra的巨细。由于是恣意地点异或0x80000000,这里修正cbWNDExtra的巨细为0x00800000。CVE-2019-0808内核破绽应用剖析修正了触发破绽窗口cbWNDExtra的巨细后,挪用SetWindowLong函数对破绽窗口的附加数据举行写操纵。经由历程前面盘算的偏移,能够正确的修正应用窗口的数据。为了读取写入地点上的值,能够将要读取的地点写入应用窗口的tagWND的spwndParent成员,在挪用GetAncestor函数,该函数现实挪用内核态函数NtUserGetAncestor,当函数的gaFlags参数为GA_PARENT时,该函数将读取tagWND构造体的spwndParent成员。CVE-2019-0808内核破绽应用剖析为了后续应用还须要写操纵,对写操纵能够运用tagWND构造中的strName成员,在strName中有一个buffer能够运用SetWindowText函数举行数据写入。这儿能够经由历程前面的破绽窗口修正buffer地点为恣意地点,在挪用SetWindowText函数就可以够举行恣意地点写。CVE-2019-0808内核破绽应用剖析提权
有了恣意地点读写就可以够猎取system历程的Token,再运用system历程的Token掩盖以后历程的Token,完成提权操纵。有了恣意读写的才能后替代Token的设施有许多,能够掩盖ntoskrnl!HalDispatchTable表中第二项的hal!HaliQuerySystemInformation() 函数指针后,挪用NtQueryIntervalProfile函数实行shellcode,在shellcode中去完成提权。也能够经由历程tagWND对象来一层层去猎取EPROCESS,在EPROCESS中就可以猎取ActiveProcessLinks,UniqueProcessId,Token,就可以够遍历历程猎取Token,经由历程写操纵完成提权。CVE-2019-0808内核破绽应用剖析


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

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

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