iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

5 хв. читання

☕️ Вступ

У моїй практиці не раз траплялося так, що, прийшовши на роботу (чи просто вставши з ліжка) та відкривши пошту, я бачив гнівний лист, що повідомляв про несправність апсторівської збірки застосунку і про потребу негайно все налагодити. 😱🤯🤬

Іноді це була моя провина. Іноді — колег. Траплялося, що й сам Apple Inc завинив 😏.

Але найбільш вбивчі сценарії були пов'язані з багами, що траплялися лише на апсторівських/релізних збірках. Ніщо так не спантеличує і не змушує галасувати на свій макбук, як неможливість приєднати налагоджувач до свого власного застосунку і подивитися що там відбувається ☠️.

Схожі труднощі створює APNS і його траблшутинг на релізних/ad hoc збірках. На тих збірках, де є production APNS оточення, неможливо приєднати дебагер. А на тих збірках, де є налагоджувач, немає APNS production пушів. Саме з ними, зазвичай, і виникають проблеми 💩🤕😭.

Apple, подібно старозавітному богу, однією рукою надає платформу, де jailbreak скоро відійде в історію, а піратство в AppStore знаходиться на рівні статистичної похибки. Іншою ж рукою він змушує розробника почувати себе бідним родичем, маленьким Олівером Твістом, що дозволив собі попросити ще каші.

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

Для середнього програміста зробити щось з релізною/епсторівською збіркою iOS застосунку було майже нереальним. Хіба що звільнитися до релізу 🤠.

Якщо коротко, то:

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

Тобто, автор застосунку може ніби перепідписати Апстор збірку сертифікатом налагодження, використовуючи provisioning profile налагоджувача. Але так ще треба вміти. Навіть після викладеного, стоїть питання про те, як приєднати налагоджувач до процесу застосунку. І як таке потім налагоджувати 🔪💔🤯.

Саме тому важливо не схибити на етапі розробки й піймати усі баги до того, як застосунок піде в Апстор. І логи: більше логів богу логів!

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Але нещодавно на горизонті з'явилась нова надія.

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

У попередній частині ми познайомились з Frida, гарним фреймворком для dynamic code injection. З його допомогою ми обійшли SSL-pinning у проекті FoodSniffer 🍔👃

У цій статті познайомимось з фреймворком, створеним на основі Frida, який значно полегшує маніпуляції з релізними збірками iOS застосунків.

Objection

Objection дозволяє зробити injection FridaGadget в iOS збірку та перепідписати її потрібним сертифікатом та provisioning profile.

Приготування

Спочатку нам потрібна релізна збірка FoodSniffer.

Важливе зауваження: при створенні ipa вимкніть «Include bitcode for iOS content».

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Далі нам знадобиться provisioning profile для налагоджуваної збірки.

Аби його отримати:

  • Встановіть застосунок на пристрій через Xcode.
  • Знайдіть FoodSniffer.app у Finder.
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок
  • Перейдіть до FoodSniffer bundle.
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок
  • Скопіюйте звідти embedded.mobileprovision до теки з вашим релізним ipa.
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

У вас повинно вийти щось подібне.

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Встановіть objection згідно з інструкцією. Наполегливо рекомендую використовувати саме virtualenv варіант.

Окрім Objection нам знадобиться ios-deploy для запуску пропатченого застосунку на пристрої.

🔏 Перепідпишемо застосунок!

У терміналі з'ясуємо хеш потрібного нам code sign identity:

security find-identity -p codesigning -v
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Нас цікавить 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, або взламуємо власний застосунок

У результаті, ми повинні отримати 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, або взламуємо власний застосунок

Тепер в іншій вкладці терміналу приєднаємо objection до FridaGadget objection explore.

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Профіт!

Плюшки, які надає objection 🍪

Обхід SSL Pinning

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

ios sslpinning disable
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Тепер можна без проблем використовувати Proxy Server для моніторингу трафіку нашого застосунку, як це було описано у першій частині.

Дамп UserDefaults

ios nsuserdefaults get

Наприкінці дампа ми повинні побачити "mood_state" = "I'm hungry".

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Дамп app keychain

ios keychain dump
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

А ось і наш суперсекретний пароль🕵️‍♀️

Вибірка даних з SQLite бази

У застосунку я додав sqlite базу chinook.db звідси.

Objection дозволяє здійснювати запити безпосередньо до бази таким чином:

  • Підключення до бази.
sqlite connect chinook.db
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок
  • Запит до неї.
sqlite execute query select * from albums
iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Висновок

Objection і Frida дозволяють, нарешті, відносно нормально та просто працювати з Ad Hoc та Distribution збірками iOS застосунків. Вони повертають програмісту владу над власним застосунком, приховану за шарами захисту, якими Apple так обережно огортає iOS застосунки. До того ж, Objection і Frida працюють на non-jailbroken пристроях, а також є відносно простими у роботі.

З ними у мене є надія make iOS development great again без потреби підриву нової штаб-квартири Apple зсередини.

iOS runtime mobile exploration with Objection, або взламуємо власний застосунок

Гіпер(корисні) посилання

Special thnx to @manishrhll!

П.С. 👀

Усе, що було описано у статті, варто застосовувати лише до власних застосунків і не намагатися ламати Тіндер чи Приват24.

Тим паче у вас і не вийде !🤣

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація