1. Introduction
Bonjour à tous, nous voici dans le premier article de présentation de petits tips pour gagner du temps au quotidien sur des sujets divers et variés de la cybersécurité. Nous allons voir ici comment manipuler facilement les logs Windows via le Powershell.
En effet, si vous avez déjà visionné ces logs via l’observateur d’évènements Windows, vous vous êtes rendus compte que ce dernier avait quelques limites quand il faisait face à de gros fichiers ou quand vous souhaitiez faire des filtres plus complexes.
C’est donc pour cela que j’ai décidé de passer en Powershell qui embarque nativement des cmdlet faites pour la compréhension de ces fichiers. De plus, le point positif d’utiliser le Powershell est que l’automatisation peut être encore plus facile.
2. HowTo
Dans un premier temps, comment lire un ou plusieurs fichiers evtx en Powershell :
Get-WinEvent -Path "C:\Users\toto\evtx\my_evtx_file.evtx"
Get-WinEvent -Path "C:\Users\toto\evtx_files\*.evtx"
Bien entendu, il existe plusieurs formats supportés :
- evt
- evtx
- etl
En terme d’affichage, voici le format ce que l’on a par défaut :
PS C:\Users\toto> Get-WinEvent -Path "C:\Users\toto\evtx_files\*.evtx"
ProviderName: Microsoft-Windows-Security-Auditing
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
01/01/1970 10:10:10 4624 Information
Comme le Powershell est très puissant et malléable, il est possible de filtrer sur les journaux via leur nom directement comme ceci :
PS C:\Users\toto> Get-WinEvent Security
ProviderName: Microsoft-Windows-Security-Auditing
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
01/01/1970 10:10:10 4624 Information
PS C:\Users\toto> Get-WinEvent Application
ProviderName: Windows Error Reporting
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
01/01/1970 10:10:10 1001 Information Détecteur d'erreurs 0, type 4…
Comme la description des logs est très souvent à rallonge, il est possible d’utiliser les options suivantes pour avoir un affichage de toutes les propriétés de manière ajustée comme il se faut.
PS C:\Users\toto> Get-WinEvent Security | Format-Table -Property * -AutoSize -Wrap
Pour plus d’informations sur le formattage en PowerShell : https://learn.microsoft.com/en-us/powershell/scripting/samples/using-format-commands-to-change-output-view?view=powershell-7.3
Si l’affichage en PowerShell ne vous convient pas il est également possible d’exporter tout cela dans un fichier CSV, pour cela il faut utiliser la fonction Export-CSV
qui est expliquée plus en détail ici : https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-7.3
Pour le filtrage il existe plusieurs possibilité :
-FilterXPath
-FilterHashtable
Le premier s’appuie sur le même filtrage que l’on peut faire dans l’observateur d’événements Windows.
Il faut ensuite récupérer le filtre entre les balises Select
et l’insérer comme ceci dans la commande :
PS C:\Users\toto> Get-WinEvent Security -FilterXPath "*[System[(EventID=4104)]]"
Pour le deuxième type de filtrage, voici comment on peut effectuer un filtrage :
PS C:\Users\toto> Get-WinEvent -FilterHashtable @{ LogName='Application'; Id='1001' } -MaxEvent 1 | Format-Table -Property * -AutoSize -Wrap
Message
-------
Détecteur d'erreurs 0, type 4
Nom d’événement : APPCRASH
Réponse : Non disponible
ID de CAB : 0
[...]
On remarque ici que j’ai utilisé l’option -MaxEvent
qui permet de limiter le nombre d’événements, cela permet de travailler sur sa requête sans faire une crise d’épilepsie. Il y a également la possibilité de jouer sur la temporalité en affichant anti-chronologiquement les logs avec l’option -Oldest
.
Enfin, il est possible que vous souhaitiez faire un filtrage sur le message à la manière d’une recherche textuelle, il est possible d’utiliser la méthode suivante :
PS C:\Users\toto> Get-WinEvent Security | select @{Label='Messages';Expression={$_.properties.Value}} | Where-Object {$_.Messages -like "*docx*"}
3. Conclusion
Voilà pour l’essentiel, bien entendu il est possible de faire encore énormément de choses avec la cmdlet Get-WinEvent
. A cela vient s’ajouter le fait que Powershell embarque beaucoup de fonctions permettant le filtrage, l’affichage ou encore l’export. Avec tout cela vous êtes donc en mesure de pouvoir mener vos investigations encore plus rapidement voire même de les automatiser.
4. Bibliographie
- Formatage de la commande
Get-WinEvent
: https://learn.microsoft.com/en-us/powershell/scripting/samples/using-format-commands-to-change-output-view?view=powershell-7.3 - Utilisation de la commande
Export-CSV
: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-7.3
Merci d’avoir suivi ce petit tuto, en espérant que cela vous ait été utile. N’hésitez pas à me communiquer vos ressentis, tips…etc via le formulaire ci-dessous.