Aller au contenu

12 · Analyse de chronologie

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.

Publié le Mis à jour le 11 min de lecture

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

OutilRôle
log2timeline.pyExtrait 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.pyFiltre, dédoublonne et exporte un fichier de stockage (CSV, JSON lines, XLSX, OpenSearch)
psteal.pyEnchaîne extraction et export en une seule commande
pinfo.pyMontre le contenu d'un fichier de stockage : parseurs utilisés, nombre d'événements, avertissements
image_export.pyExtrait 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 all et --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.
  • --parsers sélectionne des parseurs ou des presets. Lancez log2timeline.py --info pour voir ce que votre version propose. Parmi les presets historiques figurent win7 (Windows 7 et suivants) et win_gen ; ne supposez pas qu'un preset win10 existe si --info ne l'affiche pas. Presets, parseurs et exclusions se combinent : --parsers "win7,!filestat".
  • --artifact-filters ou -f/--file-filter limitent 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.
  • --workers fixe le nombre de processus de travail ; --hashers none désactive le calcul d'empreintes quand vous n'en avez pas besoin.
  • --timezone indique à 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 list affiche 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\TimeZoneInformation avant 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 :

LettreHorodatage NTFSCause habituelle
MModifiedContenu du fichier écrit
AAccessedFichier lu (mise à jour parfois désactivée ou différée selon la version et la configuration)
CChanged (entrée $MFT)Changement de métadonnées : renommage, permissions, déplacement dans le volume
BBornFichier 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.

  1. Ouvrez le CSV et laissez le chargement se terminer ; la barre d'état affiche le nombre de lignes.
  2. Appliquez d'abord le filtre de plage de dates pour réduire à votre fenêtre.
  3. Filtrez les colonnes Source ou Source Description sur les familles d'artefacts qui vous intéressent.
  4. 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.
  5. 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.
  6. 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.

ApprocheQuand l'utiliserCoût
Mini-chronologie à partir des CSV EZ ToolsVous savez à peu près quoi et quand ; triageMinutes
Plaso avec parseurs ou filtres de fichiers limitésPlusieurs familles d'artefacts, une machineDizaines de minutes
Super timeline complète avec VSSPérimètre inconnu, activité discrète, dossier judiciaireHeures

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.

  1. 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 $FN d'un fichier malveillant connu.
  2. Découpez autour. psort.py --slice 2026-06-21T14:07:00 --slice_size 30 n'exporte que les événements situés à moins de 30 minutes de cette heure (vérifiez les noms exacts des options avec psort.py -h selon votre version).
  3. 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) ?
  4. Relevez les nouveaux indicateurs : noms de fichiers, comptes, chemins, IP.
  5. 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 --workers au nombre de cœurs et surveillez la mémoire : chaque processus de travail consomme de la RAM.
  • Supprimez le superflu : --hashers none, --no-vss pour 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 --timezone erroné. 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.py et 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 $SI et $FN et 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.py avec --partitions, --vss-stores et --parsers explicites
  • 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.

Articles liés