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.环境变量 ...
随机推荐
- C语言之字符串典型例题解析
今天又遇见几个好题,和以前的一些凑一块写一篇文章,作为我延迟去自习室的一个借口吧. 首先是第一题 int fun(char* s){ char* t = s; while(*t++); return ...
- JQuery笔记(一)jq的使用方法
我用的jq版本是支持pc版为主的最高1版本里最高的1.124版本 官网的链接是只有最新的3下载,我把我在官网下载的jq代码链接发出来,如下 点我获取jq代码 和js不同的是,jq开发者封装了一些方法 ...
- JS replace可以接受回调函数
这是js最鲜为人知的秘密之一,v 1.3首次引入.大部分情况下repalce的使用情况如下: '10 12 13 40 50'.replace(/\d+/g,'*');//用 * 替换所有的数字 这是 ...
- 动态Order by
),) set @order='' ' select * from T_Table order by then ID end desc, then CreateTime end desc
- Code Sign error: No code signing identities found: No valid signing identities
Code Sign error: No code signing identities found: No valid signing identities 解决办法:如果证书可获取,最简办法就是把所 ...
- 快速排序(js版本)
快速排序的时间复杂度为:O(n*log2n),相比较其他O(n2)的排序算法,还是比较有优势的.原文参考在此处,因为本人对原文的一小段代码有点不理解,所以进行了小的修改. 1.基本思想:在数组的第一个 ...
- TCP和UDP报文分片的区别
搞了三年网络,今天才知道这个细节,汗,总结下: MTU大家都知道,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节.一个IP数据报在以太网中 传输,如果它的长度大于该MTU ...
- 把Excel工作簿的每个工作表提取出来保存为新工作簿
平台:MS office 2010 任务:有个excel工作簿,其中有上百个工作表,要求把每一个工作表全部保存为新工作簿,如果一个一个复制出来太傻了,可以用excel自带的VB解决. 方法:打开工作簿 ...
- Go-利用Map实现类似Python的Set数据结构
该笔记参考<Go并发编程实战> 首先实现一个自定义的HashSet 利用interface{}作为键,布尔型作为值. package main import ( "bytes&q ...
- String类之indexOf--->查找某字对应的位置
以下方法都是java内置类String类的内置方法(不是构造方法哦,就是普通的方法),不需要我们写,直接拿过来用即可. indexOf方法对应Api介绍 lastIndexOf方法对应Api介绍 -- ...