- PVSM.RU - https://www.pvsm.ru -

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 1

Автор: Андрей Батутин, Senior iOS Developer, DataArt.

Не раз и не два, придя на работу (или просто встав с кровати), я обнаруживал в почте гневное письмо, суть которого сводилось к тому, что в аппсторовской сборке приложения ничего не работает, и все надо срочно чинить.

Иногда причиной были мои косяки. Иногда — моих коллег. А иногда — даже самого Apple Inc [1].

Но самые убийственные сценарии были связаны с багами, которые воспроизводились только на аппсторовских/релизных сборках. Ничто так не ставит в тупик и не заставляет выть перед макбуком, как невозможность подключить дебагер к собственному приложению и посмотреть, что же там происходит.

Похожие трудности создает APNS [2] и его траблшутинг на релизных/ad-hoc сборках.
На тех сборках, где есть production APNS environment, подключить дебагер нельзя.
На тех сборках, где есть дебагер, нет APNS production-пушей. А ведь они-то обычно и отваливаются.

Apple, наподобие ветхозаветного бога, одной рукой дает платформу, где jailbreak скоро отойдет в историю [3] (и пиратство в App Store остается на уровне статистической погрешности), а другой заставляет разработчика почувствовать себя бедным родственником, маленьким Оливером Твистом, посмевшим попросить еще кашки.

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 2
Голос за кадром: «Дядя Эппл, пожалуйста, дай еще один дистрибьюшн-сертификатик...»

Для программиста средней руки сделать что-то с релизной/аппсторовской сборкой iOS-приложения было почти нереально. Проще было уволиться еще до релиза.

Если вкратце:

Релизная сборка подписывается Distribution Certificate и использует Distribution Provisioning Profile. Entitlement запрещают присоединять дебагер к процессу приложения. Плюс при скачивании ipa из App Store бинарник оказывается еще и зашифрованным. App Extensions подписываются отдельно.

Т. е. автор приложения как будто может взять и переподписать App Store-сборку дебажным сертификатом, используя дебажный provisioning profile. Но это еще надо знать как сделать. Но даже после этого вопрос, как подключить дебагер к процессу приложения, остается открытым.

Поэтому приходится делать акцент исключительно на то, чтобы не налажать на этапе разработки. И поймать все баги до того, как приложение уйдет в App Store. И логи, больше логов для бога логов!

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 3

Но недавно на горизонте замаячила новая надежда.

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 4

В предыдущей части [4] мы познакомились с Frida, замечательным фреймворком для dynamic code injection. И обошли с помощью него SSL-pinning в прекрасном проекте FoodSniffer [5].

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

Objection [6]

Objection позволяет заинжектить [7] FridaGadget [8] в iOS-сборку и переподписать ее с нужными сертификатом и provisioning profile.

Подготовка

Для начала нам нужна релизная сборка FoodSniffer.

Важное замечание — при создании ipa отключите “Include bitcode for iOS content”.

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 5

Затем нам понадобится provisioning profile для дебажной сборки.

Чтобы его получить:

  1. Установите приложение через Xcode на устройство.
  2. Найдите FoodSniffer.app в Finder.

    iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 6

  3. Перейдите в FoodSniffer bundle.

    iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 7

  4. Скопируйте оттуда embedded.mobileprovision в папку с вашим релизным ipa.

    iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 8

У вас должно получиться примерно следующее:

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 9

После в этого установите objection согласно инструкции [9]. Настоятельно рекомендую использовать именно virtualenv-вариант.

Помимо objection, нам понадобится ios-deploy [10] для запуска пропатченного приложения на устройстве.

Переподпишем приложение!

В терминале выясним хэш нужного нам code sign identity:

security find-identity -p codesigning -v

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 10

Нас интересует 386ХХХ identity, т. к. именно она соответствует дебажному серитификату, которым и было подписано приложение при установке через Xcode, из которого мы достали provisioning profile.

Заинжектим FridaGadget и переподпишем наше приложение:

objection patchipa --source FoodSniffer/FoodSniffer.ipa --codesign-signature 386XXX --provision-file embedded.mobileprovision

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 11

В результате мы должны получить FoodSniffer-frida-codesigned.ipa.

