Nday 漏洞从挖掘到利用

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

内容简介: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 第九章


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

查看所有标签

猜你喜欢:

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

Spring揭秘

Spring揭秘

王福强 / 人民邮电出版社 / 2009.8 / 99.00元

没有教程似的训导,更多的是说故事般的娓娓道来,本书是作者在多年的工作中积累的第一手Spring框架使用经验的总结,深入剖析了Spring框架各个模块的功能、出现的背景、设计理念和设计原理,揭开了Spring框架的神秘面纱,使你“知其然,更知其所以然”。每部分的扩展篇帮助读者活学活用Spring框架的方方面面,同时可以触类旁通,衍生出新的思路和解决方案。 本书内容全面,论述深刻入理,必将成为每......一起来看看 《Spring揭秘》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具