重现Windows本地提权漏洞(cve-2018-8120)

这是360 A-TEAM的第14篇文章


本篇文章360 A-TEAM @bigric3 对windows本地提权漏洞(cve-2018-8120)进行了逆向分析。同时勤劳的@bigric3 在分析过程中还保留了录屏供大家交流学习,感兴趣的同学可以在文章最后查看。

声明:本文由bigric3@360 A-Team原创,仅用于技术研究,不恰当使用会造成危害,严禁违法使用,否则后果自负。

前言

5月15日ESET发文其在3月份捕获了一个 pdf远程代码执行(cve-2018-4990)+windows本地权限提升(cve-2018-8120)的样本。ESET发文后,我从vt上下载了这样一份样本(https://www.virustotal.com/#/file/6cfbebe9c562d9cdfc540ce45d09c8a00d227421349b12847c421ba6f71f4284/detection)。


初步逆向,大致明确如外界所传,该漏洞处于开发测试阶段,不慎被上传到了公网样本检测的网上,由ESET捕获并提交微软和adobe修补。


分析过程


测试特征字符串如下:


重现Windows本地提权漏洞(cve-2018-8120)


定位样本中关键的代码并调试分析:


重现Windows本地提权漏洞(cve-2018-8120)


可以知道漏洞产生于系统调用号为0x1226的内核函数NtUserSetImeInfoEx中,该函数调用SetImeInfoEx,在SetImeInfoEx内对参数1校验疏忽,产生了空指针解引用漏洞,相关触发代码逻辑如下:


重现Windows本地提权漏洞(cve-2018-8120)

重现Windows本地提权漏洞(cve-2018-8120)

重现Windows本地提权漏洞(cve-2018-8120)


不同于目前较为主流的gdi提权技术,该样本利用了安装系统调用门来实现内核权限提升。


首先,通过指令sgdt指令获取全局描述符表:


重现Windows本地提权漏洞(cve-2018-8120)


申请0x400 bytes内存,构造调用门描述符:


重现Windows本地提权漏洞(cve-2018-8120)


调用门描述符结构如下:


重现Windows本地提权漏洞(cve-2018-8120)


调用门及mapping null page构造完毕后,开始触发漏洞安装调用门:


重现Windows本地提权漏洞(cve-2018-8120)


此时寄存器数据如下:


重现Windows本地提权漏洞(cve-2018-8120)

 

源数据如下:


重现Windows本地提权漏洞(cve-2018-8120)


目的地址数据如下:


重现Windows本地提权漏洞(cve-2018-8120)

 

可以看到安装了自身callgate及Ring0Function。安装完毕后(支持3环调用的调用门),ring3程序调用调用门。


重现Windows本地提权漏洞(cve-2018-8120)


找到对应的GDT表项


重现Windows本地提权漏洞(cve-2018-8120)


按照GDT表项的结构,分析下样本安装的调用门描述符:


段选择子cs的值为0x1a8;

对应的Ring0Function的offset低地址为0x51b4;

对应的Ring0Function的offset高地址为0x80b9;

DPL为3  & Gate Valid位为1。


段选择子cs对应的结构如下,RPL级别为0,特权级别


重现Windows本地提权漏洞(cve-2018-8120)


根据上述结构定位gdt段描述符项:


重现Windows本地提权漏洞(cve-2018-8120)


段描述符结构如下:


重现Windows本地提权漏洞(cve-2018-8120)


3,4,5,8个字节得到段基址为0x0,结合上面的Ring0Func,得到Ring0Func的物理地址。


Ring0Function很简单,直接ret,但此时ring3代码已具有ring0权限,因为这里没有恢复cs:


重现Windows本地提权漏洞(cve-2018-8120)


整个Far Pointer to Call Gate流程如下图:


 

重现Windows本地提权漏洞(cve-2018-8120)


中断在call far pointer,此时cs的值为0x1b。


重现Windows本地提权漏洞(cve-2018-8120)


单步进入后,cs变为0x1a8(此时中断在我双机调试的windbg上)。


重现Windows本地提权漏洞(cve-2018-8120)

 

单步返回之后,依然具有特权,此时已经进入用户态代码。


重现Windows本地提权漏洞(cve-2018-8120)


如此替换本进程的token为system的token后,完成权限提升,最后恢复cs,并平衡堆栈。

 

分析过程中,我近95%的按照样本的思路还原了提权代码。


演示视频




由于微信发送视频会压缩失真,想看高清版请联系我们获取。


Source code:

https://github.com/bigric3/cve-2018-8120




360 A-TEAM 是隶属于 360 企业安全集团旗下360安全监测与响应中心的纯技术研究团队。

团队主要致力于 Web 渗透,APT 攻防、对抗,前瞻性攻防工具预研。从底层原理、协议层面进行严肃、有深度的技术研究,深入还原攻与防的技术本质。欢迎有意者加入!

重现Windows本地提权漏洞(cve-2018-8120)

始发于微信公众号: 360安全监测与响应中心

本文由 华盟网 作者:congtou 发表,其版权均为 华盟网 所有,文章内容系作者个人观点,不代表 华盟网 对观点赞同或支持。如需转载,请注明文章来源。

0

相关文章

发表评论

电子邮件地址不会被公开。