Analyse des Journaux d'Événements Windows dans Splunk
Quand l'utiliser
Utilisez cette compétence lorsque :
- Les analystes SOC enquêtent sur des alertes liées à l'authentification Windows, à l'exécution de processus ou aux modifications Active Directory
- Les ingénieurs en détection construisent des requêtes SPL pour la détection de menaces basées sur Windows
- Les répondants aux incidents ont besoin de frises chronologiques forensiques des activités des endpoints Windows ou des contrôleurs de domaine
- La chasse aux menaces périodique cible des techniques ATT&CK spécifiques à Windows
Ne pas utiliser pour l'analyse d'endpoints Linux/macOS ou pour les investigations réseau uniquement.
Prérequis
- Splunk avec des données de journaux d'événements Windows ingérées (sourcetype
WinEventLog:Security,WinEventLog:System,XmlWinEventLog:Microsoft-Windows-Sysmon/Operational) - Sysmon déployé sur les endpoints avec la configuration SwiftOnSecurity ou Olaf Hartong
- Accélération du modèle de données CIM pour les modèles de données Endpoint et Authentication
- Connaissance des Event IDs de sécurité Windows et des types d'événements Sysmon
Workflow
Étape 1 : Détection des attaques d'authentification
Détection de force brute (EventCode 4625 — Échec de connexion) :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4625
| stats count, dc(TargetUserName) AS unique_users, values(TargetUserName) AS targeted_users
by src_ip, Logon_Type, Status
| where count > 20
| eval attack_type = case(
Logon_Type=3, "Force brute réseau",
Logon_Type=10, "Force brute RDP",
Logon_Type=2, "Force brute interactive",
1=1, "Autre"
)
| eval status_meaning = case(
Status="0xc000006d", "Mauvais nom d'utilisateur ou mot de passe",
Status="0xc000006a", "Mot de passe incorrect (utilisateur valide)",
Status="0xc0000234", "Compte verrouillé",
Status="0xc0000072", "Compte désactivé",
1=1, Status
)
| sort - count
| table src_ip, attack_type, status_meaning, count, unique_users, targeted_users
Détection de pulvérisation de mots de passe :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4625 Logon_Type=3
| bin _time span=10m
| stats dc(TargetUserName) AS unique_users, count AS total_attempts,
values(TargetUserName) AS users_targeted by src_ip, _time
| where unique_users > 10 AND total_attempts < unique_users * 3
| eval spray_confidence = if(unique_users > 25, "ÉLEVÉE", "MOYENNE")
Connexion réussie après échecs (indicateur de compromission) :
index=wineventlog sourcetype="WinEventLog:Security"
(EventCode=4625 OR EventCode=4624) src_ip!="127.0.0.1"
| sort _time
| stats earliest(_time) AS first_seen, latest(_time) AS last_seen,
sum(eval(if(EventCode=4625,1,0))) AS failures,
sum(eval(if(EventCode=4624,1,0))) AS successes
by src_ip, TargetUserName, ComputerName
| where failures > 10 AND successes > 0
| eval time_to_success = round((last_seen - first_seen)/60, 1)
| sort - failures
Étape 2 : Détection d'élévation de privilèges
Nouveau compte administrateur créé (T1136.001) :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4720
| join TargetUserName type=left [
search index=wineventlog EventCode=4732 TargetUserName="Administrators"
| rename MemberName AS TargetUserName
]
| table _time, SubjectUserName, TargetUserName, ComputerName
| eval alert = "Nouveau compte créé et ajouté au groupe Administrateurs"
Privilèges spéciaux attribués (EventCode 4672) :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4672
SubjectUserName!="SYSTEM" SubjectUserName!="LOCAL SERVICE" SubjectUserName!="NETWORK SERVICE"
| stats count, values(PrivilegeList) AS privileges by SubjectUserName, ComputerName
| where count > 0
| search privileges IN ("SeDebugPrivilege", "SeTcbPrivilege", "SeBackupPrivilege",
"SeRestorePrivilege", "SeAssignPrimaryTokenPrivilege")
Détection de manipulation de jetons (T1134) :
index=sysmon EventCode=10 TargetImage="*\\lsass.exe"
GrantedAccess IN ("0x1010", "0x1038", "0x1fffff", "0x40")
| stats count by SourceImage, SourceUser, Computer, GrantedAccess
| where NOT match(SourceImage, "(svchost|csrss|wininit|MsMpEng|CrowdStrike)")
| sort - count
Étape 3 : Détection de mécanismes de persistance
Création de tâche planifiée (T1053.005) :
index=wineventlog (sourcetype="WinEventLog:Security" EventCode=4698)
OR (sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
Image="*\\schtasks.exe")
| eval task_info = coalesce(TaskContent, CommandLine)
| search task_info="*powershell*" OR task_info="*cmd*" OR task_info="*http*" OR task_info="*\\Temp\\*"
| table _time, Computer, SubjectUserName, TaskName, task_info
Modification de clé de registre Run (T1547.001) :
index=sysmon EventCode=13
TargetObject IN (
"*\\CurrentVersion\\Run\\*",
"*\\CurrentVersion\\RunOnce\\*",
"*\\CurrentVersion\\RunServices\\*",
"*\\Explorer\\Shell Folders\\*"
)
| stats count by Computer, Image, TargetObject, Details
| where NOT match(Image, "(explorer\\.exe|msiexec\\.exe|setup\\.exe)")
| sort - count
Abonnement WMI (T1546.003) :
index=sysmon EventCode=20 OR EventCode=21
| stats count by Computer, Operation, Consumer, EventNamespace
| where count > 0
Étape 4 : Détection de mouvement latéral
Exploitation de service à distance (T1021.002 — SMB/Partages administratifs Windows) :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=3
| stats dc(ComputerName) AS unique_destinations, values(ComputerName) AS targets
by src_ip, TargetUserName
| where unique_destinations > 3
| sort - unique_destinations
| table src_ip, TargetUserName, unique_destinations, targets
Détection PsExec (T1021.002) :
index=sysmon EventCode=1
(Image="*\\psexec.exe" OR Image="*\\psexesvc.exe"
OR ParentImage="*\\psexesvc.exe"
OR OriginalFileName="psexec.c")
| table _time, Computer, User, ParentImage, Image, CommandLine
Mouvement latéral RDP (T1021.001) :
index=wineventlog sourcetype="WinEventLog:Security" EventCode=4624 Logon_Type=10
| stats count, dc(ComputerName) AS rdp_targets, values(ComputerName) AS destinations
by src_ip, TargetUserName
| where rdp_targets > 2
| sort - rdp_targets
Étape 5 : Construire une frise chronologique forensique
Créer une frise chronologique complète pour un hôte compromis :
(index=wineventlog OR index=sysmon) Computer="WORKSTATION-042"
earliest="2024-03-14T00:00:00" latest="2024-03-16T00:00:00"
| eval event_description = case(
EventCode=4624, "Connexion : ".TargetUserName." (Type ".Logon_Type.")",
EventCode=4625, "Échec de connexion : ".TargetUserName,
EventCode=4688 OR (sourcetype="XmlWinEventLog:*Sysmon*" AND EventCode=1),
"Processus : ".Image." CMD : ".CommandLine,
EventCode=4698, "Tâche planifiée : ".TaskName,
EventCode=3, "Réseau : ".DestinationIp.":".DestinationPort,
EventCode=11, "Fichier créé : ".TargetFilename,
EventCode=13, "Registre : ".TargetObject,
1=1, "Événement ".EventCode
)
| sort _time
| table _time, EventCode, event_description, User, src_ip
Étape 6 : Créer des tables de recherche pour l'enrichissement
Construire des tables de référence pour le contexte des Event IDs Windows :
| inputlookup windows_eventcode_lookup.csv
| table EventCode, Description, ATT_CK_Technique, Severity
Si la table n'existe pas, la créer :
EventCode,Description,ATT_CK_Technique,Severity
4624,Connexion réussie,T1078,Information
4625,Échec de connexion,T1110,Faible
4648,Connexion avec informations d'identification explicites,T1078,Moyen
4672,Privilèges spéciaux attribués,T1134,Moyen
4688,Nouveau processus créé,T1059,Information
4698,Tâche planifiée créée,T1053.005,Moyen
4720,Compte utilisateur créé,T1136.001,Élevé
4732,Membre ajouté à un groupe de sécurité,T1098,Élevé
4768,Ticket TGT Kerberos demandé,T1558,Information
4769,Ticket de service Kerberos,T1558.003,Faible
4771,Pré-authentification Kerberos échouée,T1110,Faible
Concepts clés
| Terme | Définition |
|---|---|
| EventCode 4624 | Connexion réussie — Logon_Type 2 (interactive), 3 (réseau), 10 (RDP), 7 (déverrouillage) |
| EventCode 4625 | Échec de connexion — Le code d'état indique la raison de l'échec (mauvais mot de passe, compte verrouillé, désactivé) |
| Sysmon EventCode 1 | Création de processus avec la ligne de commande complète, le processus parent et les hachages |
| Sysmon EventCode 3 | Connexion réseau initiée par un processus — IP source/destination, port et contexte du processus |
| Logon Type 3 | Connexion réseau (SMB, WMI, PowerShell Remoting) — indicateur clé de mouvement latéral |
| Logon Type 10 | Connexion interactive à distance via RDP/Services Terminal |
Outils et systèmes
- Splunk Enterprise : Plateforme SIEM avec moteur de requêtes SPL pour l'analyse et la corrélation des journaux d'événements Windows
- Sysmon (System Monitor) : Outil Microsoft Sysinternals fournissant une journalisation détaillée des processus, du réseau et de l'activité des fichiers
- Splunk CIM : Modèle d'information commun mappant les événements Windows à des champs normalisés pour les requêtes multi-sources
- Windows Event Forwarding (WEF) : Mécanisme Windows intégré pour centraliser les journaux d'événements vers un serveur collecteur
Scénarios courants
- Kerberoasting (T1558.003) : Détecter EventCode 4769 avec un type de chiffrement 0x17 (RC4) pour des comptes de service non standard
- DCSync (T1003.006) : Détecter EventCode 4662 avec DS-Replication-Get-Changes à partir de sources autres que des contrôleurs de domaine
- Golden Ticket (T1558.001) : Détecter EventCode 4769 avec des propriétés de ticket anormales (durée de vie longue, chiffrement non standard)
- Pass-the-Hash (T1550.002) : Détecter EventCode 4624 Logon_Type 3 avec authentification NTLM à partir de sources inattendues
- DLL Side-Loading (T1574.002) : Sysmon EventCode 7 montrant des DLL non signées chargées par des processus légitimes
Format de sortie
ANALYSE DES JOURNAUX D'ÉVÉNEMENTS WINDOWS — HÔTE : WORKSTATION-042
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Période : 2024-03-14 au 2024-03-15
Événements : 12 847 total (Security : 9 231 | Sysmon : 3 616)
Résumé d'authentification :
Connexions réussies (4624) : 487 (Type 3 : 312, Type 10 : 45, Type 2 : 130)
Échecs de connexion (4625) : 847 (depuis 192.168.1.105 — FORCE BRUTE)
Identifiants explicites (4648) : 12
Constatations suspectes :
[ÉLEVÉ] 847 échecs de connexion suivis d'une réussite à 14:35 depuis 192.168.1.105
[ÉLEVÉ] Nouvel utilisateur "backdoor_admin" créé (4720) à 14:38
[ÉLEVÉ] Utilisateur ajouté au groupe Administrateurs (4732) à 14:38
[MOYEN] schtasks.exe crée une tâche de persistance à 14:42
[MOYEN] Exécution de commande PowerShell encodée à 14:45
Cartographie ATT&CK :
T1110.001 — Devinette de mot de passe (847 échecs de connexion)
T1136.001 — Création de compte local (backdoor_admin)
T1053.005 — Tâche planifiée (persistance)
T1059.001 — PowerShell (exécution encodée)