
Enquête Forensique des Journaux Windows
- Jean-Christophe Miler
- Soc , Cybersécurité
- 12 février 2026
Table of Contents
Vue d’Ensemble
Un projet pratique d’analyste SOC pour enquêter sur les événements de sécurité Windows et détecter les intrusions potentielles à l’aide des journaux système.
Objectifs d’Apprentissage
- Analyser les journaux d’événements Windows pour les incidents de sécurité
- Identifier les modèles d’activité malveillante
- Corréler les événements à partir de différentes sources de journaux
- Construire une chronologie des événements de sécurité
- Documenter les conclusions forensiques
Structure du Projet
windows-log-forensics/
├── sample-logs/
│ ├── security.evtx
│ ├── system.evtx
│ ├── application.evtx
│ └── powershell.evtx
├── analysis-scripts/
│ ├── event-parser.py
│ ├── timeline-builder.py
│ └── anomaly-detector.py
├── tools/
│ ├── evtx-dump.py
│ └── log-parser.py
├── documentation/
│ ├── windows-event-id-reference.md
│ └── investigation-checklist.md
├── reports/
│ └── forensic-analysis-template.md
└── README.md
Outils Requis
- Observateur d’Événements Windows
- Python 3.8+ avec la bibliothèque
evtx - Velociraptor ou Hayabusa pour l’analyse des journaux
- Outils d’analyse de chronologie
- Pile Splunk/ELK (Optionnel)
Scénarios d’Enquête
Scénario 1: Activité de Connexion Suspideuse
- Analyser les tentatives de connexion échouées (ID d’événement 4625)
- Identifier les attaques par force brute potentielles
- Détecter le mouvement latéral (ID d’événement 4624, Type de connexion 3)
- Suivre les modèles d’authentification inhabituels
Scénario 2: Exécution Malveillante de Processus
- Enquêter sur la création suspecte de processus (ID d’événement 4688)
- Analyser les blocs de scripts PowerShell (ID d’événement 4104)
- Détecter les techniques Living-off-the-land potentielles
- Identifier les tentatives d’injection de processus
Scénario 3: Tentatives d’Escalade de Privilèges
- Surveiller les changements de privilèges inhabituels (ID d’événement 4670)
- Analyser la création/modification de services (ID d’événement 7045)
- Détecter la création de tâches planifiées (ID d’événement 4698)
- Enquêter sur les modifications du registre
Principaux ID d’Événements à Surveiller
Événements d’Authentification
- 4624: Connexion au compte réussie
- 4625: Connexion au compte échouée
- 4634: Déconnexion du compte
- 4648: Identifiants explicites utilisés
- 4768/4769: Authentification Kerberos
Événements de Processus
- 4688: Nouveau processus créé
- 4689: Processus terminé
- 4656/4663: Accès aux objets
- 4103/4104: Journalisation des blocs de scripts PowerShell
Événements Système
- 7045: Nouveau service installé
- 4698: Tâche planifiée créée
- 4670: Permissions modifiées sur un objet
Exemples de Scripts d’Analyse
Analyseur de Journaux d’Événements
import evtx
import xml.etree.ElementTree as ET
from datetime import datetime
def parse_security_events(evtx_file, event_ids=None):
"""
Analyser le journal de sécurité Windows
"""
events = []
with evtx.Evtx(evtx_file) as log:
for record in log.records():
xml = record.xml()
root = ET.fromstring(xml)
event_id = root.find('.//EventID').text
if event_ids and event_id not in event_ids:
continue
timestamp = root.find('.//System/TimeCreated').get('SystemTime')
timestamp = datetime.fromisoformat(timestamp.replace('Z', '+00:00'))
event_data = {}
for data in root.findall('.//EventData/Data'):
name = data.get('Name')
event_data[name] = data.text
events.append({
'timestamp': timestamp,
'event_id': event_id,
'data': event_data
})
return events
def detect_brute_force(events, threshold=10, time_window=300):
"""
Détecter les attaques par force brute potentielles
"""
failed_logins = [e for e in events if e['event_id'] == '4625']
attacks = []
for i, event in enumerate(failed_logins):
window_events = []
for later_event in failed_logins[i:]:
time_diff = (later_event['timestamp'] - event['timestamp']).total_seconds()
if time_diff <= time_window:
window_events.append(later_event)
else:
break
if len(window_events) >= threshold:
attacks.append({
'start_time': event['timestamp'],
'count': len(window_events),
'target_account': event['data'].get('TargetUserName'),
'source_ip': event['data'].get('IpAddress')
})
return attacks
Constructeur de Chronologie
import pandas as pd
from datetime import datetime, timedelta
def build_incident_timeline(events, start_time, end_time):
"""
Construire une chronologie des événements de sécurité
"""
timeline = []
for event in events:
event_time = event['timestamp']
if start_time <= event_time <= end_time:
timeline.append({
'timestamp': event_time,
'event_id': event['event_id'],
'description': get_event_description(event),
'severity': get_event_severity(event['event_id']),
'details': event['data']
})
return sorted(timeline, key=lambda x: x['timestamp'])
def get_event_description(event):
"""Générer une description lisible de l'événement"""
event_id = event['event_id']
data = event['data']
descriptions = {
'4625': f"Échec de connexion pour {data.get('TargetUserName')} depuis {data.get('IpAddress')}",
'4624': f"Connexion réussie pour {data.get('TargetUserName')} depuis {data.get('IpAddress')}",
'4688': f"Processus créé: {data.get('NewProcessName')} par {data.get('SubjectUserName')}",
'4104': f"Script PowerShell exécuté par {data.get('UserId')}"
}
return descriptions.get(event_id, f"Événement {event_id} s'est produit")
Étapes d’Enquête
1. Évaluation Initiale
- Collecter les fichiers journaux pertinents
- Déterminer la fenêtre temporelle de l’enquête
- Identifier les systèmes et utilisateurs critiques
- Établir l’activité de référence
2. Corrélation des Événements
- Corréler les événements d’authentification avec la création de processus
- Lier les connexions réseau aux événements d’application
- Identifier les séquences d’activités suspectes
- Construire la chronologie de la chaîne d’attaque
3. Détection d’Anomalies
- Identifier les heures/lieux de connexion inhabituels
- Détecter les tentatives d’escalade de privilèges
- Trouver les exécutions de processus suspectes
- Signaler les modifications système non autorisées
4. Évaluation de l’Impact
- Déterminer les comptes et systèmes affectés
- Évaluer les risques d’accès et d’exfiltration de données
- Identifier les mécanismes de persistance
- Évaluer l’impact sur l’entreprise
5. Documentation
- Créer une chronologie détaillée des événements
- Documenter toutes les conclusions et preuves
- Fournir des recommandations de correction
- Mettre à jour les règles de détection
Exemples de Conclusions d’Enquête
Détection d’Attaque par Force Brute
Chronologie:
2026-02-12 08:00:15 - Tentative de connexion échouée pour admin (192.168.1.100)
2026-02-12 08:00:16 - Tentative de connexion échouée pour admin (192.168.1.100)
[... 15 tentatives échouées supplémentaires ...]
2026-02-12 08:05:22 - Connexion réussie pour admin (192.168.1.100)
Conclusions:
- 16 tentatives échouées suivies d'une connexion réussie
- IP source: 192.168.1.100
- Cible: Compte Administrateur
- Indique une compromission potentielle des identifiants
Activité Malveillante PowerShell
Événements Détectés:
2026-02-12 09:15:30 - Bloc de script PowerShell exécuté (EncodedCommand)
2026-02-12 09:15:31 - Processus créé: powershell.exe (Payload encodé en Base64)
2026-02-12 09:15:32 - Connexion réseau vers 185.14.28.45:443
Analyse:
- Commandes PowerShell encodées détectées
- Activité réseau suspecte après l'exécution
- Téléchargement/exécution de malware potentiel
Résultats Attendus
- Rapport d’analyse forensique complet
- Chronologie des événements avec annotations
- Liste des IOC来源于 l’analyse des journaux
- Recommandations de règles de détection
- Article de blog documentant le processus d’enquête
Idées d’Extension
- Pipeline d’analyse automatisé des journaux
- Intégration avec SIEM pour la détection en temps réel
- Modèle d’apprentissage automatique pour la détection d’anomalies
- Tableau de bord personnalisé pour la surveillance de la sécurité
Ressources
Notes de Sécurité
- Travailler avec des données de journaux assainies pour la formation
- Suivre les procédures de chaîne de custody pour les incidents réels
- Documenter toutes les étapes d’analyse
- Valider les conclusions avec plusieurs sources


