iOS Pentesting

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

iOS Basics

iOS Basics

Testing Environment

Na ovoj stranici možete pronaći informacije o iOS simulatoru, emulatorima i jailbreaking:

iOS Testing Environment

Initial Analysis

Basic iOS Testing Operations

Tokom testiranja biće predloženo više operacija (povezivanje sa uređajem, čitanje/pisanje/učitavanje/preuzimanje fajlova, korišćenje nekih alata…). Dakle, ako ne znate kako da izvedete neku od ovih radnji, molimo vas, počnite sa čitanjem stranice:

iOS Basic Testing Operations

Tip

Za sledeće korake aplikacija treba biti instalirana na uređaju i trebalo bi da već imate IPA file aplikacije.
Pročitajte stranicu Basic iOS Testing Operations da biste naučili kako da to uradite.

Basic Static Analysis

Neki interesantni dekompajleri za iOS - IPA fajlove:

Preporučuje se korišćenje alata MobSF za automatsku statičku analizu IPA fajla.

Identifikacija zaštita prisutnih u binarnoj datoteci:

  • PIE (Position Independent Executable): Kada je omogućeno, aplikacija se učitava na nasumičnu memorijsku adresu svaki put kad se pokrene, što otežava predviđanje početne memorijske adrese.
otool -hv <app-binary> | grep PIE   # It should include the PIE flag
  • Stack Canaries: Da bi se proverio integritet steka, vrednost ‘canary’ se postavlja na stek pre poziva funkcije i ponovo se proverava kada funkcija završi.
otool -I -v <app-binary> | grep stack_chk   # It should include the symbols: stack_chk_guard and stack_chk_fail
  • ARC (Automatic Reference Counting): Sprečavanje uobičajenih grešaka u upravljanju memorijom
otool -I -v <app-binary> | grep objc_release   # It should include the _objc_release symbol
  • Encrypted Binary: Binarni fajl bi trebalo da bude šifrovan
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # The cryptid should be 1

Identifikacija osetljivih/nesigurnih funkcija

  • Weak Hashing Algorithms
# On the iOS device
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# On linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Insecure Random Functions
# On the iOS device
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# On linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Insecure ‘Malloc’ Function
# On the iOS device
otool -Iv <app> | grep -w "_malloc"

# On linux
grep -iER "_malloc"
  • Insecure and Vulnerable Functions
# On the iOS device
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"

# On 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"

Uobičajene metode detekcije jailbreak-a

  • File System Checks: Proverite postojanje uobičajenih jailbreak fajlova i direktorijuma, kao što su /Applications/Cydia.app ili /Library/MobileSubstrate/MobileSubstrate.dylib.
  • Sandbox Violations: Pokušajte da pristupite ograničenim delovima fajl sistema, što bi trebalo biti blokirano na uređajima koji nisu jailbreak-ovani.
  • API Checks: Proverite da li je moguće koristiti zabranjene pozive kao što su fork() za kreiranje child procesa ili system() da biste videli da li /bin/sh postoji.
  • Process Checks: Pratite prisustvo poznatih procesa vezanih za jailbreak, poput Cydia, Substrate, ili ssh.
  • Kernel Exploits: Proverite prisustvo kernel exploit-ova koji se često koriste u jailbreak-ovima.
  • Environment Variables: Pregledajte environment promenljive za znakove jailbreak-a, kao što je DYLD_INSERT_LIBRARIES.
  • Libraries Check: Proverite koje su libs učitane u procesu aplikacije.
  • Check schemes: Na primer canOpenURL(URL(string: "cydia://")).

Uobičajene metode detekcije Anti-Debugging

  • Check for Debugger Presence: Koristite sysctl ili druge metode da proverite da li je debugger pričvršćen.
  • Anti-Debugging APIs: Potražite pozive ka anti-debugging API-jima kao što su ptrace ili SIGSTOP kao ptrace(PT_DENY_ATTACH, 0, 0, 0).
  • Timing Checks: Izmerite vreme izvođenja određenih operacija i potražite odstupanja koja mogu ukazivati na debugovanje.
  • Memory Checks: Pregledajte memoriju zbog poznatih debugger artefakata ili izmena.
  • Environment Variables: Proverite environment promenljive koje mogu ukazivati na debugging sesiju.
  • Mach Ports: Otkrivanje da li mach exception portovi koriste debagere.

Anti-Debugging & Anti-Tamper Techniques (Layered Checks)

Real-world aplikacije često slojevito kombinuju pre-exec, on-attach i kontinuirane provere. Uobičajeni obrasci koje treba tražiti (i kako ih neutralisati tokom testiranja):

  • Private API side-channel fingerprinting: privatni launch API-ji (npr. SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions) se zloupotrebljavaju za proveru instaliranih bundle ID-ova (com.opa334.TrollStore, org.coolstar.SileoStore, com.tigisoftware.Filza, itd.) na osnovu povratnih kodova/logovanja. Hook-ujte poziv i sanitizujte argumente/vraćene vrednosti da biste emulirali čist uređaj.
  • Self-attestation via code-signing state: csops() sa CS_OPS_ENTITLEMENTS_BLOB čita entitlements; neočekivane vrednosti pokreću izlaz. Ovo se sparuje sa integritet proverama (CRC32/MD5 resursa, validacija sertifikata, Mach-O metadata kao LC_ENCRYPTION_INFO_64) da otkrije re-signovanje ili patchovanje. Instrumentujte ove rutine i forsirajte “očekivane” rezultate tokom analize.
  • Kill-on-attach: ptrace(PT_DENY_ATTACH) u kombinaciji sa abort()/exit() pri attach-u. Zaobiđite ovo neutralisanjem puta za terminaciju ili hook-ovanjem ptrace da uspe bez nametanja zabrane.
  • Crash forensics sabotage: prepisivanje CPU registara pre crash-a kako bi se uništili backtrace-ovi. Bolje je postaviti breakpointe/hook-ove ranije u detekcionom putu umesto oslanjanja na crash logove.
  • Jetsam-based termination: namerni pritisak na memoriju da bi se pokrenuo jetsam, koji ne ostavlja normalan crash log. Potražite velike alokacije oko detekcione logike i ograničite/skraćujte ih da biste sačuvali logove.
  • Continuous checks with delayed enforcement: heartbeat tajmeri ponovo pokreću detekciju i primenjuju sankcije kasnije. Trace-ujte tajmere/dispatch source-ove i održavajte proces živim tako što ćete zaobići putanju za odloženi kill.

