Skip to content

Análisis forense de ConsoleHost_history.txt de PSReadLine

Qué registra el archivo de historial de PSReadLine, dónde se encuentra, por qué no tiene marcas de tiempo y cómo usarlo (y cuáles son sus límites) en una investigación.

Publicado el 3 min de lectura

En resumen. PSReadLine guarda cada comando escrito en una consola interactiva en ConsoleHost_history.txt: una línea por comando, sin marcas de tiempo, por usuario y persistente tras los reinicios. Es una mina de oro para saber qué escribió una persona, pero registra solo la entrada interactiva de la consola y le da el orden, no la hora. Abra el parser para leerlo junto a los registros de eventos.

Dónde se encuentra y qué contiene

PSReadLine (incluido de serie desde PowerShell 5 / Windows 10) mantiene un archivo de historial en:

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

El nombre sigue el patrón <HostName>_history.txt; ConsoleHost es la consola normal de powershell.exe. Añade una línea por cada comando aceptado. Un comando de varias líneas se guarda con una comilla invertida al final de cada línea salvo la última, por lo que el parser las vuelve a unir en una sola entrada. Como es un archivo por usuario dentro de AppData\Roaming, se atribuye al titular del perfil en el que se encuentra: conserve la ruta Users\<name>\ al recopilarlo. Consulte PSReadLine.

Sin marcas de tiempo: solo el orden

El archivo no contiene ninguna hora. Esto tiene dos consecuencias. En primer lugar, su cronología es únicamente el orden de las líneas; para situar un comando en el tiempo debe correlacionarlo con un evento 4104 u 800 con marca de tiempo, o con una transcripción. En segundo lugar, el archivo persiste tras los reinicios y los inicios de sesión del perfil, por lo que una línea puede ser semanas o meses más antigua que el primer evento de sus registros. Trátelo como un registro de intención y de técnica, que debe corroborarse con otras fuentes en cuanto a la cronología.

Límites que conviene señalar

  • Solo interactivo. Los comandos ejecutados desde un .ps1, una tarea programada, WinRM o un host personalizado que no sea la consola no se escriben aquí.
  • Controlado por el atacante. El historial se puede borrar (Clear-History borra el de la sesión; eliminar o truncar el archivo lo elimina por completo); el parser señala los comandos de borrado del historial que detecta.
  • No prueba el éxito. Registra lo que se escribió, incluidos errores tipográficos y comandos abandonados, no lo que tuvo éxito.

Uso en un caso

Cargue el archivo de historial junto con los registros de eventos y las transcripciones para que cada comando escrito se alinee con su ejecución registrada. El parser decodifica cualquier comando codificado de una línea del historial y señala los download cradles, la manipulación de Defender y de AMSI, y el borrado de registros. Analícelo en su navegador.

Preguntas frecuentes

¿Dónde está el archivo de historial de PowerShell?

PSReadLine lo escribe en C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt, uno por usuario. Otros hosts usan <HostName>_history.txt.

¿Tiene marcas de tiempo?

No. PSReadLine añade una línea por comando, sin hora. El orden de las líneas es la única cronología, y el archivo puede ser mucho más antiguo que los registros de eventos.

¿Qué captura?

Solo la entrada interactiva escrita en un host de consola, por usuario, a lo largo de sesiones y reinicios. No captura scripts, tareas programadas ni runspaces que no sean de consola.

Artículos relacionados

Paso a paso: abra registros .evtx de PowerShell, el historial de PSReadLine y las transcripciones en un visor gratuito en el navegador, reconstruya los bloques de script, decodifique comandos codificados y exporte a CSV o JSON.
Cómo se estructuran las transcripciones de PowerShell, qué registra el encabezado, cómo funcionan las marcas de tiempo de los comandos con -IncludeInvocationHeader y cómo investigarlas.
Cómo funcionan -EncodedCommand y las técnicas habituales de ofuscación de PowerShell (base64/UTF-16LE, gzip/deflate, códigos de carácter, concatenación, el operador de formato y las comillas invertidas) y cómo decodificarlas de forma segura.