Los registros de bloques de script de PowerShell residen en Registros de aplicaciones y servicios → Microsoft → Windows → PowerShell → Operacional, como el evento 4104. Solo están completos si el registro de bloques de script está activado. Para exportarlos:
wevtutil epl «Microsoft-Windows-PowerShell/Operational» C:logspowershell.evtx
PowerShell 7 es un producto separado con un canal distinto, PowerShellCore/Operational, y con su propia configuración de políticas.
Si un atacante tocó una máquina con Windows, lo más probable es que PowerShell estuviera involucrado. El registro de bloques de script registra el código que realmente se ejecutó, a menudo después de que se hayan eliminado las capas de ofuscación. Prime Core tiene 663 reglas de detección para registros de PowerShell, mapeadas a 417 técnicas de MITRE ATT&CK. Cubren el uso malicioso de PowerShell (T1059.001), ofuscación (T1027) y cradles de descarga que traen herramientas (T1105).
Antes de comenzar
¿Está activado el registro de bloques de script?
reg query «HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging»
EnableScriptBlockLogging ajustado a 0x1 significa sí. Si la clave no existe, está desactivado. Incluso en ese caso, Windows PowerShell 5.1 todavía registra bloques de script que considera sospechosos, como eventos 4104 a nivel de Advertencia. Así que puede que encuentres algunos eventos. Solo no los confundas con el panorama completo.
Activarlo ayuda de ahora en adelante, no para lo que ya ocurrió. Utiliza la configuración de Política de Grupo Plantillas administrativas → Componentes de Windows → Windows PowerShell → Activar el registro de bloques de script de PowerShell, o establece el valor del registro directamente:
reg add «HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging» /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
PowerShell 7 lee su propia clave de políticas bajo HKLMSOFTWAREPoliciesMicrosoftPowerShellCore. Si fue instalado desde un zip en lugar del MSI, su canal de eventos puede no estar registrado hasta que ejecutes RegisterManifest.ps1 desde $PSHOME.
Espera volumen. Cada script y módulo que se ejecuta termina en el registro. Aumenta el tamaño máximo del canal, o solo mantendrás unas pocas horas.
Espera secretos. Los scripts de administración a veces llevan contraseñas y claves de API en texto plano, y el registro de bloques de script los registra fielmente. Tenlo en cuenta antes de que este archivo vaya a cualquier parte, y lee la sección de LogTotal a continuación.
Exportar los registros
En el Visor de Eventos, haz clic derecho en Operacional bajo PowerShell y elige Guardar todos los eventos como… Desde la línea de comandos:
:: solo bloques de script
wevtutil epl «Microsoft-Windows-PowerShell/Operational» C:logsps_4104.evtx /q:»*[System[(EventID=4104)]]»
:: PowerShell 7
wevtutil epl «PowerShellCore/Operational» C:logspwsh.evtx
:: el clásico log de «Windows PowerShell»: eventos de inicio del motor con la línea de comandos del host
wevtutil epl «Windows PowerShell» C:logswindows_powershell.evtx
Ese último es fácil de olvidar, pero vale la pena capturarlo. El evento 400 registra cada inicio del motor, incluida la versión del motor. Una EngineVersion de 2.0 en un sistema moderno generalmente significa que alguien disminuyó intencionadamente para esquivar el registro de bloques de script.
Sube y revisa en LogTotal
LogTotal lee EVTX nativamente. Una cosa que saber primero: LogTotal todavía no sanitiza archivos EVTX. [PROOF: confirm which formats the sanitize step covers today.] With PowerShell logs, that matters more than usual, because of the secrets mentioned above. Use EVTX uploads freely for test machines. For production hosts, get a yes from whoever owns data handling first.
- Subir. Abre logtotal.com y coloca el archivo. [PRUEBA: pantalla de carga, límite de tamaño]
- Revisar. [PROOF: what the results screen shows for PowerShell data]
Cómo se ve esto en datos reales. Usamos [PRUEBA: fuente de muestra, por ejemplo, una máquina virtual de prueba con el registro de bloques de script activado, después de ejecutar un cradle de descarga codificado y una cadena de prueba de manipulación de AMSI inofensiva]. LogTotal señaló [PRUEBA: hallazgos reales]. [PRUEBA: enlace al archivo de muestra]
Cuando sale mal
| Síntoma | Causa probable | Fix |
|---|---|---|
| No hay eventos 4104 en absoluto | El registro de bloques de script está desactivado y nada parecía sospechoso | Actívalo para el futuro; revisa el log de Windows PowerShell para lo que aún puedas obtener |
| Solo unos pocos eventos 4104, todos de Advertencia | El registro está desactivado; estás viendo un registro automático de bloques sospechosos | Lo mismo que arriba |
| No encontrado PowerShellCore/Operational | PowerShell 7 no está instalado, o su manifiesto no está registrado | Ejecuta RegisterManifest.ps1 desde $PSHOME |
| El texto 4104 es texto cifrado ilegible | El registro de eventos protegidos está activado | Necesitas el certificado de descifrado |
| El registro cubre solo unas pocas horas | Tamaño por defecto, alto volumen | Aumenta el tamaño máximo del canal |
FAQ
¿El registro de bloques de script detecta código ofuscado?
En gran medida, sí. Registra bloques de script a medida que se compilan. Cuando el código ofuscado construye y ejecuta la siguiente etapa, esa etapa se registra como su propio bloque, a menudo en forma legible.
¿Cuál es la diferencia con la transcripción?
La transcripción escribe archivos de texto de la entrada y salida de la sesión en una carpeta. El registro de bloques de script registra el código en sí mismo en el registro de eventos. Se complementan entre sí, y ambos valen la pena tener.