Basic Dynamic Analysis

Pogledajte dinamičku analizu koju MobSF obavlja. Moraćete da se krećete kroz različite prikaze i da interagujete sa njima, ali će alat hooking-ovati nekoliko klasa tokom rada i pripremiti izveštaj kada završite.

Listing Installed Apps

Koristite komandu frida-ps -Uai da odredite bundle identifier instaliranih aplikacija:

$ 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

Basic Enumeration & Hooking

Naučite kako da enumerate the components of the application i kako jednostavno da hook methods and classes koristeći objection:

iOS Hooking With Objection

Struktura IPA

Struktura IPA file je suštinski ista kao kod zipped package. Preimenovanjem ekstenzije u .zip, fajl se može dekompresovati i otkriti svoj sadržaj. Unutar ove strukture, Bundle predstavlja potpuno zapakovanu aplikaciju spremnu za instalaciju. Unutar ćete pronaći direktorijum nazvan <NAME>.app, koji enkapsulira resurse aplikacije.

  • Info.plist: Ovaj fajl sadrži specifične konfiguracione detalje aplikacije.
  • _CodeSignature/: Ovaj direktorijum uključuje plist fajl koji sadrži potpis, osiguravajući integritet svih fajlova u bundlu.
  • Assets.car: Kompresovani arhiv koji čuva asset fajlove kao što su ikonice.
  • Frameworks/: Ova fascikla sadrži native biblioteke aplikacije, koje mogu biti u obliku .dylib ili .framework fajlova.
  • PlugIns/: Ovo može uključivati ekstenzije aplikacije, poznate kao .appex fajlovi, iako nisu uvek prisutni. * Core Data: Koristi se za čuvanje trajnih podataka aplikacije za offline upotrebu, keširanje privremenih podataka i dodavanje undo funkcionalnosti u aplikaciji na jednom uređaju. Da bi sinhronizovao podatke preko više uređaja u istom iCloud nalogu, Core Data automatski preslikava šemu u CloudKit container.
  • PkgInfo: PkgInfo fajl je alternativan način da se odrede type i creator kodovi vaše aplikacije ili bundla.
  • en.lproj, fr.proj, Base.lproj: To su jezički paketi koji sadrže resurse za te specifične jezike, i podrazumevani resurs u slučaju da neki jezik nije podržan.
  • Bezbednost: Direktoriјum _CodeSignature/ igra ključnu ulogu u bezbednosti aplikacije verifikujući integritet svih fajlova u bundlu putem digitalnih potpisa.
  • Upravljanje asset-ima: Fajl Assets.car koristi kompresiju za efikasno upravljanje grafičkim resursima, što je ključno za optimizaciju performansi aplikacije i smanjenje njenog ukupnog veličine.
  • Frameworks i PlugIns: Ovi direktorijumi naglašavaju modularnost iOS aplikacija, omogućavajući developerima da uključe ponovno upotrebljiv kod (Frameworks/) i prošire funkcionalnost aplikacije (PlugIns/).
  • Lokalizacija: Struktura podržava više jezika, olakšavajući globalni doseg aplikacije uključivanjem resursa za specifične jezičke pakete.

Info.plist

Info.plist služi kao temelj za iOS aplikacije, enkapsulira ključne konfiguracione podatke u obliku key-value parova. Ovaj fajl je obavezan ne samo za aplikacije već i za app extensions i frameworks koji su uključeni u bundle. Strukturiran je ili u XML ili u binarnom formatu i sadrži kritične informacije, od dozvola aplikacije do bezbednosnih konfiguracija. Za detaljno istraživanje dostupnih ključeva, možete se obratiti Apple Developer Documentation.

Za one koji žele da rade s ovim fajlom u pristupačnijem formatu, XML konverzija se može lako postići korišćenjem plutil na macOS (dostupno nativno na verzijama 10.2 i novijim) ili plistutil na Linuxu. Komande za konverziju su sledeće:

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

Među mnoštvom informacija koje datoteka Info.plist može otkriti, naročito se ističu stringovi dozvola aplikacije (UsageDescription), prilagođene URL šeme (CFBundleURLTypes) i konfiguracije za App Transport Security (NSAppTransportSecurity). Ovi unosi, zajedno sa drugim kao što su izvezeni/uvoženi prilagođeni tipovi dokumenata (UTExportedTypeDeclarations / UTImportedTypeDeclarations), mogu se lako pronaći pregledom datoteke ili korišćenjem jednostavne grep komande:

$ grep -i <keyword> Info.plist

Putanje podataka

