首页
社区
课程
招聘
[原创]强网杯出题思路-solid_core-HijackPrctl
发表于: 2018-3-27 08:56 19299

[原创]强网杯出题思路-solid_core-HijackPrctl

2018-3-27 08:56
19299

solid_core出题时候,基本上是以CSAW-2015-CTFstringipc题目为基础进行内存读写的限制,CSAW-2015-CTF中的题目是一个krealloc的利用。
krealloc的定义中mm/slab_common.ckrealloc

如果size=0,krealloc返回值为0x10
krealloc

通过修改size=-1,使得kremalloc的返回值变成0x10,同时size因为是0xFFFFFFFFFFFFFFFF所以可以进行任意地址读写。
krealloc
那么传统思路下一步提权的方法有两种,下面进行介绍。

下面以csaw-2015stringipc为例子来介绍两种从任意地址读写到权限提升到权限的传统思路

做过内核漏洞利用的同学应该都了解task_struct中的cred结构代表了该进程的权限结构
krealloc

如果我们能够修改cred结构的值那么就可以进行提权操作。这是一个很正常的思路,但是我们的cred结构地址在哪里呢?这里CSAW给出的思路是通过prctl设置comm结构为一个Random的字符串是,然后通过爆破这个Random的字符串,每八个字节进行遍历,耗时比较久,但是是可行的。
链接如下 https://github.com/mncoppola/StringIPC/blob/master/solution/solution.c

第二种方法是使用RET2DIR攻击,在这里CSAW-2015-stringipc可以通过攻击VDSO来劫持用户态的代码执行流程。下面我们先来补充一下VDSO的知识:

VDSO(Virtual Dynamically-linked Shared Object)是个很有意思的东西, 它将内核态的调用映射到用户态的地址空间中, 使得调用开销更小, 路径更好.

开销更小比较容易理解, 那么路径更好指的是什么呢? 拿x86下的系统调用举例, 传统的int 0x80有点慢, Intel和AMD分别实现了sysenter, sysexit和syscall, sysret, 即所谓的快速系统调用指令, 使用它们更快, 但是也带来了兼容性的问题. 于是Linux实现了vsyscall, 程序统一调用vsyscall, 具体的选择由内核来决定. 而vsyscall的实现就在VDSO中.

Linux(kernel 2.6 or upper)环境下执行ldd /bin/sh, 会发现有个名字叫linux-vdso.so.1(老点的版本是linux-gate.so.1)的动态文件, 而系统中却找不到它, 它就是VDSO. 例如:

所以,不难理解,VDSO是一段内核空间的代码,用来提供给用户态下更快地调用系统调用。正是因为这个特殊的机制,使得我们可以进行攻击。
CSAW-CTF-2015stringipc题目中,内核态下VDSO页的权限是RW,这个代码页会被直接映射到用户态下的进程中,以满足gettime等频繁系统调用的速度。这个代码页映射到用户态的权限属性是RX,就是可以执行。所以,我们可以通过在内核态下通过任意写来修改VDSO的代码,譬如我们修改代码成为prepare_cred+commited_cred等,这样在用户调用VDSO时,就可以劫持控制流了。
具体链接如下: http://itszn.com/blog/?p=21

这里也有一个问题:VDSO位置在哪里呢?这个可以爆破,因为我们有了任意地址读的权限,不过和上面爆破cred结构的技术不一样,我们可以更快的爆破,因为VDSO必定是被安防到一个内存页里面,也就是页对其的,同时它是一个ELF文件,是有ELF Signurte,所以我们可以按照内存页的偏移来进行爆破,这样爆破速度会很快,大概是256倍,而且它的映射位置离内核基址并不是太远,可以很快就出来了。

题目为了限制大家不能使用cred覆盖ret2dir攻击利用方法,我对csaw-ctf-2015进行了修改,限制了内存读写范围。

