记录我做出的第一道内核题目。

距离上次写博客已经过了一年,令人感叹。
一年前的这个时候我刚刚做出第一道pwn题,而今天终于打开了kernel exploit的大门。
对于这一年来, 这是否是一份令人满意的答卷?

[0xFF] Before

应先对用户态/内核态等概念有一定了解。请阅读基础知识

[0x00] Kernel Exp v.s. UserSpace Exp

内核利用对比于用户态利用的主要区别:

  1. 目标。用户态利用一般是通过与题目程序的IO交互,获取服务器的shell。而内核利用则一般是提权。题目会直接给我们目标服务器环境的一个普通用户/低权限shell, 即我们可以在目标服务器上以低权限运行任意自定程序, 然后通过内核漏洞或驱动漏洞进行提权攻击,拿到root权限的shell并获取root可读的flag。

  2. 手段。关于栈溢出,原理是一样的,但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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs none /dev
/sbin/mdev -s
mkdir -p /dev/pts
mount -vt devpts -o gid=4,mode=620 none /dev/pts
chmod 666 /dev/ptmx
cat /proc/kallsyms >/tmp/kallsyms
echo 1 >/proc/sys/kernel/kptr_restrict
echo 1 >/proc/sys/kernel/dmesg_restrict
ifconfig eth0 up
udhcpc -i

ifconfig eth0 10.0.2.15 netmask 255.255.255.0
route add default gw 10.0.2.2
insmod /core.ko

poweroff -d 120 -f &
setsid /bin/cttyhack setuidgid 1000 /bin/sh
echo 'sh end!\n'
umount /proc
umount /sys

poweroff -d 0 -f

注意到把/proc/kallsyms复制到了/tmp/kallsyms,普通用户也可以读,可以通过这里获得所有内核符号地址。poweroff这行2min关机,调试时可以先把这行给删了。

注意到insmod /core.ko,这个core.ko应该就是要打的漏洞模块。

扔进IDA里看一看:

1

To be continued..

⬆︎TOP