EVIL msi. Уязвимости файлов .msi
Вы, вероятно, довольно часто сталкивались с файлами MSI. Они используются производителями программного обеспечения для предоставления своих программ. Этот формат более удобен, чем стандартный, потому что:
- Есть возможность восстановления и установки определенных компонентов
- Хранение данных в хорошо структурированных таблицах, к которым можно легко получить доступ через API-интерфейсы
- Простое распространение через SCCM, web-endpoints
В файлах MSI могут быть различные уязвимости, большинство из которых приведут к повышению привилегий. К ним относятся как логические уязвимости: перехват DLL/TypeLib/COM/Exe-файла/скрипта/etc
, злоупотребление путями.
Сам формат MSI в чем-то похож на базы данных SQL. Внутри файла MSI находятся таблицы с различными данными. Между таблицами существует взаимосвязь. Эта таблица анализируется и используется при установке файла MSI.
Отмечу, что таблиц много. Нас интересуют лишь некоторые из них. Полный список таблиц приведен здесь.
специальная таблица, внутри которой расположены ресурсы, используемые приложением (изображения, ярлыки, иконки и т.д.);
- таблица, указывающая, какие файлы должны быть установлены в системе;
- таблица, содержащая информацию о структуре папок устанавливаемой программы;
- таблица, содержащая действия, которые необходимо выполнить во время установки файла MSI (создать ярлык, создать раздел реестра, ввести значение);
- действия, которые необходимо выполнить в процессе установки, однако, они не могут быть выполнены через Windows Installer API, поэтому используются сторонние программы, DLL-файлы, cmd-команды
Самый простой способ найти все MSI-файлы - это заглянуть в папку C:\Windows\Installer
. Здесь вы обязательно найдете все MSI-файлы программ, установленных на вашем компьютере.
Внутри папки вы можете найти MSI-файлы и другие папки. В других папках часто хранятся различные ресурсы, необходимые для работы с MSI-файлом. Они называются GUID. Этот идентификатор GUID можно увидеть в поле идентификационного номера установленного программного продукта.
Вы можете просмотреть установленные программы и составить сопоставление, используя эти команды:
wmic product identifyingnumber,name,vendor,version
Вы также можете использовать Powershell и добавить фильтр по программному обеспечению
Get-WmiObject - | ? { $_.Name -like } | select IdentifyingNumber,Name
Конечно, удобнее использовать автоматизированные инструменты для сбора информации и самих MSI-файлов.
- Эти инструменты можно использовать для поиска файлов msi, затем их загрузки и последующего анализа непосредственно на компьютере злоумышленника для обнаружения повышения привилегий.
- Отлично подходит для извлечения файлов MSI из SCCM. Например, из точек распространения.
CMLoot — это PowerShell-библиотека, созданная для облегчения поиска интересных файлов, хранящихся на SMB-шарах System Center Configuration Manager (SCCM/CM).
Invoke-CMLootInventory -SCCMHost sccm01.domain.local -Outfile sccmfiles.txt
Invoke- -InventoryFile .\sccmfiles.txt -Extension msi
Вы также можете найти файлы для анализа в Интернете. Например, вы можете воспользоваться Google.
Самое главное. Внутри файлов MSI можно найти оставшиеся пароли, API-ключи, конечные точки и другие данные, которые могут представлять интерес для злоумышленников. В MyMSIAnalyzer мы выделили класс Cardfinder
для обнаружения учетных данных. Поиск учетных данных работает на пределе простоты. Он проверяет все.
Поскольку формат MSI близок к формату SQL, вы можете получить все свойства с помощью одного запроса. Однако, если вам нужен переносимый вариант или вы еще не знаете, как компилировать проекты C#, вы можете использовать сценарий Powershell с той же логикой:
$installerPath = "C:\Windows\Installer" $package = New-Object -ComObject WindowsInstaller.Installer { param ( [string]$msiPath ) try { $database = $package.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $package, @($msiPath, 0)) $view = $database.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $database, @("SELECT * FROM Property")) $view.Execute() while ($record = $view.Fetch()) { $property = $record.StringData(1) $value = $record.StringData(2) if ($property -match"USERNAME|PASSWORD|USER|PASS") { Write-Host "File: , Property: , Value: " } } } catch { Write-Host "Error processing file: " -ForegroundColor Red } } Get-ChildItem -Path -Filter *.msi - Recurse | ForEach-Object { AnalyzeMsiFile .FullName}
Конечно, внутренние учетные данные MSI можно найти довольно редко. Чаще всего только при анализе Файлов MSI, которые были украдены из SCCM. Поэтому, если мы ищем вектор повышения привилегий, нам нужно проанализировать поведение файла MSI.
И здесь нам нужно ознакомиться с необычной функциональностью: механизмом восстановления файлов MSI.
Механизм восстановления MSI позволяет системе Windows переустановить либо весь продукт, либо отдельные его компоненты. По сути, вы можете исправить программу, если что-то пошло не так во время использования или установки.
Эту функциональность наиболее удобно использовать с помощью инструмента CLI msiexec.
Кроме того, пользовательские действия MSI, созданные разработчиком файла MSI, запускаются в режиме восстановления. Здесь также может быть уязвимость. Если пользовательские действия или весь файл MSI настроен неправильно, процесс восстановления выполняется от имени пользователя NT AUTHORITY\SYSTEM
, что позволяет нам повысить привилегии.
Например, если разработчик настроил пользовательские действия на запуск cmd.exe, то во время обычной установки cmd.exe будет запущен от имени текущего пользователя, но во время восстановления он будет запущен от имени системного пользователя (администратора).
Также с помощью пользовательских действий можно запускать некоторые графические приложения от имени системы (администратора), из которых можно сделать аналог обхода, выйти на explorer.exe и запустить cmd.exe из него. cmd.exe будет запущено от имени системы (администратора).
Давайте начнем с проверки всего файла MSI. Есть только две вещи, которые нам нужно отслеживать:
- Наличие графического интерфейса, если мы хотим продвигать его с помощью explorer.exe escape.
- Имя пользователя, от имени которого файл MSI запускается в режиме восстановления, если мы хотим проверить файл на наличие других уязвимостей, таких как перехват библиотеки DLL.
Самый простой способ обнаружить такие MSI-файлы - воспользоваться инструментом Gui Finder
Файлы MSI довольно часто используются в инфраструктуре Windows. Часто неправильный подход к разработке или развертыванию таких файлов приводит к возможности повышения привилегий на хосте. Поэтому, для разработчиков, которые используют расширение .msi стоит обращать внимание на различные лазейки в своих проектах. Обычным же пользователям при работе с файлами .msi необходимо тщательно их проверять, дабы оставаться в безопасности и сохранить все свои данные.