PowerShell es una herramienta extremadamente poderosa para la administración de sistemas Windows… y precisamente por ello también es uno de los vectores favoritos de los atacantes. Conocer las técnicas de evasión más utilizadas permite reforzar la seguridad, mejorar la monitorización y diseñar reglas defensivas más efectivas.
A continuación se analizan varias técnicas empleadas para ocultar actividad maliciosa, junto con su impacto y las medidas recomendadas para mitigarlas.
1. Uso de Alternate Data Streams (ADS) para Evasión
$content = 'Invoke-Mimikatz'; $file = 'C:\temp\normal.txt'; $stream = 'C:\temp\normal.txt:hidden'; Set-
Content -Path $file -Value 'This is a normal file'; Add-Content -Path $stream -Value $content; Get-
Content -Path $stream
Los Alternate Data Streams de NTFS permiten almacenar información oculta dentro de un archivo sin modificar su contenido visible. Un atacante puede esconder comandos, cargas maliciosas o scripts dentro de estos flujos alternativos.
Riesgos principales
- El contenido no aparece en un listado normal del sistema de archivos.
- Muchos antivirus no inspeccionan ADS por defecto.
- Permite persistencia discreta.
Cómo defenderse
- Utilizar herramientas específicas (Sysinternals
streams.exe, PowerShellGet-Item -Stream *). - Monitorizar rutas sensibles mediante EDR.
- Bloquear ejecución desde rutas no aprobadas.
- Analizar cambios inesperados en archivos aparentemente benignos.
2. Bypass de la Execution Policy
$policy = Get-ExecutionPolicy; Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process; # Run your
script here; Set-ExecutionPolicy -ExecutionPolicy $policy -Scope Process
Algunos atacantes modifican temporalmente la Execution Policy del proceso para permitir la ejecución de scripts que normalmente el sistema bloquearía.
Riesgos
- Permite ejecutar scripts no firmados o potencialmente maliciosos.
- No deja rastros persistentes si solo se modifica a nivel de proceso.
Contramedidas
- Aplicar políticas de restricción mediante GPO que no puedan ser sobrescritas fácilmente.
- Monitorizar procesos de PowerShell con parámetros sospechosos.
- Habilitar el Constrained Language Mode.
- Forzar la firma de scripts corporativos.
3. Ejecución de Scripts en Memoria (In-Memory Execution)
$code = [System.IO.File]::ReadAllText('C:\temp\script.ps1'); Invoke-Expression $code
Los atacantes pueden cargar y ejecutar código directamente en memoria sin escribirlo al disco, evadiendo soluciones basadas en escaneo de archivos.
Riesgos
- Evita firmas tradicionales basadas en archivos.
- Se combina habitualmente con payloads cifrados o comprimidos.
Medidas defensivas
- Activar y revisar PowerShell Script Block Logging.
- Implementar AMSI (Antimalware Scan Interface) y asegurarse de que no esté paralizado o manipulado.
- Utilizar EDR con capacidades de monitoreo en memoria.
4. Invocación Dinámica mediante Reflection
$assembly = [Reflection.Assembly]::LoadWithPartialName('System.Management'); $type =
$assembly.GetType('System.Management.ManagementObjectSearcher'); $constructor =
$type.GetConstructor(@([string])); $instance = $constructor.Invoke(@('SELECT * FROM Win32_Process'));
$method = $type.GetMethod('Get'); $result = $method.Invoke($instance, @())
La reflexión permite manipular clases del .NET Framework sin cargar módulos visibles o comunes, dificultando la trazabilidad.
Riesgos
- Permite ejecutar funciones del sistema sin depender de cmdlets auditables.
- Puede cargar ensamblados directamente desde memoria.
Defensa
- Revisar logs de event tracing for Windows (ETW) centrados en .NET.
- Monitorizar uso atípico de métodos de reflexión.
- Bloquear PowerShell clásico en favor de PowerShell 7 cuando sea posible, debido a mejoras de seguridad.
5. Ejecución de Comandos Codificados (Base64)
$encodedCmd = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes('Get-Process'));
powershell.exe -EncodedCommand $encodedCmd
El uso de comandos codificados oculta la intención real del comando, dificultando la detección en registros básicos.
Riesgos
- Oculta cadena real del comando.
- Se usa habitualmente con
-EncodedCommand.
Cómo protegerse
- Configurar el logging avanzado de PowerShell.
- Crear reglas de detección que alerten ante comandos codificados.
- Implementar inspección de parámetros en soluciones SIEM/EDR.
6. Runspaces para Evasión
$runspace = [runspacefactory]::CreateRunspace(); $runspace.Open(); $pipeline =
$runspace.CreatePipeline(); $pipeline.Commands.AddScript('Get-Process'); $results = $pipeline.Invoke();
$runspace.Close(); $results
Los runspaces permiten ejecutar código en entornos paralelos que no heredan las mismas restricciones del PowerShell principal.
Riesgos
- Permite cargarse fuera del entorno monitorizado.
- Reduce visibilidad en herramientas de análisis en tiempo real.
Contramedidas
- Supervisión continua del comportamiento del proceso
powershell.exeypwsh. - Uso de EDR capaz de detectar runspaces y pipelines internos.
- Deshabilitar versiones antiguas de PowerShell.
Conclusión
Las técnicas descritas de ocultación en ADS, manipulación temporal de políticas, ejecución en memoria, reflexión dinámica, comandos codificados y uso de runspaces forman parte del repertorio estándar de TTPs avanzadas utilizadas por actores maliciosos. Conocerlas es esencial para adoptar medidas de detección y endurecimiento adecuadas.
Fortalecer el entorno implica:
- registrar todo lo posible,
- utilizar soluciones EDR modernas,
- aplicar políticas estrictas,
- monitorizar el comportamiento más que las firmas.