我进行了限制,限制写入范围必须大于0xffffffff80000000,这个地址在linux内存分布中,是kernel base以上。
附上linux 内核内存分布图
krealloc
所以可以限制cred被覆盖,同时编译最新内核以限制VDSO在内核情况下不能被修改。
krealloc

可以使得上两种的利用方法失效,以期待有高手能够给出一种另外的利用思路,同时我也给出了一种限制之后可以成功利用思路,也就是HijackPrctl,下面进行详细介绍。

下面介绍从内核地址任意读写(或者可以限制为局部地址读写)到任意代码执行的一种新型的Reliable Linux Root技术,这个思路其实也不算最新的,是来自于INetCop Security 分享的New Reliable Android Kernel Root Exploitation Techniques,这种漏洞利用思路主要是要劫持Prctl函数,最后跳转到call_usermodehelper,我姑且把这种方法称作HijackPrctl
我们再来确定一下现在能做的事情,我们可以进行局部地址的任意读写,题目限制了读写范围必须大于0xffffffff80000也就是kernel base以上。为了达到代码执行,我们先找一个内核函数看能不能劫持的。

这里要介绍一下Prctl函数,这个函数可以对进程进行一些设置,通过查看linux内核源码,可以知道这个函数是一个内核漏洞利用中的绝佳函数。
include/linux/security.h中可以看到cap_task_prctl拥有6个参数。
krealloc

同时在kernel/sys.c中,可以看到对于prctl这个系统调用的处理过程中,将参数原封不动的传给了security_task_prctl函数进行处理。
krealloc

继续往下跟进,我们发现security_task_prctl这个函数其实最后是定位到了一个虚表里面去,
krealloc

在调试时候我们会找到这个hook的位置在哪里,在这里是capability+0x520+0x18这个偏移,这个偏移在IDA中也能分析出来。
krealloc

krealloc
这样的话,我们就找到了一个可以通过用户态传最多6个参数并且到内核态原封不动执行的虚函数。也就是意味我们可以通过修改这个指针,可以任意执行一个函数了。

