Duqu 2.0 内核利用技术分析

本文主要研究Duqu 2.0其中的一个内核提权的攻击payload。

今年年初,卡巴安全研究实验室发现并命名了Duqu2.0,与早些时候的1.0版本较为类似。微软在去年6月9日发布了MS15-061安全更新,修复了这个问题。

本文着重于利用技术的分析,不对漏洞本身做过多研究。

 

漏洞本身的内容是比较简单的,在用户态给自己注册一个 ClientCopyImage方法的回调函数,当这个函数被内核调用的时候就会销毁windows的对象,同时还可以注销关联类的回调,从而导致内存UAF。了解了大致的问题,我发现这个攻击所利用到的技术十分复杂的。

在UAF后通过间接的结构分配,可以达到后续内容可控。漏洞调用 NtUserThunkedMenuItemInfo函数,这个函数的调用会在多个已经释放的内存空间中分配各种类型的对象,接着,会继续分配其他对象来保证内存指针的对准精度,比如指向到某段shellcode等。攻击者所控制到的地址被用作一个指针传递给 HMUnlockObject,然后由 ClientCopyImage回调之后,内核会完成整个调用过程。

HMUnlockObject内的指令减少对象引用计数器后,指针会准确指向tagCLS对象内,并覆盖cbclsExtra。tagCLS对象的内存地址可以用 _MapDesktopObjectWin32k函数计算出来。

Duqu2_1

下面的代码中可以看到, rcx指向一个错误的 tagCLS对象内部,黄色高亮部分标记了 DWORD值在内存中减少的过程:

Duqu2_B

对目标 rcx+8,指针指向 tagCLS对象中的 cbclsExtra,该对象已经被一系列的WindowsAPI调用并创建。这个区域显示了所占用的额外内存大小。一般来说,能访问到额外内存的API会有 GetClassLangSetClassLang。下图是原版的 tagCLS对象。

Duqu2_3

原本的空间是初始化为0的,这意味着这个类没有额外内存空间。但是使用 HMUnlockObject却可以破坏内存的结构,使其变为 -1或者 0xffffffff

Duqu2_4

当存在了已经加过料的 cbclsExtra后,漏洞就可以使用 GetClassLongSetClassLang这两个API来随意访问那块额外内存空间。

比较CF和AF然后用ja指令跳走,来确认API的索引参数最大值,以及对0xffffffff与这个索引无符号比较,使得其拥有了对大量内核内存的读写权

Duqu2_5b


未完待续:关于64bit内存地址的读写权限获取的研究(预计今日晚些时候更新)

声明: 本文采用 BY-NC-SA 协议进行授权 | Deamwork
转载请注明转自《Duqu 2.0 内核利用技术分析
本文地址:https://www.deamwork.com/archives/duqu-2-0-kernel-exploitation-technique-analysis.orz6

回复 (2)

  1. zwwooooo United States Mozilla Firefox Windows   / 回复

    表示完全看不懂,我就酱油过吧… 话说你的昵称改了,差点没认出来了…

    • Jason Cooper Reserved Mozilla Firefox Windows   / 回复

      @zwwooooo
      哈,前面一直通信管制没去你那里玩,真不好意思啊~

发表评论 修改评论取消编辑

允许使用的标签 - 您可以在评论中使用如下的 HTML 标签以及属性。

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img src="" alt=""> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

 :mrgreen:  :|  :twisted:  :arrow:  8O  :)  :?  8-)  :evil:  :D  :idea:  :oops:  :P  :roll:  ;)  :cry:  :o  :lol:  :x  :(  :!:  :?:

引用通告 (0)

› 尚无引用通告。

欢迎来到Deamwork! o(∩_∩)o
X