Paalkia CTF

Hexagone CTF / Forensics / Panthère Silencieuse 3/4

Medium T1070.006 Opération Panthère Silencieuse

Panthère Silencieuse 3/4

Timestomp MFT

01Énoncé

Un outil a été déposé sur le poste et maquillé pour se fondre dans la masse. À partir du triage fourni, identifie le fichier malveillant et la manière dont l'attaquant a tenté de le dissimuler. Soumets trois éléments : le secret contenu dans le fichier, son chemin complet, et la technique employée pour masquer le fichier.

02Contexte

L'attaquant a déposé un binaire sur FIN-WKS-07 et a maquillé ses dates pour le faire passer pour un vieux fichier système. Ce challenge porte sur l'analyse du système de fichiers NTFS et la détection de timestomping.

TTP de référence : Indicator Removal, manipulation d'horodatage (timestomp). Acteurs comparables : APT28, APT29.

03Artefact

  • PANTHERE-EVD-03.zip contenant un dossier disk/
  • Le $MFT (seul artefact utile)
  • Hives SYSTEM/SECURITY/SAM/SOFTWARE, Amcache.hve, NTUSER et UsrClass de j.martin, des dizaines de prefetch, les tâches planifiées, SRUDB.dat

04Difficulté

Le $MFT parsé en CSV compte 921 347 lignes. Le fichier recherché porte un nom légitime de Windows et des dates crédibles en apparence. Il faut savoir quels attributs NTFS comparer pour le démasquer. Du bruit a aussi été ajouté (registre, tâches planifiées, prefetch...). Il faut donc faire un vrai travail de tri et bien comprendre ce qu'on a sous les yeux.

05Résolution

Étape 1 : choisir l'artefact

Le triage contient plusieurs sources, mais l'énoncé parle d'un fichier déposé sur le disque. Le $MFT est la référence : chaque fichier du volume NTFS y possède un enregistrement, avec son nom, son dossier parent et ses horodatages.

Étape 2 : parser le $MFT

PowerShell
C:\Tools\EZTools\net9\MFTECmd.exe -f '.\$MFT' --csv . --csvf "mft.csv"
C:\Tools\EZTools\net9\TimelineExplorer\TimelineExplorer.exe
Le CSV du $MFT ouvert dans Timeline Explorer

MFTECmd (EZ Tools) convertit le $MFT en CSV : une ligne par fichier, avec son chemin complet (ParentPath), sa taille et ses horodatages. Timeline Explorer permet de filtrer ce CSV.

Étape 3 : chercher le fichier maquillé

Clic droit sur Parent Path > Filter Editor.

Menu Filter Editor dans Timeline Explorer
Filtre Timeline Explorer
Contains([Extension], '.exe') And Not Contains([Parent Path], 'Windows') And Not Contains([Parent Path], 'Program Files')
Filtre dans le Filter Editor
Les 20 exécutables restants

On cherche les exécutables situés hors des emplacements standards (Windows et Program Files). Le CSV passe de 921 347 lignes à 20.

Sur ces 20 exécutables :

  • les binaires OneDrive dans AppData\Local\Microsoft\OneDrive : installation légitime par utilisateur ;
  • les binaires Sysmon dans \lab\Sysmon : outil de supervision installé sur le poste ;
  • FacturePro_Update.exe dans Downloads : suspect, mais son nom n'imite aucun fichier système, il ne cherche pas à se fondre dans la masse ;
  • RuntimeBroker.exe dans \ProgramData\Intel.

« Se fondre dans la masse » suggère un nom de fichier légitime. RuntimeBroker.exe est un processus Windows qui réside dans C:\Windows\System32. Sa présence dans ProgramData\Intel, un dossier lui aussi au nom rassurant, est anormale : c'est du masquerading.

Limite du filtre : il exclut tout chemin contenant Windows, y compris AppData\Roaming\Microsoft\Windows, emplacement prisé des attaquants. Il fonctionne ici, mais ne suffirait pas dans tous les cas.

Ligne RuntimeBroker.exe dans ProgramData\Intel

Étape 4 : confirmer le timestomping

Colonnes Created0x10 et Created0x30

Autre anomalie : un timestomping. Les horodatages du fichier trahissent une seconde technique. NTFS stocke deux jeux de dates par fichier :

  • $STANDARD_INFORMATION (0x10) : celles qu'affiche l'Explorateur, modifiables par n'importe quel programme via l'API Windows ;
  • $FILE_NAME (0x30) : mises à jour par le noyau, hors de portée des outils classiques.

MFTECmd ne remplit la colonne Created0x30 que lorsqu'elle diffère de Created0x10. Elle est vide pour tous les fichiers, sauf RuntimeBroker.exe :

  • $SI création : 2021-03-14 08:12:00
  • $FN création : 2026-11-05 09:19:30

Le fichier prétend exister depuis 2021, mais le noyau a enregistré sa création pendant l'intrusion. L'attaquant a vieilli la date $SI pour le noyer parmi les fichiers anciens : c'est du timestomping. Les secondes rondes (08:12:00, fractions à zéro) confirment une date saisie à la main.

Étape 5 : extraire le contenu

Deux méthodes possibles.

Méthode 1 : HxD

On regarde la taille du fichier.

Colonne File Size : 70 octets

La colonne File Size indique 70 octets. Chaque enregistrement MFT fait 1024 octets. Quand les données d'un fichier tiennent dans l'espace restant après l'en-tête et les autres attributs (en pratique moins de 700 octets environ), NTFS les stocke directement dans l'enregistrement : c'est un fichier résident. Son contenu est donc lisible dans le $MFT lui-même, sans l'image disque.

Entry Number 2830

On récupère l'Entry Number du fichier : 2830. Les enregistrements étant contigus et de taille fixe, l'offset se calcule : 2830 × 1024 = 2 897 920, soit 0x2C3800 en hexadécimal.

On ouvre $MFT dans HxD, puis Search > Go to > 2C3800.

Go to 2C3800 dans HxD
Enregistrement MFT 2830 dans HxD

L'enregistrement commence par la signature FILE0, propre à chaque entrée MFT. On y lit le nom du fichier en UTF-16 (RuntimeBroker.exe), puis en clair dans l'attribut $DATA :

Contenu résident
RWX{mft_t1m3st0mp_si_vs_fn} :: panthere loader stub (internal build)

Méthode 2 : MFTECmd.exe

On reprend l'Entry Number, puis :

PowerShell
C:\Tools\EZTools\net9\MFTECmd.exe -f '.\$MFT' --de 2830
Sortie de MFTECmd --de 2830

L'option --de (dump entry) affiche le détail de l'enregistrement : attributs, horodatages et contenu résident, ici en ASCII.

La sortie apporte une preuve supplémentaire du timestomping. Dans STANDARD INFO, trois dates sont fixées à 2021-03-14 08:12:00.0000000, mais Record Modified On vaut 2026-11-05 09:19:42.

Ce champ, mis à jour à chaque modification de l'enregistrement, n'est pas modifiable par l'API utilisée pour falsifier les dates. Il révèle le moment de la falsification : 12 secondes après la création réelle du fichier (09:19:30 dans $FILE_NAME).

06Réponses

  • Secret : RWX{mft_t1m3st0mp_si_vs_fn}
  • Chemin : C:\ProgramData\Intel\RuntimeBroker.exe
  • Technique : timestomping

07Pistes de détection

  • Un exécutable au nom système (RuntimeBroker.exe, svchost.exe...) en dehors de System32.
  • Un fichier dont la date de création $SI est antérieure à celle de son $FN.
  • Des horodatages ronds, aux fractions de seconde nulles.
  • MITRE ATT&CK : T1070.006 (timestomp), T1036.005 (masquerading).

08Note du concepteur

Objectif pédagogique

Trier un $MFT volumineux pour isoler un fichier qui se fait passer pour un binaire Windows. Il faut raisonner sur l'emplacement des exécutables (un nom système hors de System32), puis prouver le timestomping en comparant $STANDARD_INFORMATION et $FILE_NAME. Le challenge introduit aussi la notion de fichier résident : un petit fichier dont le contenu se lit directement dans le $MFT, sans image disque.

Validation renforcée

Le flag est greppable en clair dans le $MFT. Pour forcer l'analyse, la soumission exige trois éléments : le flag, le chemin complet et la technique. Le chemin complet est le discriminant, car il existe beaucoup de RuntimeBroker.exe légitimes. L'énoncé reste volontairement vague.