Kurzfassung: Schadcode kommt selten im Klartext - er wird kodiert oder komprimiert eingeschleust und erst auf dem Host wieder lesbar gemacht. Deobfuscate/Decode ist genau dieser Schritt: certutil dekodiert eine Datei, PowerShell wandelt Base64 zurück oder entpackt einen Datenstrom im Speicher. Die Erkennung setzt am Dekodier-Werkzeug und an den typischen Funktionsnamen in der Kommandozeile an. Drei sigma-cli-validierte Sigma-Regeln, dazu Härtung und der Test im Lab. Serie "Angriff erkennen".
Kodierung ist der Trick, mit dem Angreifer an Signaturen und Perimeter-Prüfungen vorbeikommen: Was als Base64-Zeichenkette oder komprimierter Block hereinkommt, ist für einen Virenscanner zunächst nur Rauschen. Erst auf dem Host wird daraus wieder ausführbarer Code - und genau dieser Entpack-Schritt ist sichtbar. Deobfuscate/Decode folgt oft unmittelbar auf das Nachladen eines Werkzeugs und geht der Ausführung voraus. Wer die wenigen Dekodier-Werkzeuge im Blick hat, erwischt den Angriff an einer schmalen, gut beobachtbaren Stelle. Dieser Beitrag nimmt die Erkennung in den Blick und bleibt auf der Verteidigerseite.
Einordnung in ATT&CK: Deobfuscate/Decode Files or Information (T1140). MITRE führt die Technik in der Taktik Defense Evasion und nennt Windows, Linux und macOS als Plattformen. In dieser Serie steht sie in der Spalte Stealth, dicht neben dem Living off the Land.
Was der Angreifer tut
Das Entschlüsseln und Entpacken läuft auf der Ebene des Prinzips, nicht als Anleitung, in wenigen Varianten ab:
- Mit certutil dekodieren. Das mitgelieferte certutil wandelt mit -decode eine Base64- oder Hex-Datei zurück in ihre Originalform - ein bequemer Dekodierer, der auf jedem Windows vorhanden ist.
- Base64 in PowerShell. Eine kodierte Zeichenkette wird per FromBase64String zur Laufzeit zurückgewandelt, oft direkt vor der Ausführung.
- Im Speicher entpacken. Ein komprimierter Block wird über einen GzipStream oder DeflateStream entpackt, sodass auf der Platte nichts Lesbares liegt.
- Verketten. Dekodieren, entpacken und ausführen folgen oft in einem Skript aufeinander - die Deobfuskierung ist das Scharnier dazwischen.
Für die Erkennung ist entscheidend: Die Deobfuskierung läuft über wenige, benannte Werkzeuge und Funktionen - certutil mit -decode, FromBase64String, ein Decompress-Stream - die in der Kommandozeile im Klartext stehen. Genau daran setzen die Regeln an.
Welche Logquellen die Technik zeigt
- Prozess-Telemetrie. Event 4688 und Sysmon Event 1 zeigen certutil und PowerShell samt Kommandozeile im Klartext - mit dem Dekodier-Schalter oder dem Funktionsnamen. Die wichtigste Quelle.
- PowerShell-Protokolle. Script Block Logging macht FromBase64String und die Stream-Dekomprimierung sichtbar, auch wenn sie in einem Skriptblock versteckt sind.
- Dateiereignisse. Oft entsteht beim Dekodieren eine neue Datei; ihr Anlegen in einem Temp-Verzeichnis ergänzt das Bild.
- Werkzeug-Kontext. certutil ist ein mitgeliefertes Windows-Werkzeug; Grundlagen zu seinem Missbrauch stehen unter Living off the Land.
Das Muster im Log
Das klarste Signal ist certutil mit -decode oder -decodehex - für das Dekodieren einer Datei gibt es im Alltag kaum einen Grund, und Angreifer nutzen es gern, weil es überall vorhanden ist. Das zweite Signal ist FromBase64String in einer PowerShell-Kommandozeile, oft zusammen mit einem anschließenden Aufruf von Invoke-Expression. Das dritte ist ein GzipStream oder DeflateStream im Decompress-Modus, der einen Block im Speicher entpackt. Legitime Treffer stammen von Installations- und Verwaltungsskripten auf bekannten Hosts. Auffällig wird es, wenn die Dekodierung aus einem ungewöhnlichen Elternprozess oder kurz nach einem Download geschieht. Der Blick auf Werkzeug, Funktion und Kontext trennt den Alltag vom Angriff.
Drei Sigma-Regeln
Die Regeln sind mit sigma-cli geprüft und nehmen die drei Wege: die certutil-Dekodierung, die Base64-Dekodierung in PowerShell und die In-Memory-Dekomprimierung. Die erste ist die spezifischste.
1. certutil-Dekodierung einer Datei (T1140). certutil mit -decode oder -decodehex. Die Regel steht auf level: high.
title: certutil-Dekodierung einer Datei
id: f84b97c3-3c43-45a7-bae0-356e0f0d6d7d
status: experimental
description: |
Erkennt die Dekodierung einer Datei mit certutil - der Schalter -decode oder -decodehex wandelt eine
Base64- oder Hex-kodierte Datei zurueck in ihre Originalform. Angreifer schleusen Schadcode kodiert
ein, um der Pruefung am Perimeter zu entgehen, und dekodieren ihn erst auf dem Host. certutil als
Dekodierer ist ein bekanntes Angreifer-Muster.
references:
- https://attack.mitre.org/techniques/T1140/
author: blue-team.net
tags:
- attack.stealth
- attack.t1140
logsource:
product: windows
category: process_creation
detection:
sel_img:
Image|endswith: '\certutil.exe'
sel_flag:
CommandLine|contains:
- '-decode'
- '/decode'
- 'decodehex'
condition: sel_img and sel_flag
falsepositives:
- Administrative Skripte, die certutil legitim zum Dekodieren nutzen - bekannte Faelle nach Host und Konto als Baseline ausnehmen
level: high
2. Base64-Dekodierung in PowerShell (T1140). FromBase64String in einer PowerShell-Kommandozeile. Die Regel steht auf level: medium.
title: Base64-Dekodierung in PowerShell
id: d996ee02-80fc-4889-9820-0143e3aa9547
status: experimental
description: |
Erkennt die Base64-Dekodierung in PowerShell ueber FromBase64String. Angreifer tragen kodierte
Nutzlasten als Zeichenkette ein und dekodieren sie zur Laufzeit, um Signaturen und eine Pruefung des
Klartexts zu umgehen. Der Aufruf von FromBase64String in einer Kommandozeile weist auf eine
Deobfuskierung zur Laufzeit hin.
references:
- https://attack.mitre.org/techniques/T1140/
author: blue-team.net
tags:
- attack.stealth
- attack.t1140
logsource:
product: windows
category: process_creation
detection:
sel_ps:
Image|endswith:
- '\powershell.exe'
- '\pwsh.exe'
sel_dec:
CommandLine|contains: 'FromBase64String'
condition: sel_ps and sel_dec
falsepositives:
- Legitime Verwaltungs- und Installationsskripte, die Base64 verwenden - bekannte Skripte und Konten als Baseline ausnehmen
level: medium
3. In-Memory-Dekomprimierung in PowerShell (T1140). Ein GzipStream oder DeflateStream im Decompress-Modus. Ebenfalls level: medium.
title: In-Memory-Dekomprimierung in PowerShell
id: bf44be03-b512-4ed9-b7bd-1c9359fafd4f
status: experimental
description: |
Erkennt das Entpacken eines komprimierten Datenstroms in PowerShell - ein GzipStream oder
DeflateStream im Decompress-Modus. Angreifer legen ihre Nutzlast komprimiert und kodiert ab und
entpacken sie erst im Speicher, damit auf der Platte nichts Lesbares liegt. Die Dekomprimierung zur
Laufzeit ist ein typisches Deobfuskierungs-Muster.
references:
- https://attack.mitre.org/techniques/T1140/
author: blue-team.net
tags:
- attack.stealth
- attack.t1140
logsource:
product: windows
category: process_creation
detection:
sel_ps:
Image|endswith:
- '\powershell.exe'
- '\pwsh.exe'
sel_stream:
CommandLine|contains:
- 'GzipStream'
- 'DeflateStream'
sel_mode:
CommandLine|contains: 'Decompress'
condition: sel_ps and sel_stream and sel_mode
falsepositives:
- Entwicklungs- und Verpackungsskripte, die Datenstroeme legitim entpacken - bekannte Skripte und Konten als Baseline ausnehmen
level: medium
Härtung: der Angriff, der ins Leere läuft
- PowerShell härten. Script Block Logging und Constrained Language Mode machen Dekodierung und Dekomprimierung sichtbar und schränken verschleierte Skripte ein.
- certutil im Blick behalten. Den Einsatz von certutil auf die Systeme und Konten begrenzen, die es brauchen, und jeden -decode-Aufruf als Alarm behandeln.
- Anwendungssteuerung. Per Application Control festlegen, welche Skript-Hosts und Werkzeuge überhaupt laufen dürfen.
- Kontext mitschneiden. Elternprozess, Benutzer und frisch geschriebene Dateien erfassen, damit eine Dekodierung in ihrem Zusammenhang bewertet werden kann.
Der Test
Die Erkennung lässt sich im Lab gefahrlos prüfen, auf einem isolierten System mit aktivem Sysmon und harmlosen Testdaten:
- Für Regel 1 mit certutil -decode eine zuvor base64-kodierte Testdatei zurückwandeln. In Event 4688 muss certutil mit dem Dekodier-Schalter erscheinen.
- Für Regel 2 in PowerShell eine harmlose Zeichenkette per FromBase64String dekodieren und den Eintrag in der Prozess-Telemetrie prüfen.
- Für Regel 3 einen Testblock mit einem DeflateStream im Decompress-Modus entpacken und das Erscheinen in Event 1 bzw. im Script Block Logging kontrollieren.
- Breiter wird der Test mit den Fällen zu T1140 aus Atomic Red Team.
Fehlalarme und Tuning
- Installation und Verwaltung. Manche Setup- und Verwaltungsskripte dekodieren legitim. Bekannte Skripte, Pfade und Konten als Baseline ausnehmen.
- certutil ist spezifisch. Ein -decode-Aufruf hat außerhalb bewusster Nutzung selten einen Grund - diese Treffer hochpriorisieren.
- Base64 kommt vor. FromBase64String taucht auch in legitimen Skripten auf; nach Elternprozess und Folgeaktion filtern, um das Rauschen zu senken.
- Kette schlägt Einzelzeile. Nachladen, Dekodieren und folgende Ausführung zusammen betrachtet sind aussagekräftiger als ein Dekodier-Aufruf allein - die Korrelation schärft die Bewertung.
Fazit
Deobfuscate/Decode ist der Moment, in dem aus kodiertem Rauschen wieder lesbarer Code wird - und damit eine schmale, gut beobachtbare Stelle. Die verlässlichen Signale sind certutil mit -decode, FromBase64String in PowerShell und eine Stream-Dekomprimierung im Decompress-Modus. Die wirksamste Härtung härtet PowerShell, behält certutil im Blick und steuert, welche Werkzeuge laufen dürfen. Weil die Deobfuskierung meist zwischen Nachladen und Ausführung sitzt, ist ihre Erkennung besonders wertvoll. Verwandt ist das Living off the Land; die weiteren Techniken dieser Taktik sammelt das Lexikon nach Taktik unter Stealth.