Бесплатно Экспресс-аудит сайта:

17.06.2022

Повышение привилегий за счет удаления произвольных файлов — и другие интересные приемы

Сложности с удалением произвольных файлов

При удалении произвольных файлов в Windows возникают два серьезных препятствия:

  1. Большинство критически важных файлов Windows заблокированы с помощью списков DACL. Последние не дают модифицировать файлы даже от имени учетной записи SYSTEM. Файлы ОС по большей части принадлежат учетной записи TrustedInstaller, и только она может их изменять. (Упражнение: найдите критически важные файлы Windows, которые все же можно удалить или перезаписать от имени SYSTEM.)
  2. Найти файл, который можно удалить от имени SYSTEM, злоумышленнику недостаточно: при удалении должна возникнуть ситуация fail-open (ухудшение безопасности).

Есть и третья потенциальная сложность: некоторые важные системные файлы всегда будут недоступны из-за нарушения условий коллективного доступа.

На практике найти файл, удаление которого имело бы смысл с точки зрения взлома системы и одновременно допускалось ей, очень сложно. Если искать в обычных местах, например в каталогах C:Windows, C:Program Files или C:Program Data, там не найдется ничего подходящего. Ранее была показана эксплуатация антивирусного и другого ПО. Однако возможность эксплуатации зависит от конкретного уязвимого поведения программ.

Решение есть — в установщике Windows

В марте 2021 года поступило сообщение об уязвимости от исследователя по имени Абдельхамид Насери (Abdelhamid Naceri), также известного как halov . Уязвимость заключалась в удалении произвольного файла посредством службы профилей пользователей (User Profile) от имени учетной записи SYSTEM. В сообщении также упоминался прием, позволяющий использовать удаление файла для повышения привилегий (EoP) и запуска командной строки от имени SYSTEM. Повышение достигалось путем удаления файла, расположенного в весьма неожиданном месте.

Ниже представлено упрощенное описание службы установщика Windows и упомянутого способа повышения привилегий.

Служба установщика Windows отвечает за установку приложений. Автор приложения создает файл с расширением .msi. Это база данных с описанием изменений, необходимых для установки приложения: какие папки нужно создать, какие файлы — скопировать, какие разделы реестра — изменить, какие специальные действия — выполнить и так далее.

При этом служба установщика Windows реализует управление транзакциями — для обеспечения целостности системы в случае сбоя установки и для аккуратного отката установки. Когда установщик Windows вносит изменение в систему, он каждый раз создает запись об этом. А когда установщик перезаписывает файл в системе более новой версией из устанавливаемого пакета, он сохраняет копию старой версии. Записи позволяют службе вернуть систему к исходному состоянию при откате установки. В простейшем сценарии записи хранятся в папке C:Config.Msi.

Во время установки служба установщика Windows создает папку C:Config.Msi и записывает туда информацию для отката изменений. При внесении изменений в систему в ходе установки служба каждый раз записывает информацию о них в файл с расширением .rbs (сценарий отката) в папке C:Config.Msi. Также при перезаписи старой версии файла более новой установщик сохраняет копию исходного файла в папке C:Config.Msi. Копиям присваивается расширение .rbf (файл отката). Если нужно откатить незавершенную установку, служба установщика обращается к файлам .rbs и .rbf и с их помощью возвращает систему к исходному состоянию.

Этот механизм важно защитить от постороннего вмешательства. Если злоумышленник сможет модифицировать файлы .rbs и .rbf до их считывания, то в ходе отката система может быть произвольно изменена. Поэтому установщик Windows с помощью DACL задает строгие ограничения на доступ к файлам в папке C:Config.Msi.

Однако есть лазейка. Злоумышленник может использовать уязвимость, позволяющую удалять произвольные папки, для полного удаления папки C:Config.Msi сразу после ее создания установщиком Windows. Затем злоумышленник может воссоздать папку C:Config.Msi с пониженными правами доступа DACL (обычным пользователям разрешено создавать папки в корневом каталоге C:). А когда установщик Windows создаст файлы отката изменений в C:Config.Msi, преступник сможет заменить папку C:Config.Msi ее поддельной версией с измененными файлами .rbs и .rbf. Тогда во время отката установщик Windows внесет произвольные изменения в систему в соответствии с вредоносными сценариями.

В данном случае единственный необходимый примитив эксплуатации — это возможность удалить пустую папку. Примитивы перемещения или переименования папки также будут работать.

От удаления, перемещения или переименования произвольной папки к повышению привилегий до уровня SYSTEM

