Active Directory – Track and disable SMBv1

active-directory-logo

Dans beaucoup d’entreprises, les protocoles legacy sont toujours présents au sein des environnements Active Directory et engendrent bon nombre de failles de sécurité. Il n’est pas toujours évident d’identifier comment et à quel moment ces protocoles peuvent être désactivés.

Dans cet article nous allons voir comment traquer et désactiver SMBv1 de notre environnement Windows.

Table des matières

A quel moment

La réponse à “À quel moment je dois”, c’est maintenant. En effet SMBv1 est un très ancien protocole qui n’est plus censé être utilisé depuis des années (au même titre que LM et NTLMv1).

La réponse à “À quel moment je peux”, est un peu plus technique. En effet, il faut dans un premier temps s’assurer que l’ensemble des OS et applications utilisées dans votre environnement n’utilisent plus SMBv1.

Dans un premier temps du côté des OS, il convient d’avoir remplacé l’ensemble des OS de type Windows Server 2003 ou Windows XP et antérieur (SP inclus). Ces OS ne sont pas compatibles SMBv2.

Pour se faire un petit inventaire des assets de votre Active Directory devrait pouvoir vous aider.

Le script PowerShell ci-dessous génère un inventaire des comptes ordinateurs :

$exportFileName = "ADcomputerInventaire_$($(get-date).ToString('yyyyMMdd-HHmmss')).csv"
$exportFilePath = "c:\temp\"
$exportFileFull = $exportFilePath+$exportFileName

$res = @()
$lstADDomain = @()
$lstADDomain += $(Get-ADDomain).Forest
$lstADDomain += $(Get-ADDomain).ChildDomains

foreach($ADDomain in $lstADDomain){
    Write-Output "List computers in: $ADDomain"
    $lstADCpt += Get-ADComputer -filter * -Properties Name, DNSHostName, OperatingSystem, OperatingSystemVersion, Enabled, LastLogonDate, lastLogonTimestamp -Server $ADDomain | select Name, DNSHostName, OperatingSystem, OperatingSystemVersion, Enabled, LastLogonDate, lastLogonTimestamp
}

foreach($cpt in $lstADCpt){
    $objVM = New-Object System.object
    $objVM | Add-Member -name "Name" -MemberType NoteProperty -Value $cpt.Name
    $objVM | Add-Member -name "DNSHostName" -MemberType NoteProperty -Value $cpt.DNSHostName
    $objVM | Add-Member -name "OperatingSystem" -MemberType NoteProperty -Value $cpt.OperatingSystem
    $objVM | Add-Member -name "OperatingSystemVersion" -MemberType NoteProperty -Value $cpt.OperatingSystemVersion
    $objVM | Add-Member -name "Enabled" -MemberType NoteProperty -Value $cpt.Enabled
    $objVM | Add-Member -name "LastLogonDate" -MemberType NoteProperty -Value $cpt.LastLogonDate
    $objVM | Add-Member -name "lastLogonTimestamp" -MemberType NoteProperty -Value $([datetime]::FromFileTime($cpt.lastLogonTimestamp).ToString('yyyyMMdd'))
    $res += $objVM
}

$res | export-csv -Path $exportFileFull -NoTypeInformation -Encoding UTF8

Maintenant, nous allons supposé que les OS obsolètes sont été remplacés. Nous allons devoir vérifier si d’autres machines tel que des imprimantes, des serveurs en workgroup ou encore des applications n’utilisent pas encore SMBv1 pour accéder à vos serveurs.

Pour ce faire, il est nécessaire d’activer les audits SMB et de traiter ceux-ci (auditer votre infrastructure pendant un mois au moins).

Tout dépend de la taille de votre infrastructure, mais pour vous simplifier la vie, je vous conseille d’utiliser un puits de logs afin de pouvoir traiter de manière centralisée l’ensemble de vos assets (Windows Event Forwarder n’est pas l’outil le plus pratique, mais celui-ci convient très bien pour ce type d’audit en one-shot).

Activer l'audit SMB

Pour activer l’audit SMB, il est nécessaire d’utiliser les commandes PowerShell ci-dessous (commandes du module “smbshare“) :

Get-SmbServerConfiguration | select *SMB1*
Set-SmbServerConfiguration -AuditSmb1Access $true -Force
Get-SmbServerConfiguration | select *SMB1*

Dès lors que l’est audits SMB sont activés, les connexions à l’aide du protocole SMBv1 génèrent des événements avec l’ID 3000 dans le journal :

  • Applications and Services Logs\Microsoft\Windows\SMBServer\Audit

Le script ci-dessous permet de parser les logs et de les exporter au format CSV.

Dans l’audit, seule l’adresse IP du client est enregistrée et non le nom, ce même script à la capacité de faire un reverse de l’IP vers un hostname en se basant sur les enregistrements PTR du DNS.

