Construire une super timeline avec Plaso
Construire et filtrer une super timeline Windows avec Plaso : options de log2timeline, psteal et psort, fuseaux, MACB, Timeline Explorer, CSV EZ Tools, pivots.
Une super timeline fusionne tous les artefacts horodatés d'un système (métadonnées du système de fichiers, clés de registre, journaux d'événements, historique des navigateurs, Prefetch, fichiers LNK, etc.) dans une seule vue chronologique. Au lieu de jongler entre une dizaine d'outils, vous lisez une seule liste ordonnée et voyez l'incident se dérouler minute par minute. Plaso, le moteur derrière log2timeline.py, est l'outil open source de référence pour la construire. Ce guide couvre les commandes et options utiles, les fuseaux horaires, le MACB, le filtrage, l'exploitation dans Timeline Explorer, les mini-chronologies plus légères à base d'EZ Tools et les erreurs qui font perdre des heures.
Pourquoi une chronologie
Chaque artefact répond à une question étroite. Une chronologie répond à la grande : dans quel ordre les choses se sont-elles passées ? Un attaquant qui se connecte en RDP, dépose un outil, l'exécute, crée un service puis supprime l'outil touche le journal Security, la $MFT, le journal USN, Prefetch, la ruche SYSTEM et le journal System. Mises côte à côte, ces traces font apparaître les liens de cause à effet, et aussi les trous, comme ces dix minutes où le journal d'événements est vide parce que quelqu'un l'a effacé.
La chaîne d'outils Plaso
| Outil | Rôle |
|---|---|
log2timeline.py | Extrait les événements d'une image, d'un périphérique, d'un dossier ou d'un fichier vers un fichier de stockage .plaso |
psort.py | Filtre, dédoublonne et exporte un fichier de stockage (CSV, JSON lines, XLSX, OpenSearch) |
psteal.py | Enchaîne extraction et export en une seule commande |
pinfo.py | Montre le contenu d'un fichier de stockage : parseurs utilisés, nombre d'événements, avertissements |
image_export.py | Extrait des fichiers d'une image par chemin, extension ou signature |
Sous Linux ou macOS, le plus simple est l'image Docker officielle (log2timeline/plaso). Figez la version utilisée et notez-la, car la sortie des parseurs et les options évoluent d'une version à l'autre.
Étape 1 : extraire avec log2timeline
# Image disque complète, toutes les partitions, volume courant et tous les clichés instantanés
log2timeline.py --storage-file HOST01.plaso \
--partitions all --vss-stores all \
/cases/HOST01/HOST01.E01
# Un dossier de triage KAPE (bien plus rapide qu'une image complète)
log2timeline.py --storage-file HOST01-triage.plaso /cases/HOST01/triage/C
# La même chose via Docker
docker run --rm -v /cases:/data log2timeline/plaso \
log2timeline.py --storage-file /data/HOST01/HOST01-triage.plaso /data/HOST01/triage/C
Options utiles :
--partitions allet--vss-stores all(ou--no-vss) évitent les questions interactives sur les images à plusieurs partitions. Les clichés instantanés conservent souvent les anciennes ruches et les journaux qu'un attaquant a nettoyés, mais ils multiplient le temps de traitement.--parserssélectionne des parseurs ou des presets. Lancezlog2timeline.py --infopour voir ce que votre version propose. Parmi les presets historiques figurentwin7(Windows 7 et suivants) etwin_gen; ne supposez pas qu'un presetwin10existe si--infone l'affiche pas. Presets, parseurs et exclusions se combinent :--parsers "win7,!filestat".--artifact-filtersou-f/--file-filterlimitent l'extraction à des chemins connus (journaux d'événements et ruches, par exemple), ce qui ramène une image complète à un volume de triage.--workersfixe le nombre de processus de travail ;--hashers nonedésactive le calcul d'empreintes quand vous n'en avez pas besoin.--timezoneindique à Plaso comment interpréter les horodatages stockés sans indication de fuseau. La plupart des artefacts Windows sont déjà en UTC : ne le réglez sur le fuseau du système source que si vous savez que certaines sources enregistrent l'heure locale.log2timeline.py --timezone listaffiche les noms valides.
Après l'extraction, vérifiez le résultat avant de lui faire confiance :
pinfo.py HOST01.plaso
pinfo.py liste les parseurs qui ont produit des événements et les avertissements d'extraction. Zéro événement winevtx à partir d'une image Windows signifie qu'un problème est survenu, pas que les journaux étaient vides.
Étape 2 : filtrer et exporter avec psort
# Tout exporter au format l2tcsv classique (lu nativement par Timeline Explorer)
psort.py -o l2tcsv -w HOST01.csv HOST01.plaso
# Le CSV "dynamic" permet de choisir les colonnes
psort.py -o dynamic --fields datetime,timestamp_desc,source,source_long,message,parser,display_name,tag \
-w HOST01-dynamic.csv HOST01.plaso
# Seulement une fenêtre de temps (syntaxe de filtre des versions récentes)
psort.py -o l2tcsv -w window.csv HOST01.plaso \
"date > DATETIME('2026-06-20T00:00:00') AND date < DATETIME('2026-06-22T00:00:00')"
# Seulement les journaux d'événements et Prefetch, par type de données
psort.py -o l2tcsv -w focused.csv HOST01.plaso \
"data_type is 'windows:evtx:record' or data_type is 'windows:prefetch:execution'"
La syntaxe des filtres d'événements a changé au fil des versions (les anciennes comparaient date à de simples chaînes). Si un filtre échoue, consultez psort.py -h et la page sur les filtres d'événements de la documentation Plaso correspondant à votre version. psort.py -o list affiche les modules de sortie disponibles ; json_line et opensearch servent à charger les données dans d'autres plateformes. Pour Timesketch, importez directement le fichier .plaso via l'interface de Timesketch ou son importeur : l'ancien module de sortie Timesketch de psort a été retiré des versions récentes.
Dédoublonnage et étiquetage
psort supprime par défaut les événements en double, ce qui compte quand un même fichier apparaît dans le volume courant et dans plusieurs clichés instantanés. Passez -a (--include_all) si vous avez besoin de chaque copie, par exemple pour prouver à quel moment un fichier a disparu entre deux clichés.
psort peut aussi lancer des plugins d'analyse pendant l'export. Le plugin tagging applique les règles d'un fichier d'étiquetage fourni avec Plaso (tag_windows.txt dans de nombreuses versions) et étiquette des événements comme une exécution d'application, une installation de service ou l'effacement d'un journal. Les étiquettes apparaissent dans la colonne tag et permettent de sauter rapidement aux lignes intéressantes :
psort.py --analysis tagging --tagging-file tag_windows.txt \
-o l2tcsv -w HOST01-tagged.csv HOST01.plaso
Le nom et le format du fichier d'étiquetage ont évolué ; listez les fichiers du répertoire data de votre installation Plaso avant de vous y fier.
psteal pour aller vite
psteal.py --source /cases/HOST01/triage/C -o l2tcsv -w HOST01-quick.csv
psteal.py conserve aussi le fichier .plaso, que vous pourrez retrier plus tard avec d'autres filtres.
Fuseaux horaires et normalisation en UTC
La plupart des horodatages Windows sont des valeurs FILETIME en UTC : $MFT, dates de dernière écriture des clés de registre, enregistrements d'événements, dates d'exécution Prefetch. Quelques sources sont en heure locale, comme certains journaux texte et certaines bases applicatives. Plaso stocke tout en UTC et exporte en UTC, sauf si vous passez --output-time-zone à psort.
Les règles qui gardent une chronologie fiable :
- Vérifiez le fuseau du système dans
SYSTEM\ControlSet00x\Control\TimeZoneInformationavant toute interprétation. - Gardez la chronologie en UTC. Ne convertissez en heure locale que dans le rapport final, en précisant le fuseau.
- Pour chaque source externe ajoutée (pare-feu, EDR, journaux cloud), vérifiez son fuseau et la dérive de son horloge.
- Pensez aux changements d'heure quand l'enquête couvre mars ou octobre.
L'entrée UTC et heure locale recense les pièges classiques.
Lire le MACB
Les événements du système de fichiers portent les quatre horodatages MACB de NTFS :
| Lettre | Horodatage NTFS | Cause habituelle |
|---|---|---|
| M | Modified | Contenu du fichier écrit |
| A | Accessed | Fichier lu (mise à jour parfois désactivée ou différée selon la version et la configuration) |
| C | Changed (entrée $MFT) | Changement de métadonnées : renommage, permissions, déplacement dans le volume |
| B | Born | Fichier créé sur ce volume |
Dans la sortie l2tcsv, la colonne MACB indique quels horodatages partagent une même heure : MACB sur une ligne signifie que les quatre sont égaux, signe classique d'un fichier tout juste créé. Le champ timestamp_desc de la sortie dynamic nomme explicitement l'horodatage (par exemple « Creation Time » ou « Last Access Time »).
Chaque fichier possède deux jeux de ces horodatages : $STANDARD_INFORMATION et $FILE_NAME. Les outils de timestomping ne réécrivent en général que $STANDARD_INFORMATION : une date de création $SI antérieure de plusieurs années à celle de $FN doit alerter. Voir $SI contre $FN et le guide de la forensique NTFS. Une copie crée une nouvelle date de création mais conserve la date de modification d'origine : « modifié avant d'être créé » signifie donc le plus souvent « copié », pas « falsifié ».
Travailler dans Timeline Explorer
Timeline Explorer, d'Eric Zimmerman, ouvre rapidement de gros CSV et reconnaît le format l2tcsv de Plaso.
- Ouvrez le CSV et laissez le chargement se terminer ; la barre d'état affiche le nombre de lignes.
- Appliquez d'abord le filtre de plage de dates pour réduire à votre fenêtre.
- Filtrez les colonnes
SourceouSource Descriptionsur les familles d'artefacts qui vous intéressent. - Cherchez vos indicateurs (nom de fichier, utilisateur, IP) avec la recherche globale, puis effacez la recherche et étiquetez les lignes utiles pour garder leur contexte.
- Regroupez par colonne (glissez l'en-tête dans la zone de regroupement) pour repérer les rafales, comme 200 créations de fichiers dans la même seconde.
- Enregistrez la session pour conserver étiquettes et filtres, et exportez les lignes étiquetées pour le rapport.
Figez la colonne d'horodatage et masquez celles dont vous n'avez pas besoin. Une chronologie lisible vaut mieux qu'une chronologie complète illisible.
Mini-chronologies ou super timeline complète
Une super timeline complète d'une grosse image peut compter des dizaines de millions de lignes. Souvent, une mini-chronologie construite à partir de quelques sources répond plus vite.
| Approche | Quand l'utiliser | Coût |
|---|---|---|
| Mini-chronologie à partir des CSV EZ Tools | Vous savez à peu près quoi et quand ; triage | Minutes |
| Plaso avec parseurs ou filtres de fichiers limités | Plusieurs familles d'artefacts, une machine | Dizaines de minutes |
| Super timeline complète avec VSS | Périmètre inconnu, activité discrète, dossier judiciaire | Heures |
Combiner les sorties EZ Tools
Les EZ Tools (lancés un par un ou via le module !EZParser de KAPE) produisent chacun des CSV avec leurs propres colonnes d'horodatage. Pour une chronologie rapide du système de fichiers, MFTECmd peut écrire un bodyfile que l'outil mactime de The Sleuth Kit transforme en chronologie :
# $MFT vers CSV, et vers un bodyfile pour mactime
MFTECmd.exe -f D:\triage\C\$MFT --csv .\out --csvf mft.csv
MFTECmd.exe -f D:\triage\C\$MFT --body .\out --bodyf mft.body --bdl C --blf
# Journal USN, avec résolution des chemins parents via la $MFT
MFTECmd.exe -f D:\triage\C\$Extend\$J -m D:\triage\C\$MFT --csv .\out --csvf usn.csv
mactime -b mft.body -z UTC -d > mft_timeline.csv
Pour fusionner plusieurs CSV (MFT, EvtxECmd, chronologie PECmd, LECmd), ramenez-les à trois ou quatre colonnes communes (horodatage UTC, source, description, chemin) avec un court script PowerShell ou Python, puis concaténez-les. Timeline Explorer les triera ensemble. Gardez les CSV d'origine : la vue fusionnée sert à naviguer, les originaux sont vos preuves.
Pivoter à partir d'une heure suspecte connue
Le travail de chronologie le plus productif part d'un point d'ancrage : un événement que vous savez malveillant, avec une heure fiable.
- Choisissez l'ancrage : une alerte EDR, une ouverture de session 4624 de type 10 depuis une IP inconnue, une installation de service (7045), la date de création
$FNd'un fichier malveillant connu. - Découpez autour.
psort.py --slice 2026-06-21T14:07:00 --slice_size 30n'exporte que les événements situés à moins de 30 minutes de cette heure (vérifiez les noms exacts des options avecpsort.py -hselon votre version). - Lisez vers l'avant et vers l'arrière. Que s'est-il passé juste avant (l'arrivée) et juste après (exécution, persistance, mouvement latéral) ?
- Relevez les nouveaux indicateurs : noms de fichiers, comptes, chemins, IP.
- Recherchez chacun dans la chronologie complète, ce qui produit en général de nouveaux ancrages. Recommencez.
Le guide des preuves d'exécution explique ce que signifie chaque ligne d'exécution, et la forensique du mouvement latéral aide à interpréter les ouvertures de session qui relient souvent les machines entre elles.
Conseils de performance
- Traitez une collecte de triage plutôt qu'une image complète quand c'est possible : c'est souvent dix fois plus rapide, voire davantage.
- Donnez à Plaso un stockage local rapide en entrée comme en sortie ; les partages réseau sont un goulot d'étranglement fréquent.
- Ajustez
--workersau nombre de cœurs et surveillez la mémoire : chaque processus de travail consomme de la RAM. - Supprimez le superflu :
--hashers none,--no-vsspour un premier passage, exclusion des parseurs bruyants. - Un fichier de stockage par machine. Fusionner plusieurs machines dès l'extraction complique le filtrage.
- Réutilisez le fichier
.plaso: exporter différentes tranches avec psort ne coûte presque rien comparé à une nouvelle extraction.
Pièges à éviter
- Un
--timezoneerroné. Le régler sur l'heure locale pour des sources déjà en UTC décale ces événements du décalage horaire. Ne l'utilisez que pour les sources sans fuseau. - Faire confiance à un traitement non vérifié. Lancez toujours
pinfo.pyet comparez le nombre d'événements par parseur à ce que vous attendez. - Se noyer dans les lignes. Tout exporter avant d'avoir un ancrage mène à faire défiler, pas à analyser.
- Prendre un horodatage pour une action. La date de dernière écriture d'une clé dit qu'elle a changé, pas quelle valeur ; une date ShimCache est la date de modification du fichier, pas une date d'exécution.
- Ignorer les écarts entre
$SIet$FNet passer à côté d'un timestomping. - Oublier les clichés instantanés quand l'attaquant a nettoyé les journaux ou supprimé des fichiers.
- Reprendre une ancienne syntaxe de filtre copiée d'articles écrits pour d'anciennes versions de Plaso.
- Perdre la reproductibilité. Notez la version de Plaso, les commandes complètes et les filtres dans le journal d'enquête.
Liste de contrôle
- Vérifier et noter le fuseau horaire du système source
- Choisir l'approche : mini-chronologie, Plaso limité ou super timeline complète
- Lancer
log2timeline.pyavec--partitions,--vss-storeset--parsersexplicites - Valider le fichier de stockage avec
pinfo.py - Exporter avec
psort.py(l2tcsv pour Timeline Explorer), découpé autour de l'ancrage - Étiqueter les lignes utiles, relever les nouveaux indicateurs et pivoter
- Recouper les événements clés avec les artefacts sources et leurs fiches
- Consigner versions, commandes, filtres et fuseau dans le rapport
Le sens des horodatages varie selon la source : consultez les fiches de la $MFT, des journaux d'événements, de Prefetch, des fichiers LNK et de ShimCache avant de conclure. Si vous débutez, commencez par les premiers pas en investigation forensique Windows.
Domaine 12
Analyse de chronologie
Les fiches artefacts derrière ce guide : emplacement selon la version de Windows, ce que prouve chacun et les outils pour l'analyser.