Zurück zu allen Beiträgen

Prefetch ist eines dieser Artefakte, die so oft als „Ausführungsbeweis" bezeichnet werden, dass Leute vergessen zu fragen, was es eigentlich beweist. Es beweist, dass Windows einen Prozess gestartet hat, der eine ausführbare Datei mit einem bestimmten Namen und Pfad-Hash ausführte. Das genügt, um viele Fälle abzuschließen. Es genügt nicht, um alle abzuschließen, und die Lücke ist genau dort, wo ich beobachtet habe, wie Analysten Behauptungen aufstellten, die sie nicht verteidigen konnten.

Dieser Beitrag ist die Version von „was sagt uns Prefetch", die ich für jemanden schreiben würde, der gleich in eine strittige Untersuchung läuft.

Was Prefetch ist, schlicht ausgedrückt

Windows beobachtet die ersten zehn Sekunden jedes neu gestarteten Prozesses. Es zeichnet auf, welche Dateien der Prozess berührt, welche DLLs er lädt und wie Speicherseiten eingelagert wurden. Diese Spur wird komprimiert und als .pf-Datei in C:\Windows\Prefetch\ abgelegt. Beim nächsten Start derselben ausführbaren Datei liest Windows die .pf-Datei, um die voraussichtlich benötigten Seiten vorzuladen — daher der Name.

Das ist der operative Zweck. Der forensische Wert ist beiläufig: Weil Windows wissen muss, was vorzuladen ist, muss es sich merken, dass die ausführbare Datei lief. Also hält Prefetch pro Binärdatei einen Datensatz mit den letzten acht Ausführungen, der Gesamtzahl der Ausführungen, dem aufgelösten Pfad der Binärdatei und einer Liste der geladenen Dateien.

Das Format des Dateinamens ist <EXECNAME>-<HASH>.pf, wobei der Hash aus dem vollständigen Pfad berechnet wird (und ab Win10+ manchmal aus weiterem Kontext), sodass dieselbe Binärdatei, aus zwei unterschiedlichen Verzeichnissen ausgeführt, zwei unterschiedliche .pf-Dateien erhält. Das ist wichtig: Ein Angreifer, der psexec.exe in C:\Users\victim\AppData\Local\Temp\ kopiert, erzeugt einen anderen Prefetch-Eintrag als ein legitimes psexec.exe in C:\Program Files\. Sie können die beiden auf einen Blick unterscheiden.

Was es tatsächlich beweist

Eine .pf-Datei beweist, dass eine ausführbare Datei mit dem eingebetteten Namen gestartet wurde — also dass ein Prozess erzeugt wurde und weit genug lief, um vom Prefetch-Dienst beobachtet zu werden. Das ist eine starke Behauptung. Stärker als Shimcache, stärker als AmCache und stärker als das USN-Journal allein.

Was es nicht beweist:

  • Es beweist nicht, dass die Datei am Pfad auf der Festplatte heute die Datei ist, die lief. Prefetch zeichnet den Pfad der ausführbaren Datei auf, nicht ihren Hash. Wenn evil.exe gelöscht und später eine harmlose evil.exe an demselben Ort abgelegt wurde, verweist die .pf auf „die ausführbare Datei an diesem Pfad" — die jetzt eine andere Datei ist.
  • Es beweist nicht, dass ein Mensch sie gestartet hat. Windows startet Prozesse aus allen möglichen automatisierten Gründen. Eine .pf für cmd.exe bedeutet, dass cmd gestartet ist; sie bedeutet nicht, dass ein Benutzer etwas hineingetippt hat.
  • Es beweist nicht, was die Binärdatei tat, als sie lief. Sie erhalten die Load-Liste, nicht die Befehlszeile. Für Argumente brauchen Sie Sysmon EID 1 oder Security 4688.
  • Es beweist nicht die Ausführung in einem bestimmten Benutzerkontext. Prefetch ist pro Maschine. Die „Wer?"-Frage braucht ein anderes Artefakt.

Wenn Sie nur eine Erkenntnis mitnehmen: Prefetch ist Ausführungsbeweis auf Ebene der Binärdatei, nicht auf Benutzer-, Befehls- oder Verhaltensebene.

Die Win10/11-Eigenheiten, die Leute beißen

Jahrelang lautete die Devise „Windows behält die letzten acht Ausführungszeiten". Ab Win10 1709+ wurde das zu „bis zu acht als Maximum", aber regelmäßig weniger — Windows fing an, ältere Einträge während Wartungsfenstern aggressiv ablaufen zu lassen. Wenn Sie eine .pf lesen und nur drei Ausführungszeitstempel finden, schließen Sie nicht, dass die Binärdatei nur dreimal lief. Sie lief mindestens dreimal.

