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:

  1. Es zeichnet den SHA-1 jedes PEs auf, das der Appraiser sah. Dieser Hash geht direkt in eine VirusTotal- oder TI-Feed-Abfrage.
  2. 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.
  3. 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 -Descending

Was 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 Temp ausfü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 LinkDate

Suchen 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 KeyLastWriteTimestamp

Das 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:

  1. Sammeln Sie Amcache (Amcache.hve + .LOG1 + .LOG2) vom Verdachts-Host.
  2. Parsen mit AmcacheParser.exe --mp.
  3. Wenden Sie den Baseline-Filter auf *_UnassociatedFileEntries.csv an.
  4. Wenden Sie Falsch-Positiv-Kontrollen an (bekannte portable Apps, Allowlist-Hashes).
  5. Triagen Sie den Rest — VirusTotal jeden Hash, schauen Sie sich verdächtige Pfade und Namen an.
  6. Bestätigen Sie die Ausführung über Prefetch / 4688 / Sysmon für jede bestätigt-böse Zeile.
  7. Zeitliche Eingrenzung des Incidents: Nehmen Sie den frühesten KeyLastWriteTimestamp und die späteste Prefetch-Laufzeit; dieses Fenster ist Ihr Incident-Zeitraum.
  8. Scopen Sie die Verbreitung über Hash- / ProgramId-Pivots über alle gesammelten Amcache-Dateien.
  9. 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#

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

Zurück zu allen Beiträgen