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