iOS Pentesting
Використовуйте Trickest для легкого створення та автоматизації робочих процесів, підтримуваних найсучаснішими інструментами спільноти. Отримайте доступ сьогодні:
iOS Основи
iOS BasicsТестове середовище
На цій сторінці ви можете знайти інформацію про iOS емулятор, емулятори та джейлбрейк:
iOS Testing EnvironmentПочаткова аналіз
Основні операції тестування iOS
Під час тестування будуть запропоновані кілька операцій (підключення до пристрою, читання/запис/завантаження/скачування файлів, використання деяких інструментів...). Тому, якщо ви не знаєте, як виконати будь-яку з цих дій, будь ласка, почніть читати цю сторінку:
iOS Basic Testing OperationsДля наступних кроків додаток має бути встановлений на пристрої та вже повинен мати IPA файл програми. Прочитайте сторінку Основні операції тестування iOS, щоб дізнатися, як це зробити.
Основний статичний аналіз
Рекомендується використовувати інструмент MobSF для автоматичного статичного аналізу IPA файлу.
Ідентифікація захистів, присутніх у бінарному файлі:
PIE (Position Independent Executable): Коли увімкнено, програма завантажується в випадкову адресу пам'яті щоразу при запуску, ускладнюючи передбачення її початкової адреси пам'яті.
Stack Canaries: Для перевірки цілісності стеку, значення «канарки» розміщується на стеку перед викликом функції та перевіряється знову після завершення функції.
ARC (Automatic Reference Counting): Для запобігання поширеним помилкам корупції пам'яті
Зашифрований бінарний файл: Бінарний файл має бути зашифрований
Ідентифікація чутливих/незахищених функцій
Слабкі алгоритми хешування
Ненадійні випадкові функції
Ненадійна функція ‘Malloc’
Ненадійні та вразливі функції
Основний динамічний аналіз
Ознайомтеся з динамічним аналізом, який виконує MobSF. Вам потрібно буде переміщатися між різними виглядами та взаємодіяти з ними, але він буде підключати кілька класів, виконуючи інші дії, і підготує звіт, коли ви закінчите.
Перелік встановлених додатків
Використовуйте команду frida-ps -Uai
, щоб визначити ідентифікатор пакета встановлених додатків:
Основна Перерахунка та Хукінг
Дізнайтеся, як перерахувати компоненти програми та як легко підключати методи та класи за допомогою objection:
iOS Hooking With ObjectionСтруктура IPA
Структура IPA файлу в основному є структурою запакованого архіву. Змінивши його розширення на .zip
, його можна розпакувати, щоб виявити його вміст. У цій структурі Bundle представляє повністю упаковану програму, готову до встановлення. Всередині ви знайдете каталог з назвою <NAME>.app
, який містить ресурси програми.
Info.plist
: Цей файл містить специфічні деталі конфігурації програми._CodeSignature/
: Цей каталог включає plist файл, який містить підпис, що забезпечує цілісність усіх файлів у бандлі.Assets.car
: Стиснутий архів, що зберігає файли активів, такі як іконки.Frameworks/
: Ця папка містить рідні бібліотеки програми, які можуть бути у формі файлів.dylib
або.framework
.PlugIns/
: Це може включати розширення програми, відомі як файли.appex
, хоча вони не завжди присутні. *Core Data
: Використовується для збереження постійних даних вашої програми для офлайн використання, для кешування тимчасових даних та для додавання функціональності скасування дій у вашій програмі на одному пристрої. Щоб синхронізувати дані між кількома пристроями в одному обліковому записі iCloud, Core Data автоматично відображає вашу схему в контейнер CloudKit.PkgInfo
: ФайлPkgInfo
є альтернативним способом вказати тип і коди творця вашої програми або бандлу.en.lproj, fr.proj, Base.lproj: Це мовні пакети, які містять ресурси для цих конкретних мов, а також ресурс за замовчуванням на випадок, якщо мова не підтримується.
Безпека: Каталог
_CodeSignature/
відіграє критичну роль у безпеці програми, перевіряючи цілісність усіх упакованих файлів через цифрові підписи.Управління активами: Файл
Assets.car
використовує стиснення для ефективного управління графічними активами, що є важливим для оптимізації продуктивності програми та зменшення її загального розміру.Frameworks та PlugIns: Ці каталоги підкреслюють модульність iOS програм, дозволяючи розробникам включати повторно використовувані бібліотеки коду (
Frameworks/
) та розширювати функціональність програми (PlugIns/
).Локалізація: Структура підтримує кілька мов, полегшуючи глобальне охоплення програми, включаючи ресурси для специфічних мовних пакетів.
Info.plist
Info.plist служить основою для iOS програм, інкапсулюючи ключові дані конфігурації у формі пар ключ-значення. Цей файл є обов'язковим не лише для програм, але й для розширень програм та фреймворків, упакованих разом. Він структурований у форматі XML або бінарному форматі та містить критичну інформацію, починаючи від дозволів програми до конфігурацій безпеки. Для детального вивчення доступних ключів можна звернутися до Apple Developer Documentation.
Для тих, хто хоче працювати з цим файлом у більш доступному форматі, конвертацію в XML можна здійснити без зусиль за допомогою plutil
на macOS (доступний нативно на версіях 10.2 і пізніше) або plistutil
на Linux. Команди для конвертації такі:
Для macOS:
Для Linux:
Серед безлічі інформації, яку може розкрити файл Info.plist, помітні записи включають рядки дозволів додатка (UsageDescription
), користувацькі URL-схеми (CFBundleURLTypes
) та конфігурації для App Transport Security (NSAppTransportSecurity
). Ці записи, разом з іншими, такими як експортовані/імпортовані користувацькі типи документів (UTExportedTypeDeclarations
/ UTImportedTypeDeclarations
), можна без зусиль знайти, перевіряючи файл або використовуючи просту команду grep
:
Шляхи Даних
У середовищі iOS каталоги призначені спеціально для системних додатків та додатків, встановлених користувачем. Системні додатки розташовані в каталозі /Applications
, тоді як додатки, встановлені користувачем, знаходяться під /var/mobile/containers/Data/Application/
. Ці додатки отримують унікальний ідентифікатор, відомий як 128-бітний UUID, що ускладнює завдання ручного знаходження папки додатка через випадковість назв каталогів.
Оскільки додатки в iOS повинні бути в пісочниці, кожен додаток також матиме папку всередині $HOME/Library/Containers
з CFBundleIdentifier
додатка як назва папки.
Однак обидві папки (папки даних та контейнерів) мають файл .com.apple.mobile_container_manager.metadata.plist
, який пов'язує обидва файли за ключем MCMetadataIdentifier
.
Щоб полегшити виявлення каталогу встановлення додатка, встановленого користувачем, інструмент objection надає корисну команду env
. Ця команда розкриває детальну інформацію про каталог для відповідного додатка. Нижче наведено приклад використання цієї команди:
Альтернативно, ім'я програми можна знайти в /private/var/containers
, використовуючи команду find
:
Команди, такі як ps
та lsof
, також можуть бути використані для ідентифікації процесу програми та переліку відкритих файлів відповідно, надаючи інформацію про активні директорії програми:
Bundle directory:
AppName.app
Це пакет програми, як було зазначено раніше в IPA, він містить основні дані програми, статичний контент, а також скомпільований бінарний файл програми.
Ця директорія видима для користувачів, але користувачі не можуть записувати в неї.
Контент у цій директорії не резервується.
Вміст цієї папки використовується для перевірки підпису коду.
Data directory:
Documents/
Містить всі дані, створені користувачем. Кінцевий користувач програми ініціює створення цих даних.
Видима для користувачів і користувачі можуть записувати в неї.
Контент у цій директорії резервується.
Програма може вимкнути шляхи, встановивши
NSURLIsExcludedFromBackupKey
.Library/
Містить всі файли, які не є специфічними для користувача, такі як кеші, налаштування, куки та файли конфігурації списку властивостей (plist).
iOS програми зазвичай використовують підкаталоги
Application Support
таCaches
, але програма може створювати власні підкаталоги.Library/Caches/
Містить напівпостійні кешовані файли.
Невидима для користувачів і користувачі не можуть записувати в неї.
Контент у цій директорії не резервується.
ОС може автоматично видаляти файли цієї директорії, коли програма не працює і місця для зберігання недостатньо.
Library/Application Support/
Містить постійні файли, необхідні для роботи програми.
Невидима для користувачів і користувачі не можуть записувати в неї.
Контент у цій директорії резервується.
Програма може вимкнути шляхи, встановивши
NSURLIsExcludedFromBackupKey
.Library/Preferences/
Використовується для зберігання властивостей, які можуть зберігатися навіть після перезапуску програми.
Інформація зберігається, нешифрована, всередині пісочниці програми у файлі plist під назвою [BUNDLE_ID].plist.
Усі пари ключ/значення, збережені за допомогою
NSUserDefaults
, можна знайти в цьому файлі.tmp/
Використовуйте цю директорію для запису тимчасових файлів, які не потрібно зберігати між запусками програми.
Містить непостійні кешовані файли.
Невидима для користувачів.
Контент у цій директорії не резервується.
ОС може автоматично видаляти файли цієї директорії, коли програма не працює і місця для зберігання недостатньо.
Давайте ближче розглянемо пакет програми iGoat-Swift (.app) у директорії Bundle (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
):
Binary Reversing
Всередині папки <application-name>.app
ви знайдете бінарний файл під назвою <application-name>
. Це файл, який буде виконуватись. Ви можете виконати базову перевірку бінарного файлу за допомогою інструменту otool
:
Перевірте, чи зашифровано додаток
Перевірте, чи є будь-який вихід для:
Дизасемблювання бінарного файлу
Дизасемблюйте текстовий розділ:
Щоб надрукувати Objective-C сегмент зразкової програми, можна використати:
Щоб отримати більш компактний код Objective-C, ви можете використовувати class-dump:
Однак, найкращими варіантами для дизасемблювання бінарного коду є: Hopper та IDA.
Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, підтримувані найсучаснішими інструментами спільноти. Отримайте доступ сьогодні:
Зберігання даних
Щоб дізнатися, як iOS зберігає дані на пристрої, прочитайте цю сторінку:
iOS BasicsНаступні місця для зберігання інформації слід перевірити відразу після встановлення програми, після перевірки всіх функцій програми і навіть після виходу з одного користувача та входу в іншого. Мета полягає в тому, щоб знайти незахищену чутливу інформацію програми (паролі, токени), поточного користувача та раніше увійшлих користувачів.
Plist
plist файли - це структуровані XML файли, які містять пари ключ-значення. Це спосіб зберігати постійні дані, тому іноді ви можете знайти чутливу інформацію в цих файлах. Рекомендується перевіряти ці файли після встановлення програми та після інтенсивного використання, щоб побачити, чи записуються нові дані.
Найпоширеніший спосіб зберігання даних у plist файлах - це використання NSUserDefaults. Цей plist файл зберігається всередині пісочниці програми в Library/Preferences/<appBundleID>.plist
Клас NSUserDefaults
надає програмний інтерфейс для взаємодії з системою за замовчуванням. Система за замовчуванням дозволяє програмі налаштовувати свою поведінку відповідно до уподобань користувача. Дані, збережені за допомогою NSUserDefaults
, можна переглядати в пакеті програми. Цей клас зберігає дані в plist файлі, але призначений для використання з невеликою кількістю даних.
Ці дані більше не можуть бути доступні безпосередньо через надійний комп'ютер, але можуть бути доступні шляхом виконання резервного копіювання.
Ви можете вивантажити інформацію, збережену за допомогою NSUserDefaults
, використовуючи ios nsuserdefaults get
від objection.
Щоб знайти всі plist, які використовуються програмою, ви можете отримати доступ до /private/var/mobile/Containers/Data/Application/{APPID}
і виконати:
Щоб конвертувати файли з XML або бінарного (bplist) формату в XML, доступні різні методи в залежності від вашої операційної системи:
Для користувачів macOS: Використовуйте команду plutil
. Це вбудований інструмент в macOS (10.2+), призначений для цієї мети:
Для користувачів Linux: Спочатку встановіть libplist-utils
, а потім використовуйте plistutil
для конвертації вашого файлу:
У сесії Objection: Для аналізу мобільних додатків спеціальна команда дозволяє вам безпосередньо конвертувати файли plist:
Core Data
Core Data
— це фреймворк для управління модельним шаром об'єктів у вашому додатку. Core Data може використовувати SQLite як своє постійне сховище, але сам фреймворк не є базою даних.
CoreData за замовчуванням не шифрує свої дані. Однак, додатковий шар шифрування може бути доданий до CoreData. Дивіться GitHub Repo для отримання додаткової інформації.
Ви можете знайти інформацію про SQLite Core Data додатку за шляхом /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
Якщо ви можете відкрити SQLite і отримати доступ до чутливої інформації, то ви знайшли неправильну конфігурацію.
YapDatabase
YapDatabase - це сховище ключ/значення, побудоване на основі SQLite. Оскільки бази даних Yap є базами даних sqlite, ви можете знайти їх, використовуючи запропоновану команду в попередньому розділі.
Інші бази даних SQLite
Звичайно, що програми створюють свої власні бази даних sqlite. Вони можуть зберігати чутливі дані на них і залишати їх незашифрованими. Тому завжди цікаво перевіряти кожну базу даних у каталозі додатків. Тому перейдіть до каталогу програми, де зберігаються дані (/private/var/mobile/Containers/Data/Application/{APPID}
)
Firebase Real-Time Databases
Розробники можуть зберігати та синхронізувати дані в NoSQL хмарній базі даних через Firebase Real-Time Databases. Дані, збережені у форматі JSON, синхронізуються з усіма підключеними клієнтами в реальному часі.
Ви можете дізнатися, як перевірити неправильно налаштовані Firebase бази даних тут:
Firebase DatabaseRealm databases
Realm Objective-C та Realm Swift пропонують потужну альтернативу для зберігання даних, яку не надає Apple. За замовчуванням, вони зберігають дані без шифрування, з можливістю шифрування через специфічну конфігурацію.
Бази даних розташовані за адресою: /private/var/mobile/Containers/Data/Application/{APPID}
. Щоб дослідити ці файли, можна використовувати команди, такі як:
Для перегляду цих файлів бази даних рекомендується інструмент Realm Studio.
Щоб реалізувати шифрування в базі даних Realm, можна використовувати наступний фрагмент коду:
Couchbase Lite Databases
Couchbase Lite описується як легкий та вбудований механізм бази даних, який слідує документно-орієнтованому (NoSQL) підходу. Розроблений для iOS та macOS, він пропонує можливість безперебійної синхронізації даних.
Щоб виявити потенційні бази даних Couchbase на пристрої, слід перевірити наступний каталог:
Cookies
iOS зберігає куки додатків у Library/Cookies/cookies.binarycookies
всередині папки кожного додатку. Однак, розробники іноді вирішують зберігати їх у keychain, оскільки згаданий файл куків може бути доступний у резервних копіях.
Щоб перевірити файл куків, ви можете використовувати цей python скрипт або використовувати ios cookies get
з objection.
Ви також можете використовувати objection, щоб конвертувати ці файли у формат JSON та перевірити дані.
Cache
За замовчуванням NSURLSession зберігає дані, такі як HTTP запити та відповіді в базі даних Cache.db. Ця база даних може містити чутливі дані, якщо токени, імена користувачів або будь-яка інша чутлива інформація була кешована. Щоб знайти кешовану інформацію, відкрийте каталог даних програми (/var/mobile/Containers/Data/Application/<UUID>
) і перейдіть до /Library/Caches/<Bundle Identifier>
. Кеш WebKit також зберігається у файлі Cache.db. Objection може відкрити та взаємодіяти з базою даних за допомогою команди sqlite connect Cache.db
, оскільки це нормальна SQLite база даних.
Рекомендується відключити кешування цих даних, оскільки вони можуть містити чутливу інформацію в запиті або відповіді. Наступний список показує різні способи досягнення цього:
Рекомендується видалити кешовані відповіді після виходу з системи. Це можна зробити за допомогою методу, наданого Apple, під назвою
removeAllCachedResponses
. Ви можете викликати цей метод наступним чином:
URLCache.shared.removeAllCachedResponses()
Цей метод видалить всі кешовані запити та відповіді з файлу Cache.db. 2. Якщо вам не потрібно використовувати переваги куків, рекомендується просто використовувати .ephemeral властивість конфігурації URLSession, яка відключить збереження куків та кешів.
Об'єкт конфігурації сесії ephemeral подібний до конфігурації сесії за замовчуванням (див. default), за винятком того, що відповідний об'єкт сесії не зберігає кеші, сховища облікових даних або будь-які дані, пов'язані з сесією, на диску. Натомість дані, пов'язані з сесією, зберігаються в оперативній пам'яті. Єдиний випадок, коли ephemeral сесія записує дані на диск, - це коли ви вказуєте їй записати вміст URL у файл.
3. Кеш також можна відключити, встановивши політику кешування на .notAllowed. Це відключить зберігання кешу будь-яким чином, як в пам'яті, так і на диску.
Snapshots
Коли ви натискаєте кнопку "Додому", iOS знімає знімок поточного екрану, щоб мати можливість здійснити перехід до програми набагато плавніше. Однак, якщо на поточному екрані присутні чутливі дані, вони будуть збережені в зображенні (яке зберігається після перезавантажень). Це знімки, до яких ви також можете отримати доступ, двічі торкнувшись екрана "Додому", щоб перемикатися між програмами.
Якщо iPhone не зламаний, зловмисник повинен мати доступ до пристрою без блокування, щоб побачити ці знімки екрана. За замовчуванням останній знімок зберігається в пісочниці програми в папці Library/Caches/Snapshots/
або Library/SplashBoard/Snapshots
(достовірні комп'ютери не можуть отримати доступ до файлової системи з iOX 7.0).
Один зі способів запобігти цій поганій поведінці - це поставити чорний екран або видалити чутливі дані перед зняттям знімка, використовуючи функцію ApplicationDidEnterBackground()
.
Наступний приклад - це метод усунення, який встановить знімок за замовчуванням.
Swift:
Objective-C:
Це встановлює фонове зображення на overlayImage.png
щоразу, коли додаток переходить у фоновий режим. Це запобігає витоку чутливих даних, оскільки overlayImage.png
завжди перекриває потній вигляд.
Keychain
Для доступу та управління iOS keychain доступні інструменти, такі як Keychain-Dumper, які підходять для джейлбрейкнутіх пристроїв. Крім того, Objection надає команду ios keychain dump
для подібних цілей.
Зберігання облікових даних
Клас NSURLCredential ідеально підходить для збереження чутливої інформації безпосередньо в keychain, обходячи необхідність у NSUserDefaults або інших обгортках. Для зберігання облікових даних після входу використовується наступний код Swift: