Copié !
Chapitre 06

Protocole SMB & Partages Réseau

Le protocole qui relie tout - énumération, mouvement latéral, capture de hashes, relay attacks. SMB est au cœur de la majorité des attaques Windows en réseau. Maîtriser ses versions, ses permissions et ses vecteurs d'attaque est indispensable.

INTERMÉDIAIRE OFFENSIF + DÉFENSIF 4 – 5h
6.1

SMB - Histoire, Fonctionnement & Ports

SMB (Server Message Block) est né en 1983 chez IBM, conçu par Barry Feigenbaum pour le système DOS d'IBM PC Network. À l'origine, il tournait sur NetBIOS - un protocole réseau des années 80 au-dessus de TCP/IP. Microsoft l'adopte et le renomme CIFS dans les années 90, en y ajoutant des fonctionnalités mais aussi des vulnérabilités structurelles qui persistent jusqu'aujourd'hui.

40 ans de dette technique

SMBv1 a été décrit par l'équipe de sécurité Microsoft comme "the ancient mariner of protocols". Conçu pour des réseaux locaux lents des années 80, il nécessite des centaines d'échanges réseau pour une simple opération de lecture - et transporte quatre décennies de décisions de design dangereuses. Son éradication complète prend encore du temps : certains équipements industriels et NAS anciens ne supportent que SMBv1.

Architecture du protocole - flux de communication
Échange SMB client-serveur - négociation, auth, accèsFLUX
Client (Windows/Linux) Serveur Windows │ │ │ ── Negotiate Protocol ───────────► │ Sélection de la version SMB │ ◄─ Negotiate Response ──────────── │ │ │ │ ── Session Setup ────────────────► │ Authentification NTLM ou Kerberos │ ◄─ Session Setup Response ──────── │ │ │ │ ── Tree Connect ─────────────────► │ Connexion au partage \\SERVEUR\PART │ ◄─ Tree Connect Response ───────── │ │ │ │ ── Create / Read / Write ────────► │ Opérations sur les fichiers │ ◄─ Responses ───────────────────── │ │ │ │ ── Tree Disconnect / Logoff ─────► │ Déconnexion
Ports utilisés
PortProtocoleUsageStatut
445/TCPSMB Direct (over TCP)SMB depuis Windows 2000 - standard moderneActif par défaut
139/TCPNetBIOS Session ServiceSMB via NetBIOS - héritage Windows 9x/NTLegacy
137/UDPNetBIOS Name ServiceRésolution de noms NetBIOSLegacy
138/UDPNetBIOS DatagramDatagrammes NetBIOSLegacy
Vérifier l'état du service SMB et la connectivitéPOWERSHELL
# Services SMB Get-Service LanmanServer # Serveur SMB (partage de ressources) Get-Service LanmanWorkstation # Client SMB (connexion aux partages distants) # Connexions SMB actives netstat -ano | findstr ":445" netstat -ano | findstr ":139" # Test de connectivité SMB vers une cible Test-NetConnection -ComputerName 192.168.56.10 -Port 445
UNC Paths - Syntaxe d'accès aux partages
Format UNC (Universal Naming Convention)SYNTAXE
\\SERVEUR\PARTAGE\Dossier\Fichier.txt │ │ │ │ │ └── Chemin dans le partage (optionnel) │ └── Nom du partage └── Nom ou IP du serveur Exemples : \\192.168.56.10\C$ ← Partage admin C$ (disque entier, admin only) \\DC01\SYSVOL ← SYSVOL sur contrôleur de domaine \\FILESERVER\Données ← Partage personnalisé \\127.0.0.1\IPC$ ← Inter-Process Communication (null sessions)
6.2

Versions SMB - Évolution & Implications Sécurité

VersionOS d'introductionSécuritéStatut actuel
SMBv1 / CIFS Windows NT 4.0 / DOS 1983 Critique - EternalBlue, Relay trivial Désactivé par défaut (Win10 1709+)
SMBv2.0 Windows Vista / Server 2008 Redesign complet - HMAC-SHA256 Supporté
SMBv2.1 Windows 7 / Server 2008 R2 + Request leasing Supporté
SMBv3.0 Windows 8 / Server 2012 Chiffrement AES-CCM, Multichannel Supporté
SMBv3.1.1 Windows 10 / Server 2016 Pre-auth SHA-512, AES-128 GCM Défaut moderne - recommandé
SMBv1 - Pourquoi il est catastrophique
Vulnérabilités structurelles
Zéro défense par design

Aucun chiffrement - trafic entier en clair. Signature optionnelle - Man-in-the-Middle trivial. Null Sessions - accès anonyme aux informations système. EternalBlue (MS17-010) - vulnérabilité kernel exploitée par WannaCry et NotPetya en 2017, à partir de NSA leaks.

Désactivation
Priorité absolue en production

Désactivé par défaut depuis Windows 10 version 1709. Pour les systèmes plus anciens ou les serveurs, la désactivation est manuelle et doit être vérifiée. Certains NAS et équipements industriels legacy ne supportent que SMBv1 - les isoler sur un VLAN dédié.

Vérifier, désactiver SMBv1 + activer le chiffrement et la signaturePOWERSHELL
# ── Vérifier l'état des versions SMB ──────────────────────────────── Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol # ── Désactiver SMBv1 (deux méthodes complémentaires) ──────────────── Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force Disable-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol" -NoRestart # Vérifier via DISM Get-WindowsOptionalFeature -Online -FeatureName "SMB1Protocol" # ── Activer le chiffrement SMBv3 ──────────────────────────────────── Set-SmbServerConfiguration -EncryptData $true -Force # Tous les partages Set-SmbShare -Name "Sensible" -EncryptData $true # Partage spécifique # ── Activer la signature SMB (protège contre le relay) ────────────── Set-SmbServerConfiguration -RequireSecuritySignature $true -Force Set-SmbClientConfiguration -RequireSecuritySignature $true -Force # ── Voir la version négociée pour les connexions actives ──────────── Get-SmbConnection | Select-Object ServerName, ShareName, Dialect, Encrypted, Signed
6.3

Gestion des Partages

Créer et gérer des partages
New-SmbShare, Get-SmbShare, Grant/Revoke, Remove - CRUD completPOWERSHELL
# ── CRÉER ─────────────────────────────────────────────────────────── New-SmbShare -Name "Public" ` -Path "C:\Partages\Public" ` -FullAccess "Everyone" ` -Description "Partage public de test" New-SmbShare -Name "Donnees" ` -Path "C:\Partages\Donnees" ` -ReadAccess "BUILTIN\Users" ` -ChangeAccess "DOMAINE\Comptabilite" ` -FullAccess "BUILTIN\Administrators" # ── LISTER ────────────────────────────────────────────────────────── Get-SmbShare | Select-Object Name, Path, Description, ScopeName # Partages administratifs intégrés - toujours présents : # C$, D$... → Partages admin des lecteurs (Admins uniquement) # ADMIN$ → C:\Windows (accès distant admin) # IPC$ → Inter-Process Communication (null sessions) # SYSVOL → (si DC) Politiques de groupe # NETLOGON → (si DC) Scripts de connexion # ── VOIR LES PERMISSIONS D'UN PARTAGE ─────────────────────────────── Get-SmbShareAccess -Name "Public" # ── MODIFIER LES PERMISSIONS ──────────────────────────────────────── Revoke-SmbShareAccess -Name "Public" -AccountName "Everyone" -Force Grant-SmbShareAccess -Name "Public" ` -AccountName "Utilisateurs authentifiés" ` -AccessRight Read -Force # ── MODIFIER UN PARTAGE ───────────────────────────────────────────── Set-SmbShare -Name "Donnees" ` -Description "Accès restreint" ` -EncryptData $true ` -FolderEnumerationMode AccessBased # Cache les fichiers inaccessibles # ── SUPPRIMER ─────────────────────────────────────────────────────── Remove-SmbShare -Name "Public" -Force
Partages administratifs cachés - le suffixe $

Un partage dont le nom se termine par $ est caché - il n'apparaît pas dans l'énumération net view standard ni dans l'Explorateur Windows. Il reste cependant accessible si on connaît son nom exact, et visible par tous les outils système.

Partages cachés - création, invisibilité et détectionCMD + POWERSHELL
# Créer un partage caché personnalisé New-SmbShare -Name "BackupSecret$" ` -Path "C:\Backup" ` -FullAccess "BUILTIN\Administrators" # N'apparaît PAS dans : net view \\localhost # Invisible pour les utilisateurs ordinaires # Accessible directement si on connaît le nom : net use Z: \\localhost\BackupSecret$ # Toujours VISIBLE par les outils admin : Get-SmbShare # PowerShell le voit net share # cmd.exe le voit aussi
6.4

Permissions SMB vs Permissions NTFS - La Règle Fondamentale

Quand un utilisateur accède à un partage SMB, deux contrôles d'accès sont appliqués en série. Comprendre leur interaction est essentiel - la majorité des erreurs de configuration vient d'une incompréhension de cette relation.

Évaluation des accès SMB - deux couches en série
Utilisateur → Connexion SMB au port 445
└── Couche 1 : Permissions du PARTAGE (définies sur le partage lui-même)
└── Si autorisé → continue vers Couche 2
└── Couche 2 : ACL NTFS (définies sur les fichiers/dossiers)
Accès FINAL = MIN(Permission SMB, Permission NTFS) - toujours le plus restrictif
Tableau des intersections
Permission SMBPermission NTFSAccès effectif
Full ControlFull ControlFull Control
Full ControlReadRead - NTFS gagne
ReadFull ControlRead - SMB gagne
No AccessFull ControlNo Access - SMB bloque tout
Full ControlNo AccessNo Access - NTFS bloque tout
Bonne pratique reconnue dans l'industrie

Mettre le partage SMB en Full Control - Everyone (ou Authenticated Users), et gérer les droits fins uniquement via les ACLs NTFS. Le SMB devient un simple portail d'entrée et NTFS fait le vrai travail de contrôle. Résultat : une seule couche à maintenir, moins d'erreurs, audit plus simple.

Implémentation de la bonne pratique SMB + NTFSPOWERSHELL
# Partage SMB ouvert - le portail d'entrée New-SmbShare -Name "Projet" -Path "C:\Projets\Alpha" -FullAccess "Everyone" # Gestion fine via ACLs NTFS uniquement icacls "C:\Projets\Alpha" /grant "Alice:(OI)(CI)M" icacls "C:\Projets\Alpha" /grant "Bob:(OI)(CI)R" icacls "C:\Projets\Alpha" /remove "Everyone" # Résultat : Alice a Modify, Bob a Read - aucune confusion entre les deux couches
Erreur classique - Double Full Control Everyone

Un admin accorde Full Control sur le partage SMB ET Full Control sur les ACLs NTFS à Everyone. Le dossier est alors accessible sans restriction à n'importe qui sur le réseau. Détectable avec NetExec en quelques secondes depuis n'importe quelle machine du réseau, authentifiée ou non.

6.5

Sessions et Fichiers Ouverts

Surveiller et fermer les sessions SMB activesPOWERSHELL
# Sessions SMB actives - qui est connecté ? Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, TransportName, Dialect # OUTPUT exemple : # ClientComputerName ClientUserName NumOpens Dialect # 192.168.56.101 DOMAIN\alice 3 3.1.1 # 192.168.56.102 DOMAIN\bob 1 2.1 # Fichiers ouverts via SMB Get-SmbOpenFile | Select-Object FileId, ClientComputerName, ClientUserName, Path, ShareRelativePath # Fermer une session SMB (forcer la déconnexion) Get-SmbSession | Where-Object {$_.ClientUserName -match "alice"} | Close-SmbSession -Force # Fermer un fichier ouvert spécifique Get-SmbOpenFile | Where-Object {$_.Path -match "confidentiel"} | Close-SmbOpenFile -Force # Historique des connexions - Event ID 5140 Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5140} -MaxEvents 20 | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data [PSCustomObject]@{ Heure = $_.TimeCreated Compte = ($data | Where-Object {$_.Name -eq 'SubjectUserName'}).'#text' Machine = ($data | Where-Object {$_.Name -eq 'IpAddress'}).'#text' Partage = ($data | Where-Object {$_.Name -eq 'ShareName'}).'#text' } } | Format-Table -AutoSize
Event IDs SMB à connaître
Event IDDescriptionImportance SOC
5140Connexion à un partage réseauSurveiller C$, ADMIN$, IPC$ depuis IPs inattendues
5141Déconnexion d'un partageCorrélation avec 5140
5142Partage crééMonitoring admin - partages non autorisés
5143Partage modifiéChangement de permissions inattendu
5144Partage suppriméEffacement de traces
5145Accès à un objet via partage réseauAccès fichier distant - très verbeux
6.6

Énumération des Partages - Boîte à Outils

Depuis Windows
net.exe, PowerShell, WMI - énumération locale et distanteCMD + POWERSHELL
rem ── NET.EXE (natif) ──────────────────────────────────────────────── net share rem Partages locaux net view \\192.168.56.10 rem Partages d'une machine distante net view \\192.168.56.10 /all rem Inclut les partages cachés ($) net use Z: \\192.168.56.10\Donnees /user:alice P@ssw0rd net use Z: /delete # ── PowerShell (local) ────────────────────────────────────────────── Get-SmbShare Get-SmbShare | Where-Object {$_.Name -notmatch '\$$'} # Exclure les cachés # ── PowerShell (distant avec credentials) ─────────────────────────── $cred = Get-Credential Get-SmbShare -CimSession (New-CimSession -ComputerName 192.168.56.10 -Credential $cred) # ── WMI ───────────────────────────────────────────────────────────── Get-WmiObject Win32_Share | Select-Object Name, Path, Type, Description
Depuis Kali Linux
smbclient - connexion interactive et transfertsBASH
# Lister les partages (anonyme) smbclient -N -L //192.168.56.10 # Lister avec credentials smbclient -U "alice%P@ssw0rd" -L //192.168.56.10 # Se connecter à un partage - shell interactif smbclient //192.168.56.10/Donnees -U "alice%P@ssw0rd" # Commandes dans le shell smbclient : # smb: \> ls ← Lister # smb: \> get secret.txt ← Télécharger # smb: \> put payload.exe ← Uploader # smb: \> recurse ON ← Mode récursif # smb: \> mget * ← Tout télécharger
NetExec - énumération réseau, null sessions, Pass-the-HashBASH
# Fingerprint SMB d'un hôte (version, signing, hostname) netexec smb 192.168.56.10 # Lister les partages avec credentials netexec smb 192.168.56.10 -u alice -p P@ssw0rd --shares # Tester les null sessions (sans authentification) netexec smb 192.168.56.10 -u '' -p '' --shares netexec smb 192.168.56.10 -u 'nonexistant' -p '' --shares # Scan d'un réseau entier netexec smb 192.168.56.0/24 --shares # OUTPUT typique : # SMB 192.168.56.10 445 WIN10LAB [*] Windows 10.0 Build 19041 # SMB 192.168.56.10 445 WIN10LAB [+] WORKGROUP\alice:P@ssw0rd # SMB 192.168.56.10 445 WIN10LAB Share Permissions Remark # SMB 192.168.56.10 445 WIN10LAB ADMIN$ Remote Admin # SMB 192.168.56.10 445 WIN10LAB C$ Default share # SMB 192.168.56.10 445 WIN10LAB IPC$ READ Remote IPC # SMB 192.168.56.10 445 WIN10LAB Public READ,WRITE ← ecriture ouverte # Exécuter une commande via SMB (style PsExec) netexec smb 192.168.56.10 -u alice -p P@ssw0rd -x "whoami" netexec smb 192.168.56.10 -u alice -p P@ssw0rd -X "Get-LocalUser" # PowerShell # Pass-the-Hash (hash NT - pas besoin du mot de passe en clair) netexec smb 192.168.56.10 -u alice -H "aad3b435b51404eeaad3b435b51404ee:<HASH_NT>"
Null Sessions - L'accès anonyme

Une Null Session est une connexion au partage IPC$ sans aucun credentials. Elle permettait historiquement d'énumérer les utilisateurs, groupes, politiques de mot de passe et partages d'un Windows NT/2000 sans aucune authentification.

Null sessions - test depuis Kali et blocage depuis WindowsBASH + POWERSHELL
# Depuis Kali - rpcclient null session rpcclient -N -U "" 192.168.56.10 # rpcclient $> enumdomusers ← Lister les utilisateurs AD # rpcclient $> enumdomgroups ← Lister les groupes # rpcclient $> querydominfo ← Infos du domaine # Avec netexec netexec smb 192.168.56.10 -u '' -p '' --users # ── Blocage depuis Windows ─────────────────────────────────────────── Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" ` -Name "RestrictAnonymous" -Value 2 # 2 = Pas d'accès anonyme Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" ` -Name "RestrictAnonymousSAM" -Value 1
6.7

Mapping de Lecteurs Réseau

Monter, lister, lire/écrire et démonter des partages réseauPOWERSHELL
# ── MAPPING PERSISTANT ────────────────────────────────────────────── # Via New-PSDrive (session PowerShell uniquement) New-PSDrive -Name "Z" -PSProvider FileSystem ` -Root "\\192.168.56.10\Donnees" ` -Credential (Get-Credential) -Persist # Via net use (persistant au reboot) net use Z: \\192.168.56.10\Donnees /user:DOMAINE\alice P@ssw0rd /persistent:yes # ── VOIR LES LECTEURS MAPPÉS ──────────────────────────────────────── Get-PSDrive -PSProvider FileSystem | Where-Object {$_.Root -like "\\*"} net use Get-WmiObject Win32_MappedLogicalDisk | Select-Object Name, ProviderName, Access # ── DÉMONTER ──────────────────────────────────────────────────────── net use Z: /delete Remove-PSDrive -Name "Z" # ── ACCÈS DIRECT VIA UNC (sans monter de lecteur) ─────────────────── Get-ChildItem "\\192.168.56.10\Donnees" Copy-Item "C:\local.txt" "\\192.168.56.10\Donnees\remote.txt" Get-Content "\\192.168.56.10\Donnees\config.ini"
6.8

Risques & Vecteurs d'Attaque SMB

