MSSQL (Microsoft SQL Server)
📚 Introduction
Microsoft SQL Server (MSSQL) est un système de gestion de base de données relationnelles (SGBDR) développé par Microsoft. Contrairement à MySQL, MSSQL est un logiciel propriétaire initialement conçu pour fonctionner sur systèmes Windows. Il est très populaire dans les environnements d’entreprise exploitant le framework .NET. Bien qu'il existe des versions compatibles avec Linux et macOS, MSSQL est le plus souvent rencontré sur serveurs Windows.
💻 Clients MSSQL
Le client natif le plus connu est SQL Server Management Studio (SSMS). Il est utilisé pour :
Gérer les bases MSSQL locales ou distantes
Accéder aux objets de la base de données (tables, vues, procédures)
Configurer les bases de données et utilisateurs
Autres clients utiles :
mssql-cli
(interface en ligne de commande)PowerShell SQLServer
(module PowerShell)HeidiSQL
,SQLPro
impacket-mssqlclient.py
: outil très utilisé en pentest
📌 Astuce :
locate mssqlclient.py
🏗️ Bases MSSQL par défaut
MSSQL contient plusieurs bases systèmes importantes :
master
Contient les informations système de l’instance
model
Modèle pour toute nouvelle base créée
msdb
Utilisée par le SQL Server Agent pour les jobs
tempdb
Base temporaire pour les objets volatils
resource
Lecture seule, contient les objets systèmes
⚙️ Configuration par défaut
Lors d'une installation par défaut, le service SQL tourne sous le compte NT SERVICE\MSSQLSERVER
. L’authentification peut se faire par :
Windows Authentication (via Active Directory ou SAM local)
SQL Authentication (login + mot de passe MSSQL)
La connexion n’est pas chiffrée par défaut, ce qui peut exposer des crédentials sur le réseau.
☠️ Paramètres à risque
Voici quelques exemples de configurations à surveiller :
Connexion sans chiffrement
Interception des crédentials
Certificats auto-signés
Falsifiables pour interception
Utilisation de named pipes
Attaques de type relay/spoof
Compte sa
actif avec mdp faible
Accès total à l’instance
🔍 Footprinting MSSQL
Par défaut, MSSQL écoute sur le port TCP 1433.
🔎 Scan Nmap avec scripts MSSQL
sudo nmap -p1433 <IP CIBLE> \
--script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-ntlm-info \
--script-args mssql.username=sa,mssql.password= \
-sV
Ce scan peut révéler :
Nom de l’instance MSSQL
Version du serveur
Pipe nommé (ex:
\\<IP CIBLE>\pipe\sql\query
)Configuration de clustering ou non
🔧 Metasploit : mssql_ping
use auxiliary/scanner/mssql/mssql_ping
set RHOSTS <IP CIBLE>
run
Retourne :
Nom de l’hôte MSSQL
Instance, port, version
Pipe nommé actif
🔑 Connexion avec mssqlclient.py
mssqlclient.py
Si nous disposons de crédentials valides :
python3 mssqlclient.py Administrator@<IP CIBLE> -windows-auth
Une fois connecté :
SQL> select name from sys.databases;
SQL> use master;
SQL> select * from sys.syslogins;
🧠 Commandes utiles MSSQL (T-SQL)
select name from sys.databases;
Affiche les bases existantes
use <db>;
Sélectionne une base
select * from sys.tables;
Affiche les tables
select * from <table>;
Contenu d’une table
select user_name();
Affiche l’utilisateur connecté
🛡️ Recommandations
Pour se former efficacement :
Installer MSSQL sur une VM Windows (ou Docker Linux)
Tester les connexions via Windows Auth et SQL Auth
Analyser les logs, pipes, ports
🔐 Bonnes pratiques :
Désactiver le compte
sa
si inutiliséImposer l’authentification chiffrée
Suivre les recommandations de Microsoft pour durcir l’instance
📚 Ressources utiles
Enumerate the target using the concepts taught in this section. List the hostname of MSSQL server.
Nous effectuons un scan des informations concernant notre cible :
$ sudo nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 10.129.96.170
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-24 15:38 CDT
PORT STATE SERVICE VERSION
1433/tcp open ms-sql-s Microsoft SQL Server 2019 15.00.2000.00; RTM
|_[10.129.96.170\MSSQLSERVER]
| ms-sql-ntlm-info:
| 10.129.96.170\MSSQLSERVER:
| Target_Name: ILF-SQL-01
| NetBIOS_Domain_Name: ILF-SQL-01
| NetBIOS_Computer_Name: ILF-SQL-01
| DNS_Domain_Name: ILF-SQL-01
| DNS_Computer_Name: ILF-SQL-01
|_ Product_Version: 10.0.17763
Nmap done: 1 IP address (1 host up) scanned in 6.44 seconds
Ce scan nous permet d'identifier le nom de notre serveur hôte qui est ILF-SQL-01
.
Connect to the MSSQL instance running on the target using the account (backdoor:Password1), then list the non-default database present on the server.
Nous nous connectons au serveur cible via mssqlclient.py
:
$ mssqlclient.py backdoor@10.129.96.170 -windows-auth
Impacket v0.13.0.dev0+20240918.213844.ac790f2b - Copyright Fortra, LLC and its affiliated companies
Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ILF-SQL-01): Line 1: Changed database context to 'master'.
[*] INFO(ILF-SQL-01): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL (ILF-SQL-01\backdoor dbo@master)>
Une fois connectés, nous pouvons utiliser la commande help
afin de nous permettre de bien naviguer dans les bases de données présentes sur le client :
SQL (ILF-SQL-01\backdoor dbo@master)> help
lcd {path} - changes the current local directory to {path}
exit - terminates the server process (and this session)
enable_xp_cmdshell - you know what it means
disable_xp_cmdshell - you know what it means
enum_db - enum databases
enum_links - enum linked servers
enum_impersonate - check logins that can be impersonated
enum_logins - enum login users
enum_users - enum current db users
enum_owner - enum db owner
exec_as_user {user} - impersonate with execute as user
exec_as_login {login} - impersonate with execute as login
xp_cmdshell {cmd} - executes cmd using xp_cmdshell
xp_dirtree {path} - executes xp_dirtree on the path
sp_start_job {cmd} - executes cmd using the sql server agent (blind)
use_link {link} - linked server to use (set use_link localhost to go back to local or use_link .. to get back one step)
! {cmd} - executes a local shell cmd
show_query - show query
mask_query - mask query
Nous pouvons alors lister les bases de données présentes sur le serveur :
SQL (ILF-SQL-01\backdoor dbo@master)> enum_db
name is_trustworthy_on
--------- -----------------
master 0
tempdb 0
model 0
msdb 1
Employees 0
Pour rappel, voici la liste des bases de données présentes par défaut :
master
Contient les informations système de l’instance
model
Modèle pour toute nouvelle base créée
msdb
Utilisée par le SQL Server Agent pour les jobs
tempdb
Base temporaire pour les objets volatils
resource
Lecture seule, contient les objets systèmes
Nous observons alors que la base de données qui est présente qui ne fait pas partie des DB par défaut est Employees
.
Mis à jour