Теперь нам нужен ios-deploy для установки и подключения к FridaGadget. Это важный этап — если просто установить ipa на устройство через iTunes или Xcode, подключиться к FridaGadget не выйдет.

Предварительно распаковав FoodSniffer-frida-codesigned.ipa:

unzip FoodSniffer-frida-codesigned.ipa

Запускаем наше пропатченное приложение на устройстве:

ios-deploy --bundle Payload/FoodSniffer.app -W -d

Если все прошло успешно, то на устройстве должно запуститься приложение, а в терминале мы увидим:

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 12

Теперь в другой вкладке терминала подключим objection к FridaGadget:

objection explore

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 13

Профит!

Плюшки, которые предоставляет objection

Обход SSL Pinning

Тут все просто:

ios sslpinning disable

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 14

Теперь можно без проблем использовать Proxy Server для мониторинга трафика нашего приложения, как было описано в первой части [11].

Дамп UserDefaults

ios nsuserdefaults get

В конце дампа мы должны увидеть “mood_state” = “I’m hungry”

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 15

Дамп app keychain

ios keychain dump

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 16

А вот и наш суперсекретный пароль.

Выборка данных из SQLite-базы.
В приложение я добавил sqlite-базу chinook.db отсюда [12].

Objection позволяет делать запросы напрямую к базе следующим образом.

  1. Подключение к базе:

    sqlite connect chinook.db

    iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 17

  2. Запрос к ней:

    sqlite execute query select * from albums

    iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 18

Вывод

Objection и Frida позволяют наконец относительно нормально и просто работать с Ad Hoc и Distribution сборками iOS-приложений. Они возвращают программисту власть над собственным приложением, скрытую за слоями защиты, которыми Apple так бережно окутывает iOS-приложения. Плюс Objection и Frida работают на non-jailbroken устройствах. К тому же, они относительно просты в работе.

С ними у меня есть надежда make iOS development great again. Благополучно избежав подрыва новой штаб-квартиры Apple изнутри.

iOS runtime mobile exploration with Objection, или Хакаем собственное приложение - 19

Гипер(полезные) ссылки

Ресерч амстердамских студентов на тему iOS Code Sign [13].

https://labs.mwrinfosecurity.com/blog/repacking-and-resigning-ios-applications/ [14]

https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2016/october/ios-instrumentation-without-jailbreak/ [15].

FoodSniffer iOS app source code [5].

Frida telegram [16].

Выражаю особую благодарность @manishrhll.

Примечание. Все вышеописанное стоит применять только к своим приложениям и не пытаться ломать «Тиндер» или еще что-нибудь. Все равно не получится!

Автор: DataArt

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/ios-development/298548

Ссылки в тексте:

[1] Apple Inc: https://stackoverflow.com/questions/44796613/silent-pushes-not-delivered-to-the-app-on-ios-11

[2] APNS: https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1

[3] историю: https://www.cultofmac.com/490594/jailbreaking-pioneers-say-iphone-jailbreaking-dead/

[4] части: https://habr.com/company/dataart/blog/424485/

[5] FoodSniffer: https://gitlab.abatutin.net/abatutin/FoodSnifferSSLPinner

[6] Objection: https://github.com/sensepost/objection

[7] заинжектить: https://www.owasp.org/index.php/Code_Injection

[8] FridaGadget: https://www.frida.re/docs/gadget/

[9] инструкции: https://github.com/sensepost/objection/wiki/Installation#virtual-installation

[10] ios-deploy: https://github.com/ios-control/ios-deploy

[11] первой части: https://habr.com/company/dataart/blog/419677/

[12] отсюда: http://www.sqlitetutorial.net/sqlite-sample-database/

[13] Ресерч амстердамских студентов на тему iOS Code Sign: http://www.delaat.net/rp/2016-2017/p50/report.pdf

[14] https://labs.mwrinfosecurity.com/blog/repacking-and-resigning-ios-applications/: https://labs.mwrinfosecurity.com/blog/repacking-and-resigning-ios-applications/

[15] https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2016/october/ios-instrumentation-without-jailbreak/: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2016/october/ios-instrumentation-without-jailbreak/

[16] Frida telegram: https://t.me/fridadotre

[17] Источник: https://habr.com/post/429196/?utm_source=habrahabr&utm_medium=rss&utm_campaign=429196