CVE-2014-4113 Win8.1 64位利用(2014.11)
CVE-2014-4113 Win8.1 64位利用
关于漏洞成因的分析已经很多了,但是样本针对的是win8之前的利用,国外研究员Moritz Jodeit对Win8.1上的利用做了研究,并给出了思路。根据其思路,对Win8.1利用做尝试。
Win8.1中调用xxxMNFindWindowFromPoint函数后,对得到的窗口对象tagWnd结构的处理代码存在差异:

Win8.1从[tag+90h]获得的值会经过检查,确定其小于7才会进行下一步操作,r10+rax*8为一个内核地址,所以这是我们没有办法控制的,得需要寻找另一条流程。
1.构造fake tagWnd
漏洞触发后,通过在几个关键位置巧妙地构造fake tagWnd,比如下图:

可以让程序的流程就来到这样一段代码:

这段代码的作用是遍历head=[tagWnd+10h]+1D0h处的链表:如果[[tagWnd+10h]+1D0h ]等于NULL,则[head]=rdi,否则继续遍历直到找到最后一个表项,并将rdi的值赋给最后一个表项的next指针。
下图中这个链表除去表头共有2个表项,指令"mov [rax],rdi"就将rdi的值赋给最后一个表项的next指针。而这最后一个表项的值是我们可以控制的,所以可以进一步将该处理解为:我们可以将任意地址的8个空byte用一个内核地址(rdi)来覆盖。由于64位系统的特点,内核地址的范围为0xFFFF0800`0000000~0xFFFFFFFF`FFFFFFFF,所以rdi的高位两字节一定为0xff,这是下一步能够获得高权限Token的关键。

2.获得高权限的Token
在Windows系统中,Token是管理权限的关键,类似于古代所使用的令牌,若是能够通过"合法"的途径制作一块高权限的令牌,便也达到了提权的目的。
内核中TOKEN对象结构中有一个很重要的SEP_TOKEN_PRIVILEGES结构,其中的每一位都代表一种权限,如下:

在决定一个Token所表示的权限时,SEP_TOKEN_PRIVILEGES结构中的Enable的值是真正起作用的。可见似乎可以通过改写[TOKEN+0x48]处的值来改变权限。
上一步我们已经找到了一段代码:可以向我们可控的任意地址连续8个字节为0写入一个内核地址。若能在SEP_TOKEN_PRIVILEGES结构中找到一段连续8字节为0的地址并且能够使edi中高位的0xff覆盖Enabled的关键位置,那么就可以得到一个高权限的Token了。这样的好处是提权的代码都在内核执行,还不用考虑SMEP的问题。
若能够在利用程序进程的Token结构找到这样的一段内存便是极好的,但是其Token的SEP_TOKEN_PRIVILEGES结构中并未找到一段连续8个字节为0的地址,所有不能利用该方法直接改写利用进程的Token来达到提权。

幸好微软提供CreateRestrictedToken函数,我们可以创建一个拥有最小权限的restricted token,并调用AdjustTokenPrivileges使其SEP_TOKEN_PRIVILEGES结构中具有连续8个字节为0:

现在已经拥有了一段连续8字节为0的SEP_TOKEN_PRIVILEGES结构,接下来需要确定使用edi覆盖SEP_TOKEN_PRIVILEGES结构的起始位置,因为我们只能够确定edi的高位两字节为0xff。
SEP_TOKEN_PRIVILEGES结构中最重要的是SeDebugPrivilege权限。只要具有该权限,就可以调试系统进程,也就具有注入代码到系统进程并远程执行的权限,等于有了管理员权限。所以一定得保证该标志位为1,即被rdi高位两字节覆盖。

结合Windows的Big Endian内存组织方式,选择SEP_TOKEN_PRIVILEGES+3的位置作为被edi覆盖的起始位置。但是需要对这个值再减去8后,再赋给[[tagWnd+10h]+170h]。因为最后操作的时候,SEP_TOKEN_PRIVILEGES+3是作为链表第一项也是最后一个表项,需要加上8后再操作。
被edi覆盖后SEP_TOKEN_PRIVILEGES结构各成员的值如下:

