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.
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"
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
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"
- 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.