Nday 漏洞从挖掘到利用

栏目: 编程工具 · 发布时间: 6年前

内容简介:use two vul and heap srpay twice这算是我的一个小练手吧,写的不是很好,主要是思路分享由于

作者:PeterPan@360 nirvan team
博客: https://peterpan980927.cn

use two vul and heap srpay twice

0x00.漏洞挖掘

这算是我的一个小练手吧,写的不是很好,主要是思路分享

queryCompletion in AVEBridge

由于 com.apple.AVEBridge 这个模块中的函数比较少,于是我就写了一个比较小的 C语言 脚本来 Fuzz 一下,这个比较简单,所以一下子就找到了:

mov rdi, [rdi+rsi*8+168]
...
call qword ptr [rax+0x1c8]

这里 rsi 是我们可控的一个参数,这里相当于我们可以劫持控制流做 ROP 进行提权,但还需要一个信息泄漏作为配合。

ReadRegister32

这是我在另一个模块 AppleIntelFramebufferAzul 中找到的一个漏洞,因为我的目的很明确,就是需要信息泄漏,所以我就从有类似特征的函数进行入手了,如函数名位 Readxxx ,有 memcpy 类似的函数。

这个函数也十分简单:

__int64 __fastcall AppleIntelAzulController::ReadRegister32(...){
    ...
    return *(a2 + a3);
}

通过逆向和调试我找到了这个函数的最上级调用是从 IntelFBClientControl::actionWrapper 函数开始的,通过调试我们发现传到 ReadRegister32 的参数 a3 是用户空间可控的,且没有做任何边界检查,也就是说这个是一个越界读,并且在它的上级函数中发现:

case 0x852:
    *(a5+2) = AppleIntelAzulController::ReadRegister32(*(this+2), *a3);

而这个 a5 正好是 IOConnectCallMethod 中要传回用户空间的那个 outputStruct 的地址,也就是说这是一个信息泄漏

getDisplayPipeCapability

这也是一个信息泄漏的问题,同样在 AppleIntelFramebufferAzul 中,首先来看看一部分代码:

//a1是this指针
v5 = *(a1+ 8 * *a2 + 0xf60);
if ( v5 ){
    if( *( v5 + 0x1dc ) && ( ! *(*(v5 + 0x3f70 ) + 0x100 ) ) ){
        memcpy(a3, (v5 + 0x2170), 0x1d8);
        *v3 = *v4
        result = 0;
    }
    else{
        ...
    }
}
else{
    ...
}
return result;

其中 a2 是我们可控数据且没有做大小检查, a3outputStruct 地址,也就是说如果我们进入 memcpy 分支,同样可以做到一个信息泄漏。

0x01.漏洞利用

这里我用来做提权的有两个漏洞, queryCompletion 我们可以通过参数来控制越界call,这个的利用就比较简单,直接通过堆喷构造数据然后泄漏 kslide 做ROP即可,但是我们在 10.13 上需要寻找新的 gadget ,上一次还用的是 project-zeropwn4fun 上用的一个,一开始我的思路有问题,总想着有这样一个 pattern

...
push rax
...
...
;... is no pop
pop rsp
...
...
;... didn't change rsp
ret

但是这样毫无疑问是自己把自己给框住了,事实上可以存在这样的一种 pattern

...
push rax
pop rsp
...
...
;... didn't change rsp
ret

而且我们的出发点可以放在二进制搜索上,直接从切入一段机器码,不需要理会其上下文,比如我们可以在ida中搜索:

50 5c

然后通过ida的 undefinecode 来找到我们需要的 gadget ,这样的话很快就能找到了,但是我因为思路问题卡了两天。

接下来就是需要一个info leak来泄漏 kslide 了。

我一开始找到的一个 infoleakReadRegister32 ,但是这个限制比较多,只能从一个很靠后的地址往后读,后面基本没有什么有效信息了,也不会有对象来给我们计算 kslide 。所以我在尝试了一段时间后放弃了

后来我又找到了一个,这个的利用条件相对来说也比较苛刻(我们可以控制*a2):

//a1是this指针
v5 = *(a1+ 8 * *a2 + 0xf60);
if ( v5 ){
    if( *( v5 + 0x1dc ) && ( ! *(*(v5 + 0x3f70 ) + 0x100 ) ) ){
        memcpy(a3, (v5 + 0x2170), 0x1d8);
        *v3 = *v4
        result = 0;
    }
    else{
        ...
    }
}
else{
    ...
}
return result;

从上面可以看到我们需要满足以下几个条件才可以进入 memcpy 的分支:

v5
*(v5+0x1dc)
*(v5 + 0x3f70 )
*(*(v5 + 0x3f70 ) + 0x100 )

并且要想泄漏 kslide 还需要满足一个条件,那就是从 (v5 + 0x2170)(v5 + 0x2170 + 0x1d8) 的地址上存在着有效数据供我们使用。

我刚一看,就有两个想法:

就地解决

在这个对象内部来找,看看有没有合适的,这是最简单的一种做法,后来我在一次实验中在偏移 0x1398 处找到了符合条件的,当时十分高兴:

Nday 漏洞从挖掘到利用

后来想到一个问题,如果这个值超出了对象,那就是我们不可控的了,而且还有一个问题就是就算在对象内,有这么多次的解引用也不一定每次都能满足,我重启后果然失效了,我后来看了一下这个对象的大小就是 0x1f60 ,果然不出所料

堆喷

另外一个就是做堆喷,来调偏移,这里我是通过 mach_msg 来实现的,泄漏分为两步:

第一次先读回来一个数据,里面泄漏了到底是哪一个消息 我们释放这个消息,通过一个内核对象占住,第二次读回来,泄漏对象虚表

target on MacOS 10.13 or 10.13.1

Nday 漏洞从挖掘到利用

poc

具体的还有一些细节问题在poc的注释中做了一些解释

代码放在我的 github 上了

0x02.参考链接

labs_mwrinfosecurity

mac OS X internals 第九章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git (Second Edition)

Pro Git (Second Edition)

Scott Chacon、Ben Straub / Apress / 2014-11-9 / USD 59.99

Scott Chacon is a cofounder and the CIO of GitHub and is also the maintainer of the Git homepage ( git-scm.com ) . Scott has presented at dozens of conferences around the world on Git, GitHub and the ......一起来看看 《Pro Git (Second Edition)》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试