Que fait Analyse des fichiers Prefetch pour l'historique d'exécution ?
Quand l'utiliser
- Lors de la détermination des programmes exécutés sur un système Windows et de leur date d'exécution
- Lors d'enquêtes sur des malwares pour confirmer l'exécution de binaires suspects
- Pour établir une chronologie d'utilisation des applications lors d'un incident
- Lors de la corrélation de l'exécution de programmes avec d'autres artéfacts forensiques
- Pour identifier des outils anti-forensiques ou des logiciels non autorisés qui ont été exécutés
Prérequis
- Accès au répertoire Prefetch Windows (C:\Windows\Prefetch) à partir d'une image forensique
- PECmd (Eric Zimmerman), WinPrefetchView ou un analyseur python-prefetch
- Compréhension du format des fichiers Prefetch (versions 17, 23, 26, 30)
- Système Windows avec Prefetch activé (par défaut sur les OS clients, désactivé sur les serveurs)
- Connaissance des conventions de nommage Prefetch (APPNAME-HASH.pf)
Workflow
Étape 1 : Extraire les fichiers Prefetch de l'image forensique
# Monter l'image forensique
mount -o ro,loop,offset=$((2048*512)) /cases/case-2024-001/images/evidence.dd /mnt/evidence
# Copier tous les fichiers prefetch
mkdir -p /cases/case-2024-001/prefetch/
cp /mnt/evidence/Windows/Prefetch/*.pf /cases/case-2024-001/prefetch/
# Compter et lister les fichiers prefetch
ls -la /cases/case-2024-001/prefetch/ | wc -l
ls -la /cases/case-2024-001/prefetch/ | head -30
# Hacher tous les fichiers prefetch pour l'intégrité
sha256sum /cases/case-2024-001/prefetch/*.pf > /cases/case-2024-001/prefetch/pf_hashes.txt
# Remarque : le format du nom de fichier Prefetch est NOM_EXECUTABLE-XXXXXXXX.pf
# Le hachage (XXXXXXXX) est basé sur le chemin de l'exécutable
# Un même exécutable provenant de chemins différents crée différents fichiers prefetch
Étape 2 : Analyser les fichiers Prefetch avec PECmd
# Utilisation de PECmd d'Eric Zimmerman (Windows ou via Mono/Wine sur Linux)
# Téléchargement sur https://ericzimmerman.github.io/
# Analyser un seul fichier prefetch
PECmd.exe -f "C:\cases\prefetch\POWERSHELL.EXE-A]B2C3D4.pf"
# Analyser tous les fichiers prefetch et exporter en CSV
PECmd.exe -d "C:\cases\prefetch\" --csv "C:\cases\analysis\" --csvf prefetch_results.csv
# Analyser avec sortie JSON
PECmd.exe -d "C:\cases\prefetch\" --json "C:\cases\analysis\" --jsonf prefetch_results.json
# La sortie inclut pour chaque fichier :
# - Nom et chemin de l'exécutable
# - Nombre d'exécutions
# - Dernier horodatage d'exécution (jusqu'à 8 horodatages dans Windows 10)
# - Fichiers et répertoires référencés lors de l'exécution
# - Informations sur le volume (numéro de série, date de création)
# - Date de création du fichier Prefetch
Étape 3 : Analyser avec Python pour une analyse sous Linux
pip install prefetch
python3 << 'PYEOF'
import os
import json
from datetime import datetime
# Analyser les fichiers prefetch en utilisant Python
import struct
def parse_prefetch(filepath):
"""Analyse un fichier Prefetch Windows."""
with open(filepath, 'rb') as f:
data = f.read()
# Vérifier le format compressé MAM (Windows 10)
if data[:4] == b'MAM\x04':
import lznt1 # ou utiliser DecompressBuffer
# Les fichiers Prefetch de Windows 10 sont compressés
print(f" [Format Win10 compressé - utilisez PECmd pour une analyse complète]")
return None
# Version 17 (XP), 23 (Vista/7), 26 (8.1), 30 (10)
version = struct.unpack('<I', data[0:4])[0]
signature = data[4:8]
if signature != b'SCCA':
print(f" Signature Prefetch invalide")
return None
file_size = struct.unpack('<I', data[8:12])[0]
exec_name = data[16:76].decode('utf-16-le').strip('\x00')
run_count = struct.unpack('<I', data[208:212])[0] if version >= 23 else struct.unpack('<I', data[144:148])[0]
result = {
'version': version,
'executable': exec_name,
'file_size': file_size,
'run_count': run_count,
}
# Extraire les derniers horodatages d'exécution
if version == 23: # Vista/7 - 1 horodatage
ts = struct.unpack('<Q', data[128:136])[0]
result['last_run'] = filetime_to_datetime(ts)
elif version >= 26: # Win8+ - jusqu'à 8 horodatages
timestamps = []
for i in range(8):
ts = struct.unpack('<Q', data[128+i*8:136+i*8])[0]
if ts > 0:
timestamps.append(filetime_to_datetime(ts))
result['last_run_times'] = timestamps
return result
def filetime_to_datetime(ft):
"""Convertit un FILETIME Windows en chaîne datetime."""
if ft == 0:
return None
timestamp = (ft - 116444736000000000) / 10000000
try:
return datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S UTC')
except (OSError, ValueError):
return None
# Traiter tous les fichiers prefetch
prefetch_dir = '/cases/case-2024-001/prefetch/'
results = []
for filename in sorted(os.listdir(prefetch_dir)):
if filename.lower().endswith('.pf'):
filepath = os.path.join(prefetch_dir, filename)
print(f"\n=== {filename} ===")
result = parse_prefetch(filepath)
if result:
print(f" Exécutable : {result['executable']}")
print(f" Nombre d'exécutions : {result['run_count']}")
if 'last_run' in result:
print(f" Dernière exécution : {result['last_run']}")
elif 'last_run_times' in result:
for i, ts in enumerate(result['last_run_times']):
print(f" Exécution {i+1} : {ts}")
results.append(result)
# Sauvegarder les résultats
with open('/cases/case-2024-001/analysis/prefetch_analysis.json', 'w') as f:
json.dump(results, f, indent=2)
PYEOF
Étape 4 : Identifier les preuves d'exécution suspectes
# Rechercher des noms d'outils malveillants connus dans le prefetch
ls /cases/case-2024-001/prefetch/ | grep -iE \
'(MIMIKATZ|PSEXEC|WMIC|COBALT|BEACON|PWDUMP|PROCDUMP|LAZAGNE|RUBEUS|BLOODHOUND|SHARPHOUND|CERTUTIL|BITSADMIN)'
# Rechercher des interpréteurs de script (exécution malveillante potentielle)
ls /cases/case-2024-001/prefetch/ | grep -iE \
'(POWERSHELL|CMD\.EXE|WSCRIPT|CSCRIPT|MSHTA|REGSVR32|RUNDLL32|MSIEXEC)'
# Rechercher des outils d'accès à distance
ls /cases/case-2024-001/prefetch/ | grep -iE \
'(TEAMVIEWER|ANYDESK|LOGMEIN|VNC|SPLASHTOP|SCREENCONNECT|AMMYY)'
# Rechercher des outils d'exfiltration de données
ls /cases/case-2024-001/prefetch/ | grep -iE \
'(RAR|7Z|ZIP|RCLONE|MEGA|DROPBOX|ONEDRIVE|GDRIVE|FTP|CURL|WGET)'
# Trouver les fichiers prefetch récemment créés (exécutables les plus récents)
ls -lt /cases/case-2024-001/prefetch/ | head -20
# Recouper avec Shimcache et Amcache pour confirmation
# La présence d'un fichier Prefetch = le programme a été exécuté au moins une fois
Étape 5 : Construire une chronologie d'exécution
# Créer une chronologie à partir des données prefetch
python3 << 'PYEOF'
import json
import csv
with open('/cases/case-2024-001/analysis/prefetch_analysis.json') as f:
data = json.load(f)
timeline = []
for entry in data:
if 'last_run_times' in entry:
for ts in entry['last_run_times']:
if ts:
timeline.append({
'timestamp': ts,
'executable': entry['executable'],
'run_count': entry['run_count'],
'source': 'Prefetch'
})
elif 'last_run' in entry and entry['last_run']:
timeline.append({
'timestamp': entry['last_run'],
'executable': entry['executable'],
'run_count': entry['run_count'],
'source': 'Prefetch'
})
# Trier chronologiquement
timeline.sort(key=lambda x: x['timestamp'])
# Écrire le fichier CSV de chronologie
with open('/cases/case-2024-001/analysis/execution_timeline.csv', 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['timestamp', 'executable', 'run_count', 'source'])
writer.writeheader()
writer.writerows(timeline)
# Afficher la fenêtre temporelle suspecte
for entry in timeline:
if '2024-01-15' in entry['timestamp'] or '2024-01-16' in entry['timestamp']:
print(f" {entry['timestamp']} | {entry['executable']} (x{entry['run_count']})")
PYEOF
Concepts clés
| Concept | Description |
|---|---|
| Prefetch | Optimisation des performances Windows qui précharge les données des applications et suit leur exécution |
| Signature SCCA | Octets magiques identifiant un fichier Prefetch valide |
| Hachage de chemin | Hachage CRC du chemin de l'exécutable formant une partie du nom de fichier .pf |
| Nombre d'exécutions | Nombre de lancements de l'exécutable (peut dépasser la capacité) |
| Horodatages de dernière exécution | Windows 8+ stocke jusqu'à 8 horodatages d'exécution les plus récents |
| Fichiers référencés | Liste des fichiers et répertoires accédés pendant les 10 premières secondes d'exécution |
| Informations sur le volume | Numéro de série du disque et date de création identifiant le volume source |
| Compression MAM | Les fichiers Prefetch Windows 10 utilisent la compression MAM4 nécessitant une décompression avant analyse |
Outils et systèmes
| Outil | Objectif |
|---|---|
| PECmd | Analyseur Prefetch d'Eric Zimmerman avec sortie CSV/JSON |
| WinPrefetchView | Outil GUI NirSoft pour visualiser les fichiers Prefetch |
| python-prefetch | Bibliothèque Python pour analyser les fichiers Prefetch |
| Prefetch Hash Calculator | Outil pour calculer le hachage attendu à partir des chemins d'exécutables |
| KAPE | Collecte automatisée d'artéfacts incluant Prefetch |
| Autopsy | Plateforme forensique avec module d'analyse Prefetch |
| Plaso/log2timeline | Outil de super-chronologie incluant un analyseur Prefetch |
| Velociraptor | Agent de point de terminaison avec des artéfacts de collecte et d'analyse Prefetch |
Scénarios courants
Scénario 1 : Confirmer l'exécution d'un malware Recherchez dans le répertoire Prefetch le nom de l'exécutable du malware, confirmez l'exécution via la présence du fichier Prefetch, extrayez le nombre d'exécutions et le dernier horodatage d'exécution, identifiez les DLL référencées pour comprendre le comportement du malware, corrélez avec les entrées de démarrage automatique du registre.
Scénario 2 : Chronologie d'utilisation des outils d'un attaquant Identifiez les fichiers Prefetch pour PsExec, Mimikatz, BloodHound et autres outils d'attaquant, construisez une chronologie chronologique des exécutions d'outils, déterminez la séquence de l'attaque (reconnaissance, vol d'identifiants, mouvement latéral), faites correspondre les horodatages avec les journaux de connexion réseau.
Scénario 3 : Préparation et exfiltration de données Recherchez les entrées Prefetch d'outils de compression (7z, WinRAR, zip), identifiez l'exécution d'utilitaires de transfert de fichiers (rclone, clients FTP), vérifiez l'exécution de clients de stockage cloud, chronométrez les opérations de préparation et de transfert de données.
Scénario 4 : Détection d'anti-forensique Vérifiez l'exécution d'outils anti-forensiques connus (CCleaner, Eraser, SDelete), identifiez si le répertoire Prefetch a récemment été vidé (moins de fichiers que prévu pour un système actif), notez les horodatages des exécutions d'outils anti-forensiques par rapport aux autres preuves.
Format de sortie
Résumé de l'analyse Prefetch :
Système : Windows 10 Pro (Build 19041)
Fichiers Prefetch : 234
Période d'analyse : Tout l'historique d'exécution disponible
Statistiques d'exécution :
Total d'exécutables uniques : 234
Première exécution : 2023-06-15 (installation du système)
Dernière exécution : 2024-01-18 23:45 UTC
Exécutions suspectes :
MIMIKATZ.EXE-5F2A3B1C.pf
Nombre d'exécutions : 3 | Dernière : 2024-01-16 02:30:15 UTC
PSEXEC.EXE-AD70946C.pf
Nombre d'exécutions : 7 | Dernière : 2024-01-16 02:45:30 UTC
RCLONE.EXE-1F3E5A2B.pf
Nombre d'exécutions : 2 | Dernière : 2024-01-17 03:15:00 UTC
POWERSHELL.EXE-022A1004.pf
Nombre d'exécutions : 145 | Dernière : 2024-01-18 14:00:00 UTC
Chronologie des attaques (d'après Prefetch) :
2024-01-15 14:32 - POWERSHELL.EXE (accès initial)
2024-01-16 02:30 - MIMIKATZ.EXE (vol d'identifiants)
2024-01-16 02:45 - PSEXEC.EXE (mouvement latéral)
2024-01-17 03:15 - RCLONE.EXE (exfiltration de données)
Rapport : /cases/case-2024-001/analysis/execution_timeline.csv