the_open_door
café
ESEN
← Volver al índice

MSSQL Linked Servers

Un linked server es una conexión permanente que un servidor MS SQL guarda hacia otra instancia SQL, para poder lanzar consultas distribuidas contra ella. Esa conexión se autentica con unas credenciales fijas almacenadas en el enlace, y muy a menudo esas credenciales son de un usuario más privilegiado que el nuestro en el servidor remoto (no es raro que sean de sa). Abusar de los linked servers permite saltar de una instancia donde somos un usuario limitado a otra donde ejecutamos como administrador, y encadenar varios saltos.

Mecanismo

Desde una sesión SQL, primero se enumeran los enlaces existentes:

SELECT srvname, isremote FROM master..sysservers;

Con EXECUTE ... AT se lanza una consulta en el servidor enlazado, que la ejecuta con sus credenciales almacenadas. Comprobar quiénes somos al otro lado suele ser revelador:

EXECUTE('SELECT system_user, is_srvrolemember(''sysadmin'')') AT [SQL02];

Si al otro lado somos sysadmin, se habilita y se usa xp_cmdshell en remoto para ejecutar comandos del sistema operativo, todo desde nuestra sesión inicial:

EXECUTE('sp_configure ''show advanced options'', 1; RECONFIGURE;
         sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT [SQL02];
EXECUTE('xp_cmdshell ''whoami''') AT [SQL02];

Los enlaces pueden formar cadenas (A -> B -> C), y se recorren anidando EXECUTE('...') AT. PowerUpSQL automatiza este descubrimiento con Get-SQLServerLinkCrawl, que sigue la cadena entera y dice en cuál de los saltos acabamos siendo administradores.

Cómo detectarlo

Desde el lado atacante, Get-SQLServerLinkCrawl -Instance <host> mapea todos los saltos alcanzables y el contexto de usuario en cada uno. Desde el lado defensivo, se auditan los enlaces y la cuenta que usan:

SELECT name, provider, data_source FROM sys.servers WHERE is_linked = 1;

Defensa. Configurar los linked servers con la cuenta de menor privilegio que cumpla su función (nunca sa), evitar los enlaces que impersonan al login actual sin control, y segmentar las instancias para que un compromiso no se propague por la cadena. Relacionado con xp_cmdshell y impersonación en MSSQL.

HerramientasPowerUpSQL