Inventaire des risques principaux
RisqueConditionImpactDétection rapide
Partages ouverts Full Control Everyone sur SMB et NTFS Lecture/écriture/suppression sans auth netexec smb <IP> -u '' -p '' --shares
C$ / ADMIN$ actifs Compte admin local avec même mot de passe Disque entier accessible, SAM/SYSTEM extractibles netexec smb <IP> -u admin -p pass --shares
SMB Signing absent RequireSecuritySignature = false NTLM Relay Attack (chapitre 7) netexec smb <CIDR> --gen-relay-list
SMBv1 actif EnableSMB1Protocol = true EternalBlue, relay trivial, null sessions Get-SmbServerConfiguration
Credentials dans SYSVOL Scripts de login avec mots de passe en clair Mots de passe récupérables par tout utilisateur du domaine netexec smb <DC> -M spider_plus
Vérifier le SMB Signing - côté offensif et défensifBASH + POWERSHELL
# ── Depuis Kali - identifier les cibles sans SMB signing ──────────── netexec smb 192.168.56.0/24 --gen-relay-list /tmp/no_signing.txt # → Génère la liste des machines sans signing = cibles de relay attack (ch. 7) cat /tmp/no_signing.txt # ── Depuis Windows - vérifier et activer le signing ───────────────── Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature Get-SmbClientConfiguration | Select-Object RequireSecuritySignature Set-SmbServerConfiguration -RequireSecuritySignature $true -Force Set-SmbClientConfiguration -RequireSecuritySignature $true -Force
Audit de sécurité SMB complet
Invoke-SMBSecurityAudit - versions, signing, chiffrement, partages ouvertsPOWERSHELL
function Invoke-SMBSecurityAudit { Write-Host "=== AUDIT SECURITE SMB ===" -ForegroundColor Cyan $config = Get-SmbServerConfiguration $clientConfig = Get-SmbClientConfiguration # 1. Versions SMB Write-Host "`n[1] Versions SMB :" Write-Host " SMBv1 : $(if($config.EnableSMB1Protocol){'ACTIVE - DESACTIVER IMMEDIATEMENT'}else{'Desactive'})" Write-Host " SMBv2 : $(if($config.EnableSMB2Protocol){'Actif'}else{'Desactive'})" # 2. Signing Write-Host "`n[2] SMB Signing :" Write-Host " Server Required : $(if($config.RequireSecuritySignature){'OK'}else{'NON REQUIS - Relay possible'})" Write-Host " Client Required : $(if($clientConfig.RequireSecuritySignature){'OK'}else{'NON REQUIS'})" # 3. Chiffrement Write-Host "`n[3] Chiffrement :" Write-Host " Encrypt All Data: $(if($config.EncryptData){'Actif'}else{'Desactive - recommande'})" # 4. Partages à risque Write-Host "`n[4] Partages accessibles a Everyone :" Get-SmbShare | ForEach-Object { $shareAccess = Get-SmbShareAccess -Name $_.Name $everyoneAccess = $shareAccess | Where-Object { $_.AccountName -match "Everyone|Tout le monde|Utilisateurs authentifi" } if ($everyoneAccess) { foreach ($a in $everyoneAccess) { $risk = if ($a.AccessRight -eq "Full") { "FULL CONTROL" } else { $a.AccessRight } Write-Host " \\$env:COMPUTERNAME\$($_.Name) - $($a.AccountName) : $risk" } } } # 5. Sessions actives Write-Host "`n[5] Sessions SMB actives :" Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, Dialect | Format-Table -AutoSize } Invoke-SMBSecurityAudit
Offensif - Chemins d'exploitation SMB

netexec smb <CIDR> --shares = cartographie instantanée des partages d'un réseau entier. --gen-relay-list = identifier les cibles sans SMB signing pour relay attack (chapitre 7). C$ accessible = disque entier lisible - SAM, SYSTEM, NTDS.dit extractibles (chapitres 8 et 12). Pass-the-Hash natif dans netexec avec -H - pas besoin du mot de passe en clair, seulement le hash NT.

Défensif - Priorités de durcissement

1. Désactiver SMBv1 - priorité absolue, aucune excuse en 2024. 2. Activer SMB Signing - bloque les relay attacks. 3. Chiffrement SMBv3 - protège contre le sniffing réseau. 4. Event ID 5140 = surveiller les accès à C$, ADMIN$, IPC$ depuis des IPs inattendues. Scanner régulièrement en interne avec netexec pour détecter les partages ouverts avant les attaquants.

TP 1

Partage EVERYONE FullAccess & Connexion depuis Kali

TP 06-A Créer un partage vulnérable, s'y connecter depuis Kali, détecter les accès, sécuriser INTERMÉDIAIRE
Prérequis

VM Windows (admin) + VM Kali sur le même réseau. Remplacer <IP_WINDOWS> par l'IP réelle de la VM Windows.

Objectifs
  1. Créer un partage volontairement ouvert (Everyone Full Access)
  2. S'y connecter depuis Kali avec smbclient - lire et déposer un fichier
  3. Observer les sessions actives et les Event ID 5140
  4. Sécuriser le partage et confirmer le blocage
Créer LabShare - Full Access EveryonePOWERSHELL
# Créer le dossier et les fichiers de test New-Item -ItemType Directory -Path "C:\LabSMB" -Force | Out-Null Set-Content "C:\LabSMB\readme.txt" -Value "Partage de test - Chapitre 6 SMB" Set-Content "C:\LabSMB\confidentiel.txt" -Value "DONNEES SENSIBLES" # Créer le partage ouvert (Full Access Everyone) New-SmbShare -Name "LabShare" ` -Path "C:\LabSMB" ` -FullAccess "Everyone" ` -Description "Partage de lab - volontairement ouvert" # Confirmer Get-SmbShareAccess -Name "LabShare" Write-Host "Partage cree : \\$env:COMPUTERNAME\LabShare" -ForegroundColor Yellow $ip = Get-NetIPAddress -AddressFamily IPv4 | Where-Object {$_.IPAddress -ne '127.0.0.1'} | Select-Object -First 1 -ExpandProperty IPAddress Write-Host "IP Windows : $ip" -ForegroundColor Cyan
smbclient et netexec - accès anonyme au partage ouvertBASH
WINDOWS_IP="192.168.56.10" # Adapter à votre IP # Test de connectivité nmap -p 445 $WINDOWS_IP --open # Lister les partages (anonyme) smbclient -N -L //$WINDOWS_IP # Connexion anonyme au partage ouvert smbclient -N //$WINDOWS_IP/LabShare # smb: \> ls # smb: \> get confidentiel.txt /tmp/confidentiel.txt # smb: \> put /etc/hostname hosted_file.txt # smb: \> exit # Netexec - énumération rapide netexec smb $WINDOWS_IP --shares -u '' -p '' netexec smb $WINDOWS_IP --shares -u 'nonexist' -p '' # Impacket null session impacket-smbclient ''@$WINDOWS_IP
Sessions actives, Event 5140, révocation et nettoyagePOWERSHELL
# Sessions SMB actives pendant l'attaque Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, Dialect # Event ID 5140 - accès au partage Get-WinEvent -FilterHashtable @{ LogName = 'Security' Id = 5140 StartTime = (Get-Date).AddMinutes(-15) } -EA SilentlyContinue | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data [PSCustomObject]@{ Heure = $_.TimeCreated IP = ($data | Where-Object {$_.Name -eq 'IpAddress'}).'#text' Compte = ($data | Where-Object {$_.Name -eq 'SubjectUserName'}).'#text' Partage = ($data | Where-Object {$_.Name -eq 'ShareName'}).'#text' } } | Format-Table -AutoSize # Sécuriser - révoquer Everyone, autoriser seulement les utilisateurs authentifiés Revoke-SmbShareAccess -Name "LabShare" -AccountName "Everyone" -Force Grant-SmbShareAccess -Name "LabShare" ` -AccountName "Utilisateurs authentifiés" -AccessRight Read -Force Get-SmbShareAccess -Name "LabShare" # Nettoyage complet Remove-SmbShare -Name "LabShare" -Force Remove-Item "C:\LabSMB" -Recurse -Force Write-Host "Nettoyage termine" -ForegroundColor Green
TP 2

Énumération avec NetExec & Détection des Partages Ouverts

TP 06-B Scanner les partages d'une cible, détecter les accès non authentifiés, générer un rapport AVANCÉ
Objectifs
  1. Fingerprinter la cible SMB - version, signing, hostname
  2. Tester null sessions et credentials valides avec NetExec
  3. Générer la liste des machines sans SMB signing
  4. Analyser les Event ID 4625 et 5140 côté Windows
  5. Générer un rapport de recommandations automatisé
Fingerprint, null sessions, enumeration avec NetExecBASH
TARGET="192.168.56.10" # Étape 1 : Fingerprint SMB (version, signing, hostname) netexec smb $TARGET # Étape 2 : Test null session echo "=== NULL SESSION ===" netexec smb $TARGET -u '' -p '' --shares # Étape 3 : Avec credentials valides echo "=== AVEC CREDENTIALS ===" netexec smb $TARGET -u 'restricteduser' -p 'Restricted@2024!' --shares # Étape 4 : Spider - lire le contenu des partages accessibles netexec smb $TARGET -u 'restricteduser' -p 'Restricted@2024!' \ -M spider_plus --shares # Étape 5 : Utilisateurs locaux via SMB netexec smb $TARGET -u 'restricteduser' -p 'Restricted@2024!' \ --local-auth --users # Étape 6 : Générer liste des machines sans SMB signing netexec smb $TARGET --gen-relay-list /tmp/no_signing.txt cat /tmp/no_signing.txt # Si l'IP apparaît → SMB signing absent → vulnérable au relay (Chapitre 7)
Analyser Event 4625 (logons échoués) et 5140 (accès partages)POWERSHELL
# ── Tentatives d'auth suspectes (Event 4625 - logon échoué) ───────── Write-Host "=== TENTATIVES D'AUTHENTIFICATION SUSPECTES ===" -ForegroundColor Red Get-WinEvent -FilterHashtable @{ LogName = 'Security' Id = 4625 StartTime = (Get-Date).AddMinutes(-30) } -EA SilentlyContinue | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data [PSCustomObject]@{ Heure = $_.TimeCreated Compte = ($data | Where-Object {$_.Name -eq 'TargetUserName'}).'#text' IP = ($data | Where-Object {$_.Name -eq 'IpAddress'}).'#text' LogonType = ($data | Where-Object {$_.Name -eq 'LogonType'}).'#text' } } | Where-Object {$_.LogonType -eq "3"} | # Type 3 = réseau (SMB) Format-Table -AutoSize # ── Accès aux partages (Event 5140) ───────────────────────────────── Write-Host "`n=== ACCES AUX PARTAGES ===" -ForegroundColor Yellow Get-WinEvent -FilterHashtable @{ LogName = 'Security' Id = 5140 StartTime = (Get-Date).AddMinutes(-30) } -EA SilentlyContinue | ForEach-Object { $xml = [xml]$_.ToXml() $data = $xml.Event.EventData.Data [PSCustomObject]@{ Heure = $_.TimeCreated Compte = ($data | Where-Object {$_.Name -eq 'SubjectUserName'}).'#text' IP = ($data | Where-Object {$_.Name -eq 'IpAddress'}).'#text' Partage = ($data | Where-Object {$_.Name -eq 'ShareName'}).'#text' Masque = ($data | Where-Object {$_.Name -eq 'AccessMask'}).'#text' } } | Format-Table -AutoSize
Tableau de recommandations avec statut et actions correctivesPOWERSHELL
Write-Host "`n=== RAPPORT DE DURCISSEMENT SMB ===" -ForegroundColor Cyan $cfg = Get-SmbServerConfiguration @( [PSCustomObject]@{ Controle = "SMBv1 desactive" Statut = if(-not $cfg.EnableSMB1Protocol){ "OK" } else{ "CRITIQUE" } Action = "Set-SmbServerConfiguration -EnableSMB1Protocol `$false" }, [PSCustomObject]@{ Controle = "SMB Signing requis" Statut = if($cfg.RequireSecuritySignature){ "OK" } else{ "Relay possible" } Action = "Set-SmbServerConfiguration -RequireSecuritySignature `$true" }, [PSCustomObject]@{ Controle = "Chiffrement SMBv3" Statut = if($cfg.EncryptData){ "OK" } else{ "Recommande" } Action = "Set-SmbServerConfiguration -EncryptData `$true" } ) | Format-Table -AutoSize

Résumé - Points clés à retenir

Histoire & Versions
40 ans de dette technique

SMB né en 1983 - SMBv1 cumule EternalBlue (WannaCry 2017), relay trivial, null sessions. SMBv3.1.1 avec chiffrement AES-256 est la seule version acceptable en production. La règle : désactiver SMBv1, forcer SMBv3, activer le signing.

Permissions
SMB + NTFS - toujours le plus restrictif

Deux couches évaluées en série. Bonne pratique : Full Control Everyone sur le partage SMB + ACLs fines sur NTFS. IPC$ en null session = énumération sans credentials possible si RestrictAnonymous n'est pas à 2.

Pour l'Offensif
NetExec - cartographie réseau instantanée

netexec smb <CIDR> --shares pour les partages ouverts. --gen-relay-list pour identifier les cibles sans signing. C$ accessible = disque entier disponible. Pass-the-Hash avec -H sans mot de passe. SYSVOL = scripts avec mots de passe en clair.

Pour le Défensif
Durcissement en 4 étapes

1. Désactiver SMBv1. 2. Forcer SMB Signing. 3. Activer le chiffrement SMBv3. 4. Surveiller Event 5140 sur C$, ADMIN$, IPC$ depuis des IPs inattendues. Scanner son propre réseau avec netexec régulièrement.

  • Expliquer l'architecture SMB - négociation, authentification, Tree Connect
  • Identifier les ports 445/TCP, 139/TCP et leurs usages
  • Distinguer SMBv1, SMBv2 et SMBv3 par leurs capacités de sécurité
  • Créer, modifier et supprimer des partages avec New-SmbShare et Set-SmbShare
  • Appliquer la règle SMB + NTFS et expliquer l'intersection des permissions
  • Détecter les partages ouverts avec netexec smb --shares
  • Tester une null session avec smbclient -N et rpcclient
  • Générer une liste de cibles sans SMB signing avec --gen-relay-list
  • Bloquer les null sessions via RestrictAnonymous = 2 dans le registre
  • Analyser les Event ID 5140 et 4625 pour détecter les accès SMB suspects
Prochain chapitre

Le Chapitre 7 - Vecteurs d'Attaque SCF & LNK est la suite directe : maintenant que tu maîtrises SMB, tu vas comprendre comment un attaquant exploite un simple partage pour capturer des hashes NTLM sans aucun accès authentifié - juste en déposant un fichier .lnk ou .scf malveillant et en attendant qu'un utilisateur ouvre le dossier.