Was PowerShell-Protokolle aufzeichnen
PowerShell schreibt mehrere unabhängige Spuren. Script Block Logging (Ereignis 4104 im Protokoll Microsoft-Windows-PowerShell/Operational) zeichnet den tatsächlich ausgeführten Code auf — den deobfuskierten Skripttext, bei langen Blöcken auf mehrere 4104-Ereignisse verteilt. Die Modulprotokollierung (4103) erfasst Details zur Pipeline-Ausführung. Das klassische Protokoll "Windows PowerShell" zeichnet den Lebenszyklus von Engine und Providern auf (400/403/600) und, per Richtlinie, die Pipeline-Ausführung (800).
Außerhalb der Ereignisprotokolle führt PSReadLine einen Klartextverlauf aller in einer interaktiven Konsole eingegebenen Befehle, und Start-Transcript (oder die Transkriptionsrichtlinie) schreibt ein vollständiges Sitzungstranskript in eine Textdatei. Zusammen gehören sie zu den aufschlussreichsten Aufzeichnungen darüber, was ein Administrator — oder ein Angreifer — auf einem Windows-Host getan hat.
Speicherorte
- C:\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx — Script Block Logging (4104) und Modulprotokollierung (4103).
- C:\Windows\System32\winevt\Logs\Windows PowerShell.evtx — klassische Engine-/Provider-/Pipeline-Ereignisse (400/403/600/800).
- C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt — interaktiver Befehlsverlauf, pro Benutzer.
- C:\Users\<user>\Documents\PowerShell_transcript.<host>.<random>.<timestamp>.txt — Transkripte, sofern aktiviert.
Warum sie für eine Untersuchung wichtig sind
- Script Block Logging erfasst den Code so, wie PowerShell ihn gesehen hat; ein -EncodedCommand oder ein obfuskierter Einzeiler wird daher in expandierter Form aufgezeichnet — dieser Parser dekodiert zudem die kodierten und komprimierten Ebenen für Sie.
- Das Zusammensetzen von 4104 anhand von ScriptBlockId und MessageNumber/MessageTotal rekonstruiert lange Skripte, die Windows auf viele Ereignisse verteilt hat, und markiert fehlende Teile.
- PSReadLine-Verlauf und Transkripte erfassen interaktive Aktivität, die möglicherweise nie in einer Skriptdatei landet, einschließlich Tippfehlern und abgebrochener Befehle.
- Befunde weisen auf Download-Cradles, AMSI-/ETW-Umgehungen, Manipulation von Protokollierung und Defender, Umgehung der Ausführungsrichtlinie, versteckte Fenster, Engine-Downgrades und gängige Obfuskation hin — als zu prüfende Hinweise, nicht als Urteile.
Einschränkungen
- Script Block Logging ist standardmäßig deaktiviert; ohne es sehen Sie möglicherweise nur Blöcke auf Warnstufe, die Windows selbst markiert hat, sowie das klassische Protokoll und den Verlauf.
- Der PSReadLine-Verlauf hat keine Zeitstempel: Die Reihenfolge ist die einzige Chronologie, und er kann deutlich älter sein als die Protokolle.
- Transkriptzeiten entsprechen der lokalen Uhr des Hosts ohne Zeitzone; Zeiten in Ereignisprotokollen sind UTC.
- Protokolle werden überschrieben und können gelöscht werden; dieses Tool markiert Löschbefehle, kann aber bereits entfernte Ereignisse nicht wiederherstellen.
So sichern Sie die Dateien
- Exportieren Sie die beiden PowerShell-Ereignisprotokolle mit wevtutil epl (oder sammeln Sie alle .evtx mit KAPE / Velociraptor) und kopieren Sie PSReadLine-Verlauf und Transkripte jedes Benutzers.
- Der EventLog-Dienst hält die Protokolle auf einem laufenden Host geöffnet; verwenden Sie daher einen Export statt einer einfachen Kopie.
- Behalten Sie die Ordnerstruktur Users\<name>\ bei, damit Verlauf und Transkripte dem richtigen Konto zugeordnet werden.
FAQ
Werden meine Dateien irgendwohin hochgeladen?
Nein. Der Parser — einschließlich des .evtx-Readers — ist in Rust geschrieben, nach WebAssembly kompiliert und läuft in einem Web Worker in Ihrem Browser. Es gibt keinen Upload-Endpunkt, und nichts aus einem Skript wird jemals ausgeführt.
Dekodiert das Tool -EncodedCommand und obfuskierte Skripte?
Ja. Base64-kodierte -EncodedCommand-Strings werden aus UTF-16LE dekodiert, und weitere Ebenen — gzip/deflate-Payloads, [char]-Codes, String-Verkettung, der Formatoperator -f und Backtick-Escaping — werden aufgelöst und als inerter Text angezeigt. Das Skript wird nie ausgeführt.
Wie wird ein Skriptblock rekonstruiert, der sich über mehrere Ereignisse erstreckt?
Windows teilt einen langen Skriptblock auf mehrere 4104-Ereignisse mit derselben ScriptBlockId auf, die jeweils MessageNumber von MessageTotal enthalten. Der Parser gruppiert nach ScriptBlockId, sortiert nach MessageNumber, fügt den Text zusammen und markiert fehlende Teile.
Was, wenn Script Block Logging deaktiviert war?
Sie sehen weiterhin das klassische Windows-PowerShell-Protokoll (Engine- und Pipeline-Ereignisse), den PSReadLine-Verlauf und eventuelle Transkripte. Außerdem protokolliert Windows als verdächtig eingestufte Skriptblöcke auch bei deaktivierter vollständiger Protokollierung auf Warnstufe, und diese werden ebenfalls erfasst.
Welche Dateien sollte ich sichern?
Microsoft-Windows-PowerShell%4Operational.evtx und Windows PowerShell.evtx aus winevt\Logs, die ConsoleHost_history.txt jedes Benutzers sowie alle PowerShell_transcript.*.txt. Der integrierte Sicherungsleitfaden bietet Exporte mit einem einzigen Befehl.