Analyse et Sniffer le réseau à l'aide de NetEventSession sur Windows

Windows propose un outil de capture très performant, qu'il est possible de manipuler via PowerShell sans trop de difficultés.
Voici comment effectuer une capture réseau automatisée avec PowerShell.


Mise en Place de la Capture Réseau

Dans cet exemple, nous définissons une variable pour spécifier l'adresse IP locale à surveiller

$utilisateur="Administrateur"
$IpLocale="192.168.0.10"

Avant de commencer une nouvelle session, il est important de vérifier que la session précédente est correctement arrêtée et supprimée pour éviter tout conflit :

Stop-NetEventSession -Name SessionDeCapture ; Remove-NetEventSession -Name SessionDeCapture

Ensuite, l'arborescence de stockage des captures est réinitialisée afin de garantir un environnement propre :

ri -r "/CAPTURE"
mkdir "/CAPTURE"

Lancement et gestion de la session de capture réseau

Une nouvelle session de capture réseau nommée SessionDeCapture est créée, configurée pour enregistrer dans un fichier local au format .etl avec une taille maximale définie :

New-NetEventSession -Name SessionDeCapture -LocalFilePath "C:\CAPTURE\capture-en-cours.etl" -MaxFileSize 4096

La session est ensuite configurée pour capturer les paquets avec une longueur de troncature spécifiée pour réduire la taille du fichier :

Add-NetEventPacketCaptureProvider -SessionName SessionDeCapture -TruncationLength 2500

La capture est limitée aux communications impliquant spécifiquement l'adresse IP locale définie précédemment :

Set-NetEventPacketCaptureProvider -SessionName SessionDeCapture -IpAddresses $IpLocale

Enfin, la capture réseau démarre et dure exactement 10 minutes (600 secondes) avant d'être arrêtée automatiquement :

Start-NetEventSession -Name SessionDeCapture
Start-Sleep -Seconds 600
Stop-NetEventSession -Name SessionDeCapture
Remove-NetEventSession -Name SessionDeCapture

Analyse des résultats de la capture

Le fichier de capture .etl obtenu est ensuite converti au format texte pour faciliter son analyse :

pktmon etl2txt "C:\CAPTURE\capture-en-cours.etl" --out "C:\CAPTURE\result.txt"

À partir de ce fichier texte très complet, on peut, par exemple, vouloir n'extraire que les adresses IPv4 uniques. On les enregistre dans un nouveau fichier texte nommé liste-brute-ip-en-cours.txt :

Get-Content "C:\CAPTURE\result.txt" | Select-String -Pattern "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" | ForEach-Object { $_.Matches } | % { $_.Value } | Sort-Object -Unique | Out-File "C:\CAPTURE\liste-brute-ip-en-cours.txt"

Enfin, la liste des adresses IP extraites est automatiquement ouverte dans le Bloc-notes pour consultation immédiate :

notepad "C:\CAPTURE\liste-brute-ip-en-cours.txt"

Faire du filtrage

- Exclure du fichier C:\CAPTURE\result.txt les requêtes provenant de certaines IP :

$ipExclure = @("192.168.0.1", "192.168.0.53", "1.1.1.1", "1.0.0.1")

Copy-Item "C:\CAPTURE\result.txt" "C:\CAPTURE\result_backup.txt"

$regexIP = ($ipExclure | ForEach-Object { [regex]::Escape($_) }) -join "|"

$lines = Get-Content "C:\CAPTURE\result.txt"

$output = for ($i = 0; $i -lt $lines.Count; $i++) {
    if ($lines[$i] -match $regexIP) {
        # Ignore la ligne contenant l'IP exclue
        continue
    }
    elseif (($i + 1) -lt $lines.Count -and $lines[$i + 1] -match $regexIP) {
        # Ignore l'en-tête si la ligne suivante contient une IP exclue
        continue
    }
    else {
        # Conserve la ligne actuelle
        $lines[$i]
    }
}

$output | Set-Content "C:\CAPTURE\result_excludeIpSource.txt"

Le fichier C:\CAPTURE\result_excludeIpsource.txt est désormais vidé des requêtes provenant des IP exclues.

- Filtrer uniquement les IP source :

gc "C:\CAPTURE\result_excludeIpSource.txt" | Select-String -Pattern "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" | ForEach-Object { $_.Matches } | ForEach-Object { $_.Value } | Where-Object { $_ -notin $ipExclure } | Sort-Object -Unique | Out-File "C:\CAPTURE\liste-brute-ip-en-cours.txt"

gc "C:\CAPTURE\liste-brute-ip-en-cours.txt"

Le fichier C:\CAPTURE\liste-brute-ip-en-cours.txt ne contient que les IPv4 source des requêtes.


⬆️ Retour en haut de la page