接触内核pwn(babydriver)

本文讲述了如何通过分析Babydriver题目,识别内核漏洞模块,利用uaf漏洞提权,以及使用gdb进行调试的过程。涉及步骤包括检查虚拟化支持、解压文件系统、KASLR与SMEP绕过、CDEV模块分析和漏洞利用策略。

分析

拿到babydriver题目附件后得到的文件如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sesTZJaL-1649688327552)(入门内核pwn(babydriver).assets/image-20220407123958143.png)]

发现运行内核就报错,内容如下:

Could not access KVM kernel module: No such file or directory qemu-system-x86_64: failed to initialize KVM: No such file or directory

未能初始化kvm,大概率是因为系统不支持虚拟化,具体可通过如下命令查看是否支持

egrep '^flags.*(vmx|svm)' /proc/cpuinfo 
#输出空则表示不支持

因为我用的pd虚拟机所以设置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7hTzEpZ6-1649688327554)(入门内核pwn(babydriver).assets/image-20220407134209512.png)]

要修改这个选项的话需要先关机虚拟机然后才能改这个设置。

在输入上面的命令看看输出情况如下图,ok成功启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fV5bTWxn-1649688327555)(入门内核pwn(babydriver).assets/image-20220407134553581.png)]

系统信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m328yqAY-1649688327556)(入门内核pwn(babydriver).assets/image-20220407134625424.png)]

首先查看init文件默认加载的信息,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI2Xj0Cv-1649688327557)(入门内核pwn(babydriver).assets/image-20220407134945266.png)]

简单的了解到这题是需要进行内核提权,那么就需要获取到目标的内核漏洞模块(babydriver.ko

思路

使用file rootfs.cpio 查看文件如图,发现是个gzip文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUb8SBup-1649688327558)(入门内核pwn(babydriver).assets/image-20220407135311541.png)]

那么对它进行改后缀名为.gz文件即可解压了,得到CPIO格式的文件即可正常的处理解压得到文件系统了

mv rootfs.cpio rootfs.cpio.gz
gunzip rootfs.cpio.gz
mkdir rootfs #用于存放文件系统
cd rootfs
cpio -idmv < ../rootfs.cpio

那么现在目标模块的在rootfs/lib/modules/4.4.72/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqGmJACq-1649688327559)(入门内核pwn(babydriver).assets/image-20220407135927765.png)]

保护

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYiKh0wL-1649688327559)(入门内核pwn(babydriver).assets/image-20220407140411101.png)]

先看看上面的checksec检查的保护:

KASLR

KASLR即内核空间地址随机化(kernel address space layout randomize),与用户态程序的ASLR相类似——在内核镜像映射到实际的地址空间时加上一个偏移值,但是内核内部的相对偏移其实还是不变的

在未开启KASLR保护机制时,内核的基址为0xffffffff81000000,内核内存布局可以参考这↑里↓

FGKASLR

KASLR 虽然在一定程度上能够缓解攻击,但是若是攻击者通过一些信息泄露漏洞获取到内核中的某个地址,仍能够直接得知内核加载地址偏移从而得知整个内核地址布局,因此有研究者基于 KASLR 实现了 FGKASLR,以函数粒度重新排布内核代码

STACK PROTECTOR

类似于用户态程序的canary,通常又被称作是stack cookie,用以检测是否发生内核堆栈溢出,若是发生内核堆栈溢出则会产生kernel panic。内核中的canary的值通常取自gs段寄存器某个固定偏移处的值

SMAP/SMEP

SMAP即管理模式访问保护(Supervisor Mode Access Prevention),SMEP即管理模式执行保护(Supervisor Mode Execution Prevention),这两种保护通常是同时开启的,用以阻止内核空间直接访问/执行用户空间的数据,完全地将内核空间与用户空间相分隔开,用以防范ret2usr(return-to-user,将内核空间的指令指针重定向至用户空间上构造好的提权代码)攻击

SMEP保护的绕过有以下两种方式:

  • 在设计中,为了使隔离的数据进行交换时具有更高的性能,隐性地址共享始终存在(VDSO & VSYSCALL),用户态进程与内核共享同一块物理内存,因此通过隐性内存共享可以完整的绕过软件和硬件的隔离保护,这种攻击方式被称之为ret2dir(return-to-direct-mapped memory )
  • Intel下系统根据CR4控制寄存器的第20位标识是否开启SMEP保护(1为开启,0为关闭),若是能够通过kernel ROP改变CR4寄存器的值便能够关闭SMEP保护,完成SMEP-bypass,接下来就能够重新进行ret2usr

KPTI

KPTI即内核页表隔离(Kernel page-table isolation),内核空间与用户空间分别使用两组不同的页表集,这对于内核的内存管理产生了根本性的变化

KPTI 机制的出现使得 ret2usr 彻底成为过去式

babydriver.ko放入IDA中进入到babydriver_init模块入口函数,简单分析如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSrtUdqW-1649688327560)(入门内核pwn(babydriver).assets/image-20220407175802956.png)]

模块流程核心函数如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koWcsTr6-1649688327561)(入门内核pwn(babydriver).assets/image-20220407191925053.png)]

具体定义:

/*
*alloc_chrdev_Region()-注册一系列字符设备号
*@dev:第一个分配号码的输出参数
*@basminor:请求的次要号码范围中的第一个
*@count:需要的次要号码数
*@name:关联设备或驱动程序的名称
*/
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
			const char *name)
{
   
   
	struct char_device_struct *cd;
	cd = __register_chrdev_region(0, baseminor, count, name);
	if (IS_ERR(cd))
		return PTR_ERR(cd);
	*dev = MKDEV(cd
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值