В дополнение к статье здесь приведен исходный код эксплойта для повышения привилегий, описанного Абдельхамидом Насери. Эксплойт может широко применяться, когда есть примитив удаления, перемещения или переименования произвольной пустой папки в контексте учетной записи SYSTEM либо учетной записи администратора. При сборке эксплойта выбирается конфигурация Release с учетом архитектуры целевой системы (x64 или x86). После запуска эксплойт предложит инициировать удаление папки C:Config.Msi. Для удаления можно активировать уязвимость удаления произвольной папки. Либо в целях тестирования можно просто выполнить команду rmdir C:Config.Msi из командной строки с повышенными привилегиями. После успешного запуска эксплойт создаст файл по пути C:Program FilesCommon Filesmicrosoft sharedinkHID.DLL. Затем можно запустить экранную клавиатуру (osk.exe), переключиться на безопасный рабочий стол (например, с помощью клавиш Ctrl-Alt-Delete) и таким образом получить командную строку с привилегиями SYSTEM.

Эксплойт содержит файл .msi. В файле .msi есть два специальных действия: одно вызывает короткую задержку, а второе — генерирует ошибку. Когда служба установщика Windows попытается установить файл .msi, установка остановится на половине и затем откатится. К началу отката эксплойт уже заменит содержимое папки C:Config.Msi вредоносными файлами .rbs и .rbf. В файле .rbf будут фрагменты вредоносного файла HID.DLL. А файл .rbs укажет установщику Windows «восстановить» вредоносный файл по нужному пути (C:Program FilesCommon Filesmicrosoft sharedink).

Полный принцип работы эксплойта для повышения привилегий выглядит так:

  1. Эксплойт создает фиктивный каталог C:Config.Msi и устанавливает для него нежесткую блокировку (oplock).
  2. Злоумышленник активирует уязвимость и удаляет папку C:Config.Msi (или переносит C:Config.Msi в другое место) в контексте учетной записи SYSTEM (или учетной записи администратора). Ввиду нежесткой блокировки процесс в контексте учетной записи SYSTEM вынужденно переходит в состояние ожидания.
  3. В эксплойте запускается функция обратного вызова для создания нежесткой блокировки. В функции обратного вызова выполняются следующие действия.
  4. Эксплойт переносит фиктивную папку C:Config.Msi в другое место. Так нежесткая блокировка сохраняется и уязвимый процесс продолжает вынужденное ожидание. В это время элемент файловой системы C:Config.Msi становится доступен для других целей (см. далее).
  5. Эксплойт создает новый поток, вызывающий службу установщика Windows для установки файла .msi с отключенным пользовательским интерфейсом.
  6. Далее поток функции обратного вызова возобновляет работу и начинает проверять наличие папки C:Config.Msi. По непонятным причинам установщик Windows создает папку C:Config.Msi, ненадолго задействует ее для хранения временного файла, удаляет, а затем снова создает, чтобы сохранить в папке сценарии отката изменений. Поток функции обратного вызова проверяет наличие папки C:Config.Msi в ожидании каждого из перечисленных действий.
  7. Когда эксплойт обнаруживает, что установщик Windows создал папку C:Config.Msi во второй раз, поток функции обратного вызова завершается и снимает нежесткую блокировку. Это позволяет уязвимому процессу продолжить работу и удалить, переместить или переименовать папку C:Config.Msi, созданную установщиком Windows.
  8. Основной поток эксплойта возобновляет работу. Он регулярно пытается создать папку C:Config.Msi с пониженными правами доступа DACL. Как только уязвимый процесс удаляет, перемещает или переименовывает папку C:Config.Msi, эксплойт успешно создает папку с таким же именем.
  9. Эксплойт следит за содержимым C:Config.Msi и ждет, когда установщик Windows создаст там файл .rbs.
  10. Эксплойт циклически пытается переместить папку C:Config.Msi в другое место. Как только установщик Windows закрывает дескриптор файла .rbs, перемещение выполняется и эксплойт продолжает работу.
  11. Эксплойт создает папку C:Config.Msi в последний раз. Туда он помещает вредоносный файл .rbs с тем же именем, что и у оригинального файла .rbs. Вместе с файлом .rbs в папку помещается вредоносный файл .rbf.
  12. После реализации задержки и генерации ошибки, указанных в файле .msi, установщик Windows откатывает изменения. Он забирает подложенные вредоносные файлы .rbs и .rbf, и в систему внедряется вредоносная DLL-библиотека.