基于上面的分析我们可以通过用户态传递参数,在内核态下任意执行6个参数以下的函数。再仔细分析一下,对吗?在32位下是可以的,在64位下并不是。我们再看这个函数
int security_task_prctl(int option, unsigned long ...)发现第一个参数optionint类型,也就是我们传入的64位会被截断成为32位,这也就导致了64位,第一个参数不能用了。
这个不影响32位下的漏洞利用,我们继续来分析32位如何利用。
其实,这里有很多思路,INetCop SecuritySlide里面有,我这里介绍另外一种基于VDSO变形的方法,也是看雪论坛上(https://bbs.pediy.com/thread-220057.htm),提出的一种方法。
具体思路是:

call_usermoderhelper是内核运行用户程序的一个api,并且该程序有root的权限。如果我们能够控制性的调用它,就能以Root权限执行我们想要执行的程序了。
定义在kernel/umh.c
krealloc

subprocess_info如下
krealloc

我们要劫持task_prctlcall_usermoderhelper吗,不是的,因为这里的第一个参数也是64位的,也不能直接劫持过来。但是内核中有些代码片段是调用了Call_usermoderhelper的,可以转化为我们所用。
譬如kernel/reboot.c中的orderly_poweroff函数中调用了run_cmd参数是poweroff_cmd,而且poweroff_cmd是一个全局变量,可以修改。
krealloc
那么我们就先篡改poweroff_cmd=我们预期执行的命令,然后直接劫持task_prctlorderly_poweroff函数,这样就任意命令执行了,同时按照INetCop Security给出的思路,需要先关闭selinux

所以再整理一下整体思路:

很惨,出题时候由于一些设置问题,产生了一些的非预期解(一共有5只队伍解出题目,三只使用非预期解,两只使用正解),不过这些非预期解也让我学习到了很多知识(姿势)。
同时在题目部署中也出现了一些问题,但是因为已经出现了非预期解,保持题目公平性,所以也就没有进行继续修改了。
同时在出这道题目的过程中,多次对内核进行编译,对于很多以前不知道的内核知识进行补充,踩了很多坑,也学了很多。
最后祝贺做出此题的战队以及参与强网杯比赛的各位战队,希望能够和各位大神继续交流内核漏洞相关的知识。
同时最近出现的ubuntu16.04提权漏洞也是一个任意内存读写漏洞,理论上也能够使用该种方法进行提权,下面我会抽时间进行调试并分析。
如果大家还想继续做这道题目的话,题目继续在10.9.173.101 9999开放。
同时本文也在本人博客上面进行发表。http://leanote.com/blog/post/5ab78270ab64413755000dcf

 
 
 
 
 
 
 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-3-27 08:57 被simSimple编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (20)
雪    币: 264
活跃值: (214)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
厉害厉害
2018-3-27 09:20
0
雪    币: 6
活跃值: (77)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
神仙神仙
2018-3-27 09:30
0
雪    币: 53
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
很强
2018-3-27 09:39
0
雪    币: 861
活跃值: (683)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
强强强,大佬博客开未注册评论吧
2018-3-27 09:48
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
八岛 强强强,大佬博客开未注册评论吧
平时懒得管理博客,直接是笔记输出的托管的博客,我看看能不能改改,要是不行的话,就找个时间再挖个坑写博客
2018-3-27 10:12
0
雪    币: 1392
活跃值: (5172)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
7
simSimple 平时懒得管理博客,直接是笔记输出的托管的博客,我看看能不能改改,要是不行的话,就找个时间再挖个坑写博客[em_2]
以前还有个挖漏洞的梦。发现养不活人。还是平时当娱乐算了!!!国内环境不好,只有有钱的大公司才愿意养这么一帮人
2018-3-27 10:43
0
雪    币: 1552
活跃值: (1288)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
8
666,精品的质量
2018-3-27 10:54
0
雪    币: 699
活跃值: (444)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
9
2018-3-27 11:12
0
雪    币: 236
活跃值: (155)
能力值: ( LV8,RANK:137 )
在线值:
发帖
回帖
粉丝
10
膜拜simple大师傅
2018-3-27 14:26
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
simple师傅长得很帅还是单身
2018-3-27 22:20
0
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
这题出的牛批。
2018-3-27 22:24
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
真的强
2018-3-28 07:27
0
雪    币: 2
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
特地前来膜拜  星星  师傅
2018-3-29 00:36
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
15
膜出题师傅
2018-3-29 20:46
0
雪    币: 190
活跃值: (194)
能力值: ( LV3,RANK:31 )
在线值:
发帖
回帖
粉丝
16
虽然看不懂,不过还是特地过来膜师傅了  :)
2018-3-29 21:11
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
2018-3-31 23:26
0
雪    币: 60
活跃值: (314)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
18
可以请教一下kernel exploit环境怎麽搭建的吗?想学习kernel  exploit自己写题目练习看看却连环境都搭不好Orz
最后于 2018-4-1 15:39 被返無歸一编辑 ,原因:
2018-4-1 15:26
0
雪    币: 2379
活跃值: (141)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
19
返無歸一 可以请教一下kernel exploit环境怎麽搭建的吗?想学习kernel  exploit自己写题目练习看看却连环境都搭不好Orz
muhe湿敷在安全客上发过一个系列教程,可以去看看
2018-4-3 15:13
0
雪    币: 60
活跃值: (314)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
20
simSimple muhe湿敷在安全客上发过一个系列教程,可以去看看
我试试,谢谢
2018-4-3 15:17
0
雪    币: 295
活跃值: (64)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
VDSO地址可以直接cat /proc/self/maps获取吗? 什么时候不能用这种方法呢?
2019-6-25 09:05
0
游客
登录 | 注册 方可回帖
返回
//