So dekodieren Sie einen kodierten PowerShell-Befehl
- Kopieren Sie die vollständige Befehlszeile aus dem Alert, dem Prozesserstellungs-Ereignis oder der EDR-Konsole und fügen Sie sie in Befehlszeile oder Base64 ein. Anführungszeichen um das Base64 stören nicht.
- Der Decoder findet das Argument
-EncodedCommandin jeder Abkürzung (-e,-ec,-encund so weiter, mit-oder/) und dekodiert es. - Die Statuszeile nennt den verwendeten Zeichensatz: UTF-16LE, wie PowerShell es erwartet, oder UTF-8, wenn die Bytes nicht nach UTF-16 aussehen.
- Lesen Sie das Ergebnis unter Dekodiertes Skript. Enthält es Literale wie
[Convert]::FromBase64String('…'), werden diese darunter mit erkanntem Typ und Größe aufgelistet. Text-Payloads öffnen sich im Ausgabebereich, komprimierte (gzip, zlib oder Raw Deflate, wie mitGzipStreamundDeflateStreamverwendet) bekommen eine Schaltfläche zum Entpacken, und andere binäre Payloads lassen sich als Datei speichern.
Ein harmloses Beispiel:
powershell.exe -NoP -NonI -W Hidden -Enc VwByAGkAdABlAC0ATwB1AHQAcAB1AHQAIAAnAGgAZQBsAGwAbwAnAA==
ergibt dekodiert Write-Output 'hello'. Derselbe Text als UTF-8-Base64 wäre V3JpdGUtT3V0cHV0ICdoZWxsbyc=, was PowerShell ablehnen oder falsch lesen würde.
Kodierte Befehle in Logs erkennen
Wegen UTF-16LE hat der Anfang eines kodierten Skripts eine wiedererkennbare Base64-Form. Erkennungsregeln suchen danach:
| Base64 beginnt mit | Skript beginnt mit |
|---|---|
JAB | $ (eine Variablenzuweisung, z. B. ist JABzAD0A gleich $s=) |
SQBFAFgA | IEX |
aQBlAHgA | iex |
SQBuAHYAbwBrAGUALQBFAHgAcAByAGUAcwBzAGkAbwBuAA | Invoke-Expression |
SQBuAHYAbwBrAGUALQBXAGUAYgBSAGUAcQB1AGUAcwB0AA | Invoke-WebRequest |
TgBlAHcALQBPAGIAagBlAGMAdAA | New-Object |
WwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcA | [Convert]::FromBase64String |
Diese Formen gelten nur ganz am Anfang. Weiter hinten im Skript hat dasselbe Wort je nach Byte-Offset modulo 3 drei mögliche Base64-Schreibweisen. Deshalb übersieht eine Log-Suche nach einer Schreibweise die beiden anderen.
Einen verdächtigen Befehl sicher analysieren
Kodierte Befehle sind ein gängiger Weg, ein Skript vor einem flüchtigen Blick in die Prozessliste zu verbergen. Taucht einer in einem Alert auf:
- Nur dekodieren. Diese Seite wandelt Text um und stellt außer dem Seitenaufrufzähler von Cloudflare keine Netzwerkanfragen. Fügen Sie den Befehl nicht in ein PowerShell-Fenster ein, und übergeben Sie dekodierte Ausgabe nie an
iex. - Auf Absicht und Indikatoren lesen. Notieren Sie URLs, Domains, IP-Adressen, Dateipfade, Registry-Schlüssel und Namen geplanter Aufgaben für Ihre Incident-Notizen und Sperrlisten.
- Nach weiteren Schichten suchen. Verschachtelte
FromBase64String-Aufrufe,IO.Compression.DeflateStreamoderGzipStream,-joinüber Zeichencodes und umgekehrte Zeichenketten sind übliche Verpackungen. Dekodieren Sie jede Schicht auf dieselbe Weise. - Extrahierte Binärdateien als Samples behandeln. Eine aus der Liste verschachtelter Payloads gespeicherte Datei kann Malware sein. Hashen Sie sie und analysieren Sie sie nur in einer isolierten Umgebung.
- Die Logs prüfen, die schon den Klartext haben. Mit aktivem Script Block Logging protokolliert Windows das dekodierte Skript als Ereignis 4104 in
Microsoft-Windows-PowerShell/Operational. Prozesserstellungs-Ereignisse (Security 4688 mit Befehlszeilen-Überwachung oder Sysmon-Ereignis 1) protokollieren die kodierte Befehlszeile selbst.
Legitime Verwendung und der Tab „Skript kodieren“
Administratoren nutzen -EncodedCommand, um Probleme mit Anführungszeichen zu vermeiden, wenn ein Skript durch cmd.exe, eine geplante Aufgabe, eine Remote-Shell oder ein Konfigurationsmanagement-Tool läuft. Skript kodieren erzeugt das Argument: Tippen Sie das Skript ein, wählen Sie das Präfix bei Befehl (powershell -NoProfile -EncodedCommand, pwsh -NoProfile -EncodedCommand, powershell -enc oder Nur Base64) und kopieren Sie. Eine Warnung erscheint, wenn das Ergebnis das Befehlszeilenlimit von cmd.exe mit 8.191 Zeichen überschreitet.
Dekodieren in Python und PowerShell
import base64
script = base64.b64decode(b64).decode("utf-16-le")
$script = [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($b64))
Beide geben nur Text zurück. Mehr zur Kodierungsseite auf der Seite Base64 in PowerShell und im Konverter UTF-16 in Base64.
Häufige Probleme
- Die Ausgabe sieht aus wie chinesische Schriftzeichen: UTF-8-Base64 wurde als UTF-16 dekodiert. Das Tool weicht auf UTF-8 aus, wenn das Byte-Muster nicht zu UTF-16 passt, und die Statuszeile nennt den verwendeten Zeichensatz.
- Ungültiges Base64: Der Befehl wurde durch ein Feldlimit im Log abgeschnitten oder über mehrere Zeilen umbrochen. Fügen Sie die Teile zusammen und entfernen Sie alles hinter dem Base64, was nicht dazugehört.
- Die Befehlszeile lässt sich überhaupt nicht dekodieren: Das Base64 steht womöglich in einer Zeichenkette
-Command "…FromBase64String('…')…"statt hinter-EncodedCommand. Fügen Sie nur die Base64-Zeichenkette ein; ist sie kein UTF-16-Text, zeigen der Base64-Decoder oder Base64 in Datei, was es ist.
Häufige Fragen
Was macht powershell -enc?
-enc ist eine Kurzform von -EncodedCommand. PowerShell dekodiert das Base64-Argument als UTF-16LE-Text und führt es als Skript aus. Auch andere Kurzformen wie -e und -ec werden akzeptiert.
Ist es sicher, hier einen schädlichen PowerShell-Befehl zu dekodieren?
Dekodieren ist eine Textumwandlung; nichts wird ausgeführt, und die Content Security Policy dieser Seite blockiert alle Netzwerkanfragen außer dem Seitenaufrufzähler von Cloudflare. Führen Sie das dekodierte Skript nie aus, um zu sehen, was es tut, und behandeln Sie gespeicherte binäre Payloads nur in einer isolierten Analyseumgebung.
Warum ist im Base64 jedes zweite Zeichen ein A?
PowerShell erwartet UTF-16LE, wo auf jedes ASCII-Zeichen ein Null-Byte folgt. Diese Null-Bytes erzeugen das wiederkehrende Muster mit A, wie in VwByAGkAdABlAC0A für Write-.
Wie dekodiere ich -EncodedCommand, ohne es in PowerShell auszuführen?
Verwenden Sie [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($b64)), das nur den Text zurückgibt. Leiten Sie das Ergebnis nicht an Invoke-Expression oder iex weiter.