MySQL
En MySQL, el servidor habla primero. Su handshake anuncia versión, capacidades, material de autenticación y parte de la negociación antes de que el cliente presente una cuenta. Esa apertura permite identificar el protocolo, pero también puede proceder de MariaDB, un proxy compatible o un banner modificado.
Después del login cambia la unidad de análisis. MySQL autoriza cuentas con la forma usuario@host, mapea la identidad presentada a CURRENT_USER() y aplica privilegios por objeto, schema o servidor. La misma cadena de usuario puede llegar a cuentas efectivas distintas según el origen. Enumerar el servicio significa separar el handshake de esa identidad autorizada y, después, relacionar datos y acceso a archivos con los grants efectivos.
Los ejemplos usan TARGET_IP, USERNAME, DATABASE, TABLE y FILE como placeholders.
Orden de trabajo y herramientas
Sección titulada «Orden de trabajo y herramientas»Nmap interpreta el handshake sin credenciales. El cliente mysql confirma TLS, plugin de autenticación y acceso real. Las consultas a information_schema, mysql, performance_schema y sys construyen el inventario según los permisos de la cuenta. Usa scripts NSE concretos solo para preguntas preautenticación o para una consulta ya delimitada.
| Pregunta | Herramienta | Resultado que debe confirmarse |
|---|---|---|
| ¿habla MySQL y qué anuncia? | Nmap mysql-info |
handshake y conexión con el cliente |
| ¿qué identidad acepta el servidor? | cliente mysql |
USER(), CURRENT_USER() y plugin negociado |
| ¿qué datos puede consultar? | SQL y catálogos | grants efectivos por schema y objeto |
| ¿puede leer o escribir archivos? | SQL | secure_file_priv, privilegio y ruta efectiva |
| ¿por qué falla otra herramienta? | cliente con --verbose |
TLS, plugin, DNS inverso y código de error |
Un banner compatible con MySQL también puede pertenecer a MariaDB, un proxy o un servicio gestionado. Conserva implementación anunciada y comportamiento observado por separado.
Identificar el endpoint
Sección titulada «Identificar el endpoint»MySQL escucha habitualmente en 3306/tcp. El servidor inicia el handshake y puede anunciar versión, connection ID, salt y capacidades. Esa cadena puede estar modificada y no determina por sí sola el nivel de parche real.
Nmap -sV identifica el protocolo. mysql-info analiza el handshake sin iniciar sesión:
nmap -sV -p 3306 --script mysql-info TARGET_IPEl script mysql-enum hace pruebas adicionales de cuentas y pertenece a categorías más intrusivas. No debe añadirse como rutina a la primera identificación. Primero confirma qué pregunta necesitas responder.
Conectar con el cliente
Sección titulada «Conectar con el cliente»En mysql, -h fija el host, -u el usuario y -p solicita la contraseña de forma interactiva. No añadas el secreto detrás de -p, porque puede quedar expuesto en el historial o en el listado de procesos:
mysql -h TARGET_IP -u USERNAME -pEl cliente puede negociar TLS si el servidor lo soporta. Para exigirlo, usa --sdoc-mode=REQUIRED. Para verificar también la identidad del servidor hacen falta VERIFY_CA o VERIFY_IDENTITY y una CA adecuada:
mysql -h FQDN -u USERNAME -p \ --sdoc-mode=VERIFY_IDENTITY --sdoc-ca=CA_FILEDentro de la sesión, \s muestra estado de conexión, protocolo y cipher. Las consultas SQL terminan con punto y coma:
SELECT VERSION();SELECT USER(), CURRENT_USER();SHOW STATUS LIKE 'Ssl_cipher';USER() refleja la identidad aportada por el cliente. CURRENT_USER() muestra la cuenta MySQL usada para autorizar la sesión. Pueden diferir por reglas de host o cuentas anónimas.
Construir el inventario lógico
Sección titulada «Construir el inventario lógico»SHOW DATABASES;USE DATABASE;SHOW TABLES;DESCRIBE TABLE;SHOW DATABASES solo devuelve las bases visibles para la cuenta. information_schema presenta metadatos de objetos y privilegios. performance_schema expone instrumentación. sys ofrece vistas que resumen datos de rendimiento y diagnóstico. Son esquemas distintos.
Para mantener la consulta acotada, pide columnas concretas y limita filas:
SELECT COLUMN_NAME, DATA_TYPEFROM information_schema.columnsWHERE TABLE_SCHEMA = 'DATABASE' AND TABLE_NAME = 'TABLE';
SELECT * FROM DATABASE.TABLE LIMIT 20;Los datos pueden contener hashes, tokens, connection strings o material personal. Conserva la consulta exacta junto al resultado para poder explicar qué subconjunto se obtuvo.
Usuarios y privilegios
Sección titulada «Usuarios y privilegios»Las cuentas MySQL se identifican por usuario y host. app@localhost y app@10.% son cuentas diferentes. Si la cuenta permite consultar las tablas del sistema:
SELECT User, Host, plugin, account_lockedFROM mysql.user;Para la sesión actual, SHOW GRANTS devuelve privilegios efectivos representados como sentencias:
SHOW GRANTS;Presta atención a privilegios globales, roles, FILE, administración de usuarios y capacidad de ejecutar rutinas. Una cuenta con acceso amplio a datos no implica automáticamente acceso al sistema operativo.
Interacción con archivos
Sección titulada «Interacción con archivos»secure_file_priv restringe las rutas que pueden usar operaciones de importación y exportación. Su valor puede ser un directorio, una cadena vacía o NULL:
SHOW VARIABLES LIKE 'secure_file_priv';LOAD_FILE() lee un archivo que el proceso del servidor puede abrir si también se cumplen privilegios y límites de tamaño:
SELECT LOAD_FILE('FILE');SELECT ... INTO OUTFILE crea un archivo nuevo desde el servidor. No sobrescribe uno existente y aplica permisos del proceso de MySQL:
SELECT 'MARKER' INTO OUTFILE 'FILE';La operación modifica el host. Registra ruta, propietario, modo y contenido. Distingue la ruta del cliente de la ruta vista por el servidor, especialmente con contenedores o almacenamiento remoto.
Revisar la configuración
Sección titulada «Revisar la configuración»Las rutas de my.cnf dependen de distribución y empaquetado. El cliente puede mostrar qué archivos busca:
El comando envía la ayuda de mysql a sed. -n evita imprimir todas las líneas y la expresión /inicio/,/fin/p conserva el intervalo comprendido entre ambos textos:
mysql --help | sed -n '/Default options are read from/,/Variables and options/p'Relaciona bind-address, port, skip-name-resolve, TLS, plugins, local_infile, secure_file_priv y includes con las variables efectivas obtenidas mediante SHOW VARIABLES. local_infile habilita una operación iniciada por el cliente y no equivale al privilegio FILE, que actúa desde el proceso del servidor. No presupongas que el archivo principal contiene toda la configuración.
NSE aplicado a MySQL
Sección titulada «NSE aplicado a MySQL»mysql-info obtiene datos del handshake. Con credenciales, mysql-databases, mysql-users, mysql-variables y mysql-query consultan facetas distintas. mysql-enum, mysql-empty-password, mysql-brute, mysql-dump-hashes y mysql-vuln-* cambian el volumen o la naturaleza de la prueba. Selecciona un script por pregunta y comprueba sus argumentos:
nmap -sV -n -Pn -p 3306 --script mysql-info TARGET_IPEl plugin de autenticación anunciado, la versión del cliente, TLS y políticas como require_secure_transport pueden hacer que Nmap y mysql obtengan resultados distintos. Conserva ambos errores y la negociación, no solo «login failed».
Decisiones después del login
Sección titulada «Decisiones después del login»Relaciona cada capacidad con un privilegio efectivo y con el host donde actúa. FILE puede permitir LOAD_FILE() o SELECT ... INTO OUTFILE, pero también intervienen secure_file_priv, permisos del proceso, AppArmor/SELinux y rutas visibles desde el servidor. UDF, plugins, event scheduler y general log pueden crear caminos hacia ejecución o escritura, pero exigen configuración y privilegios concretos.
Una lectura de credenciales o datos no autoriza a modificar filas. Para validar impacto, prioriza metadatos y una consulta de lectura mínima. Si la prueba necesita crear un objeto, usa un nombre único, registra definición y propietario, y elimínalo tras verificar.
Fallos, logs y cierre
Sección titulada «Fallos, logs y cierre»Los servidores pueden limitar conexiones, resolver hostnames, aplicar max_connect_errors, bloquear hosts o usar proxies. Un timeout no equivale a puerto filtrado. MySQL puede registrar conexiones, errores, general log, slow log, audit plugins y consultas en telemetría del sistema. Guarda identidad user@host, TLS, base, grants, consultas exactas, filas mínimas saneadas y hashes de exportaciones. Termina la sesión y revierte objetos o archivos creados.
Referencias operativas
Sección titulada «Referencias operativas»Amplía la comparación de clientes y scripts en herramientas y automatización. La checklist controla identidad, grants y acceso a archivos. La cheatsheet recupera consultas ya justificadas.