Handelsübliche Malware mit Amcache jagen
Wenn Sie an einem Windows-Host ankommen, der sich „komisch anfühlt" — ein Benutzer meldete merkwürdiges Verhalten, ein EDR warf eine Niedrigkonfidenz-Warnung, ein Firewall-Log zeigt etwas, was der Host nicht tun sollte — ist Amcache eines der schnellsten Artefakte, das Ihnen eine Ja-/Nein-Antwort auf „Gibt es hier offensichtliches Angreifer-Tooling?" gibt.
Diese Seite ist das Triage-Playbook für handelsübliche Malware: die spezifischen Filter, Pivots und Abfragen, die die typischen Angreifer-Artefakte auf der typischen infizierten Workstation zutage fördern.
Für den Artefakt-Hintergrund siehe die vollständige Amcache-Referenz; für das Kombinieren von Amcache mit anderen Ausführungsbeweisen siehe Amcache vs Prefetch, Amcache vs ShimCache und Amcache vs SRUM.
Warum Amcache die richtige erste Anlaufstelle ist#
Drei Eigenschaften machen Amcache zum natürlichen ersten Artefakt in einer Malware-Triage:
- Es zeichnet den SHA-1 jedes PEs auf, das der Appraiser sah. Dieser Hash geht direkt in eine VirusTotal- oder TI-Feed-Abfrage.
- Es zeichnet den vollständigen Pfad auf. Pfad ist die halbe
Geschichte für die Triage handelsüblicher Malware — alles in
\Users\<x>\AppData\Local\Temp\oder\ProgramData\ist per Standard verdächtig. - Es überlebt Binär-Löschung. Siehe Beweise gelöschter Binärprogramme aus Amcache wiederherstellen.
Zusammen: Parsen, filtern, Hash prüfen, und Sie haben in Minuten eine verteidigungsfähige Antwort auf „Gehört dieser Host?".
Der Baseline-Triage-Filter#
Wenden Sie diesen jedes Mal zuerst auf
*_UnassociatedFileEntries.csv an:
Import-Csv .\HOST_amcache_UnassociatedFileEntries.csv |
Where-Object {
$_.IsPeFile -eq 'True' -and
-not $_.Publisher -and
$_.FullPath -match '\\Users\\|\\ProgramData\\|\\AppData\\|\\Temp\\|\\Public\\'
} |
Select-Object KeyLastWriteTimestamp, FullPath, Hash, Size, LinkDate |
Sort-Object KeyLastWriteTimestamp -DescendingWas das zutage fördert:
- Unsignierte PE-Binärprogramme in Pfaden, die ein normaler Benutzer schreiben kann.
Was es verpasst (und wofür Sie Folgefilter brauchen):
- Signierte, aber bösartige Binärprogramme (signierte Ransomware, signierte RATs).
- Binärprogramme in geschützten Pfaden (
\Windows\System32\— erfordert Admin zum Ablegen, kommt aber bei Rechteausweitung vor). - Living-off-the-land-Binärprogramme (LOLBINs) — die sind
signiert und liegen legitim in
\Windows\System32\.
Dieser Filter gibt typischerweise 5–50 Zeilen auf einer typisch infizierten Workstation zurück. Die meisten sind Fehlalarme (portable Apps, Dev-Tools, individuelle Skripte). Triage von da aus.
Falsch-Positiv-Kontrollen#
Ein paar Muster, die die offensichtlich harmlosen Zeilen schnell herausfiltern:
Entwickler- / Portable-App-Pfade ausschließen#
$benignPaths = @(
'\\AppData\\Local\\JetBrains\\',
'\\AppData\\Local\\Programs\\Microsoft VS Code\\',
'\\AppData\\Local\\Programs\\Slack\\',
'\\AppData\\Local\\Programs\\Notion\\',
'\\AppData\\Roaming\\Spotify\\',
'\\AppData\\Local\\GitHubDesktop\\',
'\\AppData\\Local\\Microsoft\\Teams\\',
'\\AppData\\Local\\Discord\\',
'\\AppData\\Local\\1Password\\'
)
$rows | Where-Object {
$path = $_.FullPath
-not ($benignPaths | Where-Object { $path -match $_ })
}Passen Sie die Liste an das Standard-Entwickler- / Power-User- Tooling Ihrer Umgebung an. Eine Basis von „bekannten portablen Apps in Benutzerpfaden" lohnt sich einmal pro Umgebung zu pflegen.
Bekannte Publisher per Hash ausschließen#
Wenn Sie eine Liste bekannter guter Hashes haben (Ihre interne
Allowlist, NSRL, Cisco Talos Clean-Hash-Feed), joinen Sie die
Amcache-Hash-Spalte dagegen und entfernen Sie Treffer.
Sehr häufige Angreifer-Köder-Namen ausschließen, denen Sie woanders vertrauen#
update.exe, service.exe, svchost.exe in Benutzerpfaden sind
verdächtig, weil sie Namen mit legitimen Windows-Binärprogrammen
teilen — die Namen allein sind nicht das Signal; Pfad + fehlender
Publisher sind es. Der Baseline-Filter erfasst diese bereits.
Hochpräzise Angreifer-Muster#
Sobald Sie die gefilterte Liste haben, sind diese Muster typischerweise hochpräzise Indikatoren auf einem typischen Windows-Endpoint:
\AppData\Local\Temp\ + PE + unsigniert#
C:\Users\bob\AppData\Local\Temp\xyz1234.tmp.exe
C:\Users\bob\AppData\Local\Temp\setup_temp\install.exe
Fast nie ein harmloses Entwicklermuster. Üblich für:
- Initial-Access-Dropper aus Phishing-Anhängen.
- Office-Makro-Payloads.
- Über den Browser ausgelieferte Downloads, die aus
Tempausführen.
Verdächtige Dateinamen, die OS-Komponenten imitieren#
C:\Users\Public\Documents\svchost.exe
C:\ProgramData\msmpeng.exe
C:\Users\bob\AppData\Roaming\winupdate.exe
Die Kombination aus einem OS-komponentenartigen Namen und einem Pfad, an dem keine OS-Komponente jemals sitzen würde, ist ein beinahe sicherer Malware-Indikator.
LinkDate-Cluster#
Sortieren Sie die gefilterte Liste nach LinkDate:
$rows | Sort-Object LinkDateSuchen Sie nach Clustern: 3–10 Binärprogramme mit
LinkDate-Werten innerhalb weniger Stunden voneinander. Angreifer
kompilieren häufig ihr gesamtes Toolkit in einer Sitzung, und die
Link-Zeitstempel clustern. Das ist ein starkes „dies ist eine
Kampagne"-Signal.
Reine Hash-Treffer in Unassociated#
Nehmen Sie jeden Hash aus Ihren gefilterten Zeilen und prüfen
Sie, ob er irgendwo in *_AssociatedFileEntries.csv erscheint
(d. h. einer installierten Anwendung zugeordnet ist). Wenn
derselbe Hash auf diesem Host oder einem anderen gesammelten
Host Associated erscheint, hat das Binärprogramm anderswo einen
harmlosen oder verfolgten Kontext. Wenn es nur Unassociated und
nur auf diesem einen Host erscheint, erhöht das den Verdacht.
Ausführung bestätigen#
Eine Zeile in Amcache bedeutet, dass das Binärprogramm zur Appraiser-Zeit auf der Festplatte war; es bedeutet nicht, dass es lief. Um die Ausführung zu bestätigen:
Prefetch#
Prüfen Sie für jede verdächtige Zeile, ob
C:\Windows\Prefetch\ eine .pf für dieses Binärprogramm enthält:
NOTEPAD.EXE-1A2B3C4D.pf
XYZ1234.TMP.EXE-FEDCBA98.pf
Eine .pf ist definitiver Ausführungsbeweis. Parsen Sie
Prefetch mit PECmd.exe, um die Lauf-Zeitstempel zu bekommen.
Siehe Amcache vs Prefetch für den
vollständigen Vergleich.
Security 4688 / Sysmon 1#
Wenn Prozesserstellungs-Auditing aktiviert ist (sollte es sein), loggt jeder Start ein 4688- oder Sysmon-1-Event mit voller Kommandozeile. Filtern Sie auf den Pfad des Binärprogramms und Sie erhalten jede Ausführung mit Argumenten — in der Regel der nützlichste einzelne Datenpunkt in einer Malware-Triage.
SRUM#
Wenn das Binärprogramm messbare CPU oder Netzwerk nutzte, hat
SRUM (SRUDB.dat) eine Zeile auf Stundenebene dafür. Siehe
Amcache vs SRUM. Besonders nützlich für
Netzwerkaktivität — wenn SRUM zeigt, dass das Binärprogramm
Gigabytes an Netzwerk-Bytes sendete, ist das Ihre
Daten-Exfiltrations-Timeline.
Den Incident über Hosts scopen#
Sobald Sie mindestens ein böses Binärprogramm auf einem Host bestätigt haben, lautet die Frage: wo sonst existiert das noch?
Hash-Pivot über gesammelte Amcache#
$badHashes = @('da39a3ee5e6b4b0d3255bfef95601890afd80709',
'1234567890abcdef1234567890abcdef12345678')
Get-ChildItem -Recurse -Filter *_UnassociatedFileEntries.csv |
ForEach-Object {
$host = $_.PSChildName.Split('_')[0]
Import-Csv $_.FullName |
Where-Object { $badHashes -contains $_.Hash } |
Select-Object @{n='Host';e={$host}}, FullPath, KeyLastWriteTimestamp
} |
Sort-Object KeyLastWriteTimestampDas verrät Ihnen jeden gesammelten Host, der jemals einen der bösen Hashes hatte, sortiert nach Appraiser-Sehzeit. Offenbart oft den Patient Zero (frühester Zeitstempel) und die Verbreitung (nachfolgende Zeitstempel auf anderen Hosts).
ProgramId-Pivot für Tool-Familien#
$badProgramIds = @('0006fa0b2a9f8a4eb9d7c81e8b1f3c5d3e2a0000ffff')
Get-ChildItem -Recurse -Filter *_UnassociatedFileEntries.csv |
ForEach-Object {
$host = $_.PSChildName.Split('_')[0]
Import-Csv $_.FullName |
Where-Object { $badProgramIds -contains $_.ProgramId } |
Select-Object @{n='Host';e={$host}}, FullPath, Hash, KeyLastWriteTimestamp
}ProgramId fängt Treffer auf Familienebene ein, die Hash verpasst
(Neukompilierungen mit denselben Metadaten). Siehe
Amcache ProgramId erklärt.
Pfad-Muster-Pivot#
Get-ChildItem -Recurse -Filter *_UnassociatedFileEntries.csv |
ForEach-Object {
$host = $_.PSChildName.Split('_')[0]
Import-Csv $_.FullName |
Where-Object {
$_.FullPath -match '\\AppData\\Roaming\\[a-z0-9]{8}\\update\.exe$'
} |
Select-Object @{n='Host';e={$host}}, FullPath, Hash, KeyLastWriteTimestamp
}Für bekannte Angreifer-Pfadmuster (einen bestimmten Installationsort, den ein Intrusion Set verwendet), pivotieren Sie per Pfad-Regex statt per Hash.
Der vollständige Triage-Fluss#
Ein wiederholbarer End-to-End-Fluss:
- Sammeln Sie Amcache (
Amcache.hve+.LOG1+.LOG2) vom Verdachts-Host. - Parsen mit
AmcacheParser.exe --mp. - Wenden Sie den Baseline-Filter auf
*_UnassociatedFileEntries.csvan. - Wenden Sie Falsch-Positiv-Kontrollen an (bekannte portable Apps, Allowlist-Hashes).
- Triagen Sie den Rest — VirusTotal jeden
Hash, schauen Sie sich verdächtige Pfade und Namen an. - Bestätigen Sie die Ausführung über Prefetch / 4688 / Sysmon für jede bestätigt-böse Zeile.
- Zeitliche Eingrenzung des Incidents: Nehmen Sie den
frühesten
KeyLastWriteTimestampund die späteste Prefetch-Laufzeit; dieses Fenster ist Ihr Incident-Zeitraum. - Scopen Sie die Verbreitung über Hash- /
ProgramId-Pivots über alle gesammelten Amcache-Dateien. - Bestätigen Sie die Bereinigung: Nach der Eindämmung erneut ausführen, um zu verifizieren, dass die bösen Zeilen keine neuen entsprechenden Prefetch-Läufe mehr haben.
Dieser Fluss dauert Stunden, nicht Tage, und er funktioniert bei der überwältigenden Mehrheit der Einsätze mit handelsüblicher Malware ohne spezialisierte EDR.
Siehe auch#
- Vollständige Amcache-Referenz — das Artefakt vollständig.
- Amcache vs Prefetch — Ausführungsbeweis-Begleiter.
- Amcache FileId erklärt — Hash-Format für VT-Lookups.
- Amcache ProgramId erklärt — der hostübergreifende Familien-Pivot.
- Beweise gelöschter Binärprogramme aus Amcache wiederherstellen — wenn das Binärprogramm selbst weg ist.
- Lateral Movement und Amcache-
ProgramId-Pivoting — Scoping der Verbreitung über die Umgebung.
Um eine Hive jetzt ohne Installation zu triagieren, legen Sie die Datei auf der Startseite des Parsers ab — sie parst vollständig in Ihrem Browser.
Verwandte Beiträge
- Volatility und Amcache: die Hive aus Speicherabbildern extrahieren
Ein praktischer Leitfaden zur Wiederherstellung von Amcache aus einem Windows-Speicherabbild mit Volatility — wann speicherseitige Wiederherstellung die einzige Option ist, welche Plugins zu verwenden sind und wie an AmcacheParser übergeben wird.
- RegRipper amcache-Plugin: was es tut und wann man es verwendet
Ein praktischer Leitfaden zum amcache-Plugin von RegRipper — was es parst, wie sich seine Text-Ausgabe von AmcacheParsers CSV unterscheidet und wann man darauf zurückgreift statt (oder zusätzlich zum) Zimmerman-Tool.
- AmcacheParser-Ausgabespalten erklärt: jedes CSV-Feld dekodiert
Eine Feld-für-Feld-Referenz für die CSV-Ausgabe von AmcacheParser — FileId, PathHash, ProgramId, LinkDate, BinFileVersion, IsPeFile und jede andere Spalte, mit den Pivots, die in DFIR zählen.
- AmcacheParser-Download-Leitfaden: offizielle Quellen, Mirrors und Verifizierung
Alle Wege, AmcacheParser von Eric Zimmerman herunterzuladen — Get-ZimmermanTools, direkter Download, KAPE, Velociraptor — mit Prüfsummen-Verifizierung und Air-Gap-Installationsmustern.