17.06.2022 | Повышение привилегий за счет удаления произвольных файлов — и другие интересные приемы |
Сложности с удалением произвольных файловПри удалении произвольных файлов в Windows возникают два серьезных препятствия:
Есть и третья потенциальная сложность: некоторые важные системные файлы всегда будут недоступны из-за нарушения условий коллективного доступа. На практике найти файл, удаление которого имело бы смысл с точки зрения взлома системы и одновременно допускалось ей, очень сложно. Если искать в обычных местах, например в каталогах 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). Полный принцип работы эксплойта для повышения привилегий выглядит так:
Обратите внимание: на шаге 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 просматривает содержимое временной папки и удаляет каждый обнаруженный там файл. Исследователь использовал следующий прием:
Может вспомниться техника эксплуатации символических ссылок и 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-эксплойт можно использовать даже удаленно. Ему не требуется ничего, кроме возможности внедрить в нужное место папку или файл. ЗаключениеРассмотренные приемы доказывают: некоторые довольно слабые примитивы эксплуатации можно эффективно использовать. Было показано следующее:
Благодарим исследователя Абдельхамида Насери за его вклад в разработку этих эксплуатационных приемов и за сообщения об уязвимостях. Ждем от него новой полезной информации. А пока подписывайтесь на @HexKitchen и @thezdi в «Твиттере», чтобы получать новости об эксплойтах и обновлениях безопасности. |
Проверить безопасность сайта