iOS Pentesting
Reading time: 41 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
iOS Basics
{{#ref}} ios-basics.md {{#endref}}
Testing Environment
Katika ukurasa huu unaweza kupata taarifa kuhusu iOS simulator, emulators na jailbreaking:
{{#ref}} ios-testing-environment.md {{#endref}}
Initial Analysis
Basic iOS Testing Operations
Wakati wa kupima operesheni kadhaa zitapendekezwa (unganisho na kifaa, kusoma/kandika/kuhamasisha/kuhamasisha faili, kutumia zana kadhaa...). Hivyo, ikiwa hujui jinsi ya kufanya mojawapo ya vitendo hivi tafadhali, anza kusoma ukurasa:
{{#ref}} basic-ios-testing-operations.md {{#endref}}
note
Kwa hatua zinazofuata programu inapaswa kuwa imewekwa kwenye kifaa na inapaswa kuwa tayari imepata IPA file ya programu.
Soma ukurasa wa Basic iOS Testing Operations kujifunza jinsi ya kufanya hivyo.
Basic Static Analysis
Baadhi ya decompilers za kuvutia za iOS - IPA files:
- https://github.com/LaurieWired/Malimite
- https://ghidra-sre.org/
Inapendekezwa kutumia zana MobSF kufanya Uchambuzi wa Kawaida wa moja kwa moja kwa faili la IPA.
Utambuzi wa ulinzi ulio katika binary:
- PIE (Position Independent Executable): Wakati umewezeshwa, programu inachukuliwa kwenye anwani ya kumbukumbu ya nasibu kila wakati inapoanzishwa, na kufanya kuwa ngumu kutabiri anwani yake ya awali ya kumbukumbu.
otool -hv <app-binary> | grep PIE # Inapaswa kujumuisha bendera ya PIE
- Stack Canaries: Ili kuthibitisha uadilifu wa stack, thamani ya 'canary' inawekwa kwenye stack kabla ya kuita kazi na inathibitishwa tena mara kazi inapoisha.
otool -I -v <app-binary> | grep stack_chk # Inapaswa kujumuisha alama: stack_chk_guard na stack_chk_fail
- ARC (Automatic Reference Counting): Ili kuzuia kasoro za kawaida za uharibifu wa kumbukumbu
otool -I -v <app-binary> | grep objc_release # Inapaswa kujumuisha alama ya _objc_release
- Encrypted Binary: Binary inapaswa kuwa imefichwa
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Cryptid inapaswa kuwa 1
Utambuzi wa Kazi Nyeti/Zisizo Salama
- Weak Hashing Algorithms
# Kwenye kifaa cha iOS
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"
# Kwenye linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
- Insecure Random Functions
# Kwenye kifaa cha iOS
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"
# Kwenye linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
- Insecure ‘Malloc’ Function
# Kwenye kifaa cha iOS
otool -Iv <app> | grep -w "_malloc"
# Kwenye linux
grep -iER "_malloc"
- Insecure and Vulnerable Functions
# Kwenye kifaa cha iOS
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"
# Kwenye 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"
Basic Dynamic Analysis
Angalia uchambuzi wa dynamic ambao MobSF unafanya. Utahitaji kuzunguka kupitia maoni tofauti na kuingiliana nayo lakini itakuwa ikihook baadhi ya madarasa wakati wa kufanya mambo mengine na itatayarisha ripoti mara utakapokamilisha.
Listing Installed Apps
Tumia amri frida-ps -Uai
kubaini bundle identifier ya programu zilizowekwa:
$ 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
Msingi wa Uhesabu & Kuunganisha
Jifunze jinsi ya kuhesabu vipengele vya programu na jinsi ya kwa urahisi kuunganisha mbinu na madarasa kwa kutumia objection:
{{#ref}} ios-hooking-with-objection.md {{#endref}}
Muundo wa IPA
Muundo wa faili ya IPA kimsingi ni sawa na kifurushi kilichozungushwa. Kwa kubadilisha kiambatisho chake kuwa .zip
, inaweza kufunguliwa ili kuonyesha yaliyomo. Ndani ya muundo huu, Bundle inawakilisha programu iliyopakiwa kikamilifu tayari kwa usakinishaji. Ndani, utapata directory inayoitwa <NAME>.app
, ambayo inajumuisha rasilimali za programu.
Info.plist
: Faili hii ina maelezo maalum ya usanidi wa programu._CodeSignature/
: Hii ni directory inayojumuisha faili ya plist ambayo ina saini, kuhakikisha uadilifu wa faili zote ndani ya bundle.Assets.car
: Hifadhi iliyoshinikizwa inayohifadhi faili za mali kama ikoni.Frameworks/
: Folda hii ina maktaba asilia za programu, ambazo zinaweza kuwa katika mfumo wa faili za.dylib
au.framework
.PlugIns/
: Hii inaweza kujumuisha nyongeza kwa programu, inayojulikana kama faili za.appex
, ingawa hazipo kila wakati. *Core Data
: Inatumika kuhifadhi data ya kudumu ya programu yako kwa matumizi ya mtandaoni, kuhifadhi data ya muda, na kuongeza uwezo wa kufuta kwenye programu yako kwenye kifaa kimoja. Ili kusawazisha data kati ya vifaa vingi katika akaunti moja ya iCloud, Core Data inakidhi moja kwa moja muundo wako kwenye kontena la CloudKit.PkgInfo
: Faili yaPkgInfo
ni njia mbadala ya kubainisha aina na nambari za muundaji wa programu yako au bundle.- en.lproj, fr.proj, Base.lproj: Ni pakiti za lugha ambazo zina rasilimali za lugha hizo maalum, na rasilimali ya chaguo-msingi endapo lugha haipatikani.
- Usalama: Directory ya
_CodeSignature/
ina jukumu muhimu katika usalama wa programu kwa kuthibitisha uadilifu wa faili zote zilizopakiwa kupitia saini za kidijitali. - Usimamizi wa Mali: Faili ya
Assets.car
inatumia shinikizo kusimamia kwa ufanisi mali za picha, muhimu kwa kuboresha utendaji wa programu na kupunguza ukubwa wake kwa ujumla. - Frameworks na PlugIns: Hizi directory zinaonyesha uundaji wa programu za iOS, zikiwaruhusu waendelezaji kujumuisha maktaba za msimbo zinazoweza kutumika tena (
Frameworks/
) na kuongeza uwezo wa programu (PlugIns/
). - Utafsiri: Muundo huu unasaidia lugha nyingi, ukirahisisha kufikia programu duniani kwa kujumuisha rasilimali za pakiti za lugha maalum.
Info.plist
Info.plist inatumika kama msingi wa programu za iOS, ikijumuisha data muhimu za usanidi katika mfumo wa funguo-thamani. Faili hii ni lazima si tu kwa programu bali pia kwa nyongeza za programu na maktaba zilizopakiwa ndani. Imeundwa kwa muundo wa XML au wa binary na ina taarifa muhimu kuanzia ruhusa za programu hadi usanidi wa usalama. Kwa uchambuzi wa kina wa funguo zinazopatikana, mtu anaweza kurejelea Apple Developer Documentation.
Kwa wale wanaotaka kufanya kazi na faili hii kwa muundo rahisi, ubadilishaji wa XML unaweza kufanywa kwa urahisi kwa kutumia plutil
kwenye macOS (inapatikana kiasili kwenye toleo 10.2 na baadaye) au plistutil
kwenye Linux. Amri za ubadilishaji ni kama ifuatavyo:
- Kwa macOS:
$ plutil -convert xml1 Info.plist
- Kwa Linux:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Kati ya maelezo mengi ambayo faili ya Info.plist inaweza kufichua, entries muhimu ni pamoja na nyuzi za ruhusa za programu (UsageDescription
), mipango ya URL ya kawaida (CFBundleURLTypes
), na mipangilio ya Usalama wa Usafiri wa Programu (NSAppTransportSecurity
). Entries hizi, pamoja na nyingine kama aina za hati za kawaida zilizotolewa/zilizopokelewa (UTExportedTypeDeclarations
/ UTImportedTypeDeclarations
), zinaweza kupatikana kwa urahisi kwa kukagua faili au kutumia amri rahisi ya grep
:
$ grep -i <keyword> Info.plist
Data Paths
Katika mazingira ya iOS, directories zimewekwa maalum kwa ajili ya system applications na user-installed applications. System applications zinapatikana katika directory ya /Applications
, wakati apps zilizowekwa na mtumiaji ziko chini ya /var/mobile/containers/Data/Application/
. Programu hizi zinapewa kitambulisho cha kipekee kinachojulikana kama 128-bit UUID, na kufanya kazi ya kutafuta folda ya programu kwa mikono kuwa ngumu kutokana na uhodari wa majina ya directories.
warning
Kwa kuwa programu katika iOS lazima ziwe sandboxed, kila app pia itakuwa na folda ndani ya $HOME/Library/Containers
yenye CFBundleIdentifier
ya app kama jina la folda.
Hata hivyo, folda zote mbili (data & container folders) zina faili .com.apple.mobile_container_manager.metadata.plist
inayounganisha faili hizo mbili katika ufunguo MCMetadataIdentifier
).
Ili kuwezesha kugundua directory ya usakinishaji ya app iliyowekwa na mtumiaji, objection tool inatoa amri muhimu, env
. Amri hii inaonyesha taarifa za kina za directory kwa app husika. Hapa chini kuna mfano wa jinsi ya kutumia amri hii:
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
Kwa upande mwingine, jina la programu linaweza kutafutwa ndani ya /private/var/containers
kwa kutumia amri ya find
:
find /private/var/containers -name "Progname*"
Amri kama ps
na lsof
zinaweza pia kutumika kubaini mchakato wa programu na orodha ya faili zilizo wazi, mtawalia, zikitoa maarifa kuhusu njia za saraka za programu zinazofanya kazi:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
Bundle directory:
- AppName.app
- Hii ni Application Bundle kama ilivyoonekana hapo awali katika IPA, ina data muhimu za programu, maudhui ya kudumu pamoja na binary iliyokusanywa ya programu.
- Hii directory inaonekana kwa watumiaji, lakini watumiaji hawawezi kuandika ndani yake.
- Maudhui katika hii directory hayahifadhiwi.
- Maudhui ya folda hii yanatumika kuhakiki saini ya msimbo.
Data directory:
- Documents/
- Inashikilia data yote inayozalishwa na mtumiaji. Mtumiaji wa mwisho wa programu anaanzisha uundaji wa data hii.
- Inaonekana kwa watumiaji na watumiaji wanaweza kuandika ndani yake.
- Maudhui katika hii directory yanahifadhiwa.
- Programu inaweza kuzima njia kwa kuweka
NSURLIsExcludedFromBackupKey
. - Library/
- Inashikilia faili ambazo si maalum kwa mtumiaji, kama caches, preferences, cookies, na faili za usanidi wa orodha ya mali (plist).
- Programu za iOS kwa kawaida hutumia
Application Support
naCaches
subdirectories, lakini programu inaweza kuunda subdirectories za kawaida. - Library/Caches/
- Inashikilia faili za cache zisizo na kudumu.
- Haionekani kwa watumiaji na watumiaji hawawezi kuandika ndani yake.
- Maudhui katika hii directory hayahifadhiwi.
- OS inaweza kufuta faili za directory hii kiotomatiki wakati programu haiko inafanya kazi na nafasi ya kuhifadhi inakosekana.
- Library/Application Support/
- Inashikilia faili za kudumu zinazohitajika kwa ajili ya kuendesha programu.
- Haionekani kwa watumiaji na watumiaji hawawezi kuandika ndani yake.
- Maudhui katika hii directory yanahifadhiwa.
- Programu inaweza kuzima njia kwa kuweka
NSURLIsExcludedFromBackupKey
. - Library/Preferences/
- Inatumika kuhifadhi mali ambazo zinaweza kudumu hata baada ya programu kuanzishwa tena.
- Taarifa huhifadhiwa, bila usimbaji, ndani ya sandbox ya programu katika faili ya plist inayoitwa [BUNDLE_ID].plist.
- Mifano yote ya funguo/thamani iliyohifadhiwa kwa kutumia
NSUserDefaults
inaweza kupatikana katika faili hii. - tmp/
- Tumia hii directory kuandika faili za muda ambazo hazihitaji kudumu kati ya uzinduzi wa programu.
- Inashikilia faili za cache zisizo na kudumu.
- Haionekani kwa watumiaji.
- Maudhui katika hii directory hayahifadhiwi.
- OS inaweza kufuta faili za directory hii kiotomatiki wakati programu haiko inafanya kazi na nafasi ya kuhifadhi inakosekana.
Hebu tuangalie kwa karibu Application Bundle ya iGoat-Swift (.app) ndani ya directory ya Bundle (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
):
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
------------ ------- ------------------ ... --------------------------------------
Regular 420 None ... rutger.html
Regular 420 None ... mansi.html
Regular 420 None ... splash.html
Regular 420 None ... about.html
Regular 420 None ... LICENSE.txt
Regular 420 None ... Sentinel.txt
Regular 420 None ... README.txt
Binary Reversing
Ndani ya folda <application-name>.app
utaona faili la binary linaloitwa <application-name>
. Hii ndiyo faili itakayokuwa inatekelezwa. Unaweza kufanya ukaguzi wa msingi wa binary kwa kutumia chombo 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)
[...]
Angalia kama programu imefungwa
Tazama kama kuna matokeo yoyote kwa:
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
Kufanya disassembly ya binary
Fanya disassembly ya sehemu ya maandiko:
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
Ili kuchapisha sehemu ya Objective-C ya programu ya mfano mtu anaweza kutumia:
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
Ili kupata msimbo wa Objective-C wenye muundo mzuri zaidi unaweza kutumia 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;
};
Hata hivyo, chaguo bora za kufungua binary ni: Hopper na IDA.
Hifadhi ya Data
Ili kujifunza jinsi iOS inavyohifadhi data kwenye kifaa, soma ukurasa huu:
{{#ref}} ios-basics.md {{#endref}}
warning
Mahali yafuatayo pa kuhifadhi taarifa yanapaswa kukaguliwa mara tu baada ya kufunga programu, baada ya kuangalia kazi zote za programu na hata baada ya kutoka kwa mtumiaji mmoja na kuingia kwa mwingine.
Lengo ni kupata taarifa nyeti zisizo na ulinzi za programu (nywila, tokeni), za mtumiaji wa sasa na za watumiaji waliowahi kuingia.
Plist
Faili za plist ni faili za XML zilizopangwa ambazo zinafunguo-na-thamani. Ni njia ya kuhifadhi data ya kudumu, hivyo wakati mwingine unaweza kupata taarifa nyeti katika faili hizi. Inapendekezwa kukagua faili hizi baada ya kufunga programu na baada ya kuitumia kwa nguvu ili kuona kama data mpya imeandikwa.
Njia ya kawaida ya kuhifadhi data katika faili za plist ni kupitia matumizi ya NSUserDefaults. Faili hii ya plist huhifadhiwa ndani ya sandbox ya programu katika Library/Preferences/<appBundleID>.plist
Darasa la NSUserDefaults
linatoa kiolesura cha programu kwa ajili ya kuingiliana na mfumo wa default. Mfumo wa default unaruhusu programu kubadilisha tabia yake kulingana na mapendeleo ya mtumiaji. Data iliyohifadhiwa na NSUserDefaults
inaweza kuonekana katika kifurushi cha programu. Darasa hili huhifadhi data katika faili ya plist, lakini inapaswa kutumika na kiasi kidogo cha data.
Data hii haiwezi kufikiwa moja kwa moja kupitia kompyuta iliyoaminika, lakini inaweza kufikiwa kwa kufanya backup.
Unaweza dump taarifa zilizohifadhiwa kwa kutumia NSUserDefaults
kwa kutumia ios nsuserdefaults get
ya objection.
Ili kupata plist zote zinazotumiwa na programu, unaweza kufikia /private/var/mobile/Containers/Data/Application/{APPID}
na kuendesha:
find ./ -name "*.plist"
Ili kubadilisha faili kutoka XML au binary (bplist) format kwenda XML, mbinu mbalimbali kulingana na mfumo wako wa uendeshaji zinapatikana:
Kwa Watumiaji wa macOS: Tumia amri ya plutil
. Ni chombo kilichojengwa ndani katika macOS (10.2+), kilichoundwa kwa ajili ya kusudi hili:
$ plutil -convert xml1 Info.plist
Kwa Watumiaji wa Linux: Sakinisha libplist-utils
kwanza, kisha tumia plistutil
kubadilisha faili yako:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Ndani ya Kikao cha Objection: Kwa kuchambua programu za simu, amri maalum inaruhusu kubadilisha faili za plist moja kwa moja:
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
Core Data
Core Data
ni mfumo wa kusimamia tabaka la mfano wa vitu katika programu yako. Core Data inaweza kutumia SQLite kama duka lake la kudumu, lakini mfumo wenyewe si database.
CoreData haiwezi kupeleka data zake kwa usimbuaji kwa chaguo-msingi. Hata hivyo, safu ya ziada ya usimbuaji inaweza kuongezwa kwa CoreData. Tazama GitHub Repo kwa maelezo zaidi.
Unaweza kupata taarifa za SQLite Core Data za programu katika njia /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
Ikiwa unaweza kufungua SQLite na kufikia taarifa nyeti, basi umepata makosa ya usanidi.
-(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 ni duka la funguo/thamani lililojengwa juu ya SQLite.
Kwa kuwa databasi za Yap ni databasi za sqlite unaweza kuziona kwa kutumia amri iliyopendekezwa katika sehemu iliyopita.
Databasi Nyingine za SQLite
Ni kawaida kwa programu kuunda databasi zao za sqlite. Wanaweza kuwa wanahifadhi data nyeti kwenye hizo na kuziacha bila usimbaji. Kwa hivyo, kila wakati ni muhimu kuangalia kila databasi ndani ya saraka ya programu. Kwa hivyo nenda kwenye saraka ya programu ambapo data imehifadhiwa (/private/var/mobile/Containers/Data/Application/{APPID}
)
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Real-Time Databases
Wakuu wa programu wana uwezo wa kuhifadhi na kusawazisha data ndani ya hifadhi ya data ya NoSQL inayohifadhiwa kwenye wingu kupitia Firebase Real-Time Databases. Data iliyohifadhiwa katika muundo wa JSON, inasawazishwa kwa wateja wote waliounganishwa kwa wakati halisi.
Unaweza kupata jinsi ya kuangalia hifadhidata za Firebase zilizopangwa vibaya hapa:
{{#ref}} ../../network-services-pentesting/pentesting-web/buckets/firebase-database.md {{#endref}}
Realm databases
Realm Objective-C na Realm Swift hutoa mbadala mzuri wa kuhifadhi data, ambao haupatikani kutoka Apple. Kwa kawaida, wana hifadhi data bila usimbaji, huku usimbaji ukiwa unapatikana kupitia usanidi maalum.
Hifadhidata ziko katika: /private/var/mobile/Containers/Data/Application/{APPID}
. Ili kuchunguza faili hizi, mtu anaweza kutumia amri kama:
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*"
Ili kuona faili hizi za database, chombo cha Realm Studio kinapendekezwa.
Ili kutekeleza usimbaji ndani ya database ya Realm, kipande kifuatacho cha msimbo kinaweza kutumika:
// 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 Databases
Couchbase Lite inafafanuliwa kama nyepesi na imejumuishwa injini ya hifadhidata inayofuata mbinu ya mwelekeo wa hati (NoSQL). Imeundwa kuwa asili kwa iOS na macOS, inatoa uwezo wa kusawazisha data bila mshono.
Ili kubaini hifadhidata za Couchbase zinazoweza kuwa kwenye kifaa, directory ifuatayo inapaswa kukaguliwa:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Cookies
iOS huhifadhi vidakuzi vya programu katika Library/Cookies/cookies.binarycookies
ndani ya folda za kila programu. Hata hivyo, waendelezaji wakati mwingine huamua kuviweka katika keychain kwani faili ya vidakuzi inaweza kufikiwa katika nakala za akiba.
Ili kuchunguza faili ya vidakuzi unaweza kutumia hii python script au tumia ios cookies get
ya objection.
Unaweza pia kutumia objection kubadilisha faili hizi kuwa muundo wa JSON na kuchunguza data.
...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
Kwa kawaida NSURLSession huhifadhi data, kama maombi na majibu ya HTTP katika Cache.db database. Hii database inaweza kuwa na data nyeti, ikiwa tokeni, majina ya watumiaji au taarifa nyingine nyeti zimehifadhiwa. Ili kupata taarifa zilizohifadhiwa fungua directory ya data ya programu (/var/mobile/Containers/Data/Application/<UUID>
) na nenda kwenye /Library/Caches/<Bundle Identifier>
. WebKit cache pia huhifadhiwa katika faili ya Cache.db. Objection inaweza kufungua na kuingiliana na database kwa amri sqlite connect Cache.db
, kwani ni normal SQLite database.
Inapendekezwa kuondoa uhifadhi wa data hii, kwani inaweza kuwa na taarifa nyeti katika ombi au jibu. Orodha ifuatayo inaonyesha njia tofauti za kufanikisha hili:
- Inapendekezwa kuondoa majibu yaliyohifadhiwa baada ya kutoka. Hii inaweza kufanywa kwa njia iliyotolewa na Apple inayoitwa
removeAllCachedResponses
Unaweza kuita njia hii kama ifuatavyo:
URLCache.shared.removeAllCachedResponses()
Njia hii itafuta maombi na majibu yote yaliyohifadhiwa kutoka faili ya Cache.db.
- Ikiwa huhitaji kutumia faida ya vidakuzi, inapendekezwa kutumia tu mali ya usanidi ya .ephemeral ya URLSession, ambayo itazima uhifadhi wa vidakuzi na Caches.
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 inaweza pia kuzuiwa kwa kuweka Sera ya Cache kuwa .notAllowed. Itazima kuhifadhi Cache kwa njia yoyote, ama katika kumbukumbu au kwenye diski.
Snapshots
Kila wakati unapobonyeza kitufe cha nyumbani, iOS huchukua picha ya skrini ya sasa ili iweze kufanya mpito kwa programu kwa njia laini zaidi. Hata hivyo, ikiwa data nyeti ipo katika skrini ya sasa, itahifadhiwa katika picha (ambayo inasalia katika reboots). Hizi ni picha ambazo unaweza pia kufikia kwa kubonyeza mara mbili skrini ya nyumbani ili kubadilisha kati ya programu.
Ipasavyo, ikiwa iPhone haijavunjwa, mshambuliaji anahitaji kuwa na ufikiaji wa kifaa kilichozuiwa ili kuona picha hizi. Kwa kawaida picha ya mwisho huhifadhiwa katika sandbox ya programu katika folda Library/Caches/Snapshots/
au Library/SplashBoard/Snapshots
(kompyuta zinazotegemewa haziwezi kufikia mfumo wa faili kutoka iOX 7.0).
Njia moja ya kuzuia tabia hii mbaya ni kuweka skrini tupu au kuondoa data nyeti kabla ya kuchukua picha kwa kutumia kazi ya ApplicationDidEnterBackground()
.
Ifuatayo ni mfano wa njia ya kurekebisha ambayo itaanzisha picha ya skrini ya kawaida.
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];
}
Hii inafanya picha ya nyuma kuwa overlayImage.png
kila wakati programu inapokuwa kwenye background. Inazuia uvujaji wa data nyeti kwa sababu overlayImage.png
daima itachukua nafasi ya mtazamo wa sasa.
Keychain
Kwa kupata na kusimamia iOS keychain, zana kama Keychain-Dumper zinapatikana, zinazofaa kwa vifaa vilivyovunjwa. Zaidi ya hayo, Objection inatoa amri ios keychain dump
kwa madhumuni sawa.
Kuhifadhi Akikumbukumbu
Darasa la NSURLCredential ni bora kwa kuhifadhi taarifa nyeti moja kwa moja kwenye keychain, ikiepuka hitaji la NSUserDefaults au vifungashio vingine. Ili kuhifadhi akikumbukumbu baada ya kuingia, kanuni ifuatayo ya Swift inatumika:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Ili kutoa hizi akiba za taarifa, amri ya Objection ios nsurlcredentialstorage dump
inatumika.
Keyboards za Kawaida na Cache ya Keyboard
Kuanzia iOS 8.0, watumiaji wanaweza kufunga nyongeza za keyboard za kawaida, ambazo zinaweza kudhibitiwa chini ya Settings > General > Keyboard > Keyboards. Ingawa keyboards hizi zinatoa kazi za ziada, zinabeba hatari ya kuandika funguo na kuhamasisha data kwa seva za nje, ingawa watumiaji wanatolewa taarifa kuhusu keyboards zinazohitaji ufikiaji wa mtandao. Programu zinaweza, na zinapaswa, kuzuia matumizi ya keyboards za kawaida kwa ajili ya kuingiza taarifa nyeti.
Mapendekezo ya Usalama:
- Inashauriwa kuzima keyboards za wahusika wengine kwa ajili ya kuongeza usalama.
- Kuwa makini na vipengele vya autocorrect na auto-suggestions vya keyboard ya iOS ya kawaida, ambavyo vinaweza kuhifadhi taarifa nyeti katika faili za cache zilizoko katika
Library/Keyboard/{locale}-dynamic-text.dat
au/private/var/mobile/Library/Keyboard/dynamic-text.dat
. Faili hizi za cache zinapaswa kukaguliwa mara kwa mara kwa ajili ya data nyeti. Kurekebisha kamusi ya keyboard kupitia Settings > General > Reset > Reset Keyboard Dictionary inashauriwa ili kufuta data za cache. - Kukamata trafiki ya mtandao kunaweza kufichua ikiwa keyboard ya kawaida inahamisha funguo kwa mbali.
Kuzuia Cache ya Uwanja wa Maandishi
Protokali ya UITextInputTraits inatoa mali za kudhibiti autocorrection na kuingiza maandiko salama, muhimu kwa kuzuia cache ya taarifa nyeti. Kwa mfano, kuzima autocorrection na kuwezesha kuingiza maandiko salama kunaweza kufikiwa kwa:
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
Zaidi ya hayo, waendelezaji wanapaswa kuhakikisha kwamba maeneo ya maandiko, hasa yale ya kuingiza taarifa nyeti kama nywila na PIN, yanazima uhifadhi kwa kuweka autocorrectionType
kuwa UITextAutocorrectionTypeNo
na secureTextEntry
kuwa YES
.
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Maktaba
Kusafisha msimbo mara nyingi kunahusisha matumizi ya kuandika. Kuna hatari inayohusiana kwani maktaba zinaweza kuwa na taarifa nyeti. Awali, katika iOS 6 na toleo la awali, maktaba zilikuwa zinapatikana kwa programu zote, zikileta hatari ya kuvuja kwa data nyeti. Sasa, programu zimepunguzia upatikanaji wa maktaba zao pekee.
Licha ya vizuizi hivi, mshambuliaji mwenye ufikiaji wa kimwili kwa kifaa kisichofungwa anaweza bado kutumia hii kwa kuunganisha kifaa hicho kwenye kompyuta na kusoma maktaba. Ni muhimu kutambua kwamba maktaba zinabaki kwenye diski hata baada ya kufutwa kwa programu.
Ili kupunguza hatari, inashauriwa kushirikiana kwa kina na programu, kuchunguza kazi zake zote na pembejeo kuhakikisha hakuna taarifa nyeti inayorekodiwa bila kukusudia.
Wakati wa kupitia msimbo wa chanzo wa programu kwa uvujaji wa uwezekano, angalia kauli za kuandika zilizowekwa na za kawaida kwa kutumia maneno muhimu kama NSLog
, NSAssert
, NSCAssert
, fprintf
kwa kazi zilizojengwa, na yoyote inayohusiana na Logging
au Logfile
kwa utekelezaji wa kawaida.
Kufuatilia Maktaba za Mfumo
Programu zinaandika vipande mbalimbali vya taarifa ambavyo vinaweza kuwa nyeti. Ili kufuatilia maktaba hizi, zana na amri kama:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
ni muhimu. Zaidi ya hayo, Xcode inatoa njia ya kukusanya kumbukumbu za console:
- Fungua Xcode.
- Unganisha kifaa cha iOS.
- Tembelea Window -> Devices and Simulators.
- Chagua kifaa chako.
- Chochea tatizo unalochunguza.
- Tumia kitufe cha Open Console kuona kumbukumbu katika dirisha jipya.
Kwa kumbukumbu za hali ya juu, kuunganisha kwenye shell ya kifaa na kutumia socat kunaweza kutoa ufuatiliaji wa kumbukumbu kwa wakati halisi:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Iliyofuatiwa na amri za kuangalia shughuli za log, ambazo zinaweza kuwa muhimu kwa kutambua matatizo au kubaini uvujaji wa data unaoweza kutokea katika logi.
Nakala za Hifadhi
Vipengele vya auto-backup vimejumuishwa katika iOS, vinavyorahisisha uundaji wa nakala za data za kifaa kupitia iTunes (hadi macOS Catalina), Finder (kuanzia macOS Catalina kuendelea), au iCloud. Nakala hizi zinajumuisha karibu data zote za kifaa, isipokuwa vipengele vya siri sana kama vile maelezo ya Apple Pay na mipangilio ya Touch ID.
Hatari za Usalama
Kuongezwa kwa programu zilizowekwa na data zao katika nakala za hifadhi kunaleta suala la uvujaji wa data na hatari kwamba mabadiliko ya nakala yanaweza kubadilisha utendaji wa programu. Inashauriwa kutohifadhi taarifa nyeti katika maandiko ya wazi ndani ya saraka ya programu yoyote au saraka zake ndogo ili kupunguza hatari hizi.
Kutengwa kwa Faili kutoka kwa Nakala za Hifadhi
Faili katika Documents/
na Library/Application Support/
zinahifadhiwa kwa default. Wataalamu wa programu wanaweza kutenga faili au saraka maalum kutoka kwa nakala za hifadhi kwa kutumia NSURL setResourceValue:forKey:error:
na NSURLIsExcludedFromBackupKey
. Praktiki hii ni muhimu kwa kulinda data nyeti isijumuishwe katika nakala za hifadhi.
Kupima Uhalifu
Ili kutathmini usalama wa nakala za programu, anza kwa kuunda nakala kwa kutumia Finder, kisha ipate kwa kufuata mwongozo kutoka nyaraka rasmi za Apple. Changanua nakala hiyo kwa data nyeti au mipangilio ambayo inaweza kubadilishwa ili kuathiri tabia ya programu.
Taarifa nyeti zinaweza kutafutwa kwa kutumia zana za mistari ya amri au programu kama iMazing. Kwa nakala zilizofichwa, uwepo wa usimbaji unaweza kuthibitishwa kwa kuangalia ufunguo wa "IsEncrypted" katika faili ya "Manifest.plist" kwenye mzizi wa nakala.
<?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>
Kwa kushughulikia nakala zilizofichwa, skripti za Python zinazopatikana katika DinoSec's GitHub repo, kama backup_tool.py na backup_passwd.py, zinaweza kuwa na manufaa, ingawa huenda zikahitaji marekebisho ili kuendana na toleo jipya la iTunes/Finder. Zana ya iOSbackup ni chaguo jingine la kupata faili ndani ya nakala zilizolindwa kwa nenosiri.
Kubadilisha Tabia ya Programu
Mfano wa kubadilisha tabia ya programu kupitia marekebisho ya nakala umeonyeshwa katika Bither bitcoin wallet app, ambapo PIN ya kufunga UI inahifadhiwa ndani ya net.bither.plist
chini ya ufunguo wa pin_code. Kuondoa ufunguo huu kutoka kwa plist na kurejesha nakala kunafuta hitaji la PIN, na kutoa ufikiaji usio na kikomo.
Muhtasari juu ya Upimaji wa Kumbukumbu kwa Taarifa Nyeti
Wakati wa kushughulikia taarifa nyeti zilizohifadhiwa katika kumbukumbu ya programu, ni muhimu kupunguza muda wa kufichuliwa kwa data hii. Kuna mbinu mbili kuu za kuchunguza maudhui ya kumbukumbu: kuunda dump ya kumbukumbu na kuchambua kumbukumbu kwa wakati halisi. Mbinu zote zina changamoto zao, ikiwa ni pamoja na uwezekano wa kukosa data muhimu wakati wa mchakato wa dump au uchambuzi.
Kurejesha na Kuchambua Dump ya Kumbukumbu
Kwa vifaa vyote vilivyovunjwa na visivyovunjwa, zana kama objection na Fridump zinaruhusu dumping ya kumbukumbu ya mchakato wa programu. Mara baada ya dumping, kuchambua data hii kunahitaji zana mbalimbali, kulingana na asili ya taarifa unayotafuta.
Ili kutoa nyuzi kutoka kwa dump ya kumbukumbu, amri kama strings
au rabin2 -zz
zinaweza kutumika:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
Kwa uchambuzi wa kina zaidi, ikiwa ni pamoja na kutafuta aina maalum za data au mifumo, radare2 inatoa uwezo mpana wa kutafuta:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
Uchambuzi wa Kumbukumbu ya Wakati Halisi
r2frida inatoa mbadala mzuri wa kukagua kumbukumbu ya programu kwa wakati halisi, bila kuhitaji dump ya kumbukumbu. Chombo hiki kinaruhusu utekelezaji wa amri za kutafuta moja kwa moja kwenye kumbukumbu ya programu inayotembea:
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
Uthibitisho wa Kificho
Mchakato Mbaya wa Usimamizi wa Funguo
Wakandarasi wengine huhifadhi data nyeti katika hifadhi ya ndani na kuificha kwa funguo zilizowekwa kwa nguvu/kutabirika katika msimbo. Hii haipaswi kufanywa kwani baadhi ya kurudi nyuma kunaweza kuruhusu washambuliaji kutoa taarifa za siri.
Matumizi ya Algorithimu zisizo Salama na/au Zilizopitwa na Wakati
Wakandarasi hawapaswi kutumia algorithimu zilizopitwa na wakati kufanya ukaguzi wa mamlaka, hifadhi au kutuma data. Baadhi ya algorithimu hizi ni: RC4, MD4, MD5, SHA1... Ikiwa hashes zinatumika kuhifadhi nywila kwa mfano, hashes zinazopinga brute-force zinapaswa kutumika pamoja na chumvi.
Kagua
Ukaguzi mkuu wa kufanya ni kutafuta ikiwa unaweza kupata nywila/siri zilizowekwa kwa nguvu katika msimbo, au ikiwa hizo ni kutabirika, na ikiwa msimbo unatumia aina fulani ya algorithimu za kificho dhaifu.
Ni ya kuvutia kujua kwamba unaweza kufuatilia baadhi ya maktaba za crypto kiotomatiki ukitumia objection na:
ios monitor crypt
Kwa maelezo zaidi kuhusu iOS cryptographic APIs na maktaba, tembelea https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography
Uthibitishaji wa Mitaa
Uthibitishaji wa mitaa una jukumu muhimu, hasa linapokuja suala la kulinda ufikiaji katika mwisho wa mbali kupitia mbinu za kijasusi. Kiini hapa ni kwamba bila utekelezaji sahihi, mifumo ya uthibitishaji wa mitaa inaweza kupuuziliwa mbali.
Msingi wa Uthibitishaji wa Mitaa wa Apple na keychain zinatoa APIs thabiti kwa waendelezaji kuwezesha mazungumzo ya uthibitishaji wa mtumiaji na kushughulikia data ya siri kwa usalama, mtawalia. Secure Enclave inalinda fingerprint ID kwa Touch ID, wakati Face ID inategemea utambuzi wa uso bila kuathiri data za kibaiolojia.
Ili kuunganisha Touch ID/Face ID, waendelezaji wana chaguo mbili za API:
LocalAuthentication.framework
kwa uthibitishaji wa mtumiaji wa kiwango cha juu bila ufikiaji wa data za kibaiolojia.Security.framework
kwa ufikiaji wa huduma za keychain za kiwango cha chini, ikilinda data za siri kwa uthibitishaji wa kibaiolojia. Mifumo mbalimbali ya open-source wrappers inafanya ufikiaji wa keychain kuwa rahisi.
caution
Hata hivyo, LocalAuthentication.framework
na Security.framework
zinaonyesha udhaifu, kwani kwa msingi hurudisha thamani za boolean bila kuhamasisha data kwa michakato ya uthibitishaji, na kuifanya iwe rahisi kupuuzilia mbali (tazama Don't touch me that way, by David Lindner et al).
Kutekeleza Uthibitishaji wa Mitaa
Ili kuhamasisha watumiaji kwa uthibitishaji, waendelezaji wanapaswa kutumia evaluatePolicy
njia ndani ya LAContext
darasa, wakichagua kati ya:
deviceOwnerAuthentication
: Inahamasisha kwa Touch ID au nambari ya kifaa, ikishindwa ikiwa zote mbili hazijawashwa.deviceOwnerAuthenticationWithBiometrics
: Inahamasisha pekee kwa Touch ID.
Uthibitishaji uliofanikiwa unadhihirishwa na thamani ya boolean inayorejea kutoka evaluatePolicy
, ikionyesha kasoro inayoweza kutokea ya usalama.
Uthibitishaji wa Mitaa kwa kutumia Keychain
Kutekeleza uthibitishaji wa mitaa katika programu za iOS kunahusisha matumizi ya keychain APIs kuhifadhi kwa usalama data za siri kama vile token za uthibitishaji. Mchakato huu unahakikisha kuwa data inaweza kufikiwa tu na mtumiaji, akitumia nambari ya kifaa chake au uthibitishaji wa kibaiolojia kama Touch ID.
Keychain inatoa uwezo wa kuweka vitu na sifa ya SecAccessControl
, ambayo inazuia ufikiaji wa kipengee hadi mtumiaji athibitishwe kwa mafanikio kupitia Touch ID au nambari ya kifaa. Kipengele hiki ni muhimu kwa kuboresha usalama.
Hapa chini kuna mifano ya msimbo katika Swift na Objective-C ikionyesha jinsi ya kuhifadhi na kupata string kutoka kwa keychain, ikitumia vipengele hivi vya usalama. Mifano inaonyesha hasa jinsi ya kuweka udhibiti wa ufikiaji ili kuhitaji uthibitishaji wa Touch ID na kuhakikisha kuwa data inapatikana tu kwenye kifaa ambacho ilipangwa, chini ya hali kwamba nambari ya kifaa imewekwa.
// 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
}
Sasa tunaweza kuomba kipengee kilichohifadhiwa kutoka kwa keychain. Huduma za keychain zitaonyesha kidirisha cha uthibitishaji kwa mtumiaji na kurudisha data au nil kulingana na kama alitoa alama sahihi ya kidole au la.
// 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
}
Ugunduzi
Matumizi ya mifumo katika programu yanaweza pia kugundulika kwa kuchambua orodha ya maktaba za dinamik zinazoshirikiwa za programu. Hii inaweza kufanywa kwa kutumia otool
:
$ otool -L <AppName>.app/<AppName>
Ikiwa LocalAuthentication.framework
inatumika katika programu, matokeo yatakuwa na mistari ifuatayo (kumbuka kwamba LocalAuthentication.framework
inatumia Security.framework
chini ya uso):
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
Ikiwa Security.framework
inatumika, ya pili tu itakuwa inionyeshwa.
Kupita Mfumo wa Uthibitishaji wa Mitaa
Objection
Kupitia Objection Biometrics Bypass, iliyoko kwenye hii ukurasa wa GitHub, mbinu inapatikana ya kushinda mekanizma ya LocalAuthentication. Msingi wa njia hii unahusisha kutumia Frida kubadilisha kazi ya evaluatePolicy
, kuhakikisha inatoa matokeo ya True
kila wakati, bila kujali mafanikio halisi ya uthibitishaji. Hii ni muhimu sana kwa kukwepa michakato ya uthibitishaji wa kibayometriki yenye kasoro.
Ili kuanzisha kupita hii, amri ifuatayo inatumika:
...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
Amri hii inanzisha mfululizo ambapo Objection inarekodi kazi ambayo kwa ufanisi inabadilisha matokeo ya ukaguzi wa evaluatePolicy
kuwa True
.
Frida
Mfano wa matumizi ya evaluatePolicy
kutoka 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"];
});
}
}
Ili kufanikisha bypass ya Uthibitishaji wa Mitaa, skripti ya Frida imeandikwa. Skripti hii inalenga ukaguzi wa evaluatePolicy, ikikamata callback yake ili kuhakikisha inarudisha success=1. Kwa kubadilisha tabia ya callback, ukaguzi wa uthibitishaji unakabiliwa kwa ufanisi.
Skripti iliyo hapa chini inasambazwa kubadilisha matokeo ya mbinu ya evaluatePolicy. Inabadilisha matokeo ya callback kuonyesha kila wakati mafanikio.
// 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!");
}
Ili kuingiza skripti ya Frida na kupita uthibitisho wa kibaiometriki, amri ifuatayo inatumika:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
Ufunuo wa Kazi Nyeti Kupitia IPC
Wasilisho Maalum ya URI / Deeplinks / Mipango Maalum
{{#ref}} ios-custom-uri-handlers-deeplinks-custom-schemes.md {{#endref}}
Viungo vya Ulimwengu
{{#ref}} ios-universal-links.md {{#endref}}
Kushiriki UIActivity
{{#ref}} ios-uiactivity-sharing.md {{#endref}}
UIPasteboard
{{#ref}} ios-uipasteboard.md {{#endref}}
Nyongeza za Programu
{{#ref}} ios-app-extensions.md {{#endref}}
WebViews
{{#ref}} ios-webviews.md {{#endref}}
Usawazishaji na Uandishi
{{#ref}} ios-serialisation-and-encoding.md {{#endref}}
Mawasiliano ya Mtandao
Ni muhimu kuangalia kwamba hakuna mawasiliano yanayotokea bila usimbaji na pia kwamba programu inathibitisha kwa usahihi cheti cha TLS cha seva.
Ili kuangalia masuala haya unaweza kutumia proxy kama Burp:
{{#ref}} burp-configuration-for-ios.md {{#endref}}
Ukaguzi wa Jina la Kikoa
Tatizo moja la kawaida katika kuthibitisha cheti cha TLS ni kuangalia kwamba cheti kimeandikwa na CA iliyoaminika, lakini sio kuangalia kama jina la kikoa la cheti ndilo jina la kikoa linalofikiwa.
Ili kuangalia tatizo hili kwa kutumia Burp, baada ya kuamini Burp CA kwenye iPhone, unaweza kuunda cheti kipya na Burp kwa jina la kikoa tofauti na kukitumia. Ikiwa programu bado inafanya kazi, basi, kuna kitu kinahatarisha.
Ufunguo wa Cheti
Ikiwa programu inatumia SSL Pinning kwa usahihi, basi programu itafanya kazi tu ikiwa cheti ni kile kinachotarajiwa. Wakati wa kujaribu programu hii inaweza kuwa tatizo kwani Burp itatoa cheti yake mwenyewe.
Ili kupita ulinzi huu ndani ya kifaa kilichovunjwa, unaweza kufunga programu SSL Kill Switch au kufunga Burp Mobile Assistant
Unaweza pia kutumia objection's ios sslpinning disable
Mambo Mengine
- Katika
/System/Library
unaweza kupata mifumo iliyosakinishwa kwenye simu inayotumiwa na programu za mfumo - Programu zilizowekwa na mtumiaji kutoka Duka la Programu ziko ndani ya
/User/Applications
- Na
/User/Library
ina data iliyohifadhiwa na programu za kiwango cha mtumiaji - Unaweza kufikia
/User/Library/Notes/notes.sqlite
kusoma noti zilizohifadhiwa ndani ya programu. - Ndani ya folda ya programu iliyosakinishwa (
/User/Applications/<APP ID>/
) unaweza kupata faili za kuvutia: iTunesArtwork
: Ikoni inayotumiwa na programuiTunesMetadata.plist
: Taarifa ya programu inayotumiwa katika Duka la Programu/Library/*
: Inashikilia mapendeleo na cache. Katika/Library/Cache/Snapshots/*
unaweza kupata picha iliyofanywa kwa programu kabla ya kuituma kwenye nyuma.
Hot Patching/Kuongeza Sasisho
Wakuu wa programu wanaweza kwa mbali kurekebisha usakinishaji wote wa programu yao mara moja bila ya kuwasilisha tena programu hiyo kwenye Duka la Programu na kusubiri hadi idhini ipatikane.
Kwa kusudi hili mara nyingi hutumia JSPatch. Lakini kuna chaguzi nyingine pia kama Siren na react-native-appstore-version-checker.
Hii ni mbinu hatari ambayo inaweza kutumika vibaya na SDK za wahusika wengine, kwa hivyo inashauriwa kuangalia ni mbinu gani inayotumika kwa sasisho za kiotomatiki (ikiwa zipo) na kujaribu. Unaweza kujaribu kupakua toleo la awali la programu kwa kusudi hili.
Wahusika Wengine
Changamoto kubwa na SDK za wahusika wengine ni ukosefu wa udhibiti wa kina juu ya kazi zao. Wakuu wa programu wanakabiliwa na chaguo: ama kuunganisha SDK na kukubali vipengele vyake vyote, ikiwa ni pamoja na hatari za usalama na wasiwasi wa faragha, au kuacha faida zake kabisa. Mara nyingi, wakuu wa programu hawawezi kurekebisha hatari ndani ya SDK hizi wenyewe. Zaidi ya hayo, kadri SDK zinavyopata uaminifu ndani ya jamii, baadhi zinaweza kuanza kuwa na malware.
Huduma zinazotolewa na SDK za wahusika wengine zinaweza kujumuisha ufuatiliaji wa tabia za mtumiaji, kuonyesha matangazo, au kuboresha uzoefu wa mtumiaji. Hata hivyo, hii inaleta hatari kwani wakuu wa programu wanaweza kutokuwa na ufahamu kamili wa msimbo unaotekelezwa na maktaba hizi, na kusababisha hatari za faragha na usalama. Ni muhimu kupunguza taarifa zinazoshirikiwa na huduma za wahusika wengine hadi zile zinazohitajika na kuhakikisha kwamba hakuna data nyeti inayofichuliwa.
Utekelezaji wa huduma za wahusika wengine kawaida huja katika aina mbili: maktaba huru au SDK kamili. Ili kulinda faragha ya mtumiaji, data yoyote inayoshirikiwa na huduma hizi inapaswa kuwa isiyojulikana ili kuzuia kufichuliwa kwa Taarifa za Kibinafsi (PII).
Ili kubaini maktaba ambazo programu inatumia, amri ya otool
inaweza kutumika. Chombo hiki kinapaswa kukimbizwa dhidi ya programu na kila maktaba iliyoshirikiwa inayotumiwa kugundua maktaba za ziada.
otool -L <application_path>
Marejeo na Rasilimali Zaidi
- 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/ kozi za bure za IOS (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 <<< toleo la Objective-C https://github.com/OWASP/iGoat-Swift <<< toleo la Swift
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/nabla-c0d3/ssl-kill-switch2
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.