Детальный разбор IPSW (Часть 1) - "Швейцарский нож" в сфере исследования безопасности IOS/MacOS
В первой части разбора IPSW мы рассмотрим основные возможности инструмента и то, как он может значительно облегчить нашу жизнь.
IPSW - это инструмент, который каждый найдет полезным для исследования *OS, так как он предоставляет множество функций, связанных с
dyld_shared_cache, DeviceTree, kernelcache, Img4 и другими. Они и представляют интерес для исследователей безопасности.Мы рассмотрим каждую из ключевых команд, чтобы понять, что она делает и как ее использовать, но перед этим нам нужно сделать главное - установить IPSW. Мы можем собрать IPSW из исходного кода или можем скачать один из предварительно собранных бинарных файлов, доступных в репозитории (https://github.com/blacktop/ipsw/releases) GitHub.
После загрузки IPSW необходимо убедиться, что все работает исправно. Для этого напечатаем
--help - данная команда также отобразит доступный нам список команд.
Меню с доступными командами после введенной командыipsw --help
Теперь, поговорим про каждую из них поподробнее:
Appstore
appstore - это первая команда, которую предоставляет ipsw. Она позволяет нам взаимодействовать с App Store Connect API.
Менюipsw appstore
ipsw appstore даёт возможность:
- управлять идентификаторами связок (Bundle IDs) созданных приложений
- управлять сертификатами подписи
- просматривать и регистрировать новые устройства
- управлять профилями обеспечения
- генерировать JWT-токены, которые могут быть использован для взаимодействия с App Store Connect API.
Довольно большое количество ipsw-команд требуют ключ App Store Connect API. Его можно получить здесь: https://appstoreconnect.apple.com/access/api.
Панель генерации App Store Connect API Key
После создания ключа нам нужно загрузить его, нажав на кнопку Download. Путь к файлу будет указан с помощью флага -p, идентификатор эмитента (Issuer ID) с помощью флага -i и идентификатор ключа (Key ID) с помощью флага -k соответственно. Оба этих идентификатора (IDs) можно скопировать с веб-страницы, как показано на скрине выше.
Bundle
Данная команда выводит список зарегестрированных идентификаторов связок (Bundle IDs), созданных в XCode. С помощью
ipws appstore bundle ls, предоставив при этом ранее полученну информацию (файл .p8, идентфикатор эмитента (Issuer ID) и идентификатор ключа (Key ID)). Мы можем использовать эту команду, чтобы просмотреть все зарегестрированные нами идентификаторы связок (Bundle IDs).Команда:
ipsw appstore bundle ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Пример использованияipsw appstore bundle ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Cert
С помощью команды appstore cert у нас появляется возможность управления сертификатами подписи. Для получения списка сертификатов мы можем просто вызвать команду
ipsw appstore cert ls вместе с указанием файла .p8, идентификатора эмитента (Issuer ID) и идентификатора ключа (Key ID). Полезно будет использовать эту команду в случаях, когда хотим быстро создать новый сертификат подписи или проверить информацию о уже существующих.Команда:
ipsw appstore cert ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Пример использованияipsw appstore cert ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Теперь рассмотрим процесс создания нового сертификата подписи.
Первое, что нам нужно сделать, это создать новый ключ с помощью openssl.
Команда:
openssl req -newkey rsa:2048 -keyout 8ksec.key -out 8ksec.csrПосле заполнения необходимой информации мы получим запрос на подписание сертификата в файле 8ksec.csr и закрытый ключ в файле 8ksec.key. Содержимое файла 8ksec.csr будет передано флагу -c в
ipsw appstore cert add. Содердимое также следует немного "почистить" путем удаления новых строк с помощью tr -d '\n'
Пример использованияopenssl req -newkey rsa:2048 -keyout 8ksec.key -out 8ksec.csr и [B]tr -d '\n'[/B]
После того как мы получили наш csr, вызовем
ipsw appstore cert add с параметром --type DEVELOPMENT.Команда:
ipsw appstore cert add -c CONTENTS_OF_CSR -t DEVELOPMENT -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Пример использованияipsw appstore cert addс параметром--type DEVELOPMENT:ipsw appstore cert add -c CONTENTS_OF_CSR -t DEVELOPMENT -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Вот и наш результат: мы успешно создали новый сертификат подписи, который был сохранен в файл в нашей системе. Чтобы убедиться, что он действительно создан, вызовем
ipsw appstore cert ls ещё раз.
Проверка создания нового сертификата подписи черезipsw appstore cert ls
Чтобы удалить сертификат, мы просто передаем команду
--id в ipsw appstore cert rm. В нашем случае команда будет выглядеть так:ipsw appstore cert rm --id Q6FAZ3K5VT -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_IDDevice
Функционал ipsw также дает нам возможность управлять устройствами с помощью appstore. Например, используя device, мы можем перечислять существующие устройства или регистрировать новые. Чтобы добавить новое устройство, нам нужно иметь UDID устройства и указать его имя и платформу (iOS). UDID устройства можно узнать с помощью команды
idevice_id из libimobiledevice.Чтобы получить список устройств, выполните команду:
ipsw appstore device ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Отображение существующих устройств с помощью командыipsw appstore device ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Profile
Подкоманда profile позволяет управлять профилями обеспечения (инициализации). Мы можем выполнять такие действия, как перечисление, создание, обновление и удаление профилей. Сами профили позволяют запускать приложения с правами или сертификатами подписи вне обычной конфигурации iOS.
Чтобы отобразить список профилей необходимо ввести следующую команду:
ipsw appstore profile ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Список доступных нам профилей, отображенный с помощью командыipsw appstore profile ls -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Для создания нового профиля необходимо следующее:
- имя профиля
- идентификатор сертификата (Certificate ID) для вновь созданного профиля
- идентификатор устройства (Device ID), с которым будет связан новый профиль
Команда:
ipsw appstore profile create NAME -c CERTIFICATES_ID -d DEVICES_ID -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Пример создания нового профиля с помощью командыipsw appstore profile create NAME -c CERTIFICATES_ID -d DEVICES_ID -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Если запрос прошел успешно, то новый профиль будет записан в папку NAME.mobileprovision на вашем диске. Чтобы убедиться, что мы действительно создали профиль, давайте выполним еще один запрос (
profile ls):
Проверка создания профиля черезprofile ls
Если Вы хотите удалить профиль - укажите имя профиля в команде
ipsw appstore profile rm с флагом -n.Команда:
ipsw appstore profile rm -n 8ksec -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_IDToken
Команда token помогает сгенерировать JWT-токен для использования вместе с App Store Connect API.
Команда:
ipsw appstore token -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Генерация JWT-токена с помощьюipsw appstore token -p PATH_TO_P8_FILE -i ISSUER_ID -k KEY_ID
Device-list
Вторая основная подкоманда, которую предоставляет ipsw, - device-list. Она позволяет просмотреть список всех iOS-устройств, их архитектуры и процессоры, установленные в них.
Менюipsw device-list
Diff
Третья основная подкоманда связана с поиском различий между двумя ipsw-файлами. ipsw-файлы - это, по сути, файлы прошивки, и мы можем найти различия между двумя из них с помощью подкоманды Diff. Это может быть полезно, например, если уязвимость была исправлена, а мы не знаем точных деталей. В таком случае Diff может указать нам правильное направление.
Мы, в качестве примера, будем использовать ipsw-файлы iPhone 15 17.0.2 и iPhone 15 7.0.3.
Команда:
ipsw diff ~/Downloads/iPhone15,4_17.0.2_21A350_Restore.ipsw ~/Downloads/iPhone15,4_17.0.3_21A360_Restore.ipsw
Результат ввода командыipsw diff ~/Downloads/iPhone15,4_17.0.2_21A350_Restore.ipsw ~/Downloads/iPhone15,4_17.0.3_21A360_Restore.ipsw
После выполнения команды мы видим, что проверяется множество различных категорий, таких как
dyld_shared_cache, права доступа и т.д.Парой строк ниже мы можем увидеть некоторые фактические изменения:
Download
Четвертая команда позволяет нам загружать множество различных вещей, таких как ОС, IPA, IPSW-файлы, инсталляторы macOS и многое другое. Мы можем использовать эту команду для загрузки или просмотра различных веб-страниц из терминала.
Менюipsw download
Appledb
Эта подкоманда позволяет загружать файлы IPSW непосредственно из appledb.
Команда:
ipsw download appledb --os iOS --version '17.0.3' --device iPhone15,2 --kernel
Пример использованияipsw download appledb --os iOS --version '17.0.3' --device iPhone15,2 --kernel
Dev
Подкоманда dev позволяет загружать IPSW, XCode, Операционные Системы (ОС) и многое другое с сайта https://developer.apple.com/download.
Команда:
ipsw download devНабрав данную команду, вы получите список того, что хотите скачать, и сможете легко выбрать нужные вам элементы для установки.
Установка с помощью командыipsw download devна примере Xcode 15.0.1
Macos
Еще одна полезная подкоманда для ipsw download, которая позволяет загружать установщики macOS.
Доступные установщики MacOS
Стоит отметить, что ipsw download предлагает и другие подкоманды, такие как git и ipa. Однако, мы их пропустим, чтобы уделить большее внимание остальным командам.
Dtree
Эта команда позволяет нам спарсить DeviceTree. DeviceTree - это представление аппаратного обеспечения, которое загрузчиками предоставляют ядру.
Чтобы спарсить DeviceTree, нам сначала нужно его получить. Для этого мы можем использовать
ipsw extract для извлечения DeviceTree из файла IPSW.
После извлечения DeviceTree мы можем спарсить его с помощью
ipsw dtree.Команда:
ipsw dtree PATH_TO_DEVICE_TREE_FILE
Dyld
Подкоманда dyld предоставляет множество функциональных возможностей, связанных с
dyld_shared_cache.Вот некоторые из них:
- получение информации о
dyld_shared_cache- поиск того, какой dylib импортирует другой dylib
- извлечение
dyld_shared_cache- поиск строки внутри
dyld_shared_cache- и многое другое...
dyld расшифровывается как dynamic loader, и его работа заключается в загрузке общих библиотек в память процесса. Чтобы ускорить процесс загрузки, все они объединены в один файл под названием dyld shared cache. Мы рассмотрим лишь несколько из этих функций, так как их очень много.
Info
Чтобы получить всю информацию из
dyld_shared_cache, мы можем вызвать ipsw dyld info с указанием пути к dyld_shared_cache. Здесь также имеются некоторые опции: например, печать только dylibs, dlopen closures.Команда:
ipsw dyld info PATH_TO_DYLD_SHARED_CACHE
Пример применения подкоманды Info через командуipsw dyld info PATH_TO_DYLD_SHARED_CACHE
Также, после некоторой общей информации мы можем увидеть dylibs внутри dyld_shared_cache, как показано на скрине ниже.
Extract
Мы можем извлечь определенный фреймворк из
dyld_shared_cache для дальнейшего анализа с помощью команды ipsw dyld extract.Команда:
ipsw dyld extract PATH_TO_DYLD_SHARED_CACHE DYLIBНа изображении ниже мы видим как извлекается Accelerate.framework.
Macho
Эта подкоманда позволяет разобрать конкретный dylib внутри файла
dyld_shared_cache.Команда:
ipsw dyld macho PATH_TO_DYLD_SHARED_CACHE DYLIBНапример, чтобы получить команды загрузки из Accelerate.framework, мы можем сделать следующее (использовать команду):
Imports
Чтобы узнать, какие dylib'ы загружают определенный dylib, мы можем использовать команду
ipsw dyld imports. Допустим, мы нашли уязвимость в определенном dylib и хотим проверить, какие другие фреймворки/dylib'ы импортируют его.Команда:
ipsw dyld imports PATH_TO_DYLD_SHARED_CACHE DYLIB
На скрине показано, какие dylibs загружают Accelerate.framework.
Objc
Мы можем собрать информацию об Objective C из dylibs с помощью
ipsw dyld objc. Её же мы можем использовать для печати классов, протоколов, селекторов или имп-кэшей для dyld_shared_cache. Эта команда полезна, если мы хотим увидеть некоторые классы/функции внутри PrivateFrameworks.Чтобы вывести все классы, мы можем использовать следующую команду:
ipsw dyld objc -class PATH_TO_DYLD_SHARED_CACHE
Split
Мы можем разделить
dyld_shared_cache с помощью ipsw dyld split, что позволит нам увидеть все, что находится внутри dyld_shared_cache. Мы рассмотрим разделение dyld_shared_cache на примере macOS Ventura.На macOS Ventura
dyld_shared_cache хранится в каталоге /System/Cryptexes/OS/System/Library/dyld/.
Для разделения нам нужно дать путь к файлу
dyld_shared_cache и путь вывода (по желанию). Помните, что наши файлы dyld_shared_cache хранятся в каталоге /System/Cryptexes/OS/System/Library/dyld/, и мы будем использовать один из них - dyld_shared_cache_arm64e.Команда:
ipsw dyld split /System/Cryptexes/Os/System/Library/dyld/dyld_shared_cache_arm64e /tmp/8ksec.
Через несколько секунд мы можем просмотреть выходную директорию, чтобы узнать, что находится внутри
dyld_shared_cache.
Как итог, мы видим множество интересных директорий, таких как PrivateFrameworks и Frameworks. Теперь мы можем, например, посмотреть экспортированные символы одного из этих фреймворков, скажем, CalendarWidget.framework, используя
nm -Ug, за которым следует путь к общей библиотеке CalendarWidget.
Str
ipsw dyld str позволяет нам искать определенные шаблоны строк в файлах dyld_shared_cache. Это удобно, когда мы хотим проверить, например, где используется или на что ссылается определенная строка.Команда:
ipsw str PATH_TO_DYLD_SHARED_CACHE -p "REGEX PATTERN"
Как видно на скрине выше, случаев, в которых присутствует строка "world", довольно много. Мы также можем увидеть название фреймворка, в котором был найден данный паттерн.
Ent
ipsw ent позволяет нам искать определенные права внутри IPSW, сделать различие между правами внутри двух разных IPSW-файлов или дамп прав для определенного MachO-файла. Это может быть полезно, если мы хотим знать каждый бинарный файл, содержащий определенный элемент, или хотим увидеть изменения между двумя разными IPSW-файлами.Search
Если мы хотим, например, выполнить поиск конкретного правомочия (разрешения) для com.apple.developer.carplay-audio, то команда будет выглядеть следующим образом:
Команда:
ipsw ent -e com.apple.developer.carplay-audio PATH_TO_IPSW_FILE
Diff
Diff позволяет увидеть разницу в правах между двумя IPSW-файлами.
Команда:
ipsw ent --diff PATH_TO_FIRST_IPSW PATH_TO_SECOND_IPSW
Поиск различий с помощью подкоманды diff - различий не найдено
Info
Команда
ipsw info позволяет просмотреть информацию о файле IPSW либо о файле OTA. Мы можем использовать эту команду, если хотим узнать версию чипа или iOS для конкретного IPSW/OTA файла. Для анализа удаленного (в знач. remote) файла мы можем выполнить проверку локальных файлов или передать URL с флагом -r.Команда для локального файла:
ipsw info PATH_TO_IPSW_OTA_FILE Команда для удаленного (в знач. remote) файла:
ipsw info -r URL
Mdevs
ipsw mdevs позволяет увидеть все мобильные устройства в определенном файле IPSW.Команда:
ipsw mdevs PATH_TO_IPSW
Mount
ipsw mount позволяет нам поднять (возвести) определенную часть файла IPSW. Этими частями являются fs (файловая система), sys (система) или app (библиотека). Мы можем использовать эту команду, если хотим увидеть, что именно находится внутри IPSW-файла. После этого провести дальнейший анализ/исследование определенной его части, например, конкретной dylib.Команда:
ipsw mount [fs|sys|app] PATH_TO_IPSW_FILEНа следующих двух изображениях мы видим поднятие/возведение
fs (файловой системы) и то, что находится внутри нее.
Теперь мы возведем диск
sys (system) и проверим его содержимое.
Осталось лишь возвести
app:
Plist
ipsw plist позволяет сделать дамп .plist-файла в виде json или, например, проследить за изменениями в plist-файлах внутри определенной директории. Допустим, мы анализируем приложение и хотим узнать, что и когда вызывает запись определенной опции в plist-файл.Мы также можем использовать
ipsw plist для просмотра определенной директории на предмет изменений внутри файлов plist. Это удобно, когда мы хотим отследить, что изменилось в plist-файле во время работы с приложением.File
Команда:
ipsw plist PATH_TO_PLIST_FILE
Мы также можем передать вывод этой функции в
jq, чтобы получить, например, идентификатор связки (Bundle ID).
watch
Мы также можем использовать ipsw plist для просмотра определенной директории на предмет изменений внутри файлов plist. Это пригодится, когда мы хотим отслеживать, какие изменения произошли внутри файла plist во время работы с приложением.
команда:
ipsw plist -w PATH_TO_DIRECTORY
Update
ipsw предоставляет нам удобный способ обновиться, выполнив команду
ipsw update, которая позволяет загрузить новую версию для конкретной ОС и архитектуры.Команда:
ipsw update
Пример использованияipsw update
После завершения загрузки мы можем извлечь архив, проверить нашу версию и убедиться, что мы действительно используем последнюю версию, запустив
ipsw update внутри загруженного пакета.
"У Вас уже установлена последняя версия" - обновлений нет
Watch
ipsw watch - это команда, которая не имеет отношения к iOS или macOS, но связана с наблюдением за изменениями в конкретном репозитории GitHub. Мы можем следить за измененным файлом или шаблоном в сообщениях и получать уведомления об изменениях через Discord.В следующей части мы рассмотрим некоторые дополнительные возможности использования ipsw для исследования безопасности *OS.
//////////////////////////////////////////////////////////////
Переведено PUG по просьбе weaver
Оригинал статьи: https://8ksec.io/ipsw-walkthrough-part-1-the-swiss-army-knife-for-ios-macos-security-research/
Надеюсь, что данная статья оказалась для Вас полезной и интересной!
Последнее редактирование модератором: