
Outil de post-exploitation C# ciblé pour Microsoft SQL Server (MS SQL / MSSQL) parcourant des chaînes de serveurs liés de toute profondeur avec usurpation d'identité de connexion en cascade à chaque saut.
Atterrissez en toute élégance sur votre Microsoft SQL Server (MS SQL) SGBD cible, comme si vous arriviez en voyage d'affaires avec une coupe de champagne à la main. 🥂

MSSQLand est un outil de post-exploitation C# pour Microsoft SQL Server (MSSQL / MS SQL) conçu pour les opérateurs red team. Conçu pour s'exécuter directement dans l'environnement cible via vos beacons (par exemple, en utilisant execute-assembly dans Cobalt Strike ou Havoc, ou toute commande dotnet), il vous permet de traverser des chaînes de serveurs liés, d'usurper l'identité de toute connexion rencontrée en cours de route, et d'émerger du dernier saut avec l'action souhaitée. Le tout avec une empreinte OPSEC minimale et aucune dépendance externe.
OPENQUERY / EXEC AT sur des chaînes de profondeur arbitraireEXECUTE AS LOGIN à chaque saut avec usurpation en cascade multi-utilisateurcm-* pour la reconnaissance et l'exploitation des bases de données Microsoft Configuration Manager[!TIP] MSSQLand est construit avec .NET Framework 4.8, en pensant à une exécution en assembly, utilisant le contexte courant. Si vous devez vous connecter en utilisant des hashs NT/LM ou un ticket Kerberos, consultez la section Pass-the-Hash.
[!NOTE] N'oubliez pas les bases. Lors d'une évaluation de sécurité, il est parfois plus simple d'utiliser SQL Server Management Studio (SSMS).
MSSQLand.exe [options] <host> [options] <action> [action-options]
MSSQLand.exe <host> --probe
Les flags globaux (-c, -l, --debug, etc.) sont acceptés à n'importe quelle position, y compris après le nom de l'action ; les tokens non reconnus après l'action sont passés tels quels à l'action.
[!NOTE] Omettre
<action>effectue uniquement un test de connexion. Il s'authentifie et se termine sans exécuter de requêtes. Idéal pour valider des identifiants avec une empreinte OPSEC minimale.
[!TIP] Évitez de saisir manuellement tous les appels RPC Out ou OPENQUERY. Laissez l'outil gérer toute chaîne de serveurs liés avec l'argument
-l, afin de pouvoir vous concentrer sur la vue d'ensemble.
Format : server:port/user@database ou toute combinaison server/user@database:port.
server (obligatoire) - Le nom d'hôte ou l'IP du serveur SQL:port (optionnel) - Numéro de port (par défaut : 1433, également courant : 1434, 14333, 2433)/user (optionnel) - Utilisateur à usurper sur ce serveur ("execute as login")
/user1/user2/user3 exécute EXECUTE AS LOGIN = 'user1'; EXECUTE AS LOGIN = 'user2'; EXECUTE AS LOGIN = 'user3';/user ajoute un nouveau contexte d'usurpation sur la pile de sécurité@database (optionnel) - Contexte de base de données# Sonde de connectivité : vérifie si le serveur est actif sans s'authentifier
MSSQLand.exe localhost --probe
# Test de connexion uniquement (aucune action exécutée, s'authentifie et quitte)
MSSQLand.exe localhost -c token
# Exécute une action spécifique
MSSQLand.exe localhost -c token info
MSSQLand.exe localhost:1434@db03 -c token info
MSSQLand.exe LAB-SQL01@AdventureWorks -c token tables -n Customer
Enchaînez plusieurs serveurs SQL à l'aide du flag -l avec le point-virgule (;) comme séparateur :
-l SQL01;SQL02/user;SQL03@database
Syntaxe :
;) - Sépare les serveurs dans la chaîne/) - Spécifie l'utilisateur à usurper ("execute as login")
/user1/user2 exécute des usurpations séquentielles@) - Spécifie le contexte de base de données[...]) - Utilisés pour protéger le nom du serveur d'une division par nos délimiteursExemples :
# Chaîne simple
-l SQL01;SQL02;SQL03
# Avec usurpation et bases de données
-l SQL01/admin;SQL02;SQL03/manager@clients
# Usurpation en cascade (usurper user1, puis user2 sur SQL01)
-l SQL01/user1/user2;SQL02;SQL03
# Cascade mixte (SQL01 : user1→user2, SQL03 : user3→user4→user5)
-l SQL01/user1/user2;SQL02;SQL03/user3/user4/user5@database
# Les noms de serveurs peuvent contenir des tirets, des points (pas besoin de crochets)
-l SQL-01;SERVER.001;HOST.DOMAIN.COM
# Les crochets ne sont nécessaires que si le nom du serveur contient des caractères délimiteurs
-l [SERVER;PROD];SQL02;[SQL03@clients]@clientdb
[!NOTE] La spécification de port (
:port) s'applique uniquement à la connexion initiale à l'hôte. Les chaînes de serveurs liés (-l) utilisent les noms de serveurs liés tels que configurés danssys.servers, et non les combinaisonshôte:port.
Ces modes ne nécessitent aucune authentification et fonctionnent avant d'avoir des identifiants.
Le service SQL Server Browser écoute sur UDP 1434 et répond aux requêtes de découverte avec la liste des instances SQL Server en cours d'exécution sur un hôte, y compris leurs noms, versions et ports TCP. Utile lorsque la cible exécute des instances nommées sur des ports dynamiques, sans avoir à deviner ou scanner.
# Interroge le service SQL Browser sur un hôte spécifique (UDP 1434)
MSSQLand.exe LAB-SQL03 --browse
Active Directory expose les enregistrements SQL Server via des Service Principal Names (SPNs) stockés sur les comptes d'ordinateur et de service. MSSQLand interroge AD via LDAP pour les SPNs MSSQLSvc/* afin d'énumérer les instances SQL Server dans le domaine, ou dans toute la forêt via le Global Catalog.
# Trouve les serveurs SQL dans Active Directory via LDAP (domaine courant)
MSSQLand.exe --findsql
# Cible un domaine spécifique
MSSQLand.exe --findsql pgd.lab
# Recherche dans toute la forêt via le Global Catalog (port 3268)
MSSQLand.exe --findsql pgd.lab --gc
La découverte est multicouche. Voir FindSqlServers.cs pour plus de détails.
Le service SQL Server Browser répond également aux paquets UDP broadcast sur UDP 1434, permettant de découvrir toutes les instances SQL Server s'annonçant sur le sous-réseau local.
# Découverte par broadcast sur le réseau local (UDP 1434)
MSSQLand.exe --broadcast
MSSQLand.exe --broadcast --timeout 5