红框内为被edi覆盖的部分,可见Enable成员编号8到23的权限都具有了。
至此,我们已经得到了一个具有SeDebugPrivilege等权限的Token了。
注:此处在实现的时候出现问题,通过查看内存确认获得了高权限的Token,但是程序却进入到了一个挂起线程无限等待的流程中了。
3.利用高权限的Token
因为得到的Token具有SeDebugPrivilege权限,接下来只需要调用WriteProcessMemory将shellcode注入到一个系统进程里去,再调用CreateRemoteThread来启动。这样就完成了整个的提权利用。
by:会飞的猫
转载请注明:http://www.cnblogs.com/flycat-2016
CVE-2014-4113 Win8.1 64位利用(2014.11)的更多相关文章
- 在win8.1 64位环境下有关Oracle的安装和卸载
1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...
- 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境
搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...
- win8.1 64位+oracle11g R2 64位 +powerdesigner破解版 64位+PL/SQL
安装时搜索了很多帖子,很多就是复制粘贴(完全不需要什么IP,host),有的版本不对,有的版本太老,今天决定贴出自己的处女贴 oracle的安装很简单,不需要说什么了,PL/SQL真是恶心死 orac ...
- win8.1 64位安装DEV C++
1.首先下载64位版本的DEV C++ http://sourceforge.net/projects/orwelldevcpp/files/Setup%20Releases/ 2.采取默认安装即可, ...
- WIN7,WIN8,WIN8.1,64位客户端使用32位的ODBC配置
运行64位的ODBC管理器,点开始-->运行-->odbcad32回车即可打开,但打开后看不到32位的驱动, 如果要运行32位的ODBC管理器,该怎么办呢,其实很简单, 只要执行C:\Wi ...
- win8.1 64位安装oracle10g客户端心得
方法同win7 64位安装方法(http://www.cnblogs.com/winkey4986/p/3683568.html)下载Oracle 10g的客户端程序,文件名是 10201_clien ...
- 在Win8.1(64位)系统上安装Scrapy(python 2.7.7)
为了在win8.1上安装scrapy折腾了好久,最终安装成功,总结步骤如下: 下载安装Visual C++ 2008 redistributables 安装lxml-3.2.4.win-amd64-p ...
- win8 Pro 64位在 UEFI模式下Ghost系统 备份 恢复
一:在win8 安装U 盘中 1. 新建 “Ghost” 文件夹 2. 将下载的Ghost64.exe 文件拷贝到文件夹 二: 启动的时候 按下F12 选择 HDDUSB 1.Windows 安装 ...
- win8.1 64位环境建设android开发环境
1.下载JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html,选择版本号 2.安装刚刚下载的JDK 3.环境变量 ...
随机推荐
- [Q]自定义保存位置及文件名
以“DWG To PDF.pc3”打印为例: 说明:<DrawingDirectory> 当前图纸所在目录<DrawingFolderName> 当前图纸文件所在文件夹名称&l ...
- redis简单总结
一.redis的准备. 下载redis:路径:Linux:http://www.redis.io.comwindow:http://www.newasp.net/soft/67186.html 解压后 ...
- UltimateDefrag磁盘碎片整理软件 v3.0.100.19汉化版
软件名称:UltimateDefrag磁盘碎片整理软件 v3.0.100.19汉化版软件类别:汉化软件运行环境:Windows软件语言:简体中文授权方式:免费版软件大小:3.25 MB软件等级:整理时 ...
- js便利关联数组 及数组定义方式 分类
"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv=& ...
- 整理了一份React-Native学习指南
原文: http://www.w3ctech.com/topic/909 自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull ...
- SpringMVC 系列教程1-文件上传-配置
SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...
- C-Free 5.0编译失败问题解决办法
解决关于C-Free 5.0编译时提示错误:[Error] undefined reference to `__dyn_tls_init_callback' 解决办法: 因为错误提示的路径是C:\Mi ...
- Android设置对话框去除黑边
在res/values/styles.xml文件中添加如下内容 <style name="dialog" parent="@android:style/Theme. ...
- hdu1026
#include <stdio.h> #include <string.h> #include <queue> using namespace std; struc ...
- python 豆瓣图片的爬取
豆瓣图片的抓取:在python中实现生产者和消费者模型的实现,大家可以参考这篇文章 http://www.bkjia.com/Pythonjc/978391.html 个人认为是讲的比较易懂的,只要看 ...