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 :

Version
Systèmes supportés
Fonctionnalités principales

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 :

Paramètre
Risque potentiel

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 serveur

  • enumdomusers : énumération des utilisateurs

  • queryuser <RID> : infos détaillées sur un utilisateur

  • netshareenumall : 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