U iOS okruženju, direktorijumi su posebno namenjeni za sistemske aplikacije i aplikacije koje je instalirao korisnik. Sistemske aplikacije se nalaze u direktorijumu /Applications, dok se aplikacije koje je instalirao korisnik nalaze pod /var/mobile/containers/Data/Application/. Tim aplikacijama je dodeljen jedinstveni identifikator poznat kao 128-bitni UUID, što otežava ručno pronalaženje fascikle aplikacije zbog nasumičnosti imena direktorijuma.

Warning

Pošto aplikacije u iOS moraju biti sandboxed, svaka aplikacija će takođe imati fasciklu unutar $HOME/Library/Containers čije je ime aplikacije CFBundleIdentifier.

Međutim, obe fascikle (data & container folders) imaju fajl .com.apple.mobile_container_manager.metadata.plist koji povezuje obe fascikle u ključu MCMetadataIdentifier).

Da bi se olakšalo pronalaženje direktorijuma u kome je instalirana aplikacija koju je korisnik dodao, objection tool pruža korisnu komandu, env. Ova komanda otkriva detaljne informacije o direktorijumima za dotičnu aplikaciju. Ispod je primer kako koristiti ovu komandu:

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

Alternativno, ime aplikacije može da se pretraži unutar /private/var/containers koristeći komandu find:

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

Komande kao što su ps i lsof mogu se koristiti za identifikovanje procesa aplikacije i za ispis otvorenih fajlova, što pruža uvid u aktivne putanje direktorijuma aplikacije:

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

Bundle direktorijum:

  • AppName.app
  • Ovo je aplikacioni paket (Application Bundle) kao što je ranije prikazano u IPA; sadrži osnovne podatke aplikacije, statički sadržaj, kao i kompajlirani binarni fajl aplikacije.
  • Ovaj direktorijum je vidljiv korisnicima, ali korisnici ne mogu da u njega pišu.
  • Sadržaj u ovom direktorijumu nije bekapovan.
  • Sadržaj ovog foldera se koristi za validaciju potpisa koda.

Direktorijum podataka:

  • Documents/
  • Sadrži sve podatke koje kreiraju korisnici. Krajnji korisnik aplikacije inicira kreiranje ovih podataka.
  • Vidljivo korisnicima i korisnici mogu da u njega pišu.
  • Sadržaj u ovom direktorijumu se bekapuje.
  • Aplikacija može isključiti putanje postavljanjem NSURLIsExcludedFromBackupKey.
  • Library/
  • Sadrži sve fajlove koji nisu specifični za korisnika, kao što su keš, podešavanja, kolačići, i property list (plist) konfiguracioni fajlovi.
  • iOS aplikacije obično koriste Application Support i Caches poddirektorijume, ali aplikacija može kreirati sopstvene poddirektorijume.
  • Library/Caches/
  • Sadrži polu-trajne keširane fajlove.
  • Nevidljivo korisnicima i korisnici ne mogu da u njega pišu.
  • Sadržaj u ovom direktorijumu nije bekapovan.
  • OS može automatski obrisati fajlove iz ovog direktorijuma kada aplikacija nije pokrenuta i ima malo slobodnog prostora.
  • Library/Application Support/
  • Sadrži perzistentne fajlove neophodne za pokretanje aplikacije.
  • Nevidljivo korisnicima i korisnici ne mogu da u njega pišu.
  • Sadržaj u ovom direktorijumu je sačuvan u rezervnoj kopiji.
  • Aplikacija može isključiti putanje postavljanjem NSURLIsExcludedFromBackupKey.
  • Library/Preferences/
  • Koristi se za čuvanje osobina koje mogu postojati čak i nakon ponovnog pokretanja aplikacije.
  • Informacije se čuvaju, nešifrovane, unutar sandbox-a aplikacije u plist fajlu nazvanom [BUNDLE_ID].plist.
  • Sve parove ključ/vrednost sačuvane korišćenjem NSUserDefaults možete naći u ovom fajlu.
  • tmp/
  • Koristite ovaj direktorijum za pisanje privremenih fajlova koji ne moraju da opstanu između pokretanja aplikacije.
  • Sadrži neperzistentne keširane fajlove.
  • Nevidljivo korisnicima.
  • Sadržaj u ovom direktorijumu se ne bekapuje.
  • OS može automatski obrisati fajlove iz ovog direktorijuma kada aplikacija nije pokrenuta i ima malo slobodnog prostora.

Pogledajmo bliže iGoat-Swift Application Bundle (.app) direktorijum unutar Bundle direktorijuma (/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

Binary Reversing

Unutar foldera <application-name>.app nalazi se binarni fajl nazvan <application-name>. Ovo je fajl koji će biti izvršen. Možete izvršiti osnovnu inspekciju binarnog fajla pomoću alata 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)
[...]

Proveri da li je aplikacija šifrovana

Proveri da li postoji bilo kakav izlaz za:

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

Disassembling the binary

Disassemble the text section:

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

Da biste ispisali Objective-C segment uzorka aplikacije, možete koristiti:

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

Da biste dobili kompaktniji Objective-C kod, možete koristiti 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;
};

Međutim, najbolje opcije za disasembliranje binarnog fajla su: Hopper i IDA.

Čuvanje podataka

Da biste saznali kako iOS čuva podatke na uređaju pročitajte ovu stranicu:

iOS Basics

Warning

Sledeća mesta za čuvanje informacija treba proveriti odmah nakon instalacije aplikacije, nakon provere svih funkcionalnosti aplikacije i čak nakon odjave jednog korisnika i prijave drugog.
Cilj je pronaći nezaštićene osetljive informacije aplikacije (passwords, tokens), trenutnog korisnika i prethodno prijavljenih korisnika.

