Linux Kernel Exploitation 生存日记 - 0x00

# Linux Kernel Exploitation 生存日记 - 0x00

# Hello, World!

大型纪录片 PalluPwner's 船新章节!!!

这次不坐牢了,开始荒野求生了... ... ... ...

Kernel 前期基础知识没啥好记录的.... ... ... 网上遍地都是。

# 基础知识

/etc/init.d 存储内核启动的参数

低版本的 kernel 直接执行 commit_cred (prepare_kernel_cred (NULL)) | commit_cred (&init_cred) 即可,高版本麻烦点

从 kernel 态返回用户态需要做什么?切记刚开始要 save_status!!!
执行 swapgs(64 位)和 iret 指令,当然前提是栈上需要布置好恢复的寄存器的值

一般的攻击思路:
寻找 kernel 中内核程序的漏洞,之后调用该程序进入内核态,利用漏洞进行提权,提完权后,返回用户态执行 system ("/bin/sh")

Ps:在返回用户态时,恢复完上述寄存器环境后,还需执行 swapgs 再 iretq,其中 swapgs 用于置换 GS 寄存器和 Kernel GSbase MSR 寄存器的内容(32 位系统中不需要 swapgs,直接 iret 返回即可)

iretq 会将之前 save_status 存储的东西重新 pop 到寄存器从而恢复为用户态。

unsigned long copy_to_user(void *to, const void *from, unsigned long n);
unsigned long copy_from_user(void *to, const void *from, unsigned long n);

那 bypass SMEP&SMAP 通过 ROP 来关闭 SMEP&SMAP 即可继续 ret2usr,直接给 cr4 赋值 0x6f0 即可

KPTI bypass:只需要将 CR3 的第 13 位取反便能完成页表切换的操作

# 命令

还有可能附件包中没有驱动程序 *.ko,此时可能需要我们自己到文件系统中把它提取出来,这里给出 ext4,cpio 两种文件系统的提取方法:

ext4:将文件系统挂载到已有目录。

1
2
mkdir ./rootfs
sudo mount rootfs.img ./rootfs

查看根目录的 init 或 etc/init.d/rcS,这是系统的启动脚本
可以看到加载驱动的路径,这时可以把驱动拷出来

卸载文件系统, sudo umount rootfs

cpio:解压文件系统、重打包

1
2
mkdir extracted; cd extracted
cpio -i --no-absolute-filenames -F ../rootfs.cpio

此时与其它文件系统相同,找到 rcS 文件,查看加载的驱动,拿出来

1
find . | cpio -o --format=newc > ../rootfs.cpio

打包:

1
2
find . | cpio -o --format=newc > ./rootfs.cpio
cpio -idmv < ./rootfs.cpio

./gen_cpio.sh core.cpio

1
2
3
4
find . -print0 \
| cpio --null -ov --format=newc \
| gzip -9 > $1
mv ./core.cpio ../