10.10.10.87 Waldo
感谢 @Baikuya
参考链接
https://forum.hackthebox.eu/discussion/968/hint-for-waldo |
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"){ |
可以看到,这个文件特意将../和..都进行了删除
../../../../../../../../../../../../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 |
之后的步骤我以前也没了解过,看了论坛才知道,我们可以通过getcap这个指令来查看是否有一些程序拥有类似于root权限的功能。
getcap -r / 2>/dev/null |
可以看到这边有一个很奇怪的命令叫 tac 实际上就是倒写的cat 有读取全局文件的功能,我们可以直接通过它来读取/root/root.txt的内容。
root flag get √