HTB靶机-codify
连接并检查稳定性

信息收集
tcp端口扫描

22 80 3000 8080开放,进行详细扫描

udp扫描

没有有用价值的内容
web网页尝试
首先我们需要在hosts文件中添加一行记录

访问查看网页

发现是个nodejs代码沙盒测试环境。点开about us页面

我们发现是基于vm2的库搭建的沙盒,并且超链接给出了我们vm2的版本信息

对于沙盒类的代码执行,我们很容易想到的是沙盒逃逸类的漏洞,我们可以去检索一下vm2相关的沙盒逃逸类的漏洞,以"vm2 sandbox escape vulnerability"类似的关键词在搜索引擎检索

检索到一个漏洞,并且版本符合3.9.16。打开利用的pocSandbox Escape in [email protected] (github.com)
1 | const {VM} = require("vm2"); |
利用漏洞拿到反弹shell
我们找到这个漏洞后,先来尝试一下能否使用

接下来我们要编写反弹shell利用,这里我尝试了直接利用bash -i,似乎没奏效,因此我们改变思路,利用curl web服务器内容后管道执行。首先要编写一个index.html文件,在里面编写成反弹shell的脚本

接着使用python提供的简易web服务器,将这个内容放到我们的本地web服务器上

编写远程执行的指令,并开启监听

成功拿到shell。通过ifconfig可以验证得知,确实为目标靶机。
但是这个用户权限似乎非常受限,大部分目录都无法进入。既然是这个用户执行的web页面,也许可以到web页面的目录下面看看。
进入到/var/www/contact下,发现一个db文件,并且具有查看的权限,我们在里面找到了joshua用户的密码哈希

直接使用jonh进行hash爆破

得到密码为spongebob1,利用这个密码我们尝试进行ssh登录

成功进入,并拿到userflag

看看这个用户的sudo的权限有那些

通过mysql-backup.sh拿到root权限

这个是mysql-backup.sh,以下是chatgpt的代码解读
-
变量定义:
DB_USER="root": 定义数据库用户名为root。DB_PASS=$(/usr/bin/cat /root/.creds): 从/root/.creds文件中读取数据库密码,并将其存储在DB_PASS变量中。
-
密码确认:
read -s -p "Enter MySQL password for $DB_USER: " USER_PASS: 以安静模式(不显示输入)提示用户输入MySQL的密码,并将输入存储在USER_PASS变量中。if [[ $DB_PASS == $USER_PASS ]]; then ... else ... fi: 检查用户输入的密码是否与存储的密码匹配。如果匹配,则继续执行脚本;如果不匹配,则显示错误消息并退出脚本。
-
创建备份目录:
BACKUP_DIR="/var/backups/mysql": 定义备份目录的路径。/usr/bin/mkdir -p "$BACKUP_DIR": 创建备份目录,如果目录已经存在,则不会报错。
-
获取数据库列表并进行备份:
-
databases=$(/usr/bin/mysql -u "$DB_USER" ... -e "SHOW DATABASES;" | /usr/bin/grep -Ev "(Database|information_schema|performance_schema)"): 运行MySQL命令来获取数据库列表,排除系统数据库。 -
for db in $databases; do … done
: 对于获取的每个数据库,执行以下操作:
- 打印正在备份的数据库名称。
- 使用
mysqldump命令备份数据库,并将输出压缩成.gz格式保存在指定的备份目录下。
-
-
完成备份后的操作:
- 打印所有数据库备份成功的消息。
- 更改备份目录的所有者为
root用户和sys-adm组。 - 设置备份目录的权限为774(用户和组具有读、写、执行权限,其他人有读权限)。
-
脚本结束:
- 打印完成消息。
这里的脚本有一个不安全的点,在变量比较时未使用引号
shellharden/how_to_do_things_safely_in_bash.md at master · anordal/shellharden (github.com)

在==的左边没有使用双引号的话,会让bash认为是在执行模式匹配,而不是字符串匹配。这将会导致可以利用 {valid_password_char}{*} 这样的模式进行匹配比较。对此我们可以使用脚本对该sh爆破。利用大佬编写的python脚本对其进行爆破
1 | import string |

拿到root权限