Plist

plist fajlovi su strukturirani XML fajlovi koji sadrže parove ključ-vrednost. To je način za trajno čuvanje podataka, pa ponekad možete naći osetljive informacije u ovim fajlovima. Preporučuje se da se ovi fajlovi provere nakon instalacije aplikacije i nakon intenzivnog korišćenja da biste videli da li su upisani novi podaci.

Najčešći način trajnog čuvanja podataka u plist fajlovima je korišćenjem NSUserDefaults. Ovaj plist fajl se čuva unutar sandbox-a aplikacije u Library/Preferences/<appBundleID>.plist

Klasa NSUserDefaults pruža programski interfejs za interakciju sa podrazumevanim sistemom. Podrazumevani sistem omogućava aplikaciji da prilagodi svoje ponašanje prema korisničkim podešavanjima. Podaci sačuvani pomoću NSUserDefaults mogu se pregledati u bundle-u aplikacije. Ova klasa skladišti podatke u plist fajl, ali je namenjena za upotrebu sa malim količinama podataka.

Ovi podaci više ne mogu biti direktno pristupljeni putem pouzdanog računara, ali im se može pristupiti izvršavanjem backup-a.

Možete dump informacije sačuvane pomoću NSUserDefaults korišćenjem objection-ove komande ios nsuserdefaults get

Da biste pronašli sve plist fajlove koje aplikacija koristi, možete pristupiti /private/var/mobile/Containers/Data/Application/{APPID} i pokrenuti:

find ./ -name "*.plist"

Da biste konvertovali fajlove iz XML ili binarnog (bplist) formata u XML, dostupne su različite metode u zavisnosti od vašeg operativnog sistema:

Za macOS korisnike: Koristite komandu plutil. To je ugrađeni alat u macOS-u (10.2+), namenjen za ovu svrhu:

$ plutil -convert xml1 Info.plist

Za Linux korisnike: Prvo instalirajte libplist-utils, zatim koristite plistutil da konvertujete vaš fajl:

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

Within an Objection Session: Za analizu mobilnih aplikacija, specifična komanda omogućava da direktno konvertujete plist fajlove:

ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist

Core Data

Core Data je framework za upravljanje slojem modela objekata u vašoj aplikaciji. Core Data can use SQLite as its persistent store, but the framework itself is not a database.
CoreData ne šifruje svoje podatke po defaultu. Međutim, dodatni sloj enkripcije može se dodati CoreData. Pogledajte GitHub Repo za više detalja.

You can find the SQLite Core Data information of an application in the path /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support

If you can open the SQLite and access sensitive information, then you found a miss-configuration.

-(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");
}
}

YapDatabase

YapDatabase je key/value store izgrađen na vrhu SQLite.
Pošto su Yap baze SQLite baze, možete ih pronaći koristeći komandu iz prethodnog odeljka.

Other SQLite Databases

Uobičajeno je da aplikacije kreiraju svoje SQLite baze podataka. One mogu čuvati osetljive podatke u njima i ostaviti ih nekriptovanim. Zbog toga je uvek interesantno proveriti svaku bazu unutar direktorijuma aplikacije. Zato idite u direktorijum aplikacije gde se podaci čuvaju (/private/var/mobile/Containers/Data/Application/{APPID})

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

Firebase Real-Time Databases

Programerima je omogućeno da čuvaju i sinhronizuju podatke unutar NoSQL cloud-hosted database putem Firebase Real-Time Databases. Smešteni u JSON formatu, podaci se sinhronizuju sa svim povezanим klijentima u realnom vremenu.

You can find how to check for misconfigured Firebase databases here:

Firebase Database

Realm databases

Realm Objective-C and Realm Swift nude snažnu alternativu za skladištenje podataka, koju Apple ne obezbeđuje. Po defaultu, oni čuvaju podatke nešifrovane, dok je šifrovanje dostupno kroz specifičnu konfiguraciju.

Baze podataka se nalaze na: /private/var/mobile/Containers/Data/Application/{APPID}. Za pregled ovih fajlova možete koristiti naredbe kao što su:

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*"

Za pregled ovih fajlova baze podataka preporučuje se alat Realm Studio.

Za implementaciju enkripcije unutar Realm baze podataka, može se koristiti sledeći kod:

// 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 baze podataka

Couchbase Lite je opisan kao lagan i ugrađen sistem za baze podataka koji koristi pristup orijentisan na dokumente (NoSQL). Dizajniran da bude nativan za iOS i macOS, omogućava besprekornu sinhronizaciju podataka.

Da biste identifikovali potencijalne Couchbase baze podataka na uređaju, treba pregledati sledeći direktorijum:

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

Cookies

iOS čuva cookies aplikacija u Library/Cookies/cookies.binarycookies u folderu svake aplikacije. Međutim, developeri ponekad odluče da ih sačuvaju u keychain jer pomenuti cookie file može biti dostupan u backup-ovima.

Za pregled cookie file-a možete koristiti this python script ili objection’s ios cookies get.
Takođe možete koristiti objection da konvertujete ove fajlove u JSON format i pregledate podatke.

...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"
}
]

Cache

