Windows Event Logs & Sysmon
Les journaux d'evenements Windows et Sysmon sont les yeux et les oreilles du defenseur. Apprends a exploiter ces sources de telemetrie pour detecter les menaces et investiguer les incidents.
- Comprendre l'architecture des Event Logs Windows et leur structure
- Maitriser les Event IDs critiques pour la detection de menaces
- Deployer et configurer Sysmon pour une visibilite avancee
- Comprendre ETW (Event Tracing for Windows) et son role en securite
- Detecter des scenarios d'attaque concrets via l'analyse de logs
- Utiliser PowerShell pour l'investigation forensique des journaux
📖 T6.1 — Introduction aux Event Logs Windows
Les Windows Event Logs sont le systeme de journalisation centralise de Windows. Chaque action significative du systeme d'exploitation, des applications et des services de securite est enregistree sous forme d'evenement structure dans des fichiers .evtx.
Les Event Logs, ce sont les cameras de surveillance du systeme. Imagine un immeuble de bureaux : chaque etage a des cameras, des capteurs d'acces aux portes et des detecteurs de mouvement. Quand un incident survient (vol, intrusion), on consulte les enregistrements pour comprendre ce qui s'est passe. Les Event Logs Windows fonctionnent exactement pareil : ils enregistrent en permanence qui fait quoi, quand et comment sur la machine. Sans eux, tu enquetes a l'aveugle.
Categories de journaux
Windows organise ses journaux en plusieurs categories principales, chacune avec un role distinct :
| Journal | Chemin dans Event Viewer | Description | Interet securite |
|---|---|---|---|
| Application | Windows Logs > Application | Evenements generes par les applications installees | Moyen — crashes d'apps, erreurs suspectes |
| Security | Windows Logs > Security | Audit des acces, authentifications, modifications de privileges | Critique — source principale pour la detection |
| System | Windows Logs > System | Evenements du noyau, des drivers et des services systeme | Eleve — installation de services, demarrage/arret |
| Setup | Windows Logs > Setup | Evenements d'installation de Windows et mises a jour | Faible — utile pour le timeline |
| Forwarded Events | Windows Logs > Forwarded Events | Evenements collectes depuis d'autres machines (WEF) | Eleve — centralisation des logs |
| Sysmon/Operational | Applications and Services Logs > Microsoft > Windows > Sysmon | Evenements detailles de Sysmon (si installe) | Critique — visibilite avancee sur les processus, reseau, fichiers |
| PowerShell/Operational | Applications and Services Logs > Microsoft > Windows > PowerShell | Activite PowerShell detaillee | Critique — detection de scripts malveillants |
Structure d'un evenement
Chaque evenement Windows est un enregistrement structure au format XML contenant les champs suivants :
| Champ | Description | Exemple |
|---|---|---|
| EventID | Identifiant numerique unique de l'evenement | 4624 (logon reussi) |
| Level | Gravite : Information, Warning, Error, Critical | Information (0) |
| Source | Composant qui a genere l'evenement | Microsoft-Windows-Security-Auditing |
| TimeCreated | Horodatage precis en UTC | 2025-01-15T14:32:05.123Z |
| Computer | Nom de la machine source | DC01.corp.local |
| Channel | Journal de destination | Security |
| Task | Categorie de l'audit | Logon (12544) |
| Keywords | Audit Success ou Audit Failure | Audit Success |
| Message / EventData | Donnees detaillees specifiques a l'evenement | TargetUserName, LogonType, IpAddress... |
Localisation des fichiers de logs
Les fichiers .evtx sont stockes dans le repertoire systeme :
# Emplacement par defaut des journaux Windows
C:\Windows\System32\winevt\Logs\
# Fichiers principaux
C:\Windows\System32\winevt\Logs\Security.evtx
C:\Windows\System32\winevt\Logs\System.evtx
C:\Windows\System32\winevt\Logs\Application.evtx
C:\Windows\System32\winevt\Logs\Microsoft-Windows-Sysmon%4Operational.evtx
C:\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx
# Taille par defaut : 20 Mo par journal (configurable)
# Format binaire .evtx (remplace le .evt depuis Vista/2008)
# Exporter un evenement en XML avec PowerShell
Get-WinEvent -LogName Security -MaxEvents 1 | Format-List *
# Structure XML typique d'un evenement 4624
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-Security-Auditing" Guid="{...}" />
<EventID>4624</EventID>
<Version>2</Version>
<Level>0</Level>
<Task>12544</Task>
<Keywords>0x8020000000000000</Keywords>
<TimeCreated SystemTime="2025-01-15T14:32:05.1234567Z" />
<Computer>DC01.corp.local</Computer>
<Channel>Security</Channel>
</System>
<EventData>
<Data Name="TargetUserName">jdupont</Data>
<Data Name="TargetDomainName">CORP</Data>
<Data Name="LogonType">10</Data>
<Data Name="IpAddress">192.168.1.50</Data>
<Data Name="LogonProcessName">User32</Data>
<Data Name="AuthenticationPackageName">Negotiate</Data>
</EventData>
</Event>
🔎 T6.2 — Event IDs critiques pour la securite
Sur les milliers d'Event IDs existants, une poignee sont essentiels pour la detection de menaces et l'investigation. Voici les incontournables que tout analyste SOC doit connaitre par coeur.
Tableau des Event IDs critiques
| Event ID | Journal | Description | Interet securite |
|---|---|---|---|
| 4624 | Security | Connexion reussie (Logon Success) | Identifier les connexions legitimes et suspectes, correler avec le LogonType |
| 4625 | Security | Echec de connexion (Logon Failure) | Detecter le brute force, le password spraying, les tentatives d'acces non autorisees |
| 4648 | Security | Connexion avec des identifiants explicites (runas) | Detecter l'utilisation de credentials volee, mouvement lateral |
| 4672 | Security | Privileges speciaux assignes a un nouveau logon | Identifier les connexions administratives, elevation de privileges suspecte |
| 4688 | Security | Un nouveau processus a ete cree | Tracking de l'execution de programmes — necessite l'activation de l'audit |
| 4697 | Security | Un service a ete installe dans le systeme | Detection de persistance via services malveillants |
| 7045 | System | Un nouveau service a ete installe | Meme role que 4697 mais dans le journal System — toujours actif |
| 4720 | Security | Un compte utilisateur a ete cree | Creation de backdoor accounts, persistence |
| 4726 | Security | Un compte utilisateur a ete supprime | Suppression de traces apres creation de comptes malveillants |
| 4732 | Security | Un membre a ete ajoute a un groupe local | Ajout au groupe Administrators — elevation de privileges |
| 4733 | Security | Un membre a ete retire d'un groupe local | Nettoyage apres ajout malveillant a un groupe |
| 1102 | Security | Le journal d'audit a ete efface | Alerte maximale — un attaquant efface ses traces |
| 4104 | PowerShell/Operational | Script Block Logging — contenu du script execute | Critique — voir le code PowerShell execute meme s'il est obfusque |
| 4656 | Security | Un handle a ete demande sur un objet | Acces a lsass.exe (credential dumping), fichiers sensibles |
| 4663 | Security | Une tentative d'acces a un objet a ete effectuee | Acces aux fichiers et registres sensibles |
| 4698 | Security | Une tache planifiee a ete creee | Persistance via scheduled tasks |
Types de connexion (Logon Types)
Le champ LogonType dans les evenements 4624/4625 revele comment l'utilisateur s'est connecte. C'est une information cruciale pour l'investigation :
| LogonType | Nom | Description | Scenario typique |
|---|---|---|---|
| 2 | Interactive | Connexion physique au clavier | Utilisateur qui se connecte sur sa machine |
| 3 | Network | Connexion reseau (partage, SMB) | Acces a un partage reseau, mouvement lateral |
| 4 | Batch | Execution de tache planifiee | Scheduled task qui s'execute sous un compte specifique |
| 5 | Service | Demarrage d'un service Windows | Service qui demarre avec un compte de service |
| 7 | Unlock | Deverrouillage de session | Retour apres verrouillage ecran |
| 8 | NetworkCleartext | Connexion reseau avec mot de passe en clair | IIS Basic Auth — suspect si inattendu |
| 9 | NewCredentials | Utilisation de credentials differents (runas /netonly) | Mouvement lateral avec credentials volee |
| 10 | RemoteInteractive | Connexion Bureau a Distance (RDP) | Administration distante, mouvement lateral RDP |
| 11 | CachedInteractive | Connexion avec credentials en cache | Laptop deconnecte du reseau |
- 4624 Type 10 + source IP inhabituelle — Mouvement lateral via RDP
- 4625 en rafale (>5 en 60s) — Brute force en cours
- 4624 Type 3 + compte admin + heure anormale — Acces reseau suspect
- 4648 + compte different du logon courant — Utilisation de credentials volee
- 4672 sur un compte non-admin — Elevation de privileges suspecte
- 1102 a n'importe quel moment — Effacement de traces, alerte maximale
👁 T6.3 — Sysmon : la visibilite avancee
Sysmon (System Monitor) est un outil gratuit de la suite Sysinternals (Microsoft) qui etend considerablement la visibilite sur l'activite systeme. La ou les Event Logs natifs manquent de details, Sysmon comble les lacunes avec une telemetrie riche et granulaire.
Si les Event Logs natifs sont des cameras de surveillance standard, Sysmon est un systeme de videosurveillance HD avec vision nocturne. Les cameras standard captent les entrees et sorties, mais Sysmon te montre aussi chaque mouvement dans chaque piece, chaque objet manipule, chaque porte ouverte. C'est la difference entre savoir que quelqu'un est entre et savoir exactement ce qu'il a fait a l'interieur.
Pourquoi Sysmon est essentiel
| Capacite | Sans Sysmon | Avec Sysmon |
|---|---|---|
| Creation de processus | Event 4688 (basique, pas de ligne de commande par defaut) | Event 1 — ligne de commande complete, hash, processus parent, user |
| Connexions reseau | Firewall log (limites) | Event 3 — processus source, IP/port destination, protocole |
| Chargement de DLL | Aucune visibilite | Event 7 — quelle DLL, signee ou non, hash |
| Injection de thread | Aucune visibilite | Event 8 — processus source et cible |
| Acces a la memoire | Event 4656 (limites) | Event 10 — acces a LSASS detectable |
| Creation de fichiers | Audit objet (bruyant) | Event 11 — creation de fichiers ciblee |
| Requetes DNS | DNS Debug Log (lourd) | Event 22 — requete DNS par processus |
Event IDs Sysmon cles
| Event ID | Nom | Description | Cas d'usage detection |
|---|---|---|---|
| 1 | Process Create | Creation d'un processus avec ligne de commande, hash, parent process | Execution de malware, LOLBins, processus suspects |
| 3 | Network Connection | Connexion TCP/UDP avec processus source, IP et port de destination | C2 callbacks, exfiltration, connexions suspectes |
| 7 | Image Loaded | Chargement d'une DLL/module par un processus | DLL hijacking, side-loading, DLL injection |
| 8 | CreateRemoteThread | Un processus cree un thread dans un autre processus | Injection de code, Cobalt Strike, Meterpreter |
| 10 | Process Access | Un processus ouvre un handle vers un autre processus | Credential dumping (acces a lsass.exe), process hollowing |
| 11 | File Create | Creation ou ecrasement d'un fichier | Malware droppe sur disque, fichiers dans Temp/Startup |
| 12/13/14 | Registry Events | Creation, modification, suppression de cles/valeurs de registre | Persistance via Run keys, modification de securite |
| 15 | FileCreateStreamHash | Creation d'un Alternate Data Stream (ADS) | Malware cache dans des ADS, mark-of-the-web |
| 17/18 | Pipe Events | Creation et connexion de named pipes | C2 via named pipes (Cobalt Strike, PsExec) |
| 22 | DNS Query | Requete DNS effectuee par un processus | DNS C2, DGA domains, exfiltration DNS |
| 23 | File Delete | Suppression de fichier (avec archivage optionnel) | Suppression de traces par l'attaquant |
| 25 | Process Tampering | Alteration d'image de processus (process hollowing, herpaderping) | Techniques d'evasion avancees |
| 26 | File Delete Logged | Suppression de fichier loguee (sans archivage) | Tracking des fichiers supprimes |
Installation et configuration de Sysmon
# Telecharger Sysmon depuis Sysinternals
# https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon
# Installation basique (configuration par defaut)
sysmon64.exe -accepteula -i
# Installation avec un fichier de configuration personnalise
sysmon64.exe -accepteula -i sysmonconfig.xml
# Mettre a jour la configuration sans reinstaller
sysmon64.exe -c sysmonconfig.xml
# Verifier le statut de Sysmon
sc query sysmon64
# Desinstaller Sysmon (si necessaire)
sysmon64.exe -u
<Sysmon schemaversion="4.90">
<!-- Capturer les hash en SHA256 -->
<HashAlgorithms>SHA256,IMPHASH</HashAlgorithms>
<!-- Archiver les fichiers supprimes -->
<ArchiveDirectory>SysmonArchive</ArchiveDirectory>
<EventFiltering>
<!-- Event ID 1 : Process Create -->
<RuleGroup name="ProcessCreate" groupRelation="or">
<ProcessCreate onmatch="exclude">
<!-- Exclure les processus systeme bruyants -->
<Image condition="is">C:\Windows\System32\conhost.exe</Image>
<Image condition="is">C:\Windows\System32\backgroundTaskHost.exe</Image>
</ProcessCreate>
</RuleGroup>
<!-- Event ID 3 : Network Connection -->
<RuleGroup name="NetworkConnect" groupRelation="or">
<NetworkConnect onmatch="include">
<!-- Capturer les connexions de processus suspects -->
<Image condition="end with">powershell.exe</Image>
<Image condition="end with">cmd.exe</Image>
<Image condition="end with">rundll32.exe</Image>
<Image condition="end with">regsvr32.exe</Image>
<Image condition="end with">mshta.exe</Image>
<Image condition="end with">certutil.exe</Image>
</NetworkConnect>
</RuleGroup>
<!-- Event ID 7 : Image Loaded (DLL) -->
<RuleGroup name="ImageLoad" groupRelation="or">
<ImageLoad onmatch="include">
<!-- DLL non signees chargees depuis des repertoires suspects -->
<Signed condition="is">false</Signed>
<ImageLoaded condition="contains">\Temp\</ImageLoaded>
<ImageLoaded condition="contains">\AppData\</ImageLoaded>
</ImageLoad>
</RuleGroup>
<!-- Event ID 10 : Process Access (LSASS protection) -->
<RuleGroup name="ProcessAccess" groupRelation="or">
<ProcessAccess onmatch="include">
<TargetImage condition="end with">lsass.exe</TargetImage>
</ProcessAccess>
</RuleGroup>
<!-- Event ID 22 : DNS Query -->
<RuleGroup name="DnsQuery" groupRelation="or">
<DnsQuery onmatch="exclude">
<!-- Exclure les requetes DNS systeme bruyantes -->
<QueryName condition="end with">.microsoft.com</QueryName>
<QueryName condition="end with">.windowsupdate.com</QueryName>
</DnsQuery>
</RuleGroup>
</EventFiltering>
</Sysmon>
⚙️ T6.4 — Event Tracing for Windows (ETW)
ETW (Event Tracing for Windows) est le mecanisme de tracing bas niveau du noyau Windows. C'est l'infrastructure sur laquelle tous les Event Logs, Sysmon, et la plupart des outils de securite reposent. Comprendre ETW permet de debloquer des sources de telemetrie que les logs classiques ne couvrent pas.
Architecture ETW
Composants systeme et applications qui emettent des evenements. Chaque provider a un GUID unique. Exemples : Microsoft-Windows-Security-Auditing, Microsoft-Windows-Kernel-Process, Microsoft-Windows-DNS-Client.
Buffers en memoire qui collectent les evenements des providers et les acheminent vers les consumers. Gerees par le ETW Controller. Sessions notables : NT Kernel Logger, EventLog-Security.
Applications qui lisent les evenements des sessions en temps reel ou depuis des fichiers .etl. Exemples : Event Viewer, Windows Defender, SIEM agents, outils de forensique.
ETW pour la securite
ETW donne acces a des telemetries invisibles dans les Event Logs classiques :
| Provider ETW | GUID | Telemetrie fournie |
|---|---|---|
| Microsoft-Windows-Threat-Intelligence | {F4E1897A-BB5D-5668-F1D8-040F4D8DD344} | Injection memoire, allocations RWX, modifications de memoire de processus |
| Microsoft-Windows-Kernel-Process | {22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716} | Creation/terminaison de processus au niveau noyau |
| Microsoft-Windows-DNS-Client | {1C95126E-7EEA-49A9-A3FE-A378B03DDB4D} | Requetes DNS detaillees |
| Microsoft-Windows-DotNETRuntime | {E13C0D23-CCBC-4E12-931B-D9CC2EEE27E4} | Chargement d'assemblies .NET (detection de .NET in-memory) |
| Microsoft-Windows-LDAP-Client | {099614A5-5DD7-4788-8BC9-E29F43DB28FC} | Requetes LDAP (BloodHound, AD enumeration) |
Commandes ETW pratiques
# Lister tous les providers ETW enregistres
logman query providers
# Rechercher un provider specifique
logman query providers | findstr /i "security"
logman query providers | findstr /i "sysmon"
# Voir les details d'un provider
logman query providers "Microsoft-Windows-Security-Auditing"
# Lister les providers actifs sur une session
logman query -ets
# Creer une session de trace pour le provider DNS
logman create trace DNSTrace -p "Microsoft-Windows-DNS-Client" -o C:\Traces\dns.etl
# Demarrer la session
logman start DNSTrace
# Laisser la trace collecter pendant un moment...
# Arreter la session
logman stop DNSTrace
# Convertir le fichier .etl en texte lisible
tracerpt C:\Traces\dns.etl -o C:\Traces\dns_report.txt -of TEXT
# Convertir en CSV pour analyse
tracerpt C:\Traces\dns.etl -o C:\Traces\dns_report.csv -of CSV
# Supprimer la session de trace
logman delete DNSTrace
# Lister les sessions ETW actives
Get-EtwTraceSession
# Lister les providers d'une session
Get-EtwTraceProvider -SessionName "EventLog-Security"
# Creer une trace en PowerShell
New-EtwTraceSession -Name "MySecurityTrace" -LogFileMode 0x2 -FlushTimer 1
Add-EtwTraceProvider -SessionName "MySecurityTrace" `
-Guid "{F4E1897A-BB5D-5668-F1D8-040F4D8DD344}" `
-Level 5 -MatchAnyKeyword 0xFFFFFFFF
# Arreter et supprimer
Stop-EtwTraceSession -Name "MySecurityTrace"
Remove-EtwTraceSession -Name "MySecurityTrace"
ntdll!EtwEventWrite en memoire, suppression de sessions de trace, ou desactivation de providers via logman. Surveiller les Event ID Sysmon 25 (Process Tampering) et les modifications des sessions ETW.
😈 T6.5 — Finding Evil : scenarios de detection
La theorie c'est bien, la pratique c'est mieux. Voici des scenarios d'attaque concrets et les requetes PowerShell correspondantes pour les detecter via les Event Logs et Sysmon.
Attaque : L'attaquant place une DLL malveillante dans un repertoire ou une application legitime va la charger a la place de la DLL legitime (DLL Search Order Hijacking).
Indicateurs : Sysmon Event ID 7 (Image Loaded) avec une DLL non signee chargee depuis un chemin inhabituel (Temp, AppData, Downloads).
# DLL non signees chargees depuis des repertoires suspects
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 7
} | Where-Object {
$_.Properties[6].Value -eq 'false' -and # Signed = false
($_.Properties[5].Value -match '\\Temp\\|\\AppData\\|\\Downloads\\|\\Desktop\\|\\Public\\')
} | Select-Object TimeCreated,
@{N='Process';E={$_.Properties[4].Value}},
@{N='DLL';E={$_.Properties[5].Value}},
@{N='Signed';E={$_.Properties[6].Value}} |
Format-Table -AutoSize
# Chercher des DLL avec des noms de DLL systeme dans des chemins anormaux
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 7
} | Where-Object {
$_.Properties[5].Value -match '(version\.dll|winhttp\.dll|dbghelp\.dll|cryptsp\.dll)' -and
$_.Properties[5].Value -notmatch 'C:\\Windows\\System32'
} | Format-List TimeCreated, Message
Attaque : L'attaquant execute des commandes PowerShell encodees en base64 ou obfusquees via des frameworks C2 (Empire, Cobalt Strike).
Indicateurs : Event ID 4104 (Script Block Logging) contenant des patterns suspects : -EncodedCommand, FromBase64String, IEX, Invoke-Expression, DownloadString.
# Rechercher des commandes PowerShell suspectes dans le Script Block Log
$suspiciousPatterns = @(
'FromBase64String',
'EncodedCommand',
'Invoke-Expression',
'IEX\s*\(',
'DownloadString',
'DownloadFile',
'Net\.WebClient',
'Invoke-Mimikatz',
'Invoke-Shellcode',
'Start-Process.*-WindowStyle.*Hidden',
'bypass',
'AmsiUtils',
'Reflection\.Assembly',
'GetDelegateForFunctionPointer',
'VirtualAlloc',
'CreateThread'
)
$regex = ($suspiciousPatterns -join '|')
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-PowerShell/Operational'
Id = 4104
} -MaxEvents 1000 | Where-Object {
$_.Message -match $regex
} | Select-Object TimeCreated,
@{N='ScriptBlock';E={$_.Message.Substring(0, [Math]::Min(200, $_.Message.Length))}} |
Format-Table -AutoSize
Attaque : L'attaquant accede au processus lsass.exe pour extraire les credentials en memoire (Mimikatz, ProcDump, comsvcs.dll).
Indicateurs : Sysmon Event ID 10 (Process Access) ciblant lsass.exe avec des droits d'acces 0x1010 ou 0x1FFFFF. Security Event 4656 avec acces a lsass.
# Detecter les acces suspects a LSASS via Sysmon
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 10
} | Where-Object {
$_.Properties[8].Value -match 'lsass\.exe' # TargetImage
} | Select-Object TimeCreated,
@{N='SourceProcess';E={$_.Properties[4].Value}},
@{N='TargetProcess';E={$_.Properties[8].Value}},
@{N='GrantedAccess';E={$_.Properties[10].Value}} |
Format-Table -AutoSize
# Via Security Log — Event 4656
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4656
} | Where-Object {
$_.Message -match 'lsass\.exe'
} | Select-Object TimeCreated,
@{N='Details';E={$_.Message.Substring(0, 300)}} |
Format-Table -Wrap
Attaque : L'attaquant utilise des credentials volees pour se connecter a d'autres machines du reseau via SMB, WMI, PsExec ou RDP.
Indicateurs : Event 4624 Type 3 (Network) ou Type 10 (RDP) avec une source IP inhabituelle ou un compte qui ne se connecte normalement pas a cette machine.
# Connexions reseau (Type 3) depuis des sources inhabituelles
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
} -MaxEvents 5000 | Where-Object {
# Logon Type 3 (Network) ou 10 (RDP)
$logonType = $_.Properties[8].Value
$sourceIP = $_.Properties[18].Value
($logonType -eq 3 -or $logonType -eq 10) -and
$sourceIP -ne '-' -and
$sourceIP -ne '::1' -and
$sourceIP -ne '127.0.0.1'
} | Select-Object TimeCreated,
@{N='User';E={$_.Properties[5].Value}},
@{N='Domain';E={$_.Properties[6].Value}},
@{N='LogonType';E={$_.Properties[8].Value}},
@{N='SourceIP';E={$_.Properties[18].Value}},
@{N='SourceHost';E={$_.Properties[11].Value}} |
Sort-Object SourceIP |
Format-Table -AutoSize
# Identifier les connexions RDP (Type 10) hors heures
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
} -MaxEvents 10000 | Where-Object {
$_.Properties[8].Value -eq 10 -and
($_.TimeCreated.Hour -lt 7 -or $_.TimeCreated.Hour -gt 20)
} | Select-Object TimeCreated,
@{N='User';E={$_.Properties[5].Value}},
@{N='SourceIP';E={$_.Properties[18].Value}} |
Format-Table -AutoSize
Attaque : L'attaquant cree un service Windows malveillant pour maintenir son acces meme apres un redemarrage.
Indicateurs : Event 7045 (System) ou 4697 (Security) avec un nom de service suspect, un chemin d'executable inhabituel, ou un service en mode auto.
# Nouveaux services installes (Event 7045 — System log)
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 7045
} | Select-Object TimeCreated,
@{N='ServiceName';E={$_.Properties[0].Value}},
@{N='ImagePath';E={$_.Properties[1].Value}},
@{N='ServiceType';E={$_.Properties[2].Value}},
@{N='StartType';E={$_.Properties[3].Value}},
@{N='AccountName';E={$_.Properties[4].Value}} |
Format-Table -AutoSize
# Filtrer les services avec des chemins suspects
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 7045
} | Where-Object {
$path = $_.Properties[1].Value
$path -match '\\Temp\\|\\AppData\\|\\Downloads\\|cmd\.exe|powershell|rundll32' -or
$path -match '\.bat$|\.ps1$|\.vbs$'
} | Select-Object TimeCreated,
@{N='ServiceName';E={$_.Properties[0].Value}},
@{N='ImagePath';E={$_.Properties[1].Value}} |
Format-Table -Wrap
Attaque : L'attaquant efface les Event Logs pour supprimer les traces de son intrusion.
Indicateurs : Event 1102 (Security log cleared) — cet evenement est toujours enregistre meme quand le journal est efface, car il est ecrit apres le vidage. C'est une alerte de severite maximale.
# Detecter l'effacement du journal Security
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 1102
} | Select-Object TimeCreated,
@{N='ClearedBy';E={$_.Properties[1].Value}},
@{N='Domain';E={$_.Properties[2].Value}} |
Format-Table -AutoSize
# Detecter l'effacement de TOUT journal (Event 104 — System)
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 104
} | Select-Object TimeCreated,
@{N='LogCleared';E={$_.Properties[0].Value}},
@{N='User';E={$_.Properties[1].Value}} |
Format-Table -AutoSize
# Verifier s'il y a des trous dans les logs (gap analysis)
$events = Get-WinEvent -LogName Security -MaxEvents 10000
$gaps = for ($i = 1; $i -lt $events.Count; $i++) {
$diff = ($events[$i-1].TimeCreated - $events[$i].TimeCreated).TotalMinutes
if ($diff -gt 60) {
[PSCustomObject]@{
GapStart = $events[$i].TimeCreated
GapEnd = $events[$i-1].TimeCreated
GapMinutes = [math]::Round($diff)
}
}
}
$gaps | Format-Table -AutoSize
🔨 T6.6 — PowerShell pour l'investigation
Get-WinEvent est l'outil PowerShell principal pour interroger les Event Logs Windows. Il remplace l'ancien Get-EventLog et supporte les requetes XPath pour un filtrage precis et performant.
Syntaxe et methodes de filtrage
# Syntaxe de base : FilterHashtable
# Filtre cote provider = RAPIDE (pas de chargement complet en memoire)
Get-WinEvent -FilterHashtable @{
LogName = 'Security' # Nom du journal
Id = 4625 # Event ID
StartTime = (Get-Date).AddDays(-7) # Depuis 7 jours
EndTime = Get-Date # Jusqu'a maintenant
} -MaxEvents 100
# Filtrer plusieurs Event IDs
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624, 4625, 4672 # Logons, echecs, privileges
}
# Filtrer par niveau de severite
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 1, 2 # 1=Critical, 2=Error
}
# Filtrer par provider
Get-WinEvent -FilterHashtable @{
ProviderName = 'Microsoft-Windows-Security-Auditing'
Id = 4688
}
# XPath permet de filtrer sur les champs EventData (plus precis)
# Echecs de logon pour un utilisateur specifique
Get-WinEvent -FilterXml @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4625)]]
and
*[EventData[Data[@Name='TargetUserName']='admin']]
</Select>
</Query>
</QueryList>
"@
# Connexions RDP (LogonType 10) depuis une IP specifique
Get-WinEvent -FilterXml @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4624)]]
and
*[EventData[Data[@Name='LogonType']='10']]
and
*[EventData[Data[@Name='IpAddress']='192.168.1.50']]
</Select>
</Query>
</QueryList>
"@
# Processus crees par cmd.exe ou powershell.exe (Event 4688)
Get-WinEvent -FilterXml @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4688)]]
and
*[EventData[Data[@Name='ParentProcessName']='C:\Windows\System32\cmd.exe'
or Data[@Name='ParentProcessName']='C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe']]
</Select>
</Query>
</QueryList>
"@
Requetes d'investigation pratiques
# === TIMELINE : reconstituer la chronologie d'un incident ===
# Tous les evenements de securite pour un utilisateur compromis
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
StartTime = '2025-01-15 08:00:00'
EndTime = '2025-01-15 20:00:00'
} | Where-Object { $_.Message -match 'jdupont' } |
Select-Object TimeCreated, Id,
@{N='Summary';E={$_.Message.Split("`n")[0]}} |
Sort-Object TimeCreated |
Export-Csv -Path C:\Investigation\timeline_jdupont.csv -NoTypeInformation
# === BRUTE FORCE : detecter les tentatives en rafale ===
# Top 10 des comptes avec le plus d'echecs de connexion
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = (Get-Date).AddHours(-24)
} | ForEach-Object {
$_.Properties[5].Value # TargetUserName
} | Group-Object | Sort-Object Count -Descending |
Select-Object -First 10 Name, Count
# === PROCESS TREE : tracer l'arbre de processus ===
# Sysmon Event 1 — voir les processus et leurs parents
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
Id = 1
StartTime = (Get-Date).AddHours(-1)
} | Select-Object TimeCreated,
@{N='Process';E={$_.Properties[4].Value}},
@{N='CommandLine';E={$_.Properties[10].Value}},
@{N='ParentProcess';E={$_.Properties[20].Value}},
@{N='ParentCommandLine';E={$_.Properties[21].Value}},
@{N='User';E={$_.Properties[12].Value}} |
Format-Table -Wrap
# === STATISTIQUES : vue d'ensemble rapide ===
# Distribution des Event IDs dans le Security log
Get-WinEvent -LogName Security -MaxEvents 50000 |
Group-Object Id |
Sort-Object Count -Descending |
Select-Object -First 20 Name, Count |
Format-Table -AutoSize
# Lister les journaux disponibles
wevtutil el
# Statistiques d'un journal
wevtutil gli Security
# Exporter un journal complet
wevtutil epl Security C:\Export\Security_backup.evtx
# Requete XPath en ligne de commande
wevtutil qe Security /q:"*[System[(EventID=4625)]]" /c:10 /f:text
# Effacer un journal (attention !)
wevtutil cl Security
# Nombre d'evenements dans un journal
wevtutil gli Security | findstr "numberOfLogRecords"
🔨 T6.7 — Lab : Terminal interactif
Exercice 1 : Investigation PowerShell
Utilise le terminal ci-dessous pour pratiquer les commandes d'investigation. Tape help pour voir les commandes disponibles.
Exercice 2 : Associe chaque Event ID a sa signification
Glisse chaque Event ID dans la zone correspondant a sa description.
✅ T6.8 — Quiz Windows Event Logs & Sysmon
Teste tes connaissances sur les journaux Windows et Sysmon. 15 questions pour valider ta maitrise du module.
Points cles du Module T6
- Les Event Logs Windows sont stockes en fichiers
.evtxdansC:\Windows\System32\winevt\Logs\— le journal Security est la source principale pour la detection - Chaque evenement a un EventID, un Level, une Source, un TimeCreated et des EventData specifiques
- Les Event IDs critiques : 4624/4625 (logon), 4688 (process), 7045 (service), 1102 (log cleared), 4104 (PowerShell)
- Le LogonType dans les events 4624/4625 revele le mode de connexion : Type 2 (local), 3 (reseau/SMB), 10 (RDP)
- Sysmon etend la visibilite avec des evenements detailles : processus (1), reseau (3), DLL (7), acces memoire (10), DNS (22)
- La configuration Sysmon SwiftOnSecurity est la reference communautaire — elle filtre le bruit et capture l'essentiel
- ETW (Event Tracing for Windows) est l'infrastructure sous-jacente de toute la telemetrie Windows — les providers ETW offrent des donnees invisibles dans les logs classiques
- Get-WinEvent avec
-FilterHashtableest la methode la plus performante pour interroger les logs — privilegier le filtrage cote provider - Les requetes XPath via
-FilterXmlpermettent de filtrer sur les champsEventDataspecifiques - Toujours correler plusieurs sources (Security + Sysmon + PowerShell) pour reconstituer une timeline d'incident complete