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)的更多相关文章

  1. 在win8.1 64位环境下有关Oracle的安装和卸载

    1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...

  2. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  3. win8.1 64位+oracle11g R2 64位 +powerdesigner破解版 64位+PL/SQL

    安装时搜索了很多帖子,很多就是复制粘贴(完全不需要什么IP,host),有的版本不对,有的版本太老,今天决定贴出自己的处女贴 oracle的安装很简单,不需要说什么了,PL/SQL真是恶心死 orac ...

  4. win8.1 64位安装DEV C++

    1.首先下载64位版本的DEV C++ http://sourceforge.net/projects/orwelldevcpp/files/Setup%20Releases/ 2.采取默认安装即可, ...

  5. WIN7,WIN8,WIN8.1,64位客户端使用32位的ODBC配置

    运行64位的ODBC管理器,点开始-->运行-->odbcad32回车即可打开,但打开后看不到32位的驱动, 如果要运行32位的ODBC管理器,该怎么办呢,其实很简单, 只要执行C:\Wi ...

  6. win8.1 64位安装oracle10g客户端心得

    方法同win7 64位安装方法(http://www.cnblogs.com/winkey4986/p/3683568.html)下载Oracle 10g的客户端程序,文件名是 10201_clien ...

  7. 在Win8.1(64位)系统上安装Scrapy(python 2.7.7)

    为了在win8.1上安装scrapy折腾了好久,最终安装成功,总结步骤如下: 下载安装Visual C++ 2008 redistributables 安装lxml-3.2.4.win-amd64-p ...

  8. win8 Pro 64位在 UEFI模式下Ghost系统 备份 恢复

    一:在win8 安装U 盘中  1. 新建 “Ghost” 文件夹 2. 将下载的Ghost64.exe 文件拷贝到文件夹  二: 启动的时候 按下F12 选择 HDDUSB 1.Windows 安装 ...

  9. win8.1 64位环境建设android开发环境

    1.下载JDK,http://www.oracle.com/technetwork/java/javase/downloads/index.html,选择版本号 2.安装刚刚下载的JDK 3.环境变量 ...

随机推荐

  1. php根据IP获取经纬度信息--百度地图篇

    一.前言 之前一篇写过 php根据IP获取IP所在城市  ,但是还想再精确一点,获取这个IP所在的经纬度信息,该怎么办呢? 百度地图为我提供了一种解决方案(当然还有其他的解决方案). 先总的来数一下, ...

  2. 优秀代码要求(转自http://www.cnblogs.com/brishenzhou/p/6284188.html)

    一段优秀的代码,它一般需要满足以下几个条件: #统一规范# 所有的代码,第一前提必须是统一规范,而常见的统一规范主要包括有以下内容: 1)统一编辑器规范 在团队开发中,我们并不对各个开发人员使用的编辑 ...

  3. ServiceContract,OperationContract

    代码如下 [ServiceContract] //服务协定定义 using System.ServiceModel; public interface IInterface1 { [Operation ...

  4. handler消息机制

    MessageQueue代码:http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android ...

  5. HDU1009FatMouse' Trade(贪心)

    Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding th ...

  6. spring杂记

    AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,并不是一种具体的实现,谈到实现一般有Filter和代理模式两种常见的使用方式.Java中常见的AOP技术有 ...

  7. git 和 svn

    GIT和SVN之间的五个基本区别 如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系 ...

  8. grunt学习随笔

    1 grunt 安装  全局安装 npm install -g grunt-cli 2 配置好package.json 和 Gruntfile 文件,这两个文件必须位于项目根目录下. 2.1packa ...

  9. POJ 2234 Matches Game(取火柴博弈1)

    传送门 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  10. POJ 1328 Radar Installation#贪心(坐标几何题)

    (- ̄▽ ̄)-* #include<iostream> #include<cstdio> #include<algorithm> #include<cmath ...