针对CVE-2018-8120 Windows提权工具兼容性BUG定位及修复

一、背景先容:

2018年5月微软宣布了针对Windows操作系统内核组件破绽(CVE-2018-8210)的补丁,该破绽影响多个版本的操作系统,成功使用破绽可使得通俗利用法度榜样以内核权限履行随意率性代码。

笔者在6月对该破绽进行阐发并宣布了破绽阐发和破绽使用文章(地址),文中同时附带了一份提权对象,支持WinXP、Win2003、Win7、Win2008等系统。后有网友回帖表示在Win7 x86系统下该使用对象无效,经调试确认提权对象确凿存在部分兼容性问题。本文将针对该问题进行弥补阐明,办理存在的兼容性问题。

CVE-2018-8120为缓冲区溢出漏洞,可造成内核随意率性地址写入。 前文中破绽使用对象经由过程触发破绽,对内查究事函数指针表进行改动,调换为一段改动当提高程Token的ShellCode地址。

二、 问题定位:

经测试在Win7 x86确凿无法实现提权,现进行问题定位。设置双机调试内核情况,在关键的位置设置断点,进行调试确认问题的缘故原由。

破绽使用对象调试

首先设置双机调试情况,虚拟机安装Win7 x86,真机安装WinDbg进行内核调试,在win32k! SetImeInfoEx ()设置断点,查看提权对象是否可以成功调用破绽函数。

确认是可以成功调用SetImeInfoEx()的,经由过程IDA反汇编查看该版本的SetImeInfoEx()函数确认破绽存在。

在SetImeInfoEx()函数进行单步跟踪,确认是否可以触发破绽

颠末单步跟踪,发明可以触发SetImeInfoEx()函数存在的缓冲区溢出漏洞,成功改动了指定的内存数据。

破绽使用对象经由过程覆盖GDI内查工具关键字段,实现随意率性内核地址读写。继承履行破绽使用对象,反省是否成功改动内查究事函数指针表HalDispatchTable。

进一步进行查看发明,破绽使用法度榜样谋略的HalDispatchTable内存地址并不精确,导致破绽使用法度榜样没有成功改动函数指针,提权ShellCode也就没有得以履行。

NtQueryIntervalProfile()和HalDispatchTable

我们阐明一下为什么改动HalDispatchTable后,可以履行ShellCode。NtQueryIntervalProfile()是Ntdll.dll中导出的未公开的系统调用.它调用内核可履行法度榜样ntosknl.exe导出的KeQueryIntervalProfile()函数.假如我们反汇编这个函数,可看到如下:

位于nt!HalDispatchTable+0×4地址上的函数会被KeQueryIntervalProfile()调用(看血色方框).以是假如我们覆盖那个地址上的指针-也便是说HalDispatchTable中的第二个指针-带有我们ShellCode地址;然后我们调用函数NtQueryIntervalProfile(),将履行我们的ShellCode。

三、办理问题:

前面已经定位到问题,因为没有精确的改动系统办事表的函数指针,导致提权的ShellCode没有履行。现在的问题是找出本来谋略历程中为什么会掉足,导致没有谋略出精确的地址。

若何谋略HalDispatchTable表地址

HalDispatchTable由NT内核文件导出,获取该表地址只必要经由过程GetProcAddress()搜索NT内核文件导出表即可,不过该函数在用户态下,无法对内核模块进行搜索。

在我们的破绽使用对象中,谋略HalDispatchTable表主如果函数leakHal()函数完成的,下面看看该函数的流程:

该函数首先经由过程EnumDeviceDrivers()获取到ntoskrnl.exe模块的运行时基址,之后在用户态加载ntoskrnl.exe并搜索HalDispatchTable表的导出地址,法度榜样应用真实导出地址减去模块基地址,得到了该表相对付模块基地址的偏移值。着末应用第一步获取的ntoskrnl.exe的运行时基地址加上上面谋略的偏移值,得出内核中HalDispatchTable表的内存地址。

NT内核文件之ntoskrnl.exe

NT内核文件是Windows的内核关键组件,平日是指可履行文件ntoskrnl.exe。然则微软根据当前CPU的核心数量以及PAE开启状态,加载不合的内核可履行文件。

如上图所示,系统根据当前处置惩罚器的事情模式,加载不合的内核文件。

办理规划

因为本来的代码在谋略HalDispatchTable表的时刻,没有斟酌到微软针对CPU设置加载不合版本内核组件的问题,导致在部分系统上无法成功改动函数指针。

在代码中加入检测CPU设置的代码,根据详细的设置,判断内核所加载的NT内核组件,并谋略HalDispatchTable的真实内存地址即可。下面是弥补的代码:

[1] [2]下一页

在本来的leakHal()代码加入了DeteckKernel()函数, 该函数检测CPU数量和PAE开启状况,返回系统可能加载的内核组件名称。后续法度榜样按原定的流程,加载该内核组件,获取HalDispatchTable表的内存地址并改动。

着末调用NtQueryIntervalProfile()函数,我们的ShellCode将以内核权限履行,以调换Token的要领进行提权。

四、总结

笔者已从新测试WinXP x86、Win 2003 x86、Win 2003 x64、Win7 x86、Win7 x64,Win2008 x86以及Win2008 x64等系统改动后的代码均可以正常提权。如各位看官碰到其他问题,迎接跟帖进行反馈,笔者将酌情进行更新办理。更新后的代码在Github有提交,感兴趣的可以去下载并测试。GitHub地址,感谢支持!

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

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

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包