Triage: verdächtige Einträge in RecentFileCache erkennen
Praktischer Leitfaden zu Pfad-Heuristiken, Basename-Eigenheiten und Laufwerk-Mustern, die eine Liste gecachter Pfade in Untersuchungs-Leads verwandeln.
Wenn du eine RecentFileCache.bcf geparst hast, hast du eine Liste von Pfaden und nichts weiter. Keine Zeitstempel, keine Hashes, keine Signierer. Die Triage-Frage lautet: welche dieser Pfade sind einen zweiten Blick wert? Dieser Post geht durch die Heuristiken, die sich in echten Fällen bewährt haben.
Die vier signalstarken Pfad-Nachbarschaften
Die meisten opportunistischen und gezielten Angreifer hinterlassen Executables in einer kleinen Auswahl beschreibbarer Verzeichnisse. Filtere deine .bcf zuerst nach diesen:
| Muster (case-insensitive) | Warum es interessant ist |
|---|---|
\AppData\Local\Temp\ | Default-Ziel für Entpackungen / Office-Downloads — auch beliebter Drop-Spot für Loader und Second-Stages |
\Windows\Temp\ | Als SYSTEM schreibbar; üblich für Malware mit Privilege Escalation |
\Users\Public\ | Weltweit beschreibbar, oft zum Sharen von Staging-Tools zwischen Accounts benutzt |
\ProgramData\ | Weltweit beschreibbarer Subtree, den manche Installer (und Malware) ausnutzen |
\PerfLogs\ | Per Default leer, merkwürdig oft von Red Teams benutzt |
\$Recycle.Bin\ | Fast nie legitim, von hier etwas auszuführen |
\Recovery\, \System Volume Information\ | Sollten system-only sein; Einträge hier verdienen Untersuchung |
In der Tabellenansicht des Parsers gruppieren sich verdächtige Nachbarschaften visuell, wenn nach Drive und dann Path sortiert wird.
Basename-Eigenheiten
Der Dateiname (letztes Segment) jedes Pfads trägt sein eigenes Signal:
- Ein- oder zweibuchstabige Namen —
a.exe,b.exe,xx.exe. Fast immer entweder Malware, Build-Artefakte oder dashelloworld.exeeines Entwicklers. Ins Ursprungsverzeichnis pivotieren. - Zufällig aussehende Strings —
j2k9f.exe,cfa31b.exe. Hohe Entropie im Basename deutet häufig auf Dropper-Output oder entpackte Stages hin. - Doppelte Erweiterungen —
invoice.pdf.exe,image.jpg.scr. Klassisches Phishing-Payload-Muster. Schon allein einen Treffer wert. - GUID-ähnliche Namen —
{f3b3c8d4-...}.exe. Entweder die per-Session-Kopie eines legitimen Installers oder Malware, die sich als solche tarnt. - Legitimer Name am falschen Ort —
svchost.exeunterC:\Users\Public\(vsC:\Windows\System32\) ist ein lehrbuchhaftes Verschieben signierter Binaries. - Nachgestellte Leerzeichen / Unicode-Tricks —
notepad .exe, Namen mit Right-to-Left-Override-Zeichen (U+202E). Der Parser bewahrt sie wortgetreu; eine Hex-Ansicht des Pfads oder ein schnellerlength(path)-Check entlarvt sie.
Laufwerksbuchstaben-Analyse
Der Parser zeigt eine drive-Spalte. Die meisten gecachten Einträge sind C:. Alles andere verdient Aufmerksamkeit:
D:,E:,F:und darüber hinaus — USB-Sticks, gemountete Shares, gemountete ISOs. Übliche Malware-Staging-Vektoren. Mit Shellbags / USBSTOR-Registry-Keys kreuzen, um das Gerät zu identifizieren.- UNC-Pfade (
\\server\share\...) — Ausführung von Netzwerk-Shares. Es lohnt sich, mit SMB-Sitzungs-Logs zu korrelieren. - Gar kein Laufwerk — Pfade, die mit einem einzelnen Namen beginnen (kein
C:, kein\\), sind für.bcfungewöhnlich und bedeuten meist, dass ein relativer Pfad aufgezeichnet wurde — was an sich interessant ist, weil der Dienst fast immer auf absolut normalisiert.
Dateinamen-→-Prozess-Pivot
Ein gegebener Basename, der in .bcf erscheint, ist kein Beweis, dass er lief — nur, dass AppCompat ihn sah. Wenn du eine Shortlist von Kandidaten hast, pivotiere:
- Prefetch (
C:\Windows\Prefetch\<NAME>-<HASH>.pf). Wenn eine entsprechende.pfexistiert, hast du ein Ausführungsereignis mit Zeitstempel(n) und einem Lauf-Counter. Amcache.hve— gleiche Ära wie.bcf, aber mit Hash, Herausgeber, Installationsdatum. Der Schwester-Parseramcache-parsermacht das client-seitig.- Die Datei auf der Platte. Wenn der Pfad noch auflöst, hashe sie und pivotiere zu VirusTotal / deinem internen IOC-Store. Wenn der Pfad nicht auflöst, wurde die Binary gelöscht — und diese Löschung ist selbst ein Ereignis, nach dem du im MFT /
$LogFilesuchen kannst.
Was nicht drin ist
Genauso wichtig: Dinge, die du in .bcf nicht erwarten solltest.
- Skripte.
.ps1,.vbs,.js,.bat,.htawerden vom Application-Experience-Scanner nicht erfasst. Eine saubere.bcfbedeutet keine saubere Maschine. - DLLs, die von signierten Hosts geladen werden. RecentFileCache kümmert sich um EXE-artige Images, die den AppCompat-Codepfad des Loaders kreuzen. DLLs, die von
rundll32.exe,regsvr32.exeodermshta.exegeladen werden, tauchen normalerweise nicht auf. - Alles, was den Loader umgangen hat. Reflective Injection, Process Hollowing, In-Memory-PE — designbedingt unsichtbar für RecentFileCache.
Ein pragmatischer Filter
Ein pragmatischer erster Pass, ausgedrückt in jq über die JSON-Ausgabe des Parsers:
jq '.entries[] | select(
(.path | ascii_downcase | test(
"\\\\(appdata\\\\local\\\\temp|windows\\\\temp|users\\\\public|programdata|perflogs|\\$recycle\\.bin)\\\\"
)) or
((.filename // "") | test("^[a-z0-9]{1,3}\\.exe$"; "i")) or
((.filename // "") | test("\\.(pdf|doc|docx|xls|xlsx|jpg|png)\\.exe$"; "i"))
) | "\(.drive // "?")\t\(.filename // "?")\t\(.path)"' rfc.json
Du bekommst eine tab-separierte Triage-Liste, bereit zum Einfügen in ein Notebook oder zum Einspeisen in eine Hash-und-VT-Schleife. Der nächste Post deckt ab, was mit den Kandidaten zu tun ist.