Обратите внимание: на шаге 7 возникает состояние гонки, которое иногда приводит к проблемам. Если уязвимый процесс не активируется немедленно и не удалит папку C:Config.Msi вовремя, момент для эксплуатации уязвимости может быть упущен: установщик Windows вскоре откроет дескриптор папки C:Config.Msi и начнет записывать в нее файл .rbs. В это время удаление C:Config.Msi не сработает, потому что папка не будет пустой. Избежать этого можно за счет запуска эксплойта в системе, имеющей как минимум 4 процессорных ядра. А идеальным вариантом для злоумышленника, вероятно, будет «тихая» система, не слишком загруженная другой активностью. В случае сбоя нужно будет повторить запуск эксплойта и активировать уязвимость еще раз.

От удаления произвольного файла к повышению привилегий до уровня SYSTEM

Описанный выше прием предполагает наличие примитива, позволяющего удалить произвольную пустую папку. Однако нередко используется примитив удаления файлов, а не папок. Так было при эксплуатации бага, обнаруженного Абдельхамидом Насери в службе профилей пользователей. Тогда для повышения привилегий до уровня SYSTEM в эксплойте использовался один дополнительный прием, описанный ниже.

В NTFS метаданные (данные индекса), связанные с папкой, хранятся в альтернативном потоке данных для этой папки. Если папка имеет имя C:MyFolder, то данные индекса находятся в потоке с именем C:MyFolder::$INDEX_ALLOCATION. Некоторые подробности об этом механизме есть здесь. Однако для текущих целей достаточно знать следующее. При удалении потока папки ::$INDEX_ALLOCATION папка успешно удаляется из файловой системы, а имя потока, такое как C:MyFolder::$INDEX_ALLOCATION, может быть передано функциям API, принимающим в качестве аргумента имя файла. Среди них, например, функция DeleteFileW.

Если заставить процесс, запущенный от имени учетной записи SYSTEM или администратора, передать произвольную строку в функцию DeleteFileW, то этот процесс можно будет использовать не только как примитив удаления файлов, но и как примитив удаления папок. А далее можно добиться повышения привилегий до уровня учетной записи SYSTEM с помощью приема выше. В данном случае передаваемая строка будет иметь вид C:Config.Msi::$INDEX_ALLOCATION.

Важно: успех зависит от конкретного кода, присутствующего в уязвимом процессе. Если уязвимый процесс просто вызывает функцию DeleteFileA/DeleteFileW, все получится. Однако процесс с необходимыми привилегиями может выполнять и другие связанные действия, например проверять атрибуты указанного файла. Вот почему описанный сценарий невозможно будет проверить из командной строки с помощью команды del C:Config.Msi::$INDEX_ALLOCATION.

От удаления содержимого папки к повышению привилегий до уровня SYSTEM

Перейдем на следующий уровень и предположим, что уязвимый процесс с привилегиями SYSTEM не позволяет указать произвольную папку или файл для удаления. Однако злоумышленник может заставить процесс удалить содержимое произвольной папки или рекурсивно удалить файлы из папки, доступной для записи. Так тоже можно добиться повышения привилегий: Абдельхамид Насери продемонстрировал это в июле 2021 года. Он подробно описал уязвимость в запланированной задаче SilentCleanup, выполняемой от имени SYSTEM. Задача SilentCleanup просматривает содержимое временной папки и удаляет каждый обнаруженный там файл. Исследователь использовал следующий прием:

  1. Создать подпапку tempfolder1.
  2. Создать файл tempfolder1file1.txt.
  3. Установить нежесткую блокировку на файл tempfolder1file1.txt.
  4. Подождать, пока уязвимый процесс не просмотрит содержимое папки tempfolder1 и не попытается удалить найденный там файл file1.txt. Это приведет к активации нежесткой блокировки.
  5. После активации нежесткой блокировки выполнить следующие действия в функции обратного вызова:
    • Переместить файл file1.txt в другое место, чтобы папка tempfolder1 оказалась пуста и ее можно было удалить. Файл file1.txt нужно переместить, а не просто удалить: для удаления потребовалось бы сначала снять нежесткую блокировку. В результате нежесткая блокировка сохраняется и уязвимый процесс продолжает находиться в состоянии ожидания. В это время выполняется следующий шаг
    • Повторно создать папку tempfolder1 в качестве соединения (junction) с папкой RPC Control в пространстве имен объектов.
    • Создать символическую ссылку RPC Controlfile1.txt, указывающую на C:Config.Msi::$INDEX_ALLOCATION.
  6. При завершении функции обратного вызова нежесткая блокировка снимается, и уязвимый процесс продолжает выполняться. Удаление файла file1.txt приводит к удалению папки C:Config.Msi.

