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. PAT乙级1001. 害死人不偿命的(3n+1)猜想 (15)

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...

  2. 怎样成为PHP 方向的一个合格的架构师(转)

    突然看到这篇文章, 值得反省, 乐在其中, 在接下来的发展中不被淘汰的都来看看, 如何成为一个架构师先明确这里所指的PHP工程师,是指主要以PHP进行Web系统的开发,没有使用其的语言工作过.工作经验 ...

  3. (repost)在ARM Linux内核中增加一个新的系统调用

    实验平台内核版本为4.0-rc1,增加一仅仅打印Hello World的syscall,最后我们在用户空间swi验证 实验平台内核版本为4.0-rc1,增加的系统调用仅仅是简单打印一个Hello Wo ...

  4. 解决 git extensions 每次提交需要输入用户名和密码

    打开git bash 输入用户名和密码 git config --global user.name "username" git config --global user.emai ...

  5. 12C RMAN 备份参考

    12C引进了pdb的概念,使得rman的恢复相对来说复杂了一些,这里对pdb的常规备份和恢复进行了简单测试,供大家参考 1.cdb启动和pdb关系测试 [oracle@xifenfei tmp]$ s ...

  6. es6--(三)set和map数据结构

    1.Set和WeakSet Set与数组相似,但是Set结构的成员必须是唯一的. WeakSet与对象类型,但是WeakSet结构的成员只能是对象 Set结构的实例属性和方法 属性: Set.prot ...

  7. [笔记]The Linux command line

    Notes on The Linux Command Line (by W. E. Shotts Jr.) edited by Gopher 感觉博客园是不是搞了什么CSS在里头--在博客园显示效果挺 ...

  8. HDU2639[背包第K大]

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=2639] 题意:求第k大背包. 题解:利用二路归并的思想,求解第K大的值. #include<bi ...

  9. Note_JavaWeb_MyBatis3

    Jar包 mybatis-3.2.8.jar junit4.4.jar log4j-1.2.17.jar 常用类 Resources SqlSession SqlSessionFactory SqlS ...

  10. 使用Pycharm 安装三方库

    除了使用easy_insatll和pip工具安装Python第三方库外还可以使用pycharm安装Python第三方库,步骤如下: 1.打开pycharm,点击File,再点击settings 2.点 ...