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 :

Base par défaut
Rôle

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 :

Paramètre/Détail
Risque

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

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)

Commande
Description

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 :

Base par défaut
Rôle

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