Po podrazumevanoj postavci NSURLSession čuva podatke, kao što su HTTP requests and responses in the Cache.db baza podataka. Ova baza može sadržati osetljive podatke, ako su tokeni, korisnička imena ili bilo koje druge osetljive informacije keširane. Da biste pronašli keširane informacije otvorite data direktorijum aplikacije (/var/mobile/Containers/Data/Application/<UUID>) i idite u /Library/Caches/<Bundle Identifier>. WebKit cache is also being stored in the Cache.db fajl. Objection može da otvori i interaguje sa bazom podataka komandom sqlite connect Cache.db, jer je to normal SQLite database.

Preporučuje se onemogućiti keširanje ovih podataka, jer mogu sadržati osetljive informacije u zahtevu ili odgovoru. Sledeća lista prikazuje različite načine da se to postigne:

  1. Preporučuje se uklanjanje keširanih odgovora nakon logout-a. To se može uraditi pomoću metode koju je obezbedio Apple nazvane removeAllCachedResponses Možete pozvati ovu metodu na sledeći način:

URLCache.shared.removeAllCachedResponses()

Ova metoda će ukloniti sve keširane zahteve i odgovore iz Cache.db fajla.

  1. Ako nije potrebno koristiti pogodnosti cookies, preporučljivo je koristiti .ephemeral konfiguraciono svojstvo URLSession, koje će onemogućiti čuvanje cookies i Caches.

Apple documentation:

An ephemeral session configuration object is similar to a default session configuration (see default), except that the corresponding session object doesn’t store caches, credential stores, or any session-related data to disk. Instead, session-related data is stored in RAM. The only time an ephemeral session writes data to disk is when you tell it to write the contents of a URL to a file.

  1. Cache se takođe može onemogućiti podešavanjem Cache Policy na .notAllowed. To će onemogućiti čuvanje Cache-a na bilo koji način, bilo u memoriji ili na disku.

Snapshots

Kad pritisnete home button, iOS uzima snapshot trenutnog ekrana kako bi tranzicija ka aplikaciji bila mnogo glađa. Međutim, ako su na trenutnom ekranu prisutni osetljivi podaci, oni će biti sačuvani u sliki (koja preživljava restartove). To su snapshot-ovi kojima takođe možete pristupiti dvostrukim dodirom na home button da biste prešli između aplikacija.

Osim ako iPhone nije jailbroken, attacker mora imati access do device otključan da bi video ove snimke. Po podrazumevanoj postavci poslednji snapshot je smešten u sandboxu aplikacije u Library/Caches/Snapshots/ ili Library/SplashBoard/Snapshots folderu (the trusted computers can’ t access the filesystem from iOX 7.0).

Jedan način da se spreči ovo nepoželjno ponašanje je da prikažete prazan ekran ili uklonite osetljive podatke pre pravljenja snapshot-a koristeći funkciju ApplicationDidEnterBackground().

Ispod je primer metode za sanaciju koja će postaviti podrazumevani screenshot.

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:

@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];
}

Ovo postavlja pozadinsku sliku na overlayImage.png kad god je aplikacija u pozadini. Time se sprečava leak osetljivih podataka, jer će overlayImage.png uvek prebrisati trenutni prikaz.

Keychain

Za pristup i upravljanje iOS keychain-om dostupni su alati poput Keychain-Dumper, pogodni za jailbroken uređaje. Dodatno, Objection pruža komandu ios keychain dump za slične svrhe.

Čuvanje kredencijala

Klasa NSURLCredential je idealna za čuvanje osetljivih informacija direktno u keychain, zaobilazeći potrebu za NSUserDefaults ili drugim wrapperima. Za čuvanje kredencijala nakon prijave koristi se sledeći Swift kod:

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

Za izdvajanje ovih sačuvanih kredencijala koristi se Objection komanda ios nsurlcredentialstorage dump.

Prilagođene tastature i keš tastature

Od iOS 8.0 nadalje, korisnici mogu instalirati custom keyboard ekstenzije, koje se mogu upravljati pod Settings > General > Keyboard > Keyboards. Iako ove tastature nude proširenu funkcionalnost, predstavljaju rizik od beleženja pritisaka tastera i slanja podataka na spoljne servere, iako su korisnici obavešteni o tastaturama kojima je potreban mrežni pristup. Aplikacije mogu, i treba da, ograniče upotrebu custom keyboards za unos osetljivih informacija.

Preporuke za bezbednost:

  • Preporučuje se onemogućavanje third-party tastatura radi poboljšane bezbednosti.
  • Obratite pažnju na funkcije autocorrect i auto-suggestions podrazumevane iOS tastature, koje bi mogle da sačuvaju osetljive informacije u keš fajlovima lociranim u Library/Keyboard/{locale}-dynamic-text.dat ili /private/var/mobile/Library/Keyboard/dynamic-text.dat. Ovi keš fajlovi treba redovno da se proveravaju zbog osetljivih podataka. Resetovanje rečnika tastature putem Settings > General > Reset > Reset Keyboard Dictionary se preporučuje za brisanje keširanih podataka.
  • Presretanje mrežnog saobraćaja može otkriti da li custom keyboard udaljeno prenosi pritiske tastera.

Sprečavanje keširanja tekstualnih polja

The UITextInputTraits protocol offers properties to manage autocorrection and secure text entry, essential for preventing sensitive information caching. For example, disabling autocorrection and enabling secure text entry can be achieved with:

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

Pored toga, developeri bi trebalo da obezbede da tekstualna polja, naročito ona za unos osetljivih informacija kao što su lozinke i PIN-ovi, onemoguće keširanje podešavanjem autocorrectionType na UITextAutocorrectionTypeNo i secureTextEntry na YES.

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

Logovi

