分析
拿到babydriver题目附件后得到的文件如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sesTZJaL-1649688327552)(入门内核pwn(babydriver).assets/image-20220407123958143.png)]](https://i-blog.csdnimg.cn/blog_migrate/a850617d7bba5890964ab4bc2fa5fca7.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)]](https://i-blog.csdnimg.cn/blog_migrate/b7df13d4c7dc2f2f70c00fe8853775ba.png)
要修改这个选项的话需要先关机虚拟机然后才能改这个设置。
在输入上面的命令看看输出情况如下图,ok成功启动
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fV5bTWxn-1649688327555)(入门内核pwn(babydriver).assets/image-20220407134553581.png)]](https://i-blog.csdnimg.cn/blog_migrate/8f62563b172629ec9fe56f832a9d4a44.png)
系统信息如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m328yqAY-1649688327556)(入门内核pwn(babydriver).assets/image-20220407134625424.png)]](https://i-blog.csdnimg.cn/blog_migrate/fa431284056a57f0d9a1f33850c3a190.png)
首先查看init文件默认加载的信息,如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI2Xj0Cv-1649688327557)(入门内核pwn(babydriver).assets/image-20220407134945266.png)]](https://i-blog.csdnimg.cn/blog_migrate/66b2a263b11ceac72f571d8c821840fd.png)
简单的了解到这题是需要进行内核提权,那么就需要获取到目标的内核漏洞模块(babydriver.ko)
思路
使用file rootfs.cpio 查看文件如图,发现是个gzip文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUb8SBup-1649688327558)(入门内核pwn(babydriver).assets/image-20220407135311541.png)]](https://i-blog.csdnimg.cn/blog_migrate/bf1c7cdbbe3e2bcddf4c0032361967f3.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)]](https://i-blog.csdnimg.cn/blog_migrate/62e3e80461bea77f19f9e88a103e4613.png)
保护
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYiKh0wL-1649688327559)(入门内核pwn(babydriver).assets/image-20220407140411101.png)]](https://i-blog.csdnimg.cn/blog_migrate/6c6635f0440bd5fbe627667582880072.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)]](https://i-blog.csdnimg.cn/blog_migrate/4a22d093d9ebb49cfe725593230fcd6c.png)
模块流程核心函数如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koWcsTr6-1649688327561)(入门内核pwn(babydriver).assets/image-20220407191925053.png)]](https://i-blog.csdnimg.cn/blog_migrate/49a34d88d328f1bb71de33d3ed4ba564.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

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

被折叠的 条评论
为什么被折叠?