Может вспомниться техника эксплуатации символических ссылок и RPC Control из инструментария symboliclink-testing-tools Джеймса Форшоу (James Forshaw). Однако важно отметить: недостаточно установить соединение от папки tempfolder1 к RPC Contro, чтобы уязвимость удаления произвольных файлов сработала. Для RPC Control нельзя составить список содержимого, поэтому уязвимый процесс не сможет найти объект RPC Controlfile1.txt путем перебора списка файлов. Нужно сначала создать реальный файл tempfolder1file1.txt, который будет найден уязвимым процессом. И только когда уязвимый процесс попытается открыть файл для удаления, следует превратить папку tempfolder1 в соединение, указывающее на пространство имен объектов.

Рабочий код эксплойта можно посмотреть в проекте FolderContentsDeleteToFolderDelete. Встроенная функция обнаружения вредоносных программ в Windows пометит этот процесс как вредоносный и завершит его. Поэтому можно добавить исключение типа «Процесс» для файла FolderContentsDeleteToFolderDelete.exe. Два эксплойта можно соединить в цепочку. Сначала злоумышленник запустит файл FolderOrFileDeleteToSystem и подождет, пока файл не предложит инициировать привилегированное удаление папки Config.Msi. Затем преступник выполнит команду FolderContentsDeleteToFolderDelete /target C:Config.Msi. Будет предложено инициировать привилегированное удаление содержимого папки C: est1. При необходимости расположение можно переопределить с помощью параметра командной строки /initial. В целях тестирования можно выполнить команду del /q C: est1* в командной строке с повышенными привилегиями и таким образом имитировать примитив привилегированного удаления содержимого папки. В результате FolderContentsDeleteToFolderDelete удалит папку C:Config.Msi, и это позволит программе FolderOrFileDeleteToSystem создать файл HID.DLL. Осталось вызвать экранную клавиатуру, нажать клавиши Ctrl-Alt-Delete и получить в распоряжение оболочку с правами SYSTEM.

От создания произвольной папки к постоянному отказу в обслуживании

Остался еще один прием. О нем также сообщил Абдельхамид Насери. Необходим примитив создания произвольной папки от имени учетной записи SYSTEM или администратора. На первый взгляд это вообще не может повлиять на безопасность (если только папка не создается с пониженными правами доступа DACL). Однако на самом деле можно реализовать серьезный отказ в обслуживании. Задача — создать папку наподобие такой: C:WindowsSystem32cng.sys.

Обычно файла или папки с таким именем не существует. Но если злоумышленник поместит в указанное место файловой системы посторонний файл или даже пустую папку, процесс загрузки Windows будет нарушен.

Принцип действия этого метода не до конца ясен. Похоже, Windows пытается загрузить модуль ядра cng.sys из неправильного места и терпит неудачу. При этом не реализована логика повторных попыток, которая бы позволила системе продолжить поиск и найти нужный драйвер. Результат — полная невозможность загрузки системы. Для достижения того же эффекта могут использоваться и другие драйверы.

В зависимости от имеющейся уязвимости, описанный DoS-эксплойт можно использовать даже удаленно. Ему не требуется ничего, кроме возможности внедрить в нужное место папку или файл.

Заключение

Рассмотренные приемы доказывают: некоторые довольно слабые примитивы эксплуатации можно эффективно использовать. Было показано следующее:

  • Удаление, перемещение или переименование произвольной папки (в том числе пустой) от имени учетной записи SYSTEM или администратора можно использовать для повышения привилегий до уровня SYSTEM.
  • Удаление произвольного файла от имени учетной записи SYSTEM или администратора обычно можно использовать для повышения привилегий до уровня SYSTEM.
  • Удаление содержимого произвольной папки от имени учетной записи SYSTEM или администратора можно использовать для повышения привилегий до уровня SYSTEM.
  • Рекурсивное удаление содержимого фиксированной папки можно использовать для повышения привилегий до уровня SYSTEM, если папка доступна злоумышленнику для записи от имени учетной записи SYSTEM или администратора.
  • Создание произвольной папки от имени учетной записи SYSTEM или администратора можно использовать для реализации постоянного отказа в обслуживании.
  • Удаление или перезапись произвольного файла от имени учетной записи SYSTEM или администратора (даже без контроля содержимого) можно использовать для реализации постоянного отказа в обслуживании.

Благодарим исследователя Абдельхамида Насери за его вклад в разработку этих эксплуатационных приемов и за сообщения об уязвимостях. Ждем от него новой полезной информации. А пока подписывайтесь на @HexKitchen и @thezdi в «Твиттере», чтобы получать новости об эксплойтах и обновлениях безопасности.