iOS Pentesting
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
iOS Basiese
Toetsomgewing
Op hierdie bladsy kan jy inligting vind oor die iOS simulator, emulators en jailbreaking:
Aanvanklike Analise
Basiese iOS toetsingsoperasies
Tydens die toetsing sal verskeie bewerkings voorgestel word (verbinding maak met die toestel, lĂȘers lees/skryf/oplaai/aflaai, ân paar gereedskap gebruikâŠ). Daarom, as jy nie weet hoe om enige van hierdie aksies uit te voer nie, begin asseblief deur die bladsy te lees:
Tip
Vir die volgende stappe moet die app geĂŻnstalleer wees op die toestel en moet jy reeds die IPA file van die toepassing verkry het.
Read the Basic iOS Testing Operations page to learn how to do this.
Basiese Statiese Ontleding
Sommige interessante iOS - IPA files decompilers:
Dit word aanbeveel om die instrument MobSF te gebruik om ân outomatiese statiese ontleding op die IPA-lĂȘer uit te voer.
Identifikasie van beskerming wat in die binĂȘr teenwoordig is:
- PIE (Position Independent Executable): Wanneer dit aangeskakel is, laai die toepassing in op ân ewekansige geheue-adres elke keer as dit begin, wat dit moeiliker maak om sy aanvanklike geheue-adres te voorspel.
otool -hv <app-binary> | grep PIE # It should include the PIE flag
- Stack Canaries: Om die integriteit van die stack te valideer, word ân âcanaryâ waarde op die stack geplaas voordat ân funksie aangeroep word en word dit weer nagegaan sodra die funksie eindig.
otool -I -v <app-binary> | grep stack_chk # It should include the symbols: stack_chk_guard and stack_chk_fail
- ARC (Automatic Reference Counting): Om algemene geheue-korrupsie tekortkominge te voorkom
otool -I -v <app-binary> | grep objc_release # It should include the _objc_release symbol
- Encrypted Binary: Die binĂȘr behoort versleuteld te wees
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # The cryptid should be 1
Identifikasie van sensitiewe/onveilige funksies
- Swak Hashing-algoritmes
# 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"
- Onveilige Random Funksies
# 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"
- Onveilige âMallocâ Funksie
# On the iOS device
otool -Iv <app> | grep -w "_malloc"
# On linux
grep -iER "_malloc"
- Onveilige en Kwesbare Funksies
# 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"
Algemene jailbreak-opsporingsmetodes
- LĂȘerstelselkontroles: Kyk vir die teenwoordigheid van algemene jailbreak-lĂȘers en -gidse, soos
/Applications/Cydia.appof/Library/MobileSubstrate/MobileSubstrate.dylib. - Sandbox-oortredings: Probeer toegang kry tot beperkte areas van die lĂȘerstelsel, wat op nie-jailbroken toestelle geblokkeer behoort te wees.
- API-kontroles: Kyk of dit moontlik is om verbode oproepe soos
fork()te gebruik om ân kindproses te skep ofsystem()om te sien of /bin/sh bestaan. - Proseskontroles: Monitor vir die teenwoordigheid van bekende jailbreak-verwante prosesse, soos
Cydia,Substrate, ofssh. - Kernel-uitbuitings: Kyk vir die teenwoordigheid van kern-uitbuitings wat algemeen in jailbreaks gebruik word.
- Omgewingveranderlikes: Inspekteer omgewingsveranderlikes vir tekens van ân jailbreak, soos
DYLD_INSERT_LIBRARIES. - Biblioteekkontrole: Kyk na die libs wat in die app-proses gelaai is.
- Kontroleer skemas: Soos
canOpenURL(URL(string: "cydia://")).
Algemene anti-debugging-opsporingsmetodes
- Kontroleer vir Debugger-teenwoordigheid: Gebruik
sysctlof ander metodes om te kyk of ân debugger aangeheg is. - Anti-Debugging APIs: Soek na oproepe na anti-debugging APIs soos
ptraceofSIGSTOP, byvoorbeeldptrace(PT_DENY_ATTACH, 0, 0, 0). - Timing-kontroles: Meet die tyd wat sekere operasies neem en kyk vir afwykings wat debugging kan aandui.
- Geheuekontroles: Inspekteer geheue vir bekende debugger-artefakte of wysigings.
- Omgewingveranderlikes: Kyk vir omgewingveranderlikes wat ân debugging-sessie kan aandui.
- Mach Ports: Ontdek of mach exception ports deur debuggers gebruik word.
Basiese Dinamiese Ontleding
Kyk na die dinamiese ontleding wat MobSF uitvoer. Jy sal deur die verskillende skerms moet navigeer en daarmee interaksie hĂȘ â dit sal verskeie classes hook terwyl dit ander dinge doen en ân verslag voorberei sodra jy klaar is.
Lys geĂŻnstalleerde apps
Gebruik die opdrag frida-ps -Uai om die bundle identifier van die geĂŻnstalleerde apps te bepaal:
$ 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
Leer hoe om die components van die application te enumerate en hoe om maklik methods en classes te hook met objection:
IPA Structure
Die struktuur van ân IPA file is in wese diĂ© van ân zipped package. Deur die extensie na .zip te hernoem, kan dit gedekomprimeer word om sy inhoud te openbaar. Binne hierdie struktuur verteenwoordig ân Bundle ân volledig gepakketteerde toepassing gereed vir installasie. Binne sal jy ân gids genaamd <NAME>.app vind, wat die toepassing se hulpbronne inkapsuleer.
Info.plist: Hierdie lĂȘer bevat spesifieke konfigurasie-besonderhede van die toepassing._CodeSignature/: Hierdie gids sluit ân plist-lĂȘer in wat ân signature bevat, en sodoende die integriteit van alle lĂȘers in die bundle verseker.Assets.car: ân Gecomprimeerde argief wat asset-lĂȘers soos ikone stoor.Frameworks/: Hierdie vouer huisves die toepassing se native libraries, wat in die vorm van.dylibof.frameworklĂȘers kan wees.PlugIns/: Dit kan uitbreidings van die toepassing insluit, bekend as.appex-lĂȘers, alhoewel dit nie altyd teenwoordig is nie. *Core Data: Dit word gebruik om jou toepassing se permanente data vir offline gebruik te stoor, om tydelike data te cache, en om undo-funksionaliteit by jou app op ân enkele toestel te voeg. Om data oor verskeie toestelle in ân enkele iCloud-rekening te sinkroniseer, spieĂ«l Core Data outomaties jou skema na ân CloudKit container.PkgInfo: DiePkgInfolĂȘer is ân alternatiewe manier om die tipe en skepper-kodes van jou toepassing of bundle te spesifiseer.- en.lproj, fr.proj, Base.lproj: Is die taalpakkette wat hulpbronne vir daardie spesifieke tale bevat, en ân standaardhulpbron vir die geval dat ân taal nie ondersteun word nie.
- Security: Die
_CodeSignature/gids speel ân kritieke rol in die app se sekuriteit deur die integriteit van alle ingesluit lĂȘers deur digitale signatures te verifieer. - Asset Management: Die
Assets.carlĂȘer gebruik kompressie om grafiese assets doeltreffend te bestuur, wat noodsaaklik is vir die optimalisering van toepassingsprestasie en die vermindering van die algehele grootte. - Frameworks and PlugIns: Hierdie gidse beklemtoon die modulariteit van iOS-toepassings, wat ontwikkelaars toelaat om herbruikbare code libraries (
Frameworks/) in te sluit en app-funksionaliteit uit te brei (PlugIns/). - Localization: Die struktuur ondersteun meertaligheid, wat globale bereik van die toepassing vergemaklik deur hulpbronne vir spesifieke taalpakkette in te sluit.
Info.plist
Die Info.plist dien as ân hoeksteen vir iOS-toepassings en enkapsuleer sleutel-konfigurasiedata in die vorm van key-value pare. Hierdie lĂȘer is verpligtend nie net vir toepassings nie, maar ook vir app extensions en frameworks wat binne gebundel is. Dit is gestruktureer in Ăłf XML Ăłf ân binĂȘre formaat en bevat kritiese inligting wat wissel van app permits tot sekuriteitskonfigurasies. Vir ân gedetaileerde ondersoek van beskikbare sleutels, kan mens verwys na die Apple Developer Documentation.
Vir diĂ© wat met hierdie lĂȘer in ân meer toeganklike formaat wil werk, kan die XML-omsetting moeiteloos bereik word deur gebruik te maak van plutil op macOS (natief beskikbaar op weergawes 10.2 en later) of plistutil op Linux. Die opdragte vir omskakeling is soos volg:
- For macOS:
$ plutil -convert xml1 Info.plist
- Vir Linux:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Onder die magdom inligting wat die Info.plist-lĂȘer kan openbaar, is noemenswaardige inskrywings onder meer app-toestemmingsstrings (UsageDescription), pasgemaakte URL-skemas (CFBundleURLTypes) en konfigurasies vir App Transport Security (NSAppTransportSecurity). Hierdie inskrywings, saam met ander soos uitgevoerde/ingevoerde pasgemaakte dokumenttipes (UTExportedTypeDeclarations / UTImportedTypeDeclarations), kan moeiteloos gevind word deur die lĂȘer te inspekteer of ân eenvoudige grep-opdrag te gebruik:
$ grep -i <keyword> Info.plist
Datapaaie
In die iOS-omgewing is gidses spesifiek aangewys vir stelseltoepassings en deur gebruikers geĂŻnstalleerde toepassings. Stelseltoepassings woon in die /Applications gids, terwyl deur gebruikers geĂŻnstalleerde apps geplaas word onder /var/mobile/containers/Data/Application/. Hierdie toepassings word ân unieke identifiseerder toegeken wat bekend staan as ân 128-bit UUID, wat die taak om handmatig ân app se gids te vind uitdagend maak as gevolg van die ewekansigheid van die gidsname.
Warning
Aangesien toepassings in iOS gesandbox moet wees, sal elke app ook ân gids hĂȘ binne
$HOME/Library/Containersmet die app seCFBundleIdentifieras die gidsnaam.Echter, beide gidse (data- & container-gidse) het die lĂȘer
.com.apple.mobile_container_manager.metadata.plistwat beide lĂȘers koppel in die sleutelMCMetadataIdentifier).
Om die ontdekking van ân deur gebruiker geĂŻnstalleerde app se installasiegids te vergemaklik, bied die objection tool ân nuttige opdrag, env. Hierdie opdrag openbaar gedetailleerde gidsinligting vir die betrokke app. Hieronder is ân voorbeeld van hoe om hierdie opdrag te gebruik:
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
Alternatiewelik kan die app-naam binne /private/var/containers met die find-opdrag gesoek word:
find /private/var/containers -name "Progname*"
Bevels soos ps en lsof kan ook gebruik word om onderskeidelik die app se proses te identifiseer en oop lĂȘers te lys, wat insigte in die app se aktiewe gidspaaie verskaf:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
Bundel-gids:
- AppName.app
- Dit is die Application Bundle soos voorheen in die IPA gesien; dit bevat noodsaaklike toepassingsdata, statiese inhoud sowel as die toepassing se saamgestelde binĂȘr.
- Hierdie gids is sigbaar vir gebruikers, maar gebruikers kan nie daarin skryf nie.
- Inhoud in hierdie gids word nie gerugsteun nie.
- Die inhoud van hierdie vouer word gebruik om die kode-handtekening te verifieer.
Datagids:
- Documents/
- Bevat alle deur gebruikers gegenereerde data. Die eindgebruiker van die toepassing inisieer die skep van hierdie data.
- Sigbaar vir gebruikers en gebruikers kan daarin skryf.
- Inhoud in hierdie gids word gerugsteun.
- Die app kan paaie deaktiveer deur
NSURLIsExcludedFromBackupKeyte stel. - Library/
- Bevat alle lĂȘers wat nie gebruiker-spesifiek is nie, soos caches, preferences, cookies, en property list (plist) konfigurasielĂȘers.
- iOS-apps gebruik gewoonlik die
Application SupportenCachessubgidse, maar die app kan aangepaste subgidse skep. - Library/Caches/
- Bevat semi-permanente gekasde lĂȘers.
- Onsigbaar vir gebruikers en gebruikers kan daarin nie skryf nie.
- Inhoud in hierdie gids word nie gerugsteun nie.
- Die OS mag die lĂȘers in hierdie gids outomaties verwyder wanneer die app nie loop nie en stoorruimte min raak.
- Library/Application Support/
- Bevat permanente lĂȘers wat nodig is vir die werking van die app.
- Onsigbaar vir gebruikers en gebruikers kan nie daarin skryf nie.
- Inhoud in hierdie gids word gerugsteun.
- Die app kan paaie deaktiveer deur
NSURLIsExcludedFromBackupKeyte stel. - Library/Preferences/
- Word gebruik om eienskappe te stoor wat selfs nĂĄ ân herbegin van die toepassing kan voortbestaan.
- Inligting word onversleuteld binne die toepassingssandbox gestoor in ân plist-lĂȘer met die naam [BUNDLE_ID].plist.
- Al die sleutel/waarde-paartjies wat met
NSUserDefaultsgestoor is, kan in hierdie lĂȘer gevind word. - tmp/
- Gebruik hierdie gids om tydelike lĂȘers te skryf wat nie tussen opstartings van die app hoef te bly nie.
- Bevat nie-permanente gekasde lĂȘers.
- Onsigbaar vir gebruikers.
- Inhoud in hierdie gids word nie gerugsteun nie.
- Die OS mag die lĂȘers in hierdie gids outomaties verwyder wanneer die app nie loop nie en stoorruimte min raak.
Kom ons neem ân nader kyk na iGoat-Swift se Application Bundle (.app) gids binne die Bundel-gids (/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
Binne die <application-name>.app gids sal jy ân binĂȘre lĂȘer met die naam <application-name> vind. Dit is die lĂȘer wat uitgevoer sal word. Jy kan ân basiese inspeksie van die binĂȘre lĂȘer uitvoer met die hulpmiddel 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)
[...]
Kontroleer of die app geënkripteer is
Kyk of daar enige uitset is vir:
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
Om die Objective-C-segment van die voorbeeldtoepassing te druk, kan mens gebruik:
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
Om ân meer kompakte Objective-C-kode te verkry, kan jy class-dump gebruik:
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;
};
Die beste opsies om die binĂȘr te disasembleer is: Hopper en IDA.
Gegewensberging
Om te leer hoe iOS data op die toestel stoor, lees hierdie bladsy:
Warning
Die volgende plekke waar inligting gestoor kan word moet reg na die installering van die toepassing, na die kontrole van al die funksionaliteite van die toepassing en selfs na uitteken van een gebruiker en aanmelding as ân ander gebruiker nagegaan word.
Die doel is om onbeskermde sensitiewe inligting van die toepassing (wagwoorde, tokens), van die huidige gebruiker en van voorheen aangemelde gebruikers te vind.
Plist
plist-lĂȘers is gestruktureerde XML-lĂȘers wat sleutel-waarde-parings bevat. Dit is ân manier om permanente data te stoor, so soms kan jy sensitiewe inligting in hierdie lĂȘers vind. Dit word aanbeveel om hierdie lĂȘers na die installering van die app en na intensiewe gebruik te kontroleer om te sien of nuwe data geskryf is.
Die mees algemene manier om data in plist-lĂȘers te behou is deur die gebruik van NSUserDefaults. Hierdie plist-lĂȘer word binne die app-sandbox gestoor in Library/Preferences/<appBundleID>.plist
Die NSUserDefaults klas bied ân programmatiese koppelvlak om met die standaardstelsel te kommunikeer. Die standaardstelsel laat ân toepassing toe om sy gedrag aan te pas volgens gebruikersvoorkeure. Data wat deur NSUserDefaults gestoor word, kan in die toepassingsbundle besigtig word. Hierdie klas stoor data in ân plist lĂȘer, maar dit is bedoel om met klein hoeveelhede data gebruik te word.
Hierdie data kan nie langer direk via ân vertroude rekenaar toeganklik wees nie, maar kan bereik word deur ân backup uit te voer.
Jy kan die inligting wat met NSUserDefaults gestoor is dump met behulp van objection se ios nsuserdefaults get
Om al die plist-lĂȘers wat deur die toepassing gebruik word te vind, kan jy toegang kry tot /private/var/mobile/Containers/Data/Application/{APPID} en voer die volgende uit:
find ./ -name "*.plist"
Om lĂȘers van XML or binary (bplist) formaat na XML om te skakel, is daar verskeie metodes beskikbaar wat afhang van jou bedryfstelsel:
Vir macOS-gebruikers: Gebruik die plutil opdrag. Dit is ân ingeboude hulpmiddel in macOS (10.2+), ontwerp vir hierdie doel:
$ plutil -convert xml1 Info.plist
Vir Linux-gebruikers: Installeer libplist-utils eers, gebruik dan plistutil om jou lĂȘer te omskep:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Within an Objection Session: Vir die ontleding van mobiele toepassings stel ân spesifieke opdrag jou in staat om plist-lĂȘers direk te omskakel:
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
Core Data
Core Data is ân raamwerk vir die bestuur van die modellaag van voorwerpe in jou toepassing. Core Data can use SQLite as its persistent store, maar die raamwerk self is nie ân databasis nie.
CoreData enkripteer sy data nie standaard nie. Daar kan egter ân ekstra enkripsielaag by CoreData gevoeg word. Sien die GitHub Repo vir meer besonderhede.
Jy kan die SQLite Core Data-inligting van ân toepassing vind in die pad /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
As jy die SQLite kan oopmaak en toegang tot sensitiewe inligting kry, het jy ân miskonfigurasie gevind.
-(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 is ân key/value store gebou bo-op SQLite.
Aangesien die Yap databases sqlite databases is, kan jy dit vind met die beoogde command in die vorige afdeling.
Other SQLite Databases
Dit is algemeen dat toepassings hul eie sqlite database skep. Hulle mag stoor gevoelige data daarop en dit onversleuteld laat. Daarom is dit altyd interessant om elke databasis binne die toepassingsgids na te gaan. Gaan dus na die application directory waar die data gestoor word (/private/var/mobile/Containers/Data/Application/{APPID})
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Real-Time Databases
Ontwikkelaars kan via Firebase Real-Time Databases data stoor en sinkroniseer binne ân NoSQL cloud-gehoste databasis. In JSON-formaat gestoor, word die data in reĂ«le tyd na alle gekoppelde kliĂ«nte gesinkroniseer.
Jy kan hier sien hoe om verkeerd gekonfigureerde Firebase-databasisse te kontroleer:
Realm databasisse
Realm Objective-C en Realm Swift bied ân kragtige alternatief vir data-opberging wat nie deur Apple voorsien word nie. Per verstek stoor hulle data onversleuteld, enkripsie is egter beskikbaar deur spesifieke konfigurasie.
Die databasisse is geleĂ« by: /private/var/mobile/Containers/Data/Application/{APPID}. Om hierdie lĂȘers te verken, kan jy opdragte soos die volgende gebruik:
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*"
Om hierdie databasislĂȘers te bekyk, word die Realm Studio tool aanbeveel.
Om enkripsie binne ân Realm-databasis te implementeer, kan die volgende kodefragment gebruik word:
// 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 Databasisse
Couchbase Lite word beskryf as ân liggewig en ingebedde databasis-enjin wat die dokument-georiĂ«nteerde (NoSQL) benadering volg. Ontwerp om inheems te wees op iOS en macOS, bied dit die vermoĂ« om data naatloos te sinkroniseer.
Om potensiĂ«le Couchbase-databasisse op ân toestel te identifiseer, moet die volgende gids ondersoek word:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Cookies
iOS stoor die cookies van die apps in die Library/Cookies/cookies.binarycookies binne elke app se gids. Ontwikkelaars besluit egter soms om dit in die keychain te stoor, aangesien die genoemde cookie file in backups verkrygbaar is.
Om die cookies-lĂȘer te inspekteer kan jy hierdie python skrip gebruik of objection se ios cookies get.
Jy kan ook objection gebruik om hierdie lĂȘers na ân JSON-formaat te omskep en die data te inspekteer.
...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
By default NSURLSession stores data, such as HTTP requests and responses in the Cache.db database. Hierdie databasis kan sensitiewe data bevat, indien tokens, gebruikersname of enige ander sensitiewe inligting in die kas gestoor is. Om die gekashde inligting te vind, open die data-gids van die app (/var/mobile/Containers/Data/Application/<UUID>) en gaan na /Library/Caches/<Bundle Identifier>. Die WebKit cache is ook in die Cache.db gestoor lĂȘer. Objection kan die databasis oopmaak en daarmee interaksie hĂȘ met die opdrag sqlite connect Cache.db, aangesien dit ân normale SQLite database is.
Dit word aanbeveel om hierdie data se caching te deaktiveer, aangesien dit sensitiewe inligting in die versoek of respons kan bevat. Die volgende lys wys verskillende maniere om dit te bereik:
- Dit word aanbeveel om gekashde responsse na logout te verwyder. Dit kan gedoen word met die deur Apple verskafde metode genaamd
removeAllCachedResponses. Jy kan hierdie metode soos volg aanroep:
URLCache.shared.removeAllCachedResponses()
Hierdie metode sal alle gekashde versoeke en responsse uit die Cache.db lĂȘer verwyder.
- As jy nie die voordeel van cookies nodig het nie, is dit aanbeveel om bloot die .ephemeral configuration property van URLSession te gebruik, wat die stoor van cookies en caches sal deaktiveer.
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.
- Cache kan ook gedeaktiveer word deur die Cache Policy op .notAllowed te stel. Dit sal die stoor van Cache op enige wyse, hetsy in geheue of op skyf, deaktiveer.
Snapshots
Whenever you press the home button, iOS takes a snapshot of the current screen to be able to do the transition to the application on a much smoother way. However, if sensitive data is present in the current screen, it will be saved in the image (which persists across reboots). These are the snapshots that you can also access double tapping the home screen to switch between apps.
Tensy die iPhone jailbroken is, moet die attacker fisiese access tot die device hĂȘ om hierdie skermkiekies te kan sien. Standaard word die laaste snapshot in die toepassing se sandbox gestoor in Library/Caches/Snapshots/ of Library/SplashBoard/Snapshots gids (trusted computers kon nie vanaf iOX 7.0 toegang tot die filesystem kry nie).
Een manier om hierdie onwenslike gedrag te voorkom, is om ân leĂ« skerm te wys of die sensitiewe data te verwyder voordat die snapshot geneem word deur die ApplicationDidEnterBackground() funksie te gebruik.
Die volgende is ân voorbeeld van ân remediasie-metode wat ân standaard skermkiekie sal stel.
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];
}
Dit stel die agtergrondbeeld op overlayImage.png wanneer die toepassing na die agtergrond verskuif word. Dit voorkom sensitiewe data leaks omdat overlayImage.png altyd die huidige aansig sal oorskryf.
Keychain
Vir toegang tot en bestuur van die iOS keychain is instrumente soos Keychain-Dumper beskikbaar, geskik vir jailbroken toestelle. Benewens bied Objection die opdrag ios keychain dump vir soortgelyke doeleindes.
Storing Credentials
Die NSURLCredential-klas is ideaal om sensitiewe inligting direk in die keychain te stoor en die behoefte aan NSUserDefaults of ander wrappers te omseil. Om credentials na login te stoor, word die volgende Swift code gebruik:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Om hierdie gestoorde credentials te onttrek, word Objection se opdrag ios nsurlcredentialstorage dump gebruik.
Pasgemaakte Toetsenborde en Toetsenbordkas
Vanaf iOS 8.0 af kan gebruikers pasgemaakte toetsenbord-uitbreidings installeer, wat beheerd kan word onder Settings > General > Keyboard > Keyboards. Alhoewel hierdie toetsenborde uitgebreide funksionaliteit bied, hou hulle Ć risiko van keystroke logging en die oordrag van data na eksterne bedieners in, al word gebruikers in kennis gestel van toetsenborde wat netwerktoegang benodig. Apps kan, en behoort, die gebruik van pasgemaakte toetsenborde te beperk wanneer sensitiewe inligting ingevoer word.
Sekuriteitsaanbevelings:
- Dit word aanbeveel om derdeparty-toetsenborde uit te skakel vir verbeterde sekuriteit.
- Wees bewus van die autocorrect en auto-suggestions funksies van die standaard iOS keyboard, wat sensitiewe inligting in cache-lĂȘers kan stoor wat gevind word in
Library/Keyboard/{locale}-dynamic-text.datof/private/var/mobile/Library/Keyboard/dynamic-text.dat. Hierdie cache-lĂȘers moet gereeld nagegaan word vir sensitiewe data. Dit word aanbeveel om die keyboard dictionary te herstel via Settings > General > Reset > Reset Keyboard Dictionary om ge-kachete data skoon te maak. - Die onderskep van netwerkverkeer kan openbaar of Ć pasgemaakte toetsenbord keystrokes na Ć eksterne bediener uitstuur.
Voorkoming van teksveld-kas
Die UITextInputTraits protocol bied properties om autocorrection en secure text entry te bestuur, wat noodsaaklik is om die kas van sensitiewe inligting te voorkom. Byvoorbeeld, die deaktivering van autocorrection en die aktivering van secure text entry kan bereik word met:
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
Daarbenewens moet ontwikkelaars verseker dat teksvelde, veral dié wat gebruik word om sensitiewe inligting soos wagwoorde en PINs in te voer, caching deaktiveer deur autocorrectionType op UITextAutocorrectionTypeNo en secureTextEntry op YES te stel.
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Logs
Foutopsporing van code behels dikwels die gebruik van logging. Daar is ân risiko aangesien logs kan sensitiewe inligting bevat. Eerder, in iOS 6 en vroeĂ«re weergawes, was logs toeganklik vir alle apps, wat ân risiko van sensitive data leakage geskep het. Nou is applications beperk tot toegang slegs tot hul logs.
Ten spyte van hierdie beperkings kan ân attacker with physical access tot ân ontgrendelde toestel steeds hiervan voordeel trek deur die toestel aan ân rekenaar te koppel en reading the logs. Dit is belangrik om daarop te let dat logs op die skyf bly selfs na die app se verwydering.
Om risikoâs te beperk, word dit aanbeveel om deeglik met die app te interaksioneer, al sy funksies en insette te ondersoek om te verseker dat geen sensitiewe inligting per ongeluk in logs geregistreer word nie.
Wanneer die app se bronkode vir potensiële leaks nagegaan word, kyk vir beide vooraf gedefinieerde en aangepaste logging statements wat sleutelwoorde soos NSLog, NSAssert, NSCAssert, fprintf vir ingeboude funksies gebruik, en enige vermeldings van Logging of Logfile vir aangepaste implementasies.
Monitoring System Logs
Apps log verskeie stukkies inligting wat sensitief kan wees. Om hierdie logs te moniteer, gereedskap en opdragte soos:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
is nuttig. Daarbenewens bied Xcode ân manier om konsole-logboodskappe te versamel:
- Maak Xcode oop.
- Koppel die iOS-toestel.
- Gaan na Window -> Devices and Simulators.
- Kies jou toestel.
- Roep die probleem wat jy ondersoek op.
- Gebruik die Open Console-knoppie om logboodskappe in ân nuwe venster te besigtig.
Vir meer gevorderde logging kan aansluiting op die toestel se shell en die gebruik van socat regstreekse logmonitering bied:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Gevolg deur opdragte om logaktiwiteite waar te neem, wat van onskatbare waarde kan wees om probleme te diagnoseer of potensiële data leakage in logs te identifiseer.
Rugsteun
Outomatiese rugsteunfunksies is in iOS geïntegreer en maak dit moontlik om kopieë van toesteldata te skep via iTunes (tot macOS Catalina), Finder (vanaf macOS Catalina), of iCloud. Hierdie rugsteunkopieë sluit byna alle toesteldata in, behalwe uiters sensitiewe items soos Apple Pay-details en Touch ID-konfigurasies.
Sekuriteitsrisikoâs
Die insluiting van geĂŻnstalleerde apps en hul data in rugsteun verhoog die kwessie van potensiĂ«le data leakage en die risiko dat rugsteunwysigings app-funksionaliteit kan verander. Dit word aanbeveel om nie sensitiewe inligting in plaintext te stoor binne enige app se gids of subgidse nie om hierdie risikoâs te beperk.
Uitsluiting van lĂȘers uit rugsteun
LĂȘers in Documents/ en Library/Application Support/ word standaard gerugsteun. Ontwikkelaars kan spesifieke lĂȘers of gidse uitsluit van rugsteun deur NSURL setResourceValue:forKey:error: met die NSURLIsExcludedFromBackupKey te gebruik. Hierdie praktyk is noodsaaklik om sensitiewe data te beskerm teen inklusie in rugsteun.
Toetsing vir kwesbaarhede
Om ân app se rugsteunsekuriteit te evalueer, begin deur ân rugsteun te skep met Finder, en lokaliseer dit dan volgens die leiding van Appleâs official documentation. Ontleed die rugsteun vir sensitiewe data of konfigurasies wat verander kan word om die app se gedrag te beĂŻnvloed.
Sensitiewe inligting kan opgespoor word met behulp van opdragreĂ«lgereedskap of toepassings soos iMazing. Vir geĂŻnkripteerde rugsteun kan die teenwoordigheid van enkripsie bevestig word deur die âIsEncryptedâ sleutel in die âManifest.plistâ lĂȘer by die wortel van die rugsteun na te gaan.
<?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>
Om met geĂ«nkripteerde backups te werk, kan Python-skripte beskikbaar in DinoSecâs GitHub repo, soos backup_tool.py en backup_passwd.py, nuttig wees, alhoewel hulle moontlik aanpassings benodig om versoenbaar te wees met die nuutste iTunes/Finder-weergawes. Die iOSbackup tool is ân ander opsie om toegang tot lĂȘers binne wagwoord-beskermde backups te kry.
Verandering van App-gedrag
ân Voorbeeld van die verander van app-gedrag deur backup-wysigings word gedemonstreer in die Bither bitcoin wallet app, waar die UI lock PIN in net.bither.plist onder die pin_code sleutel gestoor word. Deur hierdie sleutel uit die plist te verwyder en die backup te herstel, verdwyn die PIN-vereiste en word onbeperkte toegang verleen.
Opsomming oor geheue-toetsing vir sensitiewe data
Wanneer jy met sensitiewe inligting wat in ân toepassing se geheue gestoor is werk, is dit van kritieke belang om die blootstellingstyd van hierdie data te beperk. Daar is twee hoofbenaderings om geheue-inhoud te ondersoek: skep van ân geheue-dump en analiseer die geheue in real time. Albei metodes het hul uitdagings, insluitend die potensiaal om kritieke data te mis gedurende die dump-proses of analise.
Herverkry en analiseer ân geheue-dump
Vir beide jailbroken en non-jailbroken toestelle, laat gereedskap soos objection en Fridump toe om ân app se prosesgeheue te dump. Nadat dit gedump is, vereis die analise van hierdie data verskeie gereedskap, afhangende van die aard van die inligting waarna jy soek.
Om strings uit ân geheue-dump te onttrek, kan opdragte soos strings of rabin2 -zz gebruik word:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
Vir meer gedetailleerde ontleding, insluitend die soek na spesifieke datatipes of patrone, bied radare2 uitgebreide soekvermoëns:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
Runtime Geheue-analise
r2frida bied ân kragtige alternatief om ân app se memory in real time te ondersoek, sonder om ân memory dump nodig te hĂȘ. Hierdie hulpmiddel maak dit moontlik om search commands direk op die running applicationâs memory uit te voer:
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
Gebroke Kriptografie
Swak Sleutelbestuursprosesse
Sommige ontwikkelaars stoor sensitiewe data in die lokale stoor en enkripteer dit met ân sleutel wat hardcoded/predictable in die kode is. Dit behoort nie te gebeur nie aangesien sommige reversing aanvallers kan toelaat om die vertroulike inligting uit te trek.
Gebruik van Onveilige en/of Verouderde Algoritmes
Ontwikkelaars behoort nie deprecated algorithms te gebruik om authorisation checks, store of send data uit te voer nie. Sommige van hierdie algoritmes is: RC4, MD4, MD5, SHA1⊠As hashes byvoorbeeld gebruik word om wagwoorde te stoor, behoort brute-force resistant hashes met salt gebruik te word.
Kontrole
Die hoofkontroles wat uitgevoer moet word is om te kyk of jy hardcoded wagwoorde/geheime in die kode kan vind, of dit predictable is, en of die kode ân soort weak cryptography algoritmes gebruik.
Dit is interessant om te weet dat jy sommige crypto libraries outomaties kan monitor met objection:
ios monitor crypt
Vir meer inligting oor iOS-kryptografiese APIs en biblioteke, besoek https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography
Plaaslike autentisering
Plaaslike autentisering speel ân kritieke rol, veral wanneer dit gaan oor die beskerming van toegang by ân afgeleĂ« eindpunt deur middel van kryptografiese metodes. Die kern hier is dat sonder behoorlike implementering plaaslike autentiseringsmeganismes omseil kan word.
Apple se Local Authentication framework en die keychain bied robuuste APIs wat ontwikkelaars onderskeidelik help om gebruiker-verifikasie-dialoë te vertoon en om geheime data veilig te hanteer. Die Secure Enclave beveilig vingerafdruk-ID vir Touch ID, terwyl Face ID op gesigsherkenning staatmaak sonder om biometriese data te kompromitteer.
Om Touch ID/Face ID te integreer, het ontwikkelaars twee API-keuses:
LocalAuthentication.frameworkvir hoëvlak gebruiker-verifikasie sonder toegang tot biometriese data.Security.frameworkvir laer-vlak keychain-diens toegang, wat geheime data met biometriese verifikasie beveilig. Verskeie open-source wrappers maak keychain-toegang eenvoudiger.
Caution
Beide
LocalAuthentication.frameworkenSecurity.frameworkbevat egter kwesbaarhede, aangesien hulle hoofsaaklik booleaanse waardes teruggee sonder om data vir verifikasieprosesse te stuur, wat dit vatbaar maak vir omseilings (verwys na Donât touch me that way, by David Lindner et al).
Implementering van plaaslike autentisering
Om gebruikers vir verifikasie te versoek, moet ontwikkelaars die evaluatePolicy-metode binne die LAContext-klas gebruik, met die keuse tussen:
deviceOwnerAuthentication: Vra vir Touch ID of die toestel se toegangskode; misluk as geen van beide geaktiveer is.deviceOwnerAuthenticationWithBiometrics: Vra uitsluitlik vir Touch ID.
ân Suksesvolle verifikasie word aangedui deur ân booleaanse terugwaarde van evaluatePolicy, wat ân potensiĂ«le sekuriteitsgebrek uitlig.
Plaaslike autentisering met die keychain
Die implementering van plaastlike autentisering in iOS-apps behels die gebruik van keychain APIs om geheime data soos authentiseringstokens veilig te stoor. Hierdie proses verseker dat die data slegs deur die gebruiker benader kan word, met hulle toestel se toegangskode of biometriese verifikasie soos Touch ID.
Die keychain bied die vermoë om items met die SecAccessControl-attribuut te stel, wat toegang tot die item beperk totdat die gebruiker suksesvol geverifieer het via Touch ID of die toestel se toegangskode. Hierdie funksie is noodsaaklik vir die verbetering van sekuriteit.
Hieronder is kodevoorbeelde in Swift en Objective-C wat demonstreer hoe om ân string na/en vanaf die keychain te stoor en te haal, terwyl hierdie sekuriteitskenmerke gebruik word. Die voorbeelde wys spesifiek hoe om toegangbeheer op te stel om Touch ID-verifikasie te vereis en te verseker dat die data slegs op die toestel waarop dit opgestel is toeganklik is, op voorwaarde dat ân toestel se toegangskode gekonfigureer is.
// 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
}
Nou kan ons die gestoorde item uit die keychain versoek. Keychain services sal die outentiseringsdialoog aan die gebruiker voorlĂȘ en data of nil teruggee, afhangend daarvan of ân geskikte vingerafdruk voorsien is of nie.
// 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
}
Opsporing
Die gebruik van frameworks in ân app kan ook opgespoor word deur die app-binary se lys gedeelde dinamiese biblioteke te analiseer. Dit kan gedoen word deur otool te gebruik:
$ otool -L <AppName>.app/<AppName>
As LocalAuthentication.framework in ân app gebruik word, sal die uitset albei van die volgende reĂ«ls bevat (onthou dat LocalAuthentication.framework Security.framework onder die kap gebruik):
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
As Security.framework gebruik word, sal slegs die tweede een gewys word.
Local Authentication Framework Bypass
Objection
Deur die Objection Biometrics Bypass, geleĂ« by this GitHub page, is daar ân tegniek beskikbaar om die LocalAuthentication-meganisme te oorwin. Die kern van hierdie benadering behels die gebruik van Frida om die evaluatePolicy-funksie te manipuleer, sodat dit konsekwent ân True uitslag lewer, ongeag die werklike sukses van die verifikasie. Dit is veral nuttig om gebrekkige biometric authentication processes te omseil.
Om hierdie bypass te aktiveer, word die volgende opdrag gebruik:
...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
Hierdie opdrag ontketen ân reeks waarin Objection ân taak registreer wat die uitslag van die evaluatePolicy-kontrole effektief verander na True.
Frida
ân voorbeeld van die gebruik van evaluatePolicy van 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"];
});
}
}
Om die bypass van Local Authentication te bereik, word ân Frida-skrip geskryf. Hierdie skrip mik op die evaluatePolicy-kontrole en onderskep sy callback om te verseker dat dit success=1 teruggee. Deur die gedrag van die callback te verander, word die authentication check effektief gebypass.
Die skrip hieronder word geĂŻnjekteer om die resultaat van die evaluatePolicy-metode te wysig. Dit verander die callback se resultaat sodat dit altyd sukses aandui.
// 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!");
}
Om die Frida script te inject en die biometric authentication te bypass, word die volgende opdrag gebruik:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
Sensitive Functionality Exposure Through IPC
Custom URI Handlers / Deeplinks / Custom Schemes
iOS Custom URI Handlers / Deeplinks / Custom Schemes
Universal Links
UIActivity Sharing
UIPasteboard
App Extensions
WebViews
Serialisation and Encoding
iOS Serialisation and Encoding
Netwerkkommunikasie
Dit is belangrik om te kontroleer dat geen kommunikasie plaasvind without encryption en ook dat die toepassing korrek die validating the TLS certificate van die bediener doen.
Om hierdie soort probleme te toets kan jy ân proxy soos Burp gebruik:
Hostname check
Een algemene probleem by die valideer van die TLS-sertifikaat is om te kontroleer dat die sertifikaat deur ân trusted CA onderteken is, maar not check of the hostname van die sertifikaat dieselfde is as die hostname wat geraak word.
Om hierdie probleem met Burp te toets, nadat jy Burp CA op die iPhone vertrou het, kan jy create a new certificate with Burp for a different hostname en dit gebruik. As die toepassing steeds werk, is dit kwesbaar.
Certificate Pinning
Indien ân toepassing korrek SSL Pinning gebruik, sal die toepassing slegs werk as die sertifikaat die verwagte een is. By die toets van ân toepassing this might be a problem as Burp will serve itâs own certificate.
Om hierdie beskerming op ân jailbroken toestel te omseil, kan jy die toepassings SSL Kill Switch of Burp Mobile Assistant installeer.
Jy kan ook objectionâs ios sslpinning disable gebruik
Diverses
- In
/System/Librarykan jy die frameworks vind wat op die foon geïnstalleer is en deur stelseltoepassings gebruik word - Toepassings wat deur die gebruiker uit die App Store geïnstalleer is, is geleë in
/User/Applications - En
/User/Librarybevat data gestoor deur toepassings op gebruikersvlak - Jy kan toegang kry tot
/User/Library/Notes/notes.sqliteom die notas wat binne die toepassing gestoor is te lees. - Binne die gids van ân geĂŻnstalleerde toepassing (
/User/Applications/<APP ID>/) kan jy enkele interessante lĂȘers vind: iTunesArtwork: Die ikoon wat deur die app gebruik wordiTunesMetadata.plist: Inligting oor die app wat in die App Store gebruik word/Library/*: Bevat die voorkeure en kas. In/Library/Cache/Snapshots/*kan jy die snapshot vind wat van die toepassing geneem is voordat dit na die agtergrond gestuur is.
Hot Patching/Verpligte Opdatering
Ontwikkelaars kan op afstand alle installasies van hul app onmiddellik patch all installations of their app instantly sonder om die toepassing weer by die App Store in te dien en te wag tot dit goedgekeur is.
Hiervoor word gewoonlik JSPatch gebruik. Maar daar is ook ander opsies soos Siren en react-native-appstore-version-checker.
Dit is ân gevaarlike meganisme wat deur kwaadwillige derdeparty SDKs misbruik kan word; daarom word aanbeveel om te kontroleer watter metode vir automatic updating (indien enige) gebruik word en dit te toets. Jy kan probeer om ân vorige weergawe van die app af te laai vir hierdie doel.
Third Parties
ân Beduidende uitdaging met 3rd party SDKs is die lack of granular control oor hul funksionaliteite. Ontwikkelaars staan voor ân keuse: Ăłf die SDK integreer en al sy funksies aanvaar, insluitend potensiĂ«le sekuriteitskwesbaarhede en privaatheidskwessies, Ăłf heeltemal afstand doen van sy voordele. Dikwels kan ontwikkelaars nie self kwesbaarhede binne hierdie SDKs patch nie. Verder, namate SDKs vertroue in die gemeenskap kry, kan sommige begin om malware te bevat.
Die dienste wat deur derdeparty SDKs verskaf word, kan gebruikersgedragopsporing, advertensie-weergawes, of verbeterings aan die gebruikerservaring insluit. Dit bring egter ân risiko mee aangesien ontwikkelaars moontlik nie ten volle bewus is van die kode wat deur hierdie biblioteke uitgevoer word nie, wat tot potensiĂ«le privaatheids- en sekuriteitsrisikoâs kan lei. Dit is belangrik om die inligting wat met derdeparty-dienste gedeel word tot slegs wat nodig is te beperk en te verseker dat geen sensitiewe data blootgestel word nie.
Implementering van derdeparty-dienste kom gewoonlik in twee vorms: ân onafhanklike biblioteek of ân volledige SDK. Om gebruikersprivaatheid te beskerm, behoort enige data wat met hierdie dienste gedeel word anonymized te word om die bekendmaking van Personal Identifiable Information (PII) te voorkom.
Om die biblioteke wat ân toepassing gebruik te identifiseer, kan die otool opdrag gebruik word. Hierdie hulpmiddel moet teen die toepassing en elke gedeelde biblioteek wat dit gebruik, uitgevoer word om bykomende biblioteke te ontdek.
otool -L <application_path>
Interessante Kwesbaarhede & Gevallestudies
Air Keyboard Remote Input Injection
Itunesstored Bookassetd Sandbox Escape
Verwysings & Meer Hulpbronne
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering
- iOS & Mobile App Pentesting - INE
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0057/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0058/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0059/
- https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage
- https://coderwall.com/p/kjb3lw/storing-password-in-keychain-the-smart-way
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0055/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0053
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0060/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0058
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0060
- https://mas.owasp.org/MASTG/Android/0x05f-Testing-Local-Authentication/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064
- https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054
- https://github.com/ivRodriguezCA/RE-iOS-Apps/ IOS gratis kursus(https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/)
- https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577
- https://www.slideshare.net/RyanISI/ios-appsecurityminicourse
- https://github.com/prateek147/DVIA
- https://github.com/prateek147/DVIA-v2
- https://github.com/OWASP/MSTG-Hacking-Playground%20
- OWASP iGoat https://github.com/OWASP/igoat <<< Objective-C weergawe https://github.com/OWASP/iGoat-Swift <<< Swift weergawe
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/nabla-c0d3/ssl-kill-switch2
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

