感谢 @Baikuya

参考链接

https://forum.hackthebox.eu/discussion/968/hint-for-waldo

https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/     逃离restrict bash jail

https://nxnjz.net/2018/08/an-interesting-privilege-escalation-vector-getcap/   找到可用的高权限命令

https://blog.csdn.net/supermenxxx/article/details/50853778    纠正环境变量

Detail

这台机子只开放了80和22端口。

web页面截图如下所示:

里面是一个类似于小留言板一样的应用,可以增删改list。

burpsuit抓包模拟一下流程。

可以看到,这个application尝试去读取list的时候是直接取读取的文件,也就是说这些内容都是文件的形式存储的。

注意到我们发送的请求这里有   path=./.list/   很自然的去想到更改这里试一下。

可以看到当前目录下有很多文件,值得注意的是有一个fileRead.php 和我们现在用到的dirRead.php

尝试用它去读取/etc/passwd

然而并不可以,返回了错误值,那我们就读一下这个php文件本身,看看为什么不行。

返回的文件是json,里面有很多的转义字符,读起来有点难受。

用bash整理一下转义字符

cat dirty | sed 's/\\\\n/\\n/g' | sed 's/\\\\//g' > clean\_file

我们可以得到以下输出

if($\_SERVER\['REQUEST\_METHOD'\] === "POST"){
$fileContent\['file'\] = false;
header('Content-Type: application/json');
if(isset($\_POST\['file'\])){
header('Content-Type: application/json');
$\_POST\['file'\] = str\_replace( array("../", "..""), "", $\_POST\['file'\]);
if(strpos($\_POST\['file'\], "user.txt") === false){
$file = fopen("/var/www/html/" . $\_POST\['file'\], "r");
$fileContent\['file'\] = fread($file,filesize($\_POST\['file'\]));
fclose();
}
}
echo json\_encode($fileContent);
}

可以看到,这个文件特意将../和..都进行了删除

../../../../../../../../../../../../etc/passwd就会被过滤掉变成了/var/www/html/etc/passwd,所以无法被读取。

然而,在这个过滤机制中,他只对过滤进行了一次验证,不会对第一次过滤后的结果再进行过滤验证。所以我们可以通过一些方法来绕过,比如把../../../../../../../../../../../../etc/passwd 改成 …/./…/./…/./…/./…/./…/./…/./来bypass这一过滤手段。

…/./…/./…/./…/./…/./…/./…/./etc/passwd变成了../../../../../../../etc/passwd这样就能正确绕过过滤。

这样我们就能正确的读取文件了,同时我们发现/etc/passwd显示存在一个可以登陆的nobody用户。

我们去他的目录下看一下有没有什么线索。

发现user.txt和一些其他文件,这样我们就直接获得了user flag

进一步探索我们可以发现.ssh文件里居然存放了一份ssh私匙,读取下载。

老样子用上面的命令过滤一下该文件,然后ssh登陆上去。

ssh -i .monitor nobody@10.10.10.87

成功ssh上去了,进一步观察,我们发现似乎还有一个用户可以使用该私匙登录。

根据known_hosts和authorized_keys我们可以发现,该用户似乎登陆过 monitor@localhost

而且似乎我们登陆上的这台machine的本地22端口是被映射到了其他machine的,或者是这台box有特殊的其他软件,可以像docker一样有多个环境运行。

那我们去试一下,这份私匙是不是也可以登录到localhost。

ssh -i .monitor monitor@localhost

成功的登陆了上去,但是我们发现有rbash的jail。我们的一些常用命令都不能够使用。

这边我们可以通过 red 即 restrict ed 来 break the jail。

类似于 vim nano 和 ed 这一类文本编辑器其实都内置了执行命令的功能。

我们可以利用这些特性来bypass rbash的限制。

monitor@waldo:~$ red
!'/bin/sh'
export PATH=$PATH:/bin/:/sbin/
export PATH=$PATH:/usr/bin:/usr/sbin/
whoami

之后的步骤我以前也没了解过,看了论坛才知道,我们可以通过getcap这个指令来查看是否有一些程序拥有类似于root权限的功能。

getcap -r / 2>/dev/null

可以看到这边有一个很奇怪的命令叫 tac 实际上就是倒写的cat 有读取全局文件的功能,我们可以直接通过它来读取/root/root.txt的内容。

root flag get √