kernel knock knock
记录我做出的第一道内核题目。
距离上次写博客已经过了一年,令人感叹。
一年前的这个时候我刚刚做出第一道pwn题,而今天终于打开了kernel exploit的大门。
对于这一年来, 这是否是一份令人满意的答卷?
[0xFF] Before
应先对用户态/内核态等概念有一定了解。请阅读基础知识。
[0x00] Kernel Exp v.s. UserSpace Exp
内核利用对比于用户态利用的主要区别:
目标。用户态利用一般是通过与题目程序的IO交互,获取服务器的shell。而内核利用则一般是提权。题目会直接给我们目标服务器环境的一个普通用户/低权限shell, 即我们可以在目标服务器上以低权限运行任意自定程序, 然后通过内核漏洞或驱动漏洞进行提权攻击,拿到root权限的shell并获取root可读的flag。
手段。关于栈溢出,原理是一样的,但ROP时使用的地址和gadget都是内核代码的。且在内核态中我们无法使用libc的各种函数,内核的堆系统也和libc的ptmalloc完全不同。在Linux低版本(例如本篇的题目)我们可以通过劫持控制流执行内核代码中的
commit_creds(prepare_kernel_cred(NULL))来进行提权。Linux较高版本中prepare_kernel_cred(NULL)已不合法,因此要通过其他方法,此处不再赘述(因为我不会
[0x01] 附件分析
附件给了个core.cpio, 直接cpio -i < core.cpio解压发现报错,看起来像格式不对,file看了一下发现是gzip…何意味…
gzip+cpio解压后是根文件系统,查看一下init
1 | !/bin/sh |
注意到把/proc/kallsyms复制到了/tmp/kallsyms,普通用户也可以读,可以通过这里获得所有内核符号地址。poweroff这行2min关机,调试时可以先把这行给删了。
注意到insmod /core.ko,这个core.ko应该就是要打的漏洞模块。
扔进IDA里看一看:
1 |
To be continued..