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权限