Debugovanje koda često podrazumeva upotrebu logging. Postoji rizik jer logovi mogu sadržati osetljive informacije. Ranije, u iOS 6 i starijim verzijama, logovi su bili dostupni svim aplikacijama, što je predstavljalo rizik od curenja osetljivih podataka. Sada su aplikacije ograničene tako da pristupaju samo svojim logovima.

Uprkos ovim ograničenjima, napadač sa fizičkim pristupom otključanom uređaju i dalje to može iskoristiti tako što će povezati uređaj sa računarom i čitati logove. Važno je napomenuti da logovi ostaju na disku čak i nakon deinstalacije aplikacije.

Da bi se rizici ublažili, preporučuje se da se temeljno interaguje sa aplikacijom, istraže sve njene funkcionalnosti i ulazi kako bi se osiguralo da se nijedna osetljiva informacija nehotično ne beleži u logovima.

Prilikom pregledavanja izvornog koda aplikacije zbog potencijalnih curenja, tražite i predefinisane i custom logging statements koristeći ključne reči kao što su NSLog, NSAssert, NSCAssert, fprintf za ugrađene funkcije, i sve naznake Logging ili Logfile za custom implementacije.

Praćenje sistemskih logova

Aplikacije beleže razne informacije koje mogu biti osetljive. Za praćenje ovih logova koriste se alati i komande kao što su:

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

su korisni. Pored toga, Xcode pruža način za prikupljanje konzolnih logova:

  1. Otvorite Xcode.
  2. Povežite iOS uređaj.
  3. Idite na Window -> Devices and Simulators.
  4. Odaberite svoj uređaj.
  5. Pokrenite problem koji istražujete.
  6. Koristite dugme Open Console da pogledate logove u novom prozoru.

Za naprednije logovanje, povezivanje sa shell-om uređaja i korišćenje socat može obezbediti praćenje logova u realnom vremenu:

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

Praćeno komandama za posmatranje aktivnosti logova, koje mogu biti neprocenjive za dijagnostikovanje problema ili identifikovanje potencijalnog data leakage u logovima.

Backups

Funkcije automatskog backup-a su integrisane u iOS, olakšavajući kreiranje kopija podataka uređaja preko iTunes (do macOS Catalina), Finder (od macOS Catalina nadalje), ili iCloud. Ovi backup-ovi obuhvataju skoro sve podatke uređaja, izuzev veoma osetljivih elemenata kao što su Apple Pay detalji i Touch ID konfiguracije.

Security Risks

Uključivanje installiranih aplikacija i njihovih podataka u backup-ove otvara pitanje potencijalnog data leakage i rizik da izmene backup-a mogu promeniti funkcionalnost aplikacije. Preporučuje se ne skladištiti osetljive informacije u plaintext formatu unutar bilo kog direktorijuma aplikacije ili njenih poddirektorijuma kako bi se umanjili ovi rizici.

Excluding Files from Backups

Fajlovi u Documents/ i Library/Application Support/ se po defaultu backup-uju. Programeri mogu izuzeti specifične fajlove ili direktorijume iz backup-a koristeći NSURL setResourceValue:forKey:error: sa NSURLIsExcludedFromBackupKey. Ova praksa je ključna za zaštitu osetljivih podataka od uključivanja u backup-ove.

Testing for Vulnerabilities

Da biste procenili bezbednost backup-a aplikacije, počnite sa kreiranjem backup-a koristeći Finder, zatim ga pronađite prateći uputstva sa Apple’s official documentation. Analizirajte backup radi prisustva osetljivih podataka ili konfiguracija koje bi mogle biti izmenjene kako bi uticale na ponašanje aplikacije.

Osetljive informacije se mogu tražiti koristeći komandne alate ili aplikacije poput iMazing. Za enkriptovane backup-ove, prisustvo enkripcije može se potvrditi proverom ključa “IsEncrypted” u fajlu “Manifest.plist” u korenu backup-a.

<?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>

For dealing with encrypted backups, Python scripts available in DinoSec’s GitHub repo, like backup_tool.py and backup_passwd.py, may be useful, albeit potentially requiring adjustments for compatibility with the latest iTunes/Finder versions. The iOSbackup tool is another option for accessing files within password-protected backups.

Modifying App Behavior

An example of altering app behavior through backup modifications is demonstrated in the Bither bitcoin wallet app, where the UI lock PIN is stored within net.bither.plist under the pin_code key. Removing this key from the plist and restoring the backup removes the PIN requirement, providing unrestricted access.

Summary on Memory Testing for Sensitive Data

When dealing with sensitive information stored in an application’s memory, it is crucial to limit the exposure time of this data. There are two primary approaches to investigate memory content: creating a memory dump and analyzing the memory in real time. Both methods have their challenges, including the potential to miss critical data during the dump process or analysis.

Retrieving and Analyzing a Memory Dump

For both jailbroken and non-jailbroken devices, tools like objection and Fridump allow for the dumping of an app’s process memory. Once dumped, analyzing this data requires various tools, depending on the nature of the information you’re searching for.

To extract strings from a memory dump, commands such as strings or rabin2 -zz can be used:

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

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

Za detaljniju analizu, uključujući pretragu za određenim tipovima podataka ili obrascima, radare2 nudi opsežne mogućnosti pretraživanja:

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

Analiza memorije u realnom vremenu

r2frida pruža snažnu alternativu za pregled memorije aplikacije u realnom vremenu, bez potrebe za memory dump. Ovaj alat omogućava izvršavanje search commands direktno na memoriji pokrenute aplikacije:

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

Broken Cryptography

Poor Key Management Processes

Neki developeri čuvaju osetljive podatke u local storage i enkriptuju ih ključem koji je hardcoded/predictable u kodu. To ne bi trebalo raditi, jer reversing može omogućiti attackerima da ekstrahuju poverljive informacije.

Use of Insecure and/or Deprecated Algorithms

Developeri ne bi trebalo da koriste deprecated algorithms za izvođenje authorisation checks, store ili send podataka. Neki od ovih algoritama su: RC4, MD4, MD5, SHA1… Ako se hashes koriste za čuvanje lozinki na primer, hashes brute-force resistant treba koristiti sa salt.

Check

Glavne provere koje treba izvršiti su da li možete pronaći hardcoded passwords/secrets u kodu, da li su oni predictable, i da li kod koristi neku vrstu weak cryptography algoritama.

Zanimljivo je znati da možete monitor neke crypto libraries automatski koristeći objection sa:

ios monitor crypt

For more information about iOS cryptographic APIs and libraries access https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography

Lokalna autentifikacija

Lokalna autentifikacija igra ključnu ulogu, posebno kada je reč o zaštiti pristupa na udaljenom kraju putem kriptografskih metoda. Suština je da bez pravilne implementacije, lokalni mehanizmi autentifikacije mogu biti zaobiđeni.

Apple-ov Local Authentication framework i keychain pružaju robusne API-je developerima za prikaz korisničkih dijaloga za autentifikaciju i sigurno rukovanje tajnim podacima. Secure Enclave štiti identifikaciju otiskom prsta za Touch ID, dok se Face ID oslanja na prepoznavanje lica bez ugrožavanja biometrijskih podataka.

Da bi integrisali Touch ID/Face ID, developeri imaju dve API opcije:

  • LocalAuthentication.framework za visok nivo korisničke autentifikacije bez pristupa biometrijskim podacima.
  • Security.framework za niži nivo pristupa keychain servisima, osiguravajući tajne podatke biometrijskom autentifikacijom. Various open-source wrappers make keychain access simpler.

Caution

Međutim, oba LocalAuthentication.framework i Security.framework imaju ranjivosti, jer uglavnom vraćaju boolean vrednosti bez prosleđivanja podataka za autentifikacione procese, što ih čini podložnim zaobilaženju (pogledajte Don’t touch me that way, by David Lindner et al).

Implementacija lokalne autentifikacije

Da bi zatražili autentifikaciju od korisnika, developeri treba da koriste metodu evaluatePolicy u okviru klase LAContext, birajući između:

  • deviceOwnerAuthentication: Zatražuje Touch ID ili šifru uređaja, neuspeva ako nijedno nije omogućeno.
  • deviceOwnerAuthenticationWithBiometrics: Isključivo zahteva Touch ID.

Uspešna autentifikacija se označava boolean vrednošću koju vraća evaluatePolicy, što ukazuje na potencijalnu sigurnosnu manu.

Lokalna autentifikacija koristeći Keychain

Implementacija lokalne autentifikacije u iOS aplikacijama podrazumeva korišćenje keychain API-ja za sigurno čuvanje tajnih podataka kao što su authentication tokens. Ovaj proces osigurava da podacima može pristupiti samo korisnik, koristeći šifru uređaja ili biometrijsku autentifikaciju kao što je Touch ID.

Keychain omogućava postavljanje stavki sa atributom SecAccessControl, koji ograničava pristup stavci dok se korisnik uspešno ne autentifikuje putem Touch ID ili šifre uređaja. Ova opcija je ključna za unapređenje bezbednosti.

Ispod su primeri koda u Swift i Objective-C koji ilustruju kako sačuvati i dohvatiti string u/iz keychain-a koristeći ove bezbednosne funkcije. Primeri pokazuju kako podesiti kontrolu pristupa da zahteva Touch ID autentifikaciju i osiguraju da su podaci dostupni samo na uređaju na kojem su kreirani, pod uslovom da je šifra uređaja podešena.

// 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
}

Sada možemo zatražiti sačuvani item iz keychain-a. Keychain services će korisniku prikazati dialog za autentifikaciju i vratiti data ili nil, u zavisnosti od toga da li je priložen odgovarajući fingerprint.

// 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
}

Detekcija

Korišćenje frameworks u aplikaciji može se takođe detektovati analizom liste deljenih dinamičkih biblioteka binarne datoteke aplikacije. To se može uraditi pomoću otool:

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

Ako se u aplikaciji koristi LocalAuthentication.framework, izlaz će sadržati obe sledeće linije (zapamtite da LocalAuthentication.framework koristi Security.framework ispod haube):

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

Ako se koristi Security.framework, prikazaće se samo drugi.

Local Authentication Framework Bypass

Objection

Kroz Objection Biometrics Bypass, dostupnu na this GitHub page, postoji tehnika za zaobilaženje mehanizma LocalAuthentication. Suština ovog pristupa uključuje korišćenje Frida za manipulaciju funkcijom evaluatePolicy, osiguravajući da ona dosledno vraća True, bez obzira na stvarni uspeh autentifikacije. Ovo je posebno korisno za zaobilaženje neispravnih procesa biometrijske autentifikacije.

Da biste aktivirali ovaj bypass, koristi se sledeća komanda:

...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

Ova komanda pokreće sekvencu u kojoj Objection registruje zadatak koji efikasno menja ishod evaluatePolicy provere u True.

Frida

Primer upotrebe evaluatePolicy iz DVIA-v2 application:

+(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"];
});
}
}

Da bi se postigao bypass Local Authentication, napisan je Frida script. Ovaj script cilja proveru evaluatePolicy, presrećući njen callback kako bi osigurao da vraća success=1. Menjanjem ponašanja callback-a, provera autentikacije se efektivno zaobilazi.

Script ispod je injektovan da bi izmenio rezultat metode evaluatePolicy. On menja rezultat callback-a tako da uvek označava uspeh.

// 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!");
}

Da biste injektovali Frida script i zaobišli biometric authentication, koristi se sledeća komanda:

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

Izlaganje osetljivih funkcionalnosti putem IPC

iOS Custom URI Handlers / Deeplinks / Custom Schemes

iOS Universal Links

UIActivity Sharing

iOS UIActivity Sharing

UIPasteboard

iOS UIPasteboard

App Extensions

iOS App Extensions

WebViews

iOS WebViews

Serialisation and Encoding

iOS Serialisation and Encoding

Mrežna komunikacija

Važno je proveriti da nijedna komunikacija ne protiče bez enkripcije i takođe da aplikacija ispravno validira TLS sertifikat servera.
Da biste proverili ovakve probleme možete koristiti proxy kao što je Burp:

iOS Burp Suite Configuration

Provera hostname-a

Jedan čest problem pri validaciji TLS sertifikata je to što se proveri da li je sertifikat potpisan od strane pouzdane CA, ali se ne proveri da li je hostname u sertifikatu zapravo hostname kojem se pristupa.
Da biste ovaj problem proverili koristeći Burp, nakon što poverite Burp CA na iPhone-u, možete kreirati novi sertifikat u Burp-u za drugačiji hostname i koristiti ga. Ako aplikacija i dalje radi, onda je ranjiva.

Certificate Pinning

Ako aplikacija ispravno koristi SSL Pinning, aplikacija će raditi samo ako je sertifikat onaj koji se očekuje. Prilikom testiranja aplikacije ovo može predstavljati problem jer Burp servisira sopstveni sertifikat.
Da biste zaobišli ovu zaštitu na jailbroken uređaju, možete instalirati aplikaciju SSL Kill Switch ili Burp Mobile Assistant

Takođe možete koristiti objection komandu ios sslpinning disable

Ostalo

  • U /System/Library možete pronaći framework-e instalirane na telefonu koje koriste sistemske aplikacije
  • Aplikacije koje je korisnik instalirao iz App Store-a nalaze se u /User/Applications
  • A /User/Library sadrži podatke koje čuvaju aplikacije na nivou korisnika
  • Možete pristupiti /User/Library/Notes/notes.sqlite da pročitate beleške sačuvane u aplikaciji.
  • U folderu instalirane aplikacije (/User/Applications/<APP ID>/) možete naći neke interesantne fajlove:
  • iTunesArtwork: Ikona koju aplikacija koristi
  • iTunesMetadata.plist: Informacije o aplikaciji korišćene u App Store-u
  • /Library/*: Sadrži preference i cache. U /Library/Cache/Snapshots/* možete pronaći snapshot napravljen aplikaciji pre slanja u pozadinu.

Hot Patching/Enforced Updateing

Programeri mogu daljinski patch-ovati sve instalacije svoje aplikacije instantno bez potrebe da ponovo šalju aplikaciju na App Store i čekaju odobrenje.
Za ovu svrhu se obično koristi JSPatch. Ali postoje i druge opcije kao Siren i react-native-appstore-version-checker.
Ovo je opasan mehanizam koji bi mogao biti zloupotrebljen od strane zlonamernih third party SDKs, stoga se preporučuje proveriti koji metod se koristi za automatsko ažuriranje (ako uopšte postoji) i testirati ga. Možete pokušati da preuzmete prethodnu verziju aplikacije u tu svrhu.

Third Parties

Značajan izazov sa 3rd party SDKs je nedostatak granularne kontrole nad njihovim funkcionalnostima. Programeri se suočavaju sa izborom: ili integrišu SDK i prihvate sve njegove funkcije, uključujući potencijalne bezbednosne propuste i probleme privatnosti, ili odustanu od njegovih prednosti. Često programeri nisu u mogućnosti sami da zakrpe ranjivosti unutar ovih SDK-ova. Štaviše, kako SDK-ovi stiču poverenje u zajednici, neki mogu početi da sadrže malver.

Usluge koje pružaju third-party SDKs mogu uključivati praćenje ponašanja korisnika, prikazivanje oglasa ili poboljšanja korisničkog iskustva. Međutim, to uvodi rizik jer programeri možda nisu u potpunosti svesni koda koji se izvršava u ovim bibliotekama, što može dovesti do potencijalnih rizika po privatnost i bezbednost. Ključno je ograničiti informacije koje se dele sa third-party servisima na neophodne i osigurati da nijedan osetljiv podatak ne bude otkriven.

Implementacija third-party servisa obično dolazi u dva oblika: samostalna biblioteka ili kompletan SDK. Da bi se zaštitila privatnost korisnika, svi podaci deljeni sa ovim servisima treba da budu anonimizovani kako bi se sprečilo otkrivanje Personal Identifiable Information (PII).

Da biste identifikovali biblioteke koje aplikacija koristi, može se koristiti komanda otool. Ovaj alat treba pokrenuti protiv aplikacije i svake shared biblioteke koju koristi kako biste otkrili dodatne biblioteke.

otool -L <application_path>

Zanimljive ranjivosti i studije slučaja

Air Keyboard Remote Input Injection

Itunesstored Bookassetd Sandbox Escape

Zero Click Messaging Image Parser Chains

Reference i dodatni resursi

Tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Učite i vežbajte Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks