hacktricks/mobile-pentesting/ios-pentesting
2024-07-19 05:29:57 +00:00
..
basic-ios-testing-operations.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
burp-configuration-for-ios.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
extracting-entitlements-from-compiled-application.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
frida-configuration-in-ios.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
ios-app-extensions.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-basics.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-custom-uri-handlers-deeplinks-custom-schemes.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-hooking-with-objection.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-protocol-handlers.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-serialisation-and-encoding.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-testing-environment.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
ios-uiactivity-sharing.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-uipasteboard.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-universal-links.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
ios-webviews.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-07-19 05:29:57 +00:00
README.md Translated to Ukranian 2024-03-29 19:49:46 +01:00

iOS Pentesting


Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, які працюють на найбільш продвинутих інструментах спільноти у світі.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Вивчіть хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основи iOS

{% content-ref url="ios-basics.md" %} ios-basics.md {% endcontent-ref %}

Оточення тестування

На цій сторінці ви знайдете інформацію про симулятор iOS, емулятори та втечу з в'язниці:

{% content-ref url="ios-testing-environment.md" %} ios-testing-environment.md {% endcontent-ref %}

Початковий аналіз

Основні операції тестування iOS

Під час тестування буде запропоновано кілька операцій (підключення до пристрою, читання/запис/завантаження файлів, використання деяких інструментів...). Тому, якщо ви не знаєте, як виконати будь-яку з цих дій, будь ласка, почніть читати сторінку:

{% content-ref url="basic-ios-testing-operations.md" %} basic-ios-testing-operations.md {% endcontent-ref %}

{% hint style="info" %} Для наступних кроків додаток повинен бути встановлений на пристрої і вже повинен бути отриманий файл IPA додатка.
Прочитайте сторінку Основні операції тестування iOS, щоб дізнатися, як це зробити. {% endhint %}

Основний статичний аналіз

Рекомендується використовувати інструмент MobSF для автоматичного статичного аналізу файлу IPA.

Ідентифікація захистів, які присутні в бінарному файлі:

  • PIE (Position Independent Executable): Коли ввімкнено, додаток завантажується в випадкову адресу пам'яті кожного разу при запуску, що ускладнює передбачення його початкової адреси пам'яті.
otool -hv <app-binary> | grep PIE   # Повинен містити прапорець PIE
  • Stack Canaries: Для перевірки цілісності стеку на стек поміщається значення "канарейка", яке перевіряється після завершення функції.
otool -I -v <app-binary> | grep stack_chk   # Повинні містити символи: stack_chk_guard та stack_chk_fail
  • ARC (Automatic Reference Counting): Для запобігання поширеним дефектам пам'яті
otool -I -v <app-binary> | grep objc_release   # Повинен містити символ _objc_release
  • Зашифрований бінарний файл: Бінарний файл повинен бути зашифрований
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # cryptid повинен бути 1

Ідентифікація чутливих/небезпечних функцій

  • Слабкі хеш-алгоритми
# На пристрої iOS
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# На linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Ненадійні функції випадкових чисел
# На пристрої iOS
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# На linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Ненадійна функція 'Malloc'
# На пристрої iOS
otool -Iv <app> | grep -w "_malloc"

# На linux
grep -iER "_malloc"
  • Ненадійні та вразливі функції
# На пристрої iOS
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"

# На linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"

Основний динамічний аналіз

Перегляньте динамічний аналіз, який виконує MobSF. Вам потрібно буде переглянути різні види та взаємодіяти з ними, але він буде підключати кілька класів, виконувати інші дії та підготує звіт після завершення.

Список встановлених додатків

Використовуйте команду frida-ps -Uai, щоб визначити ідентифікатор пакета встановлених додатків:

$ frida-ps -Uai
PID  Name                 Identifier
----  -------------------  -----------------------------------------
6847  Calendar             com.apple.mobilecal
6815  Mail                 com.apple.mobilemail
-  App Store            com.apple.AppStore
-  Apple Store          com.apple.store.Jolly
-  Calculator           com.apple.calculator
-  Camera               com.apple.camera
-  iGoat-Swift          OWASP.iGoat-Swift

Основна енумерація та підключення

Дізнайтеся, як провести енумерацію компонентів додатка та як легко підключати методи та класи за допомогою objection:

{% content-ref url="ios-hooking-with-objection.md" %} ios-hooking-with-objection.md {% endcontent-ref %}

Структура 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 використовує стиснення для ефективного управління графічними ресурсами, що є важливим для оптимізації продуктивності додатка та зменшення його загального розміру.
  • Фреймворки та Плагіни: Ці каталоги підкреслюють модульність додатків iOS, дозволяючи розробникам включати повторно використовувані бібліотеки коду (Frameworks/) та розширювати функціональність додатка (PlugIns/).
  • Локалізація: Структура підтримує кілька мов, сприяючи глобальному охопленню додатків за рахунок включення ресурсів для конкретних мовних пакетів.

Info.plist

Info.plist служить важливим елементом для додатків iOS, упаковуючи ключові конфігураційні дані у формі ключ-значення. Цей файл є обов'язковим не лише для додатків, але й для розширень додатків та фреймворків, що входять до пакету. Він структурований у форматі XML або бінарному форматі та містить критичну інформацію від дозволів додатків до конфігурацій безпеки. Для докладного дослідження доступних ключів можна звернутися до Документації розробника Apple.

Для тих, хто бажає працювати з цим файлом у більш доступному форматі, конвертацію у формат XML можна легко виконати за допомогою plutil на macOS (доступний вбудовано на версіях 10.2 та пізніше) або plistutil на Linux. Команди для конвертації такі:

  • Для macOS:
$ plutil -convert xml1 Info.plist
  • Для Linux:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Серед маси інформації, яку може розкрити файл Info.plist, варто відзначити рядки дозволів додатка (UsageDescription), власні URL-схеми (CFBundleURLTypes), та конфігурації для безпеки транспорту додатків (NSAppTransportSecurity). Ці записи, разом з іншими, такими як експортовані/імпортовані типи документів (UTExportedTypeDeclarations / UTImportedTypeDeclarations), можна легко знайти, оглянувши файл або використовуючи просту команду grep:

$ grep -i <keyword> Info.plist

Шляхи до даних

У середовищі iOS каталоги призначені спеціально для системних додатків та додатків, встановлених користувачем. Системні додатки розташовані в каталозі /Applications, тоді як додатки, встановлені користувачем, розміщуються в /private/var/containers/. Цим додаткам призначається унікальний ідентифікатор, відомий як 128-бітний UUID, що ускладнює завдання ручного знаходження каталогу додатка через випадковість назв каталогів.

Для полегшення виявлення каталогу встановлення додатка, інструмент objection надає корисну команду env. Ця команда показує детальну інформацію про каталог для додатка, що розглядається. Нижче наведено приклад використання цієї команди:

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env

Name               Path
-----------------  -------------------------------------------------------------------------------------------
BundlePath         /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory    /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory  /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory   /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library

Альтернативно, назву додатку можна знайти в /private/var/containers, використовуючи команду find:

find /private/var/containers -name "Progname*"

Команди, такі як ps та lsof, також можуть бути використані для ідентифікації процесу додатка та переліку відкритих файлів відповідно, що надає відомості про активні шляхи додатка:

ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1

Директорія пакета:

  • AppName.app
  • Це пакет додатка, як було показано раніше в IPA, він містить важливі дані додатка, статичний вміст, а також скомпільований бінарний файл додатка.
  • Ця директорія видима для користувачів, але користувачі не можуть писати в неї.
  • Вміст цієї директорії не резервується.
  • Вміст цієї папки використовується для підтвердження підпису коду.

Директорія даних:

  • 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):

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    ...  Name
------------  -------  ------------------  ...  --------------------------------------
Regular           420  None                ...  rutger.html
Regular           420  None                ...  mansi.html
Regular           420  None                ...  splash.html
Regular           420  None                ...  about.html

Regular           420  None                ...  LICENSE.txt
Regular           420  None                ...  Sentinel.txt
Regular           420  None                ...  README.txt

Бінарне реверсування

У папці <ім'я-додатка>.app ви знайдете бінарний файл під назвою <ім'я-додатка>. Це файл, який буде виконуватися. Ви можете виконати базову інспекцію бінарного файлу за допомогою інструменту otool:

otool -Vh DVIA-v2 #Check some compilation attributes
magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64    ARM64        ALL  0x00     EXECUTE    65       7112   NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE

otool -L DVIA-v2 #Get third party libraries
DVIA-v2:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
@rpath/Bolts.framework/Bolts (compatibility version 1.0.0, current version 1.0.0)
[...]

Перевірте, чи зашифровано додаток

Перевірте, чи є вихідні дані для:

otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO

Розібрати бінарний файл

Розібрати розділ тексту:

otool -tV DVIA-v2
DVIA-v2:
(__TEXT,__text) section
+[DDLog initialize]:
0000000100004ab8    sub    sp, sp, #0x60
0000000100004abc    stp    x29, x30, [sp, #0x50]   ; Latency: 6
0000000100004ac0    add    x29, sp, #0x50
0000000100004ac4    sub    x8, x29, #0x10
0000000100004ac8    mov    x9, #0x0
0000000100004acc    adrp    x10, 1098 ; 0x10044e000
0000000100004ad0    add    x10, x10, #0x268

Для виведення сегмента Objective-C зразка додатка можна використати:

otool -oV DVIA-v2
DVIA-v2:
Contents of (__DATA,__objc_classlist) section
00000001003dd5b8 0x1004423d0 _OBJC_CLASS_$_DDLog
isa        0x1004423a8 _OBJC_METACLASS_$_DDLog
superclass 0x0 _OBJC_CLASS_$_NSObject
cache      0x0 __objc_empty_cache
vtable     0x0
data       0x1003de748
flags          0x80
instanceStart  8

Для отримання більш компактного коду Objective-C ви можете використовувати class-dump:

class-dump some-app
//
//     Generated by class-dump 3.5 (64 bit).
//
//     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//

#pragma mark Named Structures

struct CGPoint {
double _field1;
double _field2;
};

struct CGRect {
struct CGPoint _field1;
struct CGSize _field2;
};

struct CGSize {
double _field1;
double _field2;
};

Однак, найкращі варіанти для розібрання бінарного коду: Hopper та IDA.


Використовуйте Trickest для легкої побудови та автоматизації робочих процесів, що працюють на основі найбільш продвинутих інструментів спільноти.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Зберігання даних

Щоб дізнатися, як iOS зберігає дані на пристрої, прочитайте цю сторінку:

{% content-ref url="ios-basics.md" %} ios-basics.md {% endcontent-ref %}

{% hint style="warning" %} Наступні місця для зберігання інформації слід перевірити тут же після встановлення додатка, після перевірки всіх функцій додатка та навіть після виходу з одного користувача та входу в іншого.
Мета полягає в пошуку незахищеної чутливої інформації додатка (паролі, токени), поточного користувача та раніше увійшлих користувачів. {% endhint %}

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} та виконати:

find ./ -name "*.plist"

Для конвертації файлів з формату XML або бінарного (bplist) в XML існують різні методи в залежності від вашої операційної системи:

Для користувачів macOS: Використовуйте команду plutil. Це вбудований інструмент в macOS (10.2+), призначений для цієї цілі:

$ plutil -convert xml1 Info.plist

Для користувачів Linux: Спочатку встановіть libplist-utils, а потім використовуйте plistutil, щоб конвертувати ваш файл:

$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Під час сесії Objection: Для аналізу мобільних додатків, конкретна команда дозволяє вам конвертувати файли plist безпосередньо:

ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.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 та отримати доступ до чутливої інформації, то ви знайшли неправильну конфігурацію.

{% code title="Код з iGoat" %}

-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);

NSManagedObjectContext *context =[appDelegate managedObjectContext];

User *user = [self fetchUser];
if (user) {
return;
}
user = [NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
user.email = CoreDataEmail;
user.password = CoreDataPassword;
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving data: %@", [error localizedDescription]);

}else{
NSLog(@"data stored in core data");
}
}

{% endcode %}

YapDatabase

YapDatabase - це сховище ключ-значення, побудоване на основі SQLite.
Оскільки бази даних Yap є базами даних SQLite, ви можете знайти їх, використовуючи запропоновану команду в попередньому розділі.

Інші бази даних SQLite

Зазвичай додатки створюють власні бази даних SQLite. Вони можуть зберігати на них чутливі дані і залишати їх незашифрованими. Тому завжди цікаво перевірити кожну базу даних у каталозі додатків. Тому перейдіть до каталогу додатків, де зберігаються дані (/private/var/mobile/Containers/Data/Application/{APPID}).

find ./ -name "*.sqlite" -or -name "*.db"

Бази даних Firebase Real-Time

Розробники можуть зберігати та синхронізувати дані в хмарній базі даних NoSQL за допомогою Firebase Real-Time Databases. Дані зберігаються у форматі JSON та синхронізуються з усіма підключеними клієнтами в реальному часі.

Ви можете дізнатися, як перевірити налаштування Firebase баз даних тут:

{% content-ref url="../../network-services-pentesting/pentesting-web/buckets/firebase-database.md" %} firebase-database.md {% endcontent-ref %}

Бази даних Realm

Realm Objective-C та Realm Swift пропонують потужну альтернативу для зберігання даних, яку не надає Apple. За замовчуванням, вони зберігають дані незашифрованими, а шифрування доступне через конкретну конфігурацію.

Бази даних розташовані за адресою: /private/var/mobile/Containers/Data/Application/{APPID}. Для дослідження цих файлів можна використовувати команди, подібні до:

iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm  default.realm.lock  default.realm.management/  default.realm.note|

$ find ./ -name "*.realm*"

Для перегляду цих файлів баз даних рекомендується використовувати інструмент Realm Studio.

Для реалізації шифрування в межах бази даних Realm можна використати наступний фрагмент коду:

// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
let realm = try Realm(configuration: config)
// Use the Realm as normal
} catch let error as NSError {
// If the encryption key is wrong, `error` will say that it's an invalid database
fatalError("Error opening realm: \(error)")
}

Бази даних Couchbase Lite

Couchbase Lite описується як легкий та вбудований двигун баз даних, який використовує документо-орієнтований (NoSQL) підхід. Розроблений для iOS та macOS, він пропонує можливість синхронізації даних без зусиль.

Для ідентифікації потенційних баз даних Couchbase на пристрої, слід перевірити наступний каталог:

ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/

Куки

iOS зберігає файли куків додатків у Library/Cookies/cookies.binarycookies всередині кожної папки додатка. Однак розробники іноді вирішують зберігати їх у keychain, оскільки зазначений файл куків може бути доступний у резервних копіях.

Для перевірки файлу куків ви можете використовувати цей скрипт на Python або використовувати ios cookies get з objection.
Ви також можете використовувати objection для конвертації цих файлів у формат JSON та перевірки даних.

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
[
{
"domain": "highaltitudehacks.com",
"expiresDate": "2051-09-15 07:46:43 +0000",
"isHTTPOnly": "false",
"isSecure": "false",
"name": "username",
"path": "/",
"value": "admin123",
"version": "0"
}
]

Кеш

За замовчуванням NSURLSession зберігає дані, такі як HTTP-запити та відповіді в базі даних Cache.db. Ця база даних може містити чутливі дані, якщо токени, імена користувачів або будь-яка інша чутлива інформація була кешована. Щоб знайти кешовану інформацію, відкрийте каталог даних додатка (/var/mobile/Containers/Data/Application/<UUID>) та перейдіть до /Library/Caches/<Bundle Identifier>. Кеш WebKit також зберігається в файлі Cache.db. Objection може відкривати та взаємодіяти з базою даних за допомогою команди sqlite connect Cache.db, оскільки це звичайна база даних SQLite.

Рекомендується вимкнути кешування цих даних, оскільки вони можуть містити чутливу інформацію в запиті або відповіді. Нижче наведено список різних способів досягнення цього:

  1. Рекомендується видаляти кешовані відповіді після виходу з облікового запису. Це можна зробити за допомогою наданого методу Apple під назвою removeAllCachedResponses. Ви можете викликати цей метод наступним чином:

URLCache.shared.removeAllCachedResponses()

Цей метод видалить всі кешовані запити та відповіді з файлу Cache.db. 2. Якщо вам не потрібно використовувати перевагу використання файлів cookie, рекомендується просто використовувати властивість конфігурації .ephemeral URLSession, яка вимкне збереження файлів cookie та кешування.

Документація Apple:

Об'єкт конфігурації сеансу ефемерний подібний до об'єкта конфігурації сеансу за замовчуванням (див. default), за винятком того, що відповідний об'єкт сеансу не зберігає кеші, сховища облікових записів або будь-які дані, пов'язані з сеансом, на диску. Замість цього дані, пов'язані з сеансом, зберігаються в оперативній пам'яті. Єдиний раз, коли ефемерний сеанс записує дані на диск, це той випадок, коли ви кажете йому записати вміст URL-адреси в файл. 3. Кеш можна також вимкнути, встановивши політику кешу на .notAllowed. Це вимкне зберігання кешу будь-яким чином, або в оперативній пам'яті, або на диску.

Знімки

Кожного разу, коли ви натискаєте кнопку "Додому", iOS робить знімок поточного екрану, щоб мати змогу здійснити перехід до додатка більш плавно. Однак, якщо на поточному екрані є чутлива інформація, вона буде збережена в зображенні (яке зберігається після перезавантаження). Це знімки, до яких ви також можете отримати доступ, подвійно натиснувши кнопку "Додому", щоб перемикатися між додатками.

Якщо iPhone не є джейлбрейкнутим, зловмиснику потрібно мати доступ до розблокованого пристрою, щоб побачити ці знімки. За замовчуванням останній знімок зберігається в пісочниці додатка в каталозі Library/Caches/Snapshots/ або Library/SplashBoard/Snapshots (довірені комп'ютери не можуть отримати доступ до файлової системи з iOX 7.0).

Один зі способів запобігти цьому поганому поводу - це встановити пустий екран або видалити чутливі дані перед зйомкою знімка за допомогою функції ApplicationDidEnterBackground().

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

Swift:

private var backgroundImage: UIImageView?

func applicationDidEnterBackground(_ application: UIApplication) {
let myBanner = UIImageView(image: #imageLiteral(resourceName: "overlayImage"))
myBanner.frame = UIScreen.main.bounds
backgroundImage = myBanner
window?.addSubview(myBanner)
}

func applicationWillEnterForeground(_ application: UIApplication) {
backgroundImage?.removeFromSuperview()
}

Objective-C:

Objective-C:

@property (UIImageView *)backgroundImage;

- (void)applicationDidEnterBackground:(UIApplication *)application {
UIImageView *myBanner = [[UIImageView alloc] initWithImage:@"overlayImage.png"];
self.backgroundImage = myBanner;
self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.window addSubview:myBanner];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.backgroundImage removeFromSuperview];
}

Це встановлює зображення тла на overlayImage.png кожного разу, коли додаток переходить у фоновий режим. Це запобігає витоку чутливих даних, оскільки overlayImage.png завжди перекриватиме поточний вид.

Ключовий ланцюжок

Для доступу та управління ключовим ланцюжком iOS доступні інструменти, такі як Keychain-Dumper, придатні для пристроїв з виправленим джейлбрейком. Крім того, Objection надає команду ios keychain dump для подібних цілей.

Збереження облікових даних

Клас NSURLCredential ідеально підходить для збереження чутливої інформації безпосередньо в ключовому ланцюжку, обходячи необхідність у NSUserDefaults або інших обгортках. Для збереження облікових даних після входу в систему використовується наступний код на Swift:

NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];

Для вилучення цих збережених облікових даних використовується команда Objection ios nsurlcredentialstorage dump.

Спеціальні клавіатури та кеш клавіатури

Починаючи з iOS 8.0, користувачі можуть встановлювати спеціальні розширення клавіатури, які керуються в розділі Налаштування > Загальні > Клавіатура > Клавіатури. Хоча ці клавіатури пропонують розширені можливості, вони становлять ризик перехоплення натискань клавіш та передачі даних на зовнішні сервери, хоча користувачі попереджаються про клавіатури, які потребують доступу до мережі. Додатки можуть, і повинні, обмежувати використання спеціальних клавіатур для введення конфіденційної інформації.

Рекомендації з безпеки:

  • Рекомендується вимкнути клавіатури від сторонніх розробників для підвищення безпеки.
  • Будьте уважні до функцій автокорекції та автопропозицій стандартної клавіатури iOS, які можуть зберігати конфіденційну інформацію в кеш-файлах, розташованих у Library/Keyboard/{locale}-dynamic-text.dat або /private/var/mobile/Library/Keyboard/dynamic-text.dat. Ці файли кешу слід регулярно перевіряти на наявність конфіденційних даних. Рекомендується скинути словник клавіатури через Налаштування > Загальні > Скинути > Скинути словник клавіатури для очищення кешованих даних.
  • Перехоплення мережевого трафіку може розкрити, чи передає спеціальна клавіатура натискання клавіш віддалено.

Запобігання кешуванню текстових полів

Протокол UITextInputTraits пропонує властивості для управління автокорекцією та безпечним введенням тексту, що є важливим для запобігання кешування конфіденційної інформації. Наприклад, вимкнення автокорекції та увімкнення безпечного введення тексту можливо здійснити за допомогою:

textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;

Додатково, розробники повинні забезпечити, що текстові поля, особливо ті, які призначені для введення чутливої інформації, такої як паролі та ПІН-коди, вимикають кешування, встановивши autocorrectionType на UITextAutocorrectionTypeNo та secureTextEntry на YES.

UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;

Логи

Відлагодження коду часто включає в себе використання логування. Це пов'язано з ризиком, оскільки логи можуть містити чутливу інформацію. Раніше, в iOS 6 та попередніх версіях, логи були доступні всім додаткам, що створювало ризик витоку чутливих даних. Зараз додатки обмежені у доступі лише до своїх логів.

Незважаючи на ці обмеження, зловмисник з фізичним доступом до розблокованого пристрою все ще може використовувати це, підключивши пристрій до комп'ютера та читаючи логи. Важливо зауважити, що логи залишаються на диску навіть після видалення додатка.

Для зменшення ризиків рекомендується ретельно взаємодіяти з додатком, досліджуючи всі його функціональні можливості та введення, щоб переконатися, що невідомо не реєструється чутлива інформація.

При перегляді вихідного коду додатка на предмет можливих витоків, шукайте як передвизначені, так і власні оператори логування, використовуючи ключові слова, такі як NSLog, NSAssert, NSCAssert, fprintf для вбудованих функцій, а також будь-які згадки Logging або Logfile для власних реалізацій.

Моніторинг системних логів

Додатки реєструють різні частини інформації, яка може бути чутливою. Для моніторингу цих логів використовуються інструменти та команди, такі як:

idevice_id --list   # To find the device ID
idevicesyslog -u <id> (| grep <app>)   # To capture the device logs

Кроки вище є корисними. Додатково, Xcode надає можливість збирати консольні журнали:

  1. Відкрийте Xcode.
  2. Підключіть iOS-пристрій.
  3. Перейдіть до Вікно -> Пристрої та Симулятори.
  4. Виберіть свій пристрій.
  5. Спровокуйте проблему, яку ви вивчаєте.
  6. Використовуйте кнопку Відкрити консоль, щоб переглянути журнали у новому вікні.

Для більш розширеного ведення журналів, підключення до оболонки пристрою та використання socat може забезпечити моніторинг журналів у реальному часі:

iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock

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



Використовуйте Trickest для легкої побудови та автоматизації робочих процесів, що працюють на основі найбільш розвинутих інструментів спільноти у світі.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Резервні копії

Функції автоматичного резервного копіювання вбудовані в iOS, що сприяє створенню копій даних пристрою через iTunes (до macOS Catalina), Finder (починаючи з macOS Catalina) або iCloud. Ці резервні копії охоплюють майже всі дані пристрою, за винятком високочутливих елементів, таких як деталі Apple Pay та конфігурації Touch ID.

Ризики безпеки

Включення встановлених додатків та їх даних у резервні копії породжує питання можливого витоку даних та ризику того, що зміни резервних копій можуть змінити функціональність додатків. Рекомендується не зберігати високочутливу інформацію у відкритому вигляді у будь-якій директорії додатку або його піддиректоріях для зменшення цих ризиків.

Виключення файлів з резервних копій

Файли в Documents/ та Library/Application Support/ резервно копіюються за замовчуванням. Розробники можуть виключити певні файли або директорії з резервних копій, використовуючи NSURL setResourceValue:forKey:error: з NSURLIsExcludedFromBackupKey. Ця практика є важливою для захисту високочутливих даних від потрапляння в резервні копії.

Тестування на вразливості

Для оцінки безпеки резервного копіювання додатка спочатку створіть резервну копію за допомогою Finder, а потім знайдіть її, використовуючи вказівки з офіційної документації Apple. Проаналізуйте резервну копію на предмет високочутливих даних або конфігурацій, які можуть бути змінені для впливу на роботу додатка.

Високочутлива інформація може бути знайдена за допомогою інструментів командного рядка або додатків, таких як iMazing. Для зашифрованих резервних копій наявність шифрування можна підтвердити, перевіривши ключ "IsEncrypted" у файлі "Manifest.plist" у корені резервної копії.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>

Для роботи з зашифрованими резервними копіями можуть бути корисні Python-скрипти, доступні в репозиторії GitHub DinoSec, такі як backup_tool.py та backup_passwd.py, хоча, можливо, знадобиться внесення змін для сумісності з останніми версіями iTunes/Finder. Ще одним варіантом для доступу до файлів у захищених паролем резервних копіях є інструмент iOSbackup.

Зміна Поведінки Додатку

Приклад зміни поведінки додатку через модифікацію резервних копій показаний у додатку гаманця для біткоїну Bither, де ПІН-код блокування інтерфейсу користувача зберігається в net.bither.plist під ключем pin_code. Видалення цього ключа з plist та відновлення резервної копії видаляє вимогу до ПІН-коду, надаючи необмежений доступ.

Підсумок щодо Тестування Пам'яті для Чутливих Даних

При роботі з чутливою інформацією, збереженою в пам'яті додатка, важливо обмежувати час викладення цих даних. Існують два основних підходи до дослідження вмісту пам'яті: створення дампу пам'яті та аналіз пам'яті в реальному часі. Обидва методи мають свої виклики, включаючи можливість пропустити критичні дані під час процесу дампу або аналізу.

Отримання та Аналіз Дампу Пам'яті

Для пристроїв з джейлбрейком та без нього інструменти, такі як objection та Fridump, дозволяють витягти пам'ять процесу додатка. Після витягування аналіз цих даних вимагає використання різноманітних інструментів, залежно від характеру інформації, яку ви шукаєте.

Для вилучення рядків з дампу пам'яті можна використовувати команди, такі як strings або rabin2 -zz:

# Extracting strings using strings command
$ strings memory > strings.txt

# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt

Для більш детального аналізу, включаючи пошук конкретних типів даних або шаблонів, radare2 пропонує широкі можливості пошуку:

$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...

Аналіз пам'яті під час виконання

r2frida надає потужну альтернативу для інспектування пам'яті додатка в реальному часі, не потребуючи дампу пам'яті. Цей інструмент дозволяє виконувати команди пошуку безпосередньо в пам'яті запущеного додатка:

$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>

Порушена криптографія

Погані процеси управління ключами

Деякі розробники зберігають чутливі дані в локальному сховищі та шифрують їх за допомогою ключа, який зашитий у коді або передбачуваний. Цього не слід робити, оскільки деякі обертання можуть дозволити зловмисникам видобути конфіденційну інформацію.

Використання небезпечних або застарілих алгоритмів

Розробники не повинні використовувати застарілі алгоритми для виконання перевірок авторизації, зберігання або відправлення даних. Деякі з цих алгоритмів: RC4, MD4, MD5, SHA1... Якщо для зберігання паролів, наприклад, використовуються хеші, слід використовувати хеші, які стійкі до перебору з використанням солі.

Перевірка

Основні перевірки, які слід виконати, - це знаходження захардкоджених паролів/секретів у коді, або якщо вони передбачувані, і чи код використовує які-небудь слабкі криптографічні алгоритми.

Цікаво, що ви можете моніторити деякі криптографічні бібліотеки автоматично за допомогою objection з:

ios monitor crypt

Для додаткової інформації про криптографічні API та бібліотеки iOS перейдіть за посиланням https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography

Локальна аутентифікація

Локальна аутентифікація відіграє важливу роль, особливо коли йдеться про захист доступу до віддаленої точки завдяки криптографічним методам. Суть полягає в тому, що без належної реалізації механізми локальної аутентифікації можуть бути обійдені.

Фреймворк локальної аутентифікації Apple та ключниця надають робустні API для розробників з метою спрощення діалогів аутентифікації користувачів та безпечної обробки секретних даних відповідно. Безпечний елемент забезпечує відбиток пальця для Touch ID, тоді як Face ID ґрунтується на розпізнаванні обличчя без компрометації біометричних даних.

Для інтеграції Touch ID/Face ID розробники мають два варіанти API:

  • LocalAuthentication.framework для високорівневої аутентифікації користувача без доступу до біометричних даних.
  • Security.framework для доступу до служб ключниці на нижньому рівні, забезпечуючи безпечну обробку секретних даних за допомогою біометричної аутентифікації. Різноманітні обгортки з відкритим кодом спрощують доступ до ключниці.

{% hint style="danger" %} Однак як LocalAuthentication.framework, так і Security.framework мають вразливості, оскільки вони в основному повертають булеві значення без передачі даних для процесів аутентифікації, що робить їх вразливими до обхіду (див. Не торкайся мене так, за Девідом Лінднером та інші). {% endhint %}

Реалізація локальної аутентифікації

Для запиту аутентифікації від користувачів розробники повинні використовувати метод evaluatePolicy в межах класу LAContext, вибираючи між:

  • deviceOwnerAuthentication: Запит на Touch ID або код доступу до пристрою, якщо жоден з них не увімкнено.
  • deviceOwnerAuthenticationWithBiometrics: Виключно запит на Touch ID.

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

Локальна аутентифікація за допомогою ключниці

Реалізація локальної аутентифікації в додатках iOS передбачає використання API ключниці для безпечного зберігання секретних даних, таких як токени аутентифікації. Цей процес забезпечує, що дані можуть бути доступні лише користувачем, використовуючи код доступу до пристрою або біометричну аутентифікацію, наприклад Touch ID.

Ключниця пропонує можливість встановлювати елементи з атрибутом SecAccessControl, який обмежує доступ до елемента до тих пір, поки користувач успішно аутентифікується за допомогою Touch ID або коду доступу до пристрою. Ця функція є важливою для підвищення безпеки.

Нижче наведені приклади коду на Swift та Objective-C, що демонструють, як зберегти та отримати рядок з/у ключниці, використовуючи ці функції безпеки. Приклади специфічно показують, як налаштувати контроль доступу для вимоги аутентифікації Touch ID та забезпечити доступність даних лише на пристрої, на якому вони були налаштовані, за умови, що налаштований код доступу до пристрою.

// From https://github.com/mufambisi/owasp-mstg/blob/master/Document/0x06f-Testing-Local-Authentication.md

// 1. create AccessControl object that will represent authentication settings

var error: Unmanaged<CFError>?

guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
SecAccessControlCreateFlags.biometryCurrentSet,
&error) else {
// failed to create AccessControl object

return
}

// 2. define keychain services query. Pay attention that kSecAttrAccessControl is mutually exclusive with kSecAttrAccessible attribute

var query: [String: Any] = [:]

query[kSecClass as String] = kSecClassGenericPassword
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecAttrAccount as String] = "OWASP Account" as CFString
query[kSecValueData as String] = "test_strong_password".data(using: .utf8)! as CFData
query[kSecAttrAccessControl as String] = accessControl

// 3. save item

let status = SecItemAdd(query as CFDictionary, nil)

if status == noErr {
// successfully saved
} else {
// error while saving
}

{% endtab %}

{% tab title="Objective-C" %}

Внедрення коду

Внедрення коду в додаток

  1. Відкрийте проект в Xcode.
  2. Виберіть файл, в який ви хочете внести зміни.
  3. Додайте код, який ви хочете внести.
  4. Збережіть зміни та перекомпілюйте додаток.

Внедрення коду під час виконання

  1. Відкрийте проект в Xcode.
  2. Виберіть файл, в який ви хочете внести зміни.
  3. Додайте код, який ви хочете внести.
  4. Запустіть додаток на симуляторі або пристрої.
  5. Перевірте, як працює внесений код.

Внедрення коду через динамічні бібліотеки

  1. Створіть динамічну бібліотеку з кодом, який ви хочете внести.
  2. Підключіть цю бібліотеку до вашого додатка.
  3. Запустіть додаток на симуляторі або пристрої.
  4. Перевірте, як працює внесений код через динамічну бібліотеку.

{% endtab %}

// 1. create AccessControl object that will represent authentication settings
CFErrorRef *err = nil;

SecAccessControlRef sacRef = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
kSecAccessControlUserPresence,
err);

// 2. define keychain services query. Pay attention that kSecAttrAccessControl is mutually exclusive with kSecAttrAccessible attribute
NSDictionary* query = @{
(_ _bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrLabel: @"com.me.myapp.password",
(__bridge id)kSecAttrAccount: @"OWASP Account",
(__bridge id)kSecValueData: [@"test_strong_password" dataUsingEncoding:NSUTF8StringEncoding],
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacRef
};

// 3. save item
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)query, nil);

if (status == noErr) {
// successfully saved
} else {
// error while saving
}

{% endtab %} {% endtabs %}

Тепер ми можемо запросити збережену позицію зі сховища ключів. Служби ключів покажуть діалог аутентифікації користувачу і повернуть дані або nil в залежності від того, чи було надано відповідний відбиток пальця чи ні.

// 1. define query
var query = [String: Any]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecReturnData as String] = kCFBooleanTrue
query[kSecAttrAccount as String] = "My Name" as CFString
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecUseOperationPrompt as String] = "Please, pass authorisation to enter this area" as CFString

// 2. get item
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}

if status == noErr {
let password = String(data: queryResult as! Data, encoding: .utf8)!
// successfully received password
} else {
// authorization not passed
}

{% endtab %}

{% tab title="Objective-C" %}

Внедрення коду

Внедрення коду в додаток

  1. Відкрийте проект в Xcode.
  2. Виберіть файл, в який ви хочете внести зміни.
  3. Додайте код, який ви хочете внести.
  4. Збережіть зміни та скомпілюйте проект.

Внедрення коду під час виконання

  1. Відкрийте проект в Xcode.
  2. Запустіть додаток на симуляторі або пристрої.
  3. Використовуйте LLDB або інші засоби для внесення змін у код під час виконання.

Внедрення коду через динамічні бібліотеки

  1. Створіть динамічну бібліотеку з кодом, який ви хочете внести.
  2. Підключіть цю бібліотеку до додатку.
  3. Запустіть додаток, щоб виконати внесення коду.

Внедрення коду через вразливості

  1. Знайдіть вразливі місця в додатку, де можна внести код.
  2. Внесіть код через ці вразливості, використовуючи техніки експлойтування.

Внедрення коду через динамічні бібліотеки

  1. Створіть динамічну бібліотеку з кодом, який ви хочете внести.
  2. Підключіть цю бібліотеку до додатку.
  3. Запустіть додаток, щоб виконати внесення коду. {% endtab %}
// 1. define query
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecReturnData: @YES,
(__bridge id)kSecAttrAccount: @"My Name1",
(__bridge id)kSecAttrLabel: @"com.me.myapp.password",
(__bridge id)kSecUseOperationPrompt: @"Please, pass authorisation to enter this area" };

// 2. get item
CFTypeRef queryResult = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &queryResult);

if (status == noErr){
NSData* resultData = ( __bridge_transfer NSData* )queryResult;
NSString* password = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"%@", password);
} else {
NSLog(@"Something went wrong");
}

Виявлення

Використання фреймворків у додатку також може бути виявлено шляхом аналізу списку спільних динамічних бібліотек додатка. Це можна зробити за допомогою otool:

$ otool -L <AppName>.app/<AppName>

Якщо в додатку використовується LocalAuthentication.framework, вивід буде містити обидві наступні рядки (пам'ятайте, що LocalAuthentication.framework використовує Security.framework всередині):

/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security

Якщо використовується Security.framework, буде показано лише другий.

Обхід рамки локальної аутентифікації

Заперечення

Через Обхід біометричної аутентифікації Objection, розташований на цій сторінці GitHub, доступна техніка для подолання механізму LocalAuthentication. Основа цього підходу полягає в використанні Frida для маніпулювання функцією evaluatePolicy, забезпечуючи постійне отримання результату True, незалежно від фактичного успіху аутентифікації. Це особливо корисно для обходу недоліків процесів біометричної аутентифікації.

Для активації цього обходу використовується наступна команда:

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios ui biometrics_bypass
(agent) Registering job 3mhtws9x47q. Type: ios-biometrics-disable
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # (agent) [3mhtws9x47q] Localized Reason for auth requirement: Please authenticate yourself
(agent) [3mhtws9x47q] OS authentication response: false
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete

Ця команда запускає послідовність, де Objection реєструє завдання, яке ефективно змінює результат перевірки evaluatePolicy на True.

Frida

Приклад використання evaluatePolicy з додатку DVIA-v2:

+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Please authenticate yourself";

if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Successful" withTitle:@"Success"];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Failed !" withTitle:@"Error"];
});
}
}];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Your device doesn't support Touch ID or you haven't configured Touch ID authentication on your device" withTitle:@"Error"];
});
}
}

Для досягнення обхідної локальної аутентифікації написаний скрипт Frida. Цей скрипт спрямований на перевірку evaluatePolicy, перехоплюючи його зворотний виклик, щоб забезпечити повернення success=1. Змінюючи поведінку зворотного виклику, перевірка аутентифікації ефективно обходиться.

Нижче наведений скрипт, який внедрюється для зміни результату методу evaluatePolicy. Він змінює результат зворотного виклику так, щоб завжди вказував на успіх.

// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) {
console.log("Injecting...");
var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var block = new ObjC.Block(args[4]);
const callback = block.implementation;
block.implementation = function (error, value)  {

console.log("Changing the result value to true")
const result = callback(1, null);
return result;
};
},
});
} else {
console.log("Objective-C Runtime is not available!");
}

Для впровадження скрипту Frida та обхіду біометричної аутентифікації використовується наступна команда:

frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js

Використання Чутливої Функціональності Через Міжпроцесну Комунікацію

Власні Обробники URI / Глибинні Посилання / Власні Схеми

{% content-ref url="ios-custom-uri-handlers-deeplinks-custom-schemes.md" %} ios-custom-uri-handlers-deeplinks-custom-schemes.md {% endcontent-ref %}

Універсальні Посилання

{% content-ref url="ios-universal-links.md" %} ios-universal-links.md {% endcontent-ref %}

Обмін UIActivity

{% content-ref url="ios-uiactivity-sharing.md" %} ios-uiactivity-sharing.md {% endcontent-ref %}

UIPasteboard

{% content-ref url="ios-uipasteboard.md" %} ios-uipasteboard.md {% endcontent-ref %}

Розширення Додатків

{% content-ref url="ios-app-extensions.md" %} ios-app-extensions.md {% endcontent-ref %}

WebViews

{% content-ref url="ios-webviews.md" %} ios-webviews.md {% endcontent-ref %}

Серіалізація та Кодування

{% content-ref url="ios-serialisation-and-encoding.md" %} ios-serialisation-and-encoding.md {% endcontent-ref %}

Мережеве З'єднання

Важливо перевірити, що жодне з'єднання не відбувається без шифрування, а також що додаток правильно перевіряє сертифікат TLS сервера.
Для перевірки цих проблем можна використовувати проксі-сервер, такий як Burp:

{% content-ref url="burp-configuration-for-ios.md" %} burp-configuration-for-ios.md {% endcontent-ref %}

Перевірка Імені Хоста

Однією з поширених проблем перевірки сертифіката TLS є перевірка того, що сертифікат підписаний довіреним ЦС, але не перевіряється, чи ім'я хоста сертифіката відповідає імені хоста, до якого звертаються.
Для перевірки цієї проблеми за допомогою Burp, після довіри CA Burp на iPhone, можна створити новий сертифікат з Burp для іншого імені хоста та використовувати його. Якщо додаток все ще працює, то щось є уразливим.

Прикріплення Сертифіката

Якщо додаток правильно використовує Прикріплення SSL, то додаток буде працювати лише в разі, якщо сертифікат відповідає очікуваному. Під час тестування додатка це може бути проблемою, оскільки Burp буде використовувати свій власний сертифікат.
Для обхіду цієї захисту на пристрої з вибором прав доступу можна встановити додаток SSL Kill Switch або встановити Burp Mobile Assistant

Також можна використовувати ios sslpinning disable в objection

Різне

  • У /System/Library можна знайти фреймворки, встановлені в телефоні, які використовуються системними додатками
  • Додатки, встановлені користувачем з App Store, розташовані в /User/Applications
  • А /User/Library містить дані, збережені додатками рівня користувача
  • Можна отримати доступ до /User/Library/Notes/notes.sqlite, щоб прочитати збережені нотатки в додатку.
  • У папці встановленого додатка (/User/Applications/<APP ID>/) можна знайти деякі цікаві файли:
  • iTunesArtwork: Іконка, використовувана додатком
  • iTunesMetadata.plist: Інформація про додаток, використовувана в App Store
  • /Library/*: Містить налаштування та кеш. У /Library/Cache/Snapshots/* можна знайти знімок, виконаний додатком перед відправленням його у фоновий режим.

Гаряче Виправлення/Примусове Оновлення

Розробники можуть віддалено виправити всі встановлення свого додатка миттєво, не подаючи додаток на App Store та не чекаючи, поки його схвалять.
Для цієї цілі зазвичай використовується JSPatch. Але є й інші варіанти, такі як Siren та react-native-appstore-version-checker.
Це небезпечний механізм, який може бути зловживаний зловмисними SDK сторонніх сторін, тому рекомендується перевірити, який метод використовується для автоматичного оновлення (якщо такий є) та протестувати його. Для цієї цілі можна спробувати завантажити попередню версію додатка.

Сторонні Служби

Значна проблема з SDK сторонніх сторін - це відсутність дрібної контролю над їх функціональністю. Розробники стикаються з вибором: або інтегрувати SDK та приймати всі його функції, включаючи потенційні вразливості безпеки та проблеми конфіденційності, або взагалі відмовитися від його переваг. Часто розробники не можуть виправити вразливості в цих SDK самостійно. Крім того, оскільки SDK набувають довіру в спільноті, деякі з них можуть почати містити шкідливе ПЗ.

Послуги, які надаються сторонніми SDK, можуть включати відстеження поведінки користувачів, відображення реклами або покращення користувацького досвіду. Однак це призводить до ризику, оскільки розробники можуть не повністю усвідомлювати код, який виконується цими бібліотеками, що може призвести до потенційних ризиків для конфіденційності та безпеки. Важливо обмежувати інформацію, яку ділять зі сторонніми службами, лише необхідною та переконатися, що немає розголошення чутливих даних.

Реалізація сторонніх служб зазвичай має дві форми: самостійна бібліотека або повний SDK. Для захисту конфіденційності користувача будь-які дані, які діляться з цими службами, повинні бути анонімізовані, щоб запобігти розголошенню особисто ідентифікованої інформації (PII).

Для ідентифікації бібліотек, які використовує додаток, можна використовувати команду otool. Цей інструмент слід запустити проти додатка та кожної спільної бібліотеки, яку він використовує, щоб виявити додаткові бібліотеки.

otool -L <application_path>

Посилання та Додаткові Ресурси


Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси за допомогою найбільш продвинутих інструментів спільноти у світі.
Отримайте доступ сьогодні:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks: