- 06/12/2017
- 2 minutos de lectura
-
- j
- s
Aunque PowerShell ya tiene la configuración de directiva de grupo LogPipelineExecutionDetails para registrar lainvocación de cmdlets, el lenguaje de scripting de PowerShell tiene varias características que es posible que desee registrar y auditar. La nueva función de seguimiento detallado de scripts proporciona un seguimiento y análisis detallados de la actividad de scripts de Powershell en un sistema. Después de habilitar el seguimiento detallado de scripts, PowerShell registra los bloques allscript en el registro de eventos de ETW, Microsoft-Windows-PowerShell/Operational. Si un bloque de script crea otro bloque de script, por ejemplo, llamando a Invoke-Expression
, el bloque de script invocado también se registra.
El registro se habilita mediante la configuración de Directiva de grupo Activar registro de bloques de scripts de PowerShell Plantillas administrativas -> Componentes de Windows -> Windows PowerShell.
Los eventos son:
Canal | Operativo |
---|---|
Nivel | Detallado |
Código de operación | Crear |
Tarea | Inicio de comandos |
Palabra clave | Espacio de ejecución |
EventID | Motor_scriptblockcompiled (0x1008 = 4104) |
Mensaje | Creando texto de bloque de scripts (%1 de %2): ID de bloque de scripts %3: %4 |
El texto incrustado en el mensaje es la extensión del bloque de script compilado. El ID es un GUID que se conserva durante la vida del bloque de script.
Cuando habilita el registro detallado, la entidad escribe marcadores de inicio y fin:
Canal | Operativo |
---|---|
Nivel | Detallado |
Código de operación | Abrir / Cerrar |
Tarea | CommandStart / CommandStop |
Palabra clave | Espacio de ejecución |
EventID | ScriptBlock_Invoke_Start_Detail (0x1009 = 4105) / ScriptBlock_Invoke_Complete_Detail (0x100A = 4106) |
Mensaje | Invocación iniciada / completada del ID del bloque de scripts: % 1 ID del espacio de ejecución: %2 |
El ID es el GUID que representa el bloque de script (que se puede correlacionar con el ID de evento 0x1008), y el ID de espacio de ejecución representa el espacio de ejecución en el que se ejecutó este bloque de script.
Los signos de porcentaje en el mensaje de invocación representan propiedades ETW estructuradas. Mientras se reemplazan con los valores reales del texto del mensaje, una forma más sólida de acceder a ellos es recuperar el mensaje con el cmdlet Get-WinEvent y, a continuación, utilizar la matriz de propiedades del mensaje.
Este es un ejemplo de cómo esta funcionalidad puede ayudar a desenvolver un intento malicioso de cifrar y ocultar un script:
## Malwarefunction SuperDecrypt{ param($script) $bytes = ::FromBase64String($script) ## XOR "encryption" $xorKey = 0x42 for($counter = 0; $counter -lt $bytes.Length; $counter++) { $bytes = $bytes -bxor $xorKey } ::Unicode.GetString($bytes)}$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="Invoke-Expression $decrypted
Al ejecutar esto, se generan las siguientes entradas de registro:
Compiling Scriptblock text (1 of 1):function SuperDecrypt{ param($script) $bytes = ::FromBase64String($script) ## XOR "encryption" $xorKey = 0x42 for($counter = 0; $counter -lt $bytes.Length; $counter++) { $bytes = $bytes -bxor $xorKey } ::Unicode.GetString($bytes)}ScriptBlock ID: ad8ae740-1f33-42aa-8dfc-1314411877e3Compiling Scriptblock text (1 of 1):$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="ScriptBlock ID: ba11c155-d34c-4004-88e3-6502ecb50f52Compiling Scriptblock text (1 of 1):Invoke-Expression $decryptedScriptBlock ID: 856c01ca-85d7-4989-b47f-e6a09ee4eeb3Compiling Scriptblock text (1 of 1):Write-Host 'Pwnd'ScriptBlock ID: 5e618414-4e77-48e3-8f65-9a863f54b4c8
Si la longitud del bloque de script supera la capacidad de un solo evento, PowerShell rompe el script en varias partes. Aquí hay un código de ejemplo para recombinar un script a partir de sus mensajes de registro:
$created = Get-WinEvent -FilterHashtable @{ ProviderName="Microsoft-Windows-PowerShell"; Id = 4104 } | Where-Object { $_.<...> }$sortedScripts = $created | sort { $_.Properties.Value }$mergedScript = -join ($sortedScripts | % { $_.Properties.Value })
Al igual que con todos los sistemas de registro que tienen un búfer de retención limitado, una forma de atacar esta infraestructura es inundar el registro con eventos espurios para ocultar pruebas anteriores. Para protegerse de este ataque, asegúrese de tener algún tipo de colección de registros de eventos configurando el reenvío de eventos de Windows. Para obtener más información, consulte Asignar al Adversario a la supervisión del Registro de eventos de Windows.