Unter Win11 22H2 und neuer wird Prefetch auf SSDs unter bestimmten Bedingungen vom Betriebssystem teilweise deaktiviert. Microsoft nennt das Optimierung. Forensisch ist es eine Lücke. Auf SSD-gestützten Win11-Hosts habe ich gesehen, dass die Prefetch-Abdeckung auf vielleicht 60 % der Ausführungen sinkt. Prüfen Sie immer HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefetcher und EnableSuperfetch auf dem Host, bevor Sie annehmen, dass Prefetch vollständig ist. Der Standardwert 3 bedeutet, dass beide aktiv sind; 0 bedeutet aus.

Server sind schlimmer. Prefetch ist auf Windows Server standardmäßig deaktiviert. Viele Estates haben eine GPO, die es einschaltet, viele nicht. Wenn Sie DFIR auf einem Server machen und es kein Prefetch-Verzeichnis gibt oder das Verzeichnis leer ist, kann das schlicht die Voreinstellung sein — nicht zwingend Angreifer-Manipulation.

Das MAM-Format (Win10+ komprimiertes Prefetch) ist mit älteren Offline-Parsern inkompatibel. Eric Zimmermans PECmd behandelt es korrekt; viele der älteren Python-Parser tun das nicht und produzieren stillschweigend falsche Ergebnisse. Ich habe Berichte gesehen, die auf prefetchparser.py-Ausgaben aus einem Win10-Host basierten und strukturell falsch waren, weil der Parser MAM-komprimierte Dateien stillschweigend übersprungen hatte.

Die Zeitstempel lesen, ohne hereingelegt zu werden

Jede .pf-Datei enthält bis zu acht Ausführungszeiten und eine „Last run"-Zeit. Das Format ist FILETIME (100-Nanosekunden-Intervalle seit 1601 UTC), und die Zeiten sind die Zeiten, zu denen Windows begann, den Prozess zu überwachen, nicht die Zeiten, zu denen die Binärdatei auf der Festplatte war. Diese Unterscheidung ist in einem konkreten Fall wichtig.

Last run minus Created (der .pf-Datei selbst, aus NTFS) ist ungefähr die Lebensdauer des Eintrags. Wenn Last run jüngst ist, die .pf-Datei aber vor zwei Jahren erstellt wurde, läuft die Binärdatei seit zwei Jahren auf diesem Host. Das allein kann die Hypothese „Wir haben dieses Tool zum ersten Mal überhaupt gesehen" ausschließen. Paaren Sie es mit der MFT für die eigenen Daten der Binärdatei.

Wo ich Analysten in die Falle laufen sehe: einen .pf-„Last run" mit einer 4688-„Process create" anderswo auf dem Host zu vergleichen und sie als dieselbe Zeit zu behandeln. Sie sind nah, aber nicht identisch, und der Offset variiert zwischen Builds und CPU-Lasten. Innerhalb weniger Sekunden ist normal. Bei einer Minute Lücke sehen Sie dieselbe Ausführung. Bei einer Stunde sehen Sie zwei verschiedene Ausführungen.

Die Datei-Load-Liste, und wofür sie gut ist

Über den Ausführungszähler hinaus enthält jede .pf eine Liste der Dateien, die das Executable in seinen ersten zehn Sekunden geöffnet hat. Bis zu ~1000 Einträge auf einer normalen Binärdatei, alle als von Windows zur Laufzeit aufgelöste Pfade gespeichert. Diesen Teil überfliegen die meisten Leute.

Die Load-Liste ist, wohin ich schaue, wenn ich beantworten muss, was dieser Prozess berührt hat. Drei Muster, nach denen ich routinemäßig suche:

  • Hinweise auf DLL-Search-Order-Hijacking. Eine vertrauenswürdige Binärdatei, die eine DLL aus \AppData\Local\Temp\ statt aus \System32\ lädt, taucht in der Load-Liste als Pfad auf. Sortieren Sie nach Pfad-Präfix.
  • Konfigurationsdateien für Malware. Viel kommerzielle Malware lädt ihre Konfiguration von einem festen Dateinamen neben der Binärdatei. \AppData\Roaming\<tool>\config.bin und ähnliche Pfade sind tote Indizien.
  • Dokumentöffnungen. Wenn winword.exe \Users\bob\Documents\offer-letter.docx in seiner Load-Liste hat und Sie eine Phishing-Behauptung untersuchen, ist das Bestätigung, dass das Dokument auf diesem Host geöffnet wurde. Paaren Sie mit den LNK-Dateien und Jump Lists für den Benutzer-Kontext.

Die Load-Liste enthält keine geschriebenen Dateien, nur gelesene (im breiten Sinn, dass Windows Page Faults auf ihnen verfolgt). Für Schreibvorgänge brauchen Sie Sysmon EID 11.

Anti-Forensik und was hält

Angreifer können .pf-Dateien löschen und tun das auch. Drei Dinge sollten Sie wissen:

  1. Das Löschen der .pf-Datei löscht die Spur in der MFT nicht. Eine Prefetch-Löschung hinterlässt einen FileDelete | Close-USN-Datensatz und einen MFT-Eintrag, der bis zur Wiederverwendung verbleibt. Wenn das Verzeichnis verdächtig leer aussieht, parsen Sie das USN-Journal.
  2. Prefetcher mitten in einer Untersuchung zu deaktivieren ist einfach und erkennbar. Eine Registry-Wertänderung in PrefetchParameters aktualisiert das LastWrite der SYSTEM-Hive. Gegen VSC-Snapshots vergleichen.
  3. Die .pf-Dateien der Binärdateien, die der Angreifer mitbringt, bleiben oft zurück. Das ist das Geschenk, das immer weiter gibt. Angreifer bereinigen die offensichtlichen Stellen — die Binärdatei selbst, das Staging-Verzeichnis — und vergessen Prefetch. Ich habe Fälle abgeschlossen, in denen die einzige überlebende Spur einer umbenannten Mimikatz die MIMI-xxxxxx.pf-Datei war, die nie aufgeräumt wurde.

Ein Workflow, den ich tatsächlich fahre

Reihenfolge auf einem Host, auf dem Prefetch relevant ist:

  1. Erfassen Sie das gesamte C:\Windows\Prefetch\-Verzeichnis. Erhalten Sie Dateisystem-Zeitstempel; nicht mit etwas kopieren, das sie zurücksetzt.
  2. Listen Sie nach NTFS-Created absteigend. Alles, was während des vermuteten Fensters erstellt wurde, kommt auf die engere Liste.
  3. Parsen Sie zu einer flachen Tabelle: Dateiname, Name der ausführbaren Datei, Pfad, Ausführungszähler, letzte 8 Ausführungszeiten.
  4. Sortieren Sie aufsteigend nach Ausführungszähler. Single-Run-Binärdateien mit Pfaden in benutzerschreibbaren Locations sind interessant. Many-Run-Binärdateien in \System32\ sind normal.
  5. Für jede interessante Zeile holen Sie die Load-Liste und suchen die obigen Muster.
  6. Untermauern Sie mit Sysmon / Security EVTX, indem Sie Pfad und Ausführungszeiten abgleichen. Hier wird aus der Prefetch-Behauptung eine verteidigungsfähige Ausführungsbehauptung.

Schritt 4 ist das, worauf ich Analysten am häufigsten coache. Kontraintuitiv sind die Binärdateien, die einmal liefen, in der Regel interessanter als die, die hundertmal liefen.

Wo Prefetch ins Gesamtbild passt

Es ist eines von mehreren Werkzeugen, und die stärksten Behauptungen kombinieren es mit anderen. Prefetch setzt einen Namen auf die Liste. AmCache setzt einen Hash daneben. Shimcache sagt, dass Windows sich die Datei irgendwann angesehen hat. Die MFT verortet die Datei in Zeit und Raum. Das USN-Journal erzählt, was mit ihr geschah. Sysmon und Security sagen Ihnen, wer, wann und mit welchen Argumenten.

Behandeln Sie Prefetch als Dreh- und Angelpunkt für „die Binärdatei lief", und Sie verwenden es korrekt. Behandeln Sie es als Antwort auf „was passierte auf diesem Host", und Sie liegen falsch.

.pf-Dateien im Browser lesen

Der Parser auf dieser Seite dekodiert Win10/11-MAM-komprimierte Prefetch-Dateien sowie das alte SCCA-Format direkt in Ihrem Browser, ohne Upload. Werfen Sie eine .pf (oder das gesamte Verzeichnis) hinein und Sie erhalten den Namen der ausführbaren Datei, den Ausführungszähler, die acht Ausführungszeiten und die Datei-Load-Liste in einer sortierbaren Tabelle. Nützlich, wenn die Prefetch-Inhalte des Hosts sensibel genug sind, dass Sie sie lieber keinem Drittanbieterdienst übergeben.

Weiterführende Literatur

Wenn der Prefetch-Dienst deaktiviert war, hilft Ihnen nichts davon. Prüfen Sie zuerst.