SMB (Server Message Block)
🧩 Introduction au protocole SMB
Le protocole SMB (Server Message Block) est un protocole client-serveur qui permet le partage de fichiers, d’imprimantes et d'autres ressources réseau telles que les ports ou interfaces. Il est principalement utilisé dans les environnements Windows, mais des implémentations libres comme Samba permettent son usage sur des systèmes Unix/Linux.
Initialement introduit via les systèmes LAN Manager sur OS/2, SMB est devenu un pilier des services réseau Windows. Grâce à sa compatibilité descendante, les versions récentes peuvent communiquer avec des versions plus anciennes du protocole.
🔗 Fonctionnement du protocole SMB
Dans un réseau IP, SMB repose sur le protocole TCP et s’appuie sur le three-way handshake classique pour établir une connexion fiable. Une fois connectés, client et serveur échangent des messages SMB pour accéder à des fichiers ou services partagés.
Les droits d’accès sont définis via des ACL (Access Control Lists). Ces ACLs permettent une gestion fine des permissions (lecture, écriture, exécution) pour chaque utilisateur ou groupe.
🐧 Implémentation avec Samba
Samba est une implémentation libre du protocole SMB/CIFS, permettant l'interopérabilité avec les systèmes Windows. Samba implémente plusieurs versions de SMB :
CIFS
Windows NT 4.0
Utilise l'interface NetBIOS
SMB 1.0
Windows 2000
Connexion directe via TCP
SMB 2.0
Vista / Server 2008
Caching, signature améliorée
SMB 2.1
Windows 7 / Server 2008 R2
Verrouillages optimisés
SMB 3.0
Windows 8 / Server 2012
Multi-connexion, chiffrement de bout en bout
SMB 3.1.1
Windows 10 / Server 2016
Intégrité, chiffrement AES-128
Depuis Samba 3, le serveur peut rejoindre un domaine Active Directory. Avec Samba 4, il peut même agir en tant que contrôleur de domaine AD.
⚙️ Fichier de configuration : smb.conf
Le fichier /etc/samba/smb.conf
contient la configuration du serveur Samba. Exemple minimal :
[global]
workgroup = WORKGROUP
server string = Samba Server
map to guest = Bad User
usershare allow guests = yes
[notes]
comment = Partage notes
path = /mnt/notes
browseable = yes
read only = no
guest ok = yes
create mask = 0777
directory mask = 0777
🔒 Paramètres sensibles
Certaines options peuvent exposer le serveur :
browseable = yes
Permet de lister les dossiers (utile aussi à un attaquant)
guest ok = yes
Autorise les connexions anonymes
read only = no
Permet la modification de fichiers
create mask = 0777
Tous les droits sur les fichiers créés
enable privileges = yes
Honore les SID spéciaux
🛠️ Outils d'interaction et d'énumération
📂 smbclient
Permet d’interagir avec les partages SMB, y compris en session nulle :
smbclient -N -L //<IP CIBLE> # Lister les partages
smbclient //<IP CIBLE>/notes # Connexion au partage "notes"
Une fois connecté :
smb: \> ls
smb: \> get fichier.txt
smb: \> !cat fichier.txt
🔎 rpcclient
Utilitaire puissant pour interroger les services MS-RPC :
rpcclient -U "" <IP CIBLE>
Commandes utiles :
srvinfo
: infos sur le serveurenumdomusers
: énumération des utilisateursqueryuser <RID>
: infos détaillées sur un utilisateurnetshareenumall
: liste des partages
🧰 Autres outils
nmap (avec scripts NSE) :
sudo nmap -sV -sC -p139,445 <IP CIBLE>
SMBMap :
smbmap -H <IP CIBLE>
CrackMapExec :
crackmapexec smb <IP CIBLE> --shares -u '' -p ''
enum4linux-ng : outil complet d’énumération automatique
🧠 Bonnes pratiques en pentest
Rechercher les partages accessibles anonymement.
Vérifier les permissions : lecture, écriture, exécution.
Énumérer les utilisateurs/domaines via
rpcclient
.Utiliser
smbstatus
pour voir les connexions actives.Éviter de se reposer uniquement sur les outils automatisés.
📚 Ressources utiles
What version of the SMB server is running on the target system? Submit the entire banner as the answer.
Nous effectuons un scan sur notre cible :
$ nmap -sC -sV -T5 10.xx.xx.xx
Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-19 15:15 CEST
PORT STATE SERVICE VERSION
21/tcp open ftp
| fingerprint-strings:
| GenericLines:
| 220 InFreight FTP v1.1
| Invalid command: try being more creative
|_ Invalid command: try being more creative
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
111/tcp open rpcbind 2-4 (RPC #100000)
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
2049/tcp open nfs_acl 3 (RPC #100227)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap done: 1 IP address (1 host up) scanned in 72.10 seconds
La bannière associée est donc la suivante : Samba smbd 4.6.2
.
What is the name of the accessible share on the target?
Nous effectuons une connexion NULL sur notre cible :
$ smbclient -N -L \\\\10.xx.xx.xx
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
sambashare Disk InFreight SMB v3.1
IPC$ IPC IPC Service (InlaneFreight SMB server (Samba, Ubuntu))
SMB1 disabled -- no workgroup available
Le dossier accessible est sambashare
.
Connect to the discovered share and find the flag.txt file. Submit the contents as the answer.
Nous nous connectons au dossier trouvé et récupérons le fichier flag.txt
:
$ smbclient //10.xx.xx.xx/sambashare
Password for [WORKGROUP\root]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Mon Nov 8 14:43:14 2021
.. D 0 Mon Nov 8 16:53:19 2021
.profile H 807 Tue Feb 25 13:03:22 2020
contents D 0 Mon Nov 8 14:43:45 2021
.bash_logout H 220 Tue Feb 25 13:03:22 2020
.bashrc H 3771 Tue Feb 25 13:03:22 2020
4062912 blocks of size 1024. 506280 blocks available
smb: \> cd contents\
smb: \contents\> ls
. D 0 Mon Nov 8 14:43:45 2021
.. D 0 Mon Nov 8 14:43:14 2021
flag.txt N 38 Mon Nov 8 14:43:45 2021
4062912 blocks of size 1024. 506280 blocks available
smb: \contents\> get flag.txt
getting file \contents\flag.txt of size 38 as flag.txt (0.3 KiloBytes/sec) (average 0.3 KiloBytes/sec)
Les identifiants sont root:<nopassword>
.
Nous récupérons le contenu du fichier flag.txt
trouvé sur le serveur :
$ cat flag.txt
HTB{o873nz4xdo873n4zo873zn4fksuhldsf}
Nous obtenons donc le flag attendu :
HTB{o873nz4xdo873n4zo873zn4fksuhldsf}
Find out which domain the server belongs to.
Nous utilisons enum4linux afin d'obtenir le nom de domaine de notre cible :
$ enum4linux-ng -A "10.xx.xx.xx"
ENUM4LINUX - next generation (v1.3.4)
==========================
| Target Information |
==========================
[*] Target ........... 10.xx.xx.xx
[*] Username ......... ''
[*] Random Username .. 'wtljgzvy'
[*] Password ......... ''
[*] Timeout .......... 5 second(s)
===========================================================
| NetBIOS Names and Workgroup/Domain for 10.xx.xx.xx |
===========================================================
[+] Got domain/workgroup name: DEVOPS
[+] Full NetBIOS names information:
- DEVOPS <00> - <GROUP> H <ACTIVE> Domain/Workgroup Name
- DEVOPS <1d> - H <ACTIVE> Master Browser
- DEVOPS <1e> - <GROUP> H <ACTIVE> Browser Service Elections
[...]
Nous relevons le nom de domaine de la cible : DEVOPS
.
Find additional information about the specific share we found previously and submit the customized version of that specific share as the answer.
Nous nous connectons à l'aide de rpcclient
afin d'obtenir davantage d'informations concernant le partage sambashare
:
$ rpcclient -U '' "10.129.202.5"
Password for [WORKGROUP\]:
rpcclient $> netsharegetinfo sambashare
netname: sambashare
remark: InFreight SMB v3.1
path: C:\home\sambauser\
password:
type: 0x0
perms: 0
max_uses: -1
num_uses: 1
Nous obtenons alors la version associée au partage de fichier est InFreight SMB v3.1
.
What is the full system path of that specific share? (format: "/directory/names")
Le chemin associé au partage de fichier est /home/sambauser
.
Mis à jour