Skip to content

Forensik von PSReadLine ConsoleHost_history.txt

Was die PSReadLine-Verlaufsdatei aufzeichnet, wo sie liegt, warum sie keine Zeitstempel hat und wie man sie – samt ihren Grenzen – in einer Untersuchung nutzt.

Veröffentlicht am 3 Min. Lesezeit

Kurzfassung. PSReadLine speichert jeden an einer interaktiven Konsole eingegebenen Befehl in ConsoleHost_history.txt – je eine Zeile, ohne Zeitstempel, pro Benutzer und über Neustarts hinweg. Die Datei ist eine Fundgrube dafür, was eine Person eingetippt hat, erfasst aber nur interaktive Konsoleneingaben und liefert Ihnen eine Reihenfolge, keine Uhrzeit. Öffnen Sie den Parser, um sie neben den Ereignisprotokollen zu lesen.

Wo sie liegt und was sie enthält

PSReadLine (seit PowerShell 5 / Windows 10 standardmäßig enthalten) führt eine Verlaufsdatei unter:

C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

Der Name lautet <HostName>_history.txt; ConsoleHost ist die normale powershell.exe-Konsole. Pro angenommenem Befehl wird eine Zeile angehängt. Ein mehrzeiliger Befehl wird mit einem abschließenden Backtick auf jeder Zeile außer der letzten gespeichert; der Parser fügt diese Zeilen wieder zu einem Eintrag zusammen. Da die Datei pro Benutzer unter AppData\Roaming liegt, wird sie dem Profil zugeordnet, in dem sie sich befindet – behalten Sie beim Sichern den Pfad Users\<name>\ bei. Siehe PSReadLine.

Keine Zeitstempel – nur Reihenfolge

Die Datei enthält überhaupt keine Zeitangaben. Das hat zwei Folgen. Erstens besteht ihre Chronologie nur aus der Reihenfolge der Zeilen; um einen Befehl zeitlich einzuordnen, müssen Sie ihn mit einem zeitgestempelten 4104- oder 800-Ereignis oder einem Transkript korrelieren. Zweitens überdauert die Datei Neustarts und Profilanmeldungen, sodass eine Zeile Wochen oder Monate älter sein kann als das früheste Ereignis in Ihren Protokollen. Betrachten Sie sie als Nachweis von Absicht und Vorgehensweise, dessen zeitliche Einordnung anderweitig bestätigt werden muss.

Grenzen, die man kennen sollte

  • Nur interaktiv. Befehle aus einer .ps1, einer geplanten Aufgabe, über WinRM oder aus einem benutzerdefinierten Host, der nicht die Konsole ist, werden hier nicht geschrieben.
  • Vom Angreifer kontrollierbar. Der Verlauf lässt sich löschen (Clear-History leert die Sitzung; das Löschen oder Kürzen der Datei entfernt ihn vollständig) – der Parser markiert Befehle zum Löschen des Verlaufs, die er erkennt.
  • Kein Erfolgsnachweis. Er zeichnet auf, was eingetippt wurde, einschließlich Tippfehlern und abgebrochener Befehle, nicht was erfolgreich war.

Einsatz in einem Fall

Laden Sie die Verlaufsdatei zusammen mit den Ereignisprotokollen und Transkripten, damit ein eingetippter Befehl mit seiner protokollierten Ausführung übereinandergelegt werden kann. Der Parser dekodiert jeden kodierten Befehl in einer Verlaufszeile und markiert Download-Cradles, Manipulationen an Defender und AMSI sowie das Löschen von Protokollen. Analysieren Sie sie im Browser.

FAQ

Wo befindet sich die PowerShell-Verlaufsdatei?

PSReadLine schreibt sie nach C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt, eine pro Benutzer. Andere Hosts verwenden <HostName>_history.txt.

Hat sie Zeitstempel?

Nein. PSReadLine hängt pro Befehl eine Zeile ohne Uhrzeit an. Die Reihenfolge der Zeilen ist die einzige Chronologie, und die Datei kann deutlich älter sein als die Ereignisprotokolle.

Was erfasst sie?

Nur interaktive Eingaben an einem Konsolen-Host, pro Benutzer, über Sitzungen und Neustarts hinweg. Skripte, geplante Aufgaben und Nicht-Konsolen-Runspaces werden nicht erfasst.

Verwandte Artikel

Schritt für Schritt: PowerShell-.evtx-Protokolle, PSReadLine-Verlauf und Transkripte in einem kostenlosen Browser-Viewer öffnen, Skriptblöcke zusammensetzen, kodierte Befehle dekodieren und als CSV oder JSON exportieren.
Wie PowerShell-Transkripte aufgebaut sind, was der Header aufzeichnet, wie Befehlszeitstempel mit -IncludeInvocationHeader funktionieren und wie man Transkripte untersucht.
Wie -EncodedCommand und gängige PowerShell-Obfuskation funktionieren – base64/UTF-16LE, gzip/deflate, Zeichencodes, Verkettung, der Formatoperator und Backticks – und wie man sie gefahrlos dekodiert.