
Windows Log Forensisch Onderzoek
- Jean-Christophe Miler
- Soc , Cybersecurity
- 12 februari 2026
Table of Contents
Overzicht
Een praktisch SOC-analist project voor het onderzoeken van Windows beveiligingsgebeurtenissen en het detecteren van potentiële indringingen met behulp van systeemlogboeken.
Leerdoelen
- Analyseer Windows Event Logs op beveiligingsincidenten
- Identificeer patronen van kwaadaardige activiteit
- Correlleer gebeurtenissen uit verschillende logboekbronnen
- Bouw een tijdlijn van beveiligingsgebeurtenissen
- Documenteer forensische bevindingen
Projectstructuur
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
Benodigde Tools
- Windows Event Viewer
- Python 3.8+ met
evtxbibliotheek - Velociraptor of Hayabusa voor logboekanalyse
- Tijdlijnanalyse tools
- Splunk/ELK stack (Optioneel)
Onderzoeksscenario’s
Scenario 1: Verdachte Aanmeldingactiviteit
- Analyseer mislukte aanmeldingspogingen (Event ID 4625)
- Identificeer potentiële brute-force aanvallen
- Detecteer zijwaartse beweging (Event ID 4624, Aanmeldtype 3)
- Volg ongebruikelijke authenticatiepatronen
Scenario 2: Kwaadaardige Procesuitvoering
- Onderzoek verdachte procescreatie (Event ID 4688)
- Analyseer PowerShell scriptblokken (Event ID 4104)
- Detecteer potentiële living-off-the-land technieken
- Identificeer procesinjectiepogingen
Scenario 3: Privileges Escalatie Pogingen
- Monitor op ongebruikelijke privilegewijzigingen (Event ID 4670)
- Analyseer service creatie/wijziging (Event ID 7045)
- Detecteer geplande taak creatie (Event ID 4698)
- Onderzoek registermodificaties
Belangrijke Event ID’s om te Monitoren
Authenticatie Gebeurtenissen
- 4624: Account aanmelding geslaagd
- 4625: Account aanmelding mislukt
- 4634: Account afmelding
- 4648: Expliciet gebruikte referenties
- 4768/4769: Kerberos authenticatie
Proces Gebeurtenissen
- 4688: Nieuw proces aangemaakt
- 4689: Proces beëindigd
- 4656/4663: Objecttoegang
- 4103/4104: PowerShell scriptblok logging
Systeem Gebeurtenissen
- 7045: Nieuwe service geïnstalleerd
- 4698: Geplande taak aangemaakt
- 4670: Machtigingen gewijzigd op object
Voorbeeld Analyse Scripts
Event Log Parser
import evtx
import xml.etree.ElementTree as ET
from datetime import datetime
def parse_security_events(evtx_file, event_ids=None):
"""
Parse Windows Security Event Log
"""
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):
"""
Detecteer potentiële brute-force aanvallen
"""
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
Tijdlijn Bouwer
import pandas as pd
from datetime import datetime, timedelta
def build_incident_timeline(events, start_time, end_time):
"""
Bouw een tijdlijn van beveiligingsgebeurtenissen
"""
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):
"""Genereer leesbare gebeurtenisbeschrijving"""
event_id = event['event_id']
data = event['data']
descriptions = {
'4625': f"Mislukte aanmelding voor {data.get('TargetUserName')} vanaf {data.get('IpAddress')}",
'4624': f"Geslaagde aanmelding voor {data.get('TargetUserName')} vanaf {data.get('IpAddress')}",
'4688': f"Proces aangemaakt: {data.get('NewProcessName')} door {data.get('SubjectUserName')}",
'4104': f"PowerShell script uitgevoerd door {data.get('UserId')}"
}
return descriptions.get(event_id, f"Gebeurtenis {event_id} heeft plaatsgevonden")
Onderzoeksstappen
1. Initiële Beoordeling
- Verzamel relevante logboekbestanden
- Bepaal tijdsvenster voor onderzoek
- Identificeer kritieke systemen en gebruikers
- Etableer basisactiviteit
2. Gebeurteniscorrelatie
- Corrleer authenticatiegebeurtenissen met procescreatie
- Koppel netwerkverbindingen aan toepassingsgebeurtenissen
- Identificeer sequenties van verdachte activiteiten
- Bouw aanvalsketen tijdlijn
3. Anomaliedetectie
- Identificeer ongebruikelijke aanmeldingstijden/locaties
- Detecteer privileges escalatie pogingen
- Vind verdachte procesuitvoeringen
- Markeer niet-geautoriseerde systeemwijzigingen
4. Impactbeoordeling
- Bepaal getroffen accounts en systemen
- Beoordeel data-access en exfiltratierisico’s
- Identificeer persistentiemechanismen
- Evalueer bedrijfsimpact
5. Documentatie
- Creëer gedetailleerde tijdlijn van gebeurtenissen
- Documenteer alle bevindingen en bewijs
- Geef herstelaanbevelingen
- Update detectieregels
Voorbeeld Onderzoeksbevindingen
Brute-Force Aanval Detectie
Tijdlijn:
2026-02-12 08:00:15 - Mislukte aanmeldingspoging voor admin (192.168.1.100)
2026-02-12 08:00:16 - Mislukte aanmeldingspoging voor admin (192.168.1.100)
[... 15 meer mislukte pogingen ...]
2026-02-12 08:05:22 - Geslaagde aanmelding voor admin (192.168.1.100)
Bevindingen:
- 16 mislukte pogingen gevolgd door geslaagde aanmelding
- Bron IP: 192.168.1.100
- Doel: Administrator account
- Wijst op potentiële credential compromittering
Kwaadaardige PowerShell Activiteit
Gedetecteerde Gebeurtenissen:
2026-02-12 09:15:30 - PowerShell scriptblok uitgevoerd (EncodedCommand)
2026-02-12 09:15:31 - Proces aangemaakt: powershell.exe (Base64 encoded payload)
2026-02-12 09:15:32 - Netwerkverbinding naar 185.14.28.45:443
Analyse:
- Gecodeerde PowerShell commando's gedetecteerd
- Verdachte netwerkactiviteit na uitvoering
- Potentiële malware download/uitvoering
Verwachte Opleveringen
- Voltooid forensisch analyse rapport
- Gebeurtenistijdlijn met annotaties
- IOC lijst uit logboekanalyse
- Detectieregel aanbevelingen
- Blogpost die onderzoeksproces documenteert
Uitbreidingsideeën
- Geautomatiseerde logboekanalyse pipeline
- Integratie met SIEM voor real-time detectie
- Machine learning model voor anomaliedetectie
- Aangepast dashboard voor beveiligingsmonitoring
Bronnen
Veiligheidsnotities
- Werk met gesaneerde logboekgegevens voor training
- Volg keten van custodie procedures voor echte incidenten
- Documenteer alle analysestappen
- Valideer bevindingen met meerdere bronnen


