Avant d'exécuter quoi que ce soit, cartographiez le serveur et votre position en son sein : la version (pour en adapter le comportement), les connexions et bases présentes, et, de façon critique, ce que le principal courant peut déjà faire. Une grande partie est lisible par le rôle public par défaut.
Trouver les instances#
# From the network: service discovery and SPN-based discovery in AD
nmap -p1433 --script ms-sql-info <target>
# MSSQL SPNs (MSSQLSvc/...) in the directory reveal every registered instance
setspn -T example.local -Q MSSQLSvc/*
Connexions, bases et rôles#
SELECT @@version; -- version and patch level
SELECT name FROM sys.sql_logins; -- SQL logins
SELECT name FROM sys.databases; -- databases
SELECT name, type_desc FROM sys.server_principals; -- principals (logins, Windows, roles)
Ce que le principal courant peut faire#
SELECT SUSER_SNAME(); -- who am I (login)
SELECT IS_SRVROLEMEMBER('sysadmin'); -- 1 if already sysadmin
-- logins I can actually impersonate (tests the IMPERSONATE permission, not mere visibility)
SELECT name FROM sys.server_principals
WHERE type IN ('S','U') AND HAS_PERMS_BY_NAME(name, 'LOGIN', 'IMPERSONATE') = 1;
SELECT * FROM fn_my_permissions(NULL, 'SERVER'); -- my server-level permissions
# NetExec drives the same from the network, including a sysadmin check and query exec
nxc mssql <target> -u user -p pass --local-auth -q "SELECT IS_SRVROLEMEMBER('sysadmin')"
Notes d'exploitation#
- La première question est toujours
IS_SRVROLEMEMBER('sysadmin'): si vous êtes déjà sysadmin, allez directement à l'exécution de commandes ; sinon, énumérez les cibles d'usurpation et les serveurs liés. publicpeut généralement liresys.databases,sys.server_principalset appeler les procédures de coercition, donc l'énumération nécessite rarement des droits particuliers.- Notez ici les bases TRUSTWORTHY et la propriété des bases (
SELECT name, is_trustworthy_on FROM sys.databases), car elles alimentent les chaînes d'escalade. - L'accès authentifié Windows compte : une connexion relayée ou de domaine peut se mapper vers un principal plus privilégié qu'une connexion SQL.
Outils#
- NetExec
mssql(-q/-x,--local-auth) : énumération réseau, vérification sysadmin, exécution de requêtes. - Impacket
mssqlclient.py: énumération authentifiée interactive. - nmap
ms-sql-*: découverte non authentifiée d'instances et de versions.