# 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 | mkdir ./rootfs |
查看根目录的 init 或 etc/init.d/rcS,这是系统的启动脚本
可以看到加载驱动的路径,这时可以把驱动拷出来
卸载文件系统, sudo umount rootfs
cpio:解压文件系统、重打包
1 | mkdir extracted; cd extracted |
此时与其它文件系统相同,找到 rcS 文件,查看加载的驱动,拿出来
1 | find . | cpio -o --format=newc > ../rootfs.cpio |
打包:
1 | find . | cpio -o --format=newc > ./rootfs.cpio |
./gen_cpio.sh core.cpio
1 | find . -print0 \ |