$exportFileName = "SMBv1Audit_$($(get-date).ToString('yyyyMMdd-HHmmss')).csv"
$exportFilePath = "c:\temp\"
$exportFileFull = $exportFilePath+$exportFileName
$evtxPathOrName = "E:\Logs\ForwardedEvents.evtx"


$lstADDomain = @()
$lstADDomain += $(Get-ADDomain).Forest
$lstADDomain += $(Get-ADDomain).ChildDomains

$lstDC = @()

foreach($ADDomain in $lstADDomain){
    $lstDC += $(Get-ADDomain -server:$ADDomain).ReadOnlyReplicaDirectoryServers
    $lstDC += $(Get-ADDomain -server:$ADDomain).replicadirectoryservers
}


$lstADCpt = @()

foreach($ADDomain in $lstADDomain){
    Write-Output "List computers in: $ADDomain"
    $lstADCpt += Get-ADComputer -filter * -Properties Name, DNSHostName, OperatingSystem, OperatingSystemVersion, Enabled, LastLogonDate, lastLogonTimestamp -Server $ADDomain | select Name, DNSHostName, OperatingSystem, OperatingSystemVersion, Enabled, LastLogonDate, lastLogonTimestamp
}


$LogsRAW3000 = ""
$LogClear3000 = @()
$LogsRAW3000 = Get-WinEvent -FilterHashtable @{path = $($evtxPathOrName);LogName = 'ForwardedEvents'; ID = 3000} | Select-Object *



foreach($log in $LogsRAW3000){

    $objLog = New-Object System.object
    $objLog | Add-Member -name ‘TimeCreated’ -MemberType NoteProperty -Value $log.TimeCreated
    $objLog | Add-Member -name ‘ClientSMBv1_IP’ -MemberType NoteProperty -Value $log.Properties[0].Value
    $objLog | Add-Member -name ‘ServerSMBv1_Name’ -MemberType NoteProperty -Value $log.MachineName

    if($lstDC | Where-Object{$_ -eq $log.MachineName}){
        $objLog | Add-Member -name ‘IsDC’ -MemberType NoteProperty -Value $true
    }else{
        $objLog | Add-Member -name ‘IsDC’ -MemberType NoteProperty -Value $false
    }

    $revers = ""
    $revers = Resolve-DnsName $log.Properties[0].Value -Type PTR -erroraction SilentlyContinue
    if($revers){
        $objLog | Add-Member -name ‘ClientRevers’ -MemberType NoteProperty -Value $($revers).NameHost
    }else{
        #$objLog | Add-Member -name ‘ClientRevers’ -MemberType NoteProperty -Value "NoRevers"

        if(!$($evt.ClientSMBv1_IP -like "1*")){      
            $objLog | Add-Member -name ‘ClientRevers’ -MemberType NoteProperty -Value $log.Properties[0].Value
        }else{
            $objLog | Add-Member -name ‘ClientRevers’ -MemberType NoteProperty -Value "NoRevers"
        }
    }

    $LogClear3000 += $objLog
}

$LogClear3000 | export-csv -Path $exportFileFull -NoTypeInformation -Encoding UTF8

Event viewer query pour créer une vue sur les logs SMBv1 :

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-SMBServer/Audit">
    <Select Path="Microsoft-Windows-SMBServer/Audit">*[System[(EventID=3000)]]</Select>
  </Query>
</QueryList>

Une fois les IP et les machines utilisant encore SMBv1 identifiées, il faut encore identifier la raison et le moyen d’utiliser un autre protocole tel que SMBv2 ou SMBv3. Et là il n’y a pas de méthode magique, uniquement connaitre les applications et voir s’il est possible de les patcher ou mettre à jour les firmwares des scanners.

Query pour Windows Event Forwarder

Query WEF subscription pour collecte de log SMBv1 :

<QueryList>
  <Query Id="0" Path="Microsoft-Windows-SMBServer/Audit">
    <Select Path="Microsoft-Windows-SMBServer/Audit">*</Select>
  </Query>
</QueryList>

Event viewer query pour créer une vue sur les logs SMBv1 depuis WEF :

<QueryList>
  <Query Id="0" Path="ForwardedEvents">
    <Select Path="ForwardedEvents">*[System[(EventID=3000)]]</Select>
  </Query>
</QueryList>

Désactiver SMBv1

Il est possible de désactiver SMBv1plusieurs manières différentes :

  • Configuration au travers des modèles ADMX.
  • Configuration au travers des clefs de registres.
PICTO_NOTE_REMARQUE

Quelque soit la méthode utilisé, un reboot des machines est nécessaire afin que la désactivation de SMBv1 soit effectif.

GPO
Import ADMX /ADML

Les options de désactivations de SMBv1, ne sont pas contenues dans les fichiers ADMX standard. Il est nécessaire d’importer dans le magasin central les fichiers suivants :

  • SecGuide.admx
  • SecGuide.adml

Pour ce faire, vous devez dans un premier temps télécharger les baselines contenues dans “Microsoft Security Compliance Toolkit 1.0” :

Télécharger une des baseline de sécurité disponible (presque toutes les baselines contiennent les modèles d’administration qui nous intéressent).

Extraire la baseline téléchargée. Puis se rendre dans le répertoire :

  • .\BaselineName\Templates\

Dans ce répertoire doit se trouver les fichiers “ADMX” et “ADML” que nous allons utiliser à savoir “SecGuide.admx”.

Copier le fichier “SecGuide.admx” de ce répertoire dans le répertoire “PolicyDefinitions” de votre “SYSVOL”.

Copier le fichier “.\en-us\SecGuide.adml” de ce répertoire dans le répertoire “PolicyDefinitions\en-us” de votre “SYSVOL”.

WMI Filter

Une configuration supplémentaire au niveau du service “LanmanWorkstation” pour les OS avant Windows 8.1 et Windows Server 2012r2 est nécessaire, vous pouvez créer le filtre WMI suivant afin d’appliquer cette configuration uniquement sur les bonnes machines :

    • Windows 7
    • Windows 8
    • Windows Server 2008
    • Windows Server 2008r2
    • Windows Server 2012
SELECT Version 
FROM Win32_OperatingSystem 
WHERE ( Version LIKE "6.0%" or Version LIKE "6.1%" or Version LIKE "6.2%" )
GPO Settings

Créer une première GPO qui sera appliquée à toutes les machines où SMBv1 doit être désactivé. Et configurer les settings suivantes :

  • Computer Configuration > Policies > Administrative templates > MS Security Guide > Configure SMB v1 server
    • Valeur = Disabled
  • Computer Configuration > Policies > Administrative templates > MS Security Guide > Configures the SMB v1 client driver
    • Valeur = Enabled
    • Option: Configure MrxSmb10 driver = Disable driver (recommended)

Créer une seconde GPO qui ne sera appliquée uniquement sur les OS suivants où SMBv1 doit être désactivé :

    • Windows 7
    • Windows 8
    • Windows Server 2008
    • Windows Server 2008r2
    • Windows Server 2012

Et configurer les settings suivantes :

  • Computer Configuration > Policies > Administrative templates > MS Security Guide > Configure SMB v1 client (extra setting needed for pre-Win8.1/2012R2)
    • Valeur = Enabled
    • Option: Configure LanmanWorkstation dependencies =
      • Bowser
      • MRxSmb20
      • NSI
PICTO_AVERTISSEMENT

WARNING: DO NOT SELECT THE “DISABLED” RADIO BUTTON UNDER ANY CIRCUMSTANCES!

Lier le filtre WMI précédemment créé pour n’appliquer cette GPO qu’aux OS 6.0, 6.1 et 6.2.

Lier les GPO sur les OU contenants les comptes ordinateur concernés et attendre que la GPO soit appliquée (default 90 minutes).

PICTO_AVERTISSEMENT

Un reboot est nécessaire afin que la configuration soit appliquée.

Clefs de registre

Ci-dessous les clefs de registre et leurs valeurs à appliquer sur vos machines afin de désactiver SMBv1. Les clefs de registre mentionnées ci-dessous sont les mêmes que celles modifiées par les fichiers “ADMX”. Elles peuvent être appliquées directement sur vos machines hors domaine.

Sur l'ensemble des machines
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
    • Action: Update
    • Hive: HKEY_LOCAL_MACHINE
    • Key Path: SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
    • Value name: SMB1
    • Value type: REG_DWORD
    • Value data: 0
  •  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10
    • Action: Update
    • Hive: HKEY_LOCAL_MACHINE
    • Key Path: SYSTEM\CurrentControlSet\services\mrxsmb10
    • Value name: Start
    • Value type: REG_DWORD
    • Value data: 4
Configuration additionnelle pour les OS 6.0, 6.1 et 6.2

Uniquement sur les OS :

    • Windows 7
    • Windows 8
    • Windows Server 2008
    • Windows Server 2008r2
    • Windows Server 2012
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation
    • Action: Replace
    • Hive: HKEY_LOCAL_MACHINE
    • Key Path: SYSTEM\CurrentControlSet\Services\LanmanWorkstation
    • Value name: DependOnService
    • Value type: REG_MULTI_SZ
    • Value data:
      • Bowser
      • MRxSmb20
      • NSI
PICTO_ACTION

Afin d’être le plus efficace possible concernant la suppression de SMBv1, il convient d’ajouter les clefs de registre ci-dessus à vos templates de déploiement (SCCM, MDT, VMware, Packer …).

PICTO_AVERTISSEMENT

Un reboot est nécessaire afin que la configuration soit appliquée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *