比赛中的kernel pwn
比赛中我们会得到下面几个文件
- bzImage 这是一个内核编译生成的压缩内核映像
- core.cpio这是一个文件管理系统
针对core.cpio会有一系列常规操作
mkdir core
cd core
mv ../core.cpio core.cpio.gz // cp ../core.cpio core.cpio.gz
gunzip core.cpio.gz
cpio -idmv < core.cpio
然后我们在core这个目录下我们可以看见
这里有一个init文件,我们用文本编辑器打开
#!/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 eth0
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
这些就是内核启动时候的一些环境信息,其中
insmod /core.ko
这个core.ko文件就是我们主要分析的文件,这个系统挂载了core.ko这么个文件,往往漏洞就出现在这里,针对这个内核文件我们会写一个c语言的程序来完成我们的攻击。
setsid /bin/cttyhack setuidgid 1000 /bin/sh 这句话代表着我们是用什么用户,我们往往在本地中会将这句话改为
setsid /bin/cttyhack setuidgid 0 /bin/sh
- start.sh这是一个启动Linux的脚本
#!/bin/bash
qemu-system-x86_64 \
-m 128M \ //128m 的大小
-kernel bzImage \ //选择bzImage这个内核
-initrd core.cpio \ //选择core.cpio这个文件管理系统
-append 'console=ttyS0 kaslr quiet' \ //kaslr就是开启了地址随机化
-monitor /dev/null \
-cpu kvm64,+smep,+smap \ //内核保护措施
-smp cores=1,threads=1 \
-nographic
- vmlinux是 编译生成的最原始的文件,里面是有符号表与一些gadget,常用于debug
执行启动脚本之后我们会得到这样一个有普通用户权限的虚拟机环境
在比赛中我们要把普通用户变成特权用户,flag就在特权用户的目录下
我们编写脚本完成之后,打远程时一般通过一些方式将脚本发送到服务端。
原理
内核
百度一下
ioctl
ioctl 也是一个系统调用,用于与设备通信。
linux的内核我们是可以拓展的,对于一些我们写的驱动我们可以通过这个系统调用来完成。
cred结构体
内核会将各个进程的权限用一个cred结构体保存着,通过这个结构体,内核就知道这个进程的权限。
struct cred {
atomic_t usage;
#ifdef CONFIG_DEBUG_CREDENTIALS
atomic_t subscribers; /* number of processes subscribed */
void *put_addr;
unsigned magic;
#define CRED_MAGIC 0x43736