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.环境变量 ...
随机推荐
- vue跨组件通信的几种方法
http://www.tuicool.com/articles/jyM32mA 在开发组件的时候,一定会遇到组件的通信,比如点击一个图标出现弹窗和蒙层,这三个分别是不同的组件.管理他们之间的状态就成了 ...
- how to make a git repo un-git?
If you have a git repo and now you want to make it a plain filesystem tree .. (removing the git trac ...
- informix数据迁移工具使用介绍
一.dbschema USAGE: dbschema [-q] [-t tabname] [-s user] [-p user] [-r rolename] [-f procname] ...
- es6语法
let定义变量,特性: 1,不允许重复定义 2,不存在预解析 3,变量存在于会块级作用域 即{}内部 const : 定义常量,常量的值不能修改,若常量是对象 对象下的属性可修改. 解构赋值语法: 数 ...
- 集线器(HUB),交换机,和路由器的区别
交换机与集线器的区别从大的方面来看可以分为以下三点: 1.从OSI体系结构来看,集线器属于OSI第一层物理层设备,而交换机属于OSI的第二层数据链路层设备.也就意味着集线器只是对数据的传输起到同步.放 ...
- viusal studio 调试错误及解决方法(长期更新记录)
1.为了看运行结果加了 system("pause"):结果导致图像显示不出来,数据为空.主要是因为system pause后停止计算.图像显示不出来.应该改成:waitKey(0 ...
- C 语言学习准备
摘要:用 C#语言学习了一些数据结构,突然想学习 C 语言,为了学习C,本文准备好资料. C 语言学习准备 作者:乌龙哈里 时间:2015-11-17 平台:Window7 64bit,Visual ...
- vs2008编译FileZilla服务端源码
vs2008编译FileZilla服务端源码 FileZilla服务端下载地址:https://download.filezilla-project.org/server/.FileZilla服务端源 ...
- 不使用jquery情况下循环添加绑定事件方法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- @@identity的用法
问题描述:两张表,比如说A表和B表.A表中的id为自增的,B表中的id为外键,插入时不能为空. 解决办法: 用select @@identity得到上一次插入记录时自动产生的ID,将@@identit ...