RECONOCIMIENTO — Escaneo de puertos
Lo primero es verificar conectividad con la máquina víctima:
Confirmada la conectividad, lanzamos un escaneo completo de puertos:
| PUERTO | ESTADO | SERVICIO |
|---|---|---|
| 21/tcp | OPEN | FTP |
| 22/tcp | OPEN | SSH |
| 80/tcp | OPEN | HTTP |
Lanzamos un escaneo más profundo sobre los tres puertos para obtener versiones y ejecutar scripts de detección:
El escaneo revela algo crítico: Anonymous FTP login allowed. El servidor está configurado para aceptar el usuario anonymous con cualquier contraseña, sin necesidad de credenciales reales.
FTP ANÓNIMO — Extracción del archivo de backup
Accedemos al servicio FTP con el usuario anonymous y contraseña vacía, y listamos el directorio:
Hay un único fichero disponible: backup.zip. Lo descargamos a nuestra máquina para examinarlo:
CRACKING — zip2john + John the Ripper
Al intentar descomprimir el archivo, comprobamos que está protegido por contraseña:
Usamos zip2john para extraer el hash del archivo en un formato apto para el cracking:
Con la contraseña del ZIP obtenida lo descomprimimos y examinamos index.php, donde encontramos la lógica de autenticación:
El hash MD5 de la contraseña del administrador queda expuesto en el código fuente. Lo crackeamos especificando el formato raw-md5, necesario porque John no siempre detecta este esquema automáticamente:
md5() directamente sobre el password, lo especificamos explícitamente para evitar que John lo interprete como md5crypt u otro esquema y falle en el cracking.
SQL INJECTION — sqlmap y obtención de shell
Con admin / qwerty789 iniciamos sesión en la web. El panel en /dashboard.php expone un campo de búsqueda cuyo parámetro search es un vector potencial para inyección SQL. Usamos sqlmap con la cookie de sesión activa y la opción --os-shell para intentar RCE a través de la inyección:
search en dashboard.php no sanitiza la entrada, permitiendo inyección SQL sobre un backend PostgreSQL. El usuario de la base de datos tiene privilegios suficientes para ejecutar comandos del SO mediante COPY FROM PROGRAM, derivando directamente en RCE como usuario postgres.
La os-shell de sqlmap es funcional pero incómoda. Nos enviamos una reverse shell interactiva. Levantamos el listener y ejecutamos desde la os-shell:
CREDENCIALES EXPUESTAS — dashboard.php y sudo
Con la reverse shell activa como postgres, inspeccionamos el código fuente de la aplicación web en busca de credenciales. El archivo dashboard.php contiene la cadena de conexión a la base de datos en texto plano:
dashboard.php almacena la contraseña P@s5w0rd! en texto claro. El usuario postgres reutiliza esta contraseña en el sistema operativo, permitiendo la autenticación directa.
Comprobamos los privilegios sudo del usuario postgres:
El usuario puede ejecutar vi como root sobre un fichero de configuración específico. Antes de escalar, obtenemos la flag de usuario:
PRIVILEGE ESCALATION — GTFOBins: vi como root
vi es un editor que permite ejecutar comandos de shell arbitrarios desde su propio modo de comandos. Aunque el sudo está restringido a un fichero concreto, el binario que se ejecuta es vi, que nos da acceso completo a la shell:
Una vez dentro de vi, usamos la sintaxis :! para ejecutar un comando del sistema operativo directamente desde el editor:
vi permite ejecutar comandos del SO mediante :!comando desde su modo de comandos. Como el proceso fue iniciado con sudo, los comandos se ejecutan con privilegios de root. Esta técnica está documentada en GTFOBins como vector estándar de escalada cuando se tiene sudo sobre editores de texto.
CADENA DE ATAQUE
anonymous sin contraseña → se descarga backup.zip con el código fuente de la aplicación webzip2john extrae el hash del ZIP → crackeado con rockyou → index.php expone hash MD5 del admin → crackeado a qwerty789search vulnerable a SQLi en PostgreSQL → sqlmap --os-shell obtiene RCE mediante COPY FROM PROGRAM → reverse shell interactivadashboard.php almacena la contraseña de postgres en texto claro: P@s5w0rd! → acceso al sistema y comprobación de sudopostgres puede ejecutar vi como root → :!/bin/sh dentro del editor lanza shell de root → flag de root en /root/root.txt