CVE-2014-4113
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相关推荐
- Android安全研究经验谈
安全研究做什么 从攻击角度举例,可以是:对某个模块进行漏洞挖掘的方法,对某个漏洞进行利用的技术,通过逆向工程破解程序.解密数据,对系统或应用进行感染.劫持等破坏安全性的攻击技术等. 而防御上则是:查杀 ...
- 工控系统的全球安全现状:全球漏洞实例分析
工控系统的全球安全现状:全球漏洞实例分析 一.摘要 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...
- Android安全研究经验谈 @retme
搜paper时,找到的一篇讲的非常好的文章,认同其中相当一部分观点,特转载一下. 原文:http://www.360doc.com/content/17/0815/15/43931101_679381 ...
- 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 ...
- CobaltStrike使用-第五篇(Bypass UAC、CVE提权、Powerup提权)
前四篇文章介绍了CS的基本使用方法和模块,以及钓鱼攻击的方法,本篇将会介绍使用CS进行提权操作 文章目录 权限提升 Bypass UAC CVE提权 PowerUp 凭证和哈希获取 Beacon 中的 ...
- 4道与CVE结合web题目
走过路过,不要错过这个公众号哦! 0x00 前言 最近做题遇到了一些CVE的复现,其中不乏一些好题,今天介绍的是如下4个与CVE结合的题目: CVE-2017-12635(CouchDB) CVE- ...
- CV算法复现(分类算法4/6):GoogLeNet(2014年 谷歌)
致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...
- CV算法复现(分类算法3/6):VGG(2014年 牛津大学)
致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...
- 2014.4新版uboot启动流程分析
原文 http://blog.csdn.net/skyflying2012/article/details/25804209 此处转载有稍作修改 最近开始接触uboot,现在需要将2014.4版本ub ...
- 2014年个人工作总结
2014年的日常工作,从技术支持岗位调到市场.社区岗位上:日常技术处理工作变为博客.微信.微博.市场活动策划.发送奖品等.如果以此为界:即毕业10年内的主要是软件研发.团队管理.项目管理:第二个十年开 ...
最新文章
- vue css 应用变量_如何使用CSS Grid和CSS变量快速为应用创建原型
- 泉州中考分数如何计算机,2019年泉州中考总分多少分,泉州中考各个科目多少分...
- JavaScript两个变量交换值(不使用临时变量)
- Shell脚本读取Redis键值对
- Android 项目中常用到的第三方组件
- 从头到尾彻底理解傅里叶变换算法(上)
- 从outside对ASA防火墙身后ACS4.x进行管理测试
- linux exit 流程,Shell exit流程控制语句及用法
- windows10下安装JDK及环境变量设置
- 域名与DNS(域名解析服务器)
- 计算机毕业设计成品 基于Vue+Springboot的校园论坛网站管理系统java maven
- lbs mysql_使用mysql来实现lbs排序
- kaldi的安装使用
- 猜拳游戏(C语言-Linux-简单可视化)
- 橡皮擦的英语_小朋友们知道“橡皮擦”用英语该怎么说吗?
- CodeLite 16.0可以编译通过,但是在编辑器界面会显示找不到标准库头文件
- php strtotime 2099,PHP的strtotime()函数2039年bug问题
- 【CSP-J】【图论】【最短路】加工零件
- 解决微信电脑版备份,手机端出现目前网络状况复杂的问题:当前网络状况复杂,请尝试使用其它网络
- 如何将npm升级到最新版本
热门文章
- iis导入服务器证书的方法,IIS导入服务器证书的方法(IIS5、IIS6、IIS7)
- Everything 打开文件失败
- OpenOCD-Jlink配置方法
- Java基础笔记(14)—— Java的基础类型和字节大小
- SQL Sever链接数据库登录失败原因
- python在直方图上画折线图_python库之matplotlib的柱状图、直方图、阶梯图、折线图、饼图...
- springboot 好玩的自定义设置——启动时的banner
- JavaScript算法学习
- vf mysql_VF是什么?
- 最受欢迎的cms网站内容管理系统排行榜