iOS Pentesting

Χρησιμοποιήστε Trickest για να δημιουργήσετε και να αυτοματοποιήσετε ροές εργασίας που υποστηρίζονται από τα πιο προηγμένα εργαλεία της κοινότητας. Αποκτήστε πρόσβαση σήμερα:

Υποστήριξη HackTricks

iOS Βασικές Γνώσεις

iOS Basics

Περιβάλλον Δοκιμών

Σε αυτή τη σελίδα μπορείτε να βρείτε πληροφορίες σχετικά με τον iOS simulator, emulators και jailbreaking:

iOS Testing Environment

Αρχική Ανάλυση

Βασικές Λειτουργίες Δοκιμών iOS

Κατά τη διάρκεια της δοκιμής θα προταθούν αρκετές λειτουργίες (σύνδεση στη συσκευή, ανάγνωση/γραφή/ανέβασμα/κατέβασμα αρχείων, χρήση ορισμένων εργαλείων...). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε καμία από αυτές τις ενέργειες, παρακαλώ, ξεκινήστε να διαβάζετε τη σελίδα:

iOS Basic Testing Operations

Για τα επόμενα βήματα η εφαρμογή θα πρέπει να είναι εγκατεστημένη στη συσκευή και θα πρέπει να έχει ήδη αποκτήσει το IPA αρχείο της εφαρμογής. Διαβάστε τη σελίδα Βασικές Λειτουργίες Δοκιμών iOS για να μάθετε πώς να το κάνετε αυτό.

Βασική Στατική Ανάλυση

Συνιστάται να χρησιμοποιήσετε το εργαλείο MobSF για να εκτελέσετε μια αυτόματη Στατική Ανάλυση στο IPA αρχείο.

Αναγνώριση των προστασιών που υπάρχουν στο δυαδικό:

  • PIE (Position Independent Executable): Όταν είναι ενεργοποιημένο, η εφαρμογή φορτώνεται σε μια τυχαία διεύθυνση μνήμης κάθε φορά που εκκινείται, καθιστώντας πιο δύσκολη την πρόβλεψη της αρχικής της διεύθυνσης μνήμης.

otool -hv <app-binary> | grep PIE   # Θα πρέπει να περιλαμβάνει τη σημαία PIE
  • Stack Canaries: Για να επικυρωθεί η ακεραιότητα της στοίβας, μια τιμή ‘canary’ τοποθετείται στη στοίβα πριν από την κλήση μιας συνάρτησης και επικυρώνεται ξανά μόλις η συνάρτηση τελειώσει.

otool -I -v <app-binary> | grep stack_chk   # Θα πρέπει να περιλαμβάνει τα σύμβολα: stack_chk_guard και stack_chk_fail
  • ARC (Automatic Reference Counting): Για να αποτραπούν κοινά σφάλματα διαφθοράς μνήμης

otool -I -v <app-binary> | grep objc_release   # Θα πρέπει να περιλαμβάνει το σύμβολο _objc_release
  • Κρυπτογραφημένο Δυαδικό: Το δυαδικό θα πρέπει να είναι κρυπτογραφημένο

otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # Η κρυπτογράφηση θα πρέπει να είναι 1

Αναγνώριση Ευαίσθητων/Ανασφαλών Συναρτήσεων

  • Αδύνατοι Αλγόριθμοι Χαρακτηρισμού

# Στη συσκευή iOS
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# Στο linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Ανασφαλείς Τυχαίοι Αλγόριθμοι

# Στη συσκευή iOS
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# Στο linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Ανασφαλής Συνάρτηση ‘Malloc’

# Στη συσκευή iOS
otool -Iv <app> | grep -w "_malloc"

# Στο linux
grep -iER "_malloc"
  • Ανασφαλείς και Ευάλωτες Συναρτήσεις

# Στη συσκευή iOS
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"

# Στο linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"

Βασική Δυναμική Ανάλυση

Δείτε τη δυναμική ανάλυση που εκτελεί το MobSF. Θα χρειαστεί να πλοηγηθείτε μέσα από τις διάφορες προβολές και να αλληλεπιδράσετε μαζί τους, αλλά θα συνδέει πολλές κλάσεις κάνοντας άλλες ενέργειες και θα ετοιμάσει μια αναφορά μόλις ολοκληρώσετε.

Καταγραφή Εγκατεστημένων Εφαρμογών

Χρησιμοποιήστε την εντολή frida-ps -Uai για να προσδιορίσετε τον bundle identifier των εγκατεστημένων εφαρμογών:

$ 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

Βασική Αρίθμηση & Hooking

Μάθετε πώς να αριθμείτε τα συστατικά της εφαρμογής και πώς να hookάρει εύκολα μεθόδους και κλάσεις με το objection:

iOS Hooking With Objection

Δομή IPA

Η δομή ενός IPA αρχείου είναι ουσιαστικά αυτή ενός συμπιεσμένου πακέτου. Με την αλλαγή της επέκτασής του σε .zip, μπορεί να αποσυμπιεστεί για να αποκαλύψει το περιεχόμενό του. Μέσα σε αυτή τη δομή, ένα Bundle αντιπροσωπεύει μια πλήρως συσκευασμένη εφαρμογή έτοιμη για εγκατάσταση. Μέσα, θα βρείτε έναν φάκελο με όνομα <NAME>.app, ο οποίος περιέχει τους πόρους της εφαρμογής.

  • Info.plist: Αυτό το αρχείο περιέχει συγκεκριμένες λεπτομέρειες ρύθμισης της εφαρμογής.

  • _CodeSignature/: Αυτός ο φάκελος περιλαμβάνει ένα αρχείο plist που περιέχει μια υπογραφή, διασφαλίζοντας την ακεραιότητα όλων των αρχείων στο bundle.

  • Assets.car: Ένα συμπιεσμένο αρχείο που αποθηκεύει αρχεία πόρων όπως εικονίδια.

  • Frameworks/: Αυτός ο φάκελος φιλοξενεί τις εγγενείς βιβλιοθήκες της εφαρμογής, οι οποίες μπορεί να είναι σε μορφή αρχείων .dylib ή .framework.

  • PlugIns/: Αυτό μπορεί να περιλαμβάνει επεκτάσεις της εφαρμογής, γνωστές ως αρχεία .appex, αν και δεν είναι πάντα παρόντα. * Core Data: Χρησιμοποιείται για να αποθηκεύει τα μόνιμα δεδομένα της εφαρμογής σας για offline χρήση, να αποθηκεύει προσωρινά δεδομένα και να προσθέτει λειτουργία undo στην εφαρμογή σας σε μία μόνο συσκευή. Για να συγχρονίσετε δεδομένα σε πολλές συσκευές σε έναν μόνο λογαριασμό iCloud, το Core Data αντικατοπτρίζει αυτόματα το σχήμα σας σε ένα CloudKit container.

  • PkgInfo: Το αρχείο PkgInfo είναι ένας εναλλακτικός τρόπος για να καθορίσετε τους τύπους και τους κωδικούς δημιουργού της εφαρμογής ή του bundle σας.

  • en.lproj, fr.proj, Base.lproj: Είναι τα πακέτα γλώσσας που περιέχουν πόρους για αυτές τις συγκεκριμένες γλώσσες, και έναν προεπιλεγμένο πόρο σε περίπτωση που μια γλώσσα δεν υποστηρίζεται.

  • Ασφάλεια: Ο φάκελος _CodeSignature/ παίζει κρίσιμο ρόλο στην ασφάλεια της εφαρμογής επαληθεύοντας την ακεραιότητα όλων των συσκευασμένων αρχείων μέσω ψηφιακών υπογραφών.

  • Διαχείριση Πόρων: Το αρχείο Assets.car χρησιμοποιεί συμπίεση για να διαχειρίζεται αποτελεσματικά τα γραφικά στοιχεία, κρίσιμο για τη βελτιστοποίηση της απόδοσης της εφαρμογής και τη μείωση του συνολικού της μεγέθους.

  • Frameworks και PlugIns: Αυτοί οι φάκελοι υπογραμμίζουν τη μονάδα των εφαρμογών iOS, επιτρέποντας στους προγραμματιστές να συμπεριλαμβάνουν επαναχρησιμοποιήσιμες βιβλιοθήκες κώδικα (Frameworks/) και να επεκτείνουν τη λειτουργικότητα της εφαρμογής (PlugIns/).

  • Τοπικοποίηση: Η δομή υποστηρίζει πολλές γλώσσες, διευκολύνοντας την παγκόσμια εμβέλεια της εφαρμογής περιλαμβάνοντας πόρους για συγκεκριμένα πακέτα γλώσσας.

Info.plist

Το Info.plist χρησιμεύει ως θεμέλιο για τις εφαρμογές iOS, περιλαμβάνοντας βασικά δεδομένα ρύθμισης με τη μορφή ζευγών κλειδιού-τιμής. Αυτό το αρχείο είναι απαραίτητο όχι μόνο για τις εφαρμογές αλλά και για τις επεκτάσεις εφαρμογών και τα frameworks που περιλαμβάνονται. Είναι δομημένο είτε σε XML είτε σε δυαδική μορφή και περιέχει κρίσιμες πληροφορίες που κυμαίνονται από άδειες εφαρμογής έως ρυθμίσεις ασφαλείας. Για μια λεπτομερή εξερεύνηση των διαθέσιμων κλειδιών, μπορείτε να ανατρέξετε στην Τεκμηρίωση Προγραμματιστών της Apple.

Για όσους επιθυμούν να εργαστούν με αυτό το αρχείο σε μια πιο προσβάσιμη μορφή, η μετατροπή σε XML μπορεί να επιτευχθεί εύκολα μέσω της χρήσης του plutil σε macOS (διαθέσιμο εγγενώς σε εκδόσεις 10.2 και μεταγενέστερες) ή plistutil σε Linux. Οι εντολές για τη μετατροπή είναι οι εξής:

  • Για macOS:

$ plutil -convert xml1 Info.plist
  • Για Linux:

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

Μεταξύ της πληθώρας πληροφοριών που μπορεί να αποκαλύψει το αρχείο Info.plist, οι αξιοσημείωτες καταχωρήσεις περιλαμβάνουν τις συμβολοσειρές αδειών εφαρμογής (UsageDescription), τα προσαρμοσμένα URL schemes (CFBundleURLTypes), και τις ρυθμίσεις για την Ασφάλεια Μεταφοράς Εφαρμογών (NSAppTransportSecurity). Αυτές οι καταχωρήσεις, μαζί με άλλες όπως οι εξαγόμενοι/εισαγόμενοι προσαρμοσμένοι τύποι εγγράφων (UTExportedTypeDeclarations / UTImportedTypeDeclarations), μπορούν να εντοπιστούν εύκολα με την επιθεώρηση του αρχείου ή χρησιμοποιώντας μια απλή εντολή grep:

$ grep -i <keyword> Info.plist

Διαδρομές Δεδομένων

Στο περιβάλλον iOS, οι καταλόγοι προορίζονται συγκεκριμένα για συστήματα εφαρμογών και εφαρμογές που έχουν εγκατασταθεί από τον χρήστη. Οι εφαρμογές συστήματος βρίσκονται στον κατάλογο /Applications, ενώ οι εφαρμογές που έχουν εγκατασταθεί από τον χρήστη τοποθετούνται κάτω από /var/mobile/containers/Data/Application/. Αυτές οι εφαρμογές έχουν ανατεθεί μια μοναδική ταυτότητα γνωστή ως 128-bit UUID, καθιστώντας την εργασία της χειροκίνητης εύρεσης του φακέλου μιας εφαρμογής δύσκολη λόγω της τυχαιότητας των ονομάτων των καταλόγων.

Καθώς οι εφαρμογές στο iOS πρέπει να είναι απομονωμένες, κάθε εφαρμογή θα έχει επίσης έναν φάκελο μέσα στο $HOME/Library/Containers με το CFBundleIdentifier της εφαρμογής ως όνομα φακέλου.

Ωστόσο, και οι δύο φάκελοι (φάκελοι δεδομένων & φακέλοι κοντέινερ) έχουν το αρχείο .com.apple.mobile_container_manager.metadata.plist που συνδέει και τα δύο αρχεία στην κλειδί MCMetadataIdentifier).

Για να διευκολυνθεί η ανακάλυψη του καταλόγου εγκατάστασης μιας εφαρμογής που έχει εγκατασταθεί από τον χρήστη, το objection tool παρέχει μια χρήσιμη εντολή, env. Αυτή η εντολή αποκαλύπτει λεπτομερείς πληροφορίες καταλόγου για την εφαρμογή σε ερώτηση. Παρακάτω είναι ένα παράδειγμα του πώς να χρησιμοποιήσετε αυτήν την εντολή:

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

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

Εναλλακτικά, το όνομα της εφαρμογής μπορεί να αναζητηθεί μέσα στο /private/var/containers χρησιμοποιώντας την εντολή find:

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

Οι εντολές όπως ps και lsof μπορούν επίσης να χρησιμοποιηθούν για να εντοπίσουν τη διαδικασία της εφαρμογής και να καταγράψουν τα ανοιχτά αρχεία, αντίστοιχα, παρέχοντας πληροφορίες σχετικά με τις ενεργές διαδρομές καταλόγου της εφαρμογής:

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

Bundle directory:

  • AppName.app

  • Αυτό είναι το Application Bundle όπως έχει αναφερθεί προηγουμένως στο IPA, περιέχει βασικά δεδομένα εφαρμογής, στατικό περιεχόμενο καθώς και το μεταγλωττισμένο δυαδικό της εφαρμογής.

  • Αυτός ο φάκελος είναι ορατός στους χρήστες, αλλά οι χρήστες δεν μπορούν να γράψουν σε αυτόν.

  • Το περιεχόμενο σε αυτόν τον φάκελο δεν είναι αντίγραφο ασφαλείας.

  • Τα περιεχόμενα αυτού του φακέλου χρησιμοποιούνται για επικύρωση της υπογραφής κώδικα.

Data directory:

  • Documents/

  • Περιέχει όλα τα δεδομένα που δημιουργούνται από τον χρήστη. Ο τελικός χρήστης της εφαρμογής ξεκινά τη δημιουργία αυτών των δεδομένων.

  • Ορατός στους χρήστες και οι χρήστες μπορούν να γράψουν σε αυτόν.

  • Το περιεχόμενο σε αυτόν τον φάκελο είναι αντίγραφο ασφαλείας.

  • Η εφαρμογή μπορεί να απενεργοποιήσει διαδρομές ορίζοντας το NSURLIsExcludedFromBackupKey.

  • Library/

  • Περιέχει όλα τα αρχεία που δεν είναι συγκεκριμένα για τον χρήστη, όπως caches, προτιμήσεις, cookies, και αρχεία ρύθμισης παραμέτρων plist.

  • Οι εφαρμογές iOS συνήθως χρησιμοποιούν τους υποφακέλους Application Support και Caches, αλλά η εφαρμογή μπορεί να δημιουργήσει προσαρμοσμένους υποφακέλους.

  • Library/Caches/

  • Περιέχει ημι-μόνιμα αρχεία cache.

  • Αόρατος στους χρήστες και οι χρήστες δεν μπορούν να γράψουν σε αυτόν.

  • Το περιεχόμενο σε αυτόν τον φάκελο δεν είναι αντίγραφο ασφαλείας.

  • Το OS μπορεί να διαγράψει τα αρχεία αυτού του φακέλου αυτόματα όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.

  • Library/Application Support/

  • Περιέχει μόνιμα αρχεία απαραίτητα για την εκτέλεση της εφαρμογής.

  • Αόρατος στους χρήστες και οι χρήστες δεν μπορούν να γράψουν σε αυτόν.

  • Το περιεχόμενο σε αυτόν τον φάκελο είναι αντίγραφο ασφαλείας.

  • Η εφαρμογή μπορεί να απενεργοποιήσει διαδρομές ορίζοντας το NSURLIsExcludedFromBackupKey.

  • Library/Preferences/

  • Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να διαρκέσουν ακόμη και μετά την επανεκκίνηση μιας εφαρμογής.

  • Οι πληροφορίες αποθηκεύονται, χωρίς κρυπτογράφηση, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist που ονομάζεται [BUNDLE_ID].plist.

  • Όλα τα ζεύγη κλειδιού/τιμής που αποθηκεύονται χρησιμοποιώντας το NSUserDefaults μπορούν να βρεθούν σε αυτό το αρχείο.

  • tmp/

  • Χρησιμοποιήστε αυτόν τον φάκελο για να γράψετε προσωρινά αρχεία που δεν χρειάζεται να διαρκέσουν μεταξύ των εκκινήσεων της εφαρμογής.

  • Περιέχει μη μόνιμα αρχεία cache.

  • Αόρατος στους χρήστες.

  • Το περιεχόμενο σε αυτόν τον φάκελο δεν είναι αντίγραφο ασφαλείας.

  • Το OS μπορεί να διαγράψει τα αρχεία αυτού του φακέλου αυτόματα όταν η εφαρμογή δεν εκτελείται και ο χώρος αποθήκευσης είναι περιορισμένος.

Ας ρίξουμε μια πιο προσεκτική ματιά στον φάκελο Application Bundle (.app) της iGoat-Swift μέσα στον φάκελο 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

Μέσα στον φάκελο <application-name>.app θα βρείτε ένα δυαδικό αρχείο που ονομάζεται <application-name>. Αυτό είναι το αρχείο που θα εκτελείται. Μπορείτε να εκτελέσετε μια βασική επιθεώρηση του δυαδικού αρχείου με το εργαλείο otool:

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

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

Ελέγξτε αν η εφαρμογή είναι κρυπτογραφημένη

Δείτε αν υπάρχει κάποια έξοδος για:

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

Αποσυναρμολόγηση του δυαδικού αρχείου

Αποσυναρμολόγηση της ενότητας κειμένου:

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

Για να εκτυπώσετε το Objective-C segment της δείγματος εφαρμογής, μπορείτε να χρησιμοποιήσετε:

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

Για να αποκτήσετε πιο συμπαγή κώδικα Objective-C μπορείτε να χρησιμοποιήσετε class-dump:

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

#pragma mark Named Structures

struct CGPoint {
double _field1;
double _field2;
};

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

struct CGSize {
double _field1;
double _field2;
};

Ωστόσο, οι καλύτερες επιλογές για την αποσυναρμολόγηση του δυαδικού είναι: Hopper και IDA.

Χρησιμοποιήστε Trickest για να δημιουργήσετε και να ** αυτοματοποιήσετε ροές εργασίας** που υποστηρίζονται από τα πιο προηγμένα εργαλεία της κοινότητας. Αποκτήστε πρόσβαση σήμερα:

Αποθήκευση Δεδομένων

Για να μάθετε πώς το iOS αποθηκεύει δεδομένα στη συσκευή, διαβάστε αυτή τη σελίδα:

iOS Basics

Οι παρακάτω τοποθεσίες αποθήκευσης πληροφοριών θα πρέπει να ελέγχονται αμέσως μετά την εγκατάσταση της εφαρμογής, μετά τον έλεγχο όλων των λειτουργιών της εφαρμογής και ακόμη και μετά την αποσύνδεση από έναν χρήστη και σύνδεση σε έναν διαφορετικό. Ο στόχος είναι να βρείτε μη προστατευμένες ευαίσθητες πληροφορίες της εφαρμογής (κωδικοί πρόσβασης, tokens), του τρέχοντος χρήστη και προηγούμενων συνδεδεμένων χρηστών.

Plist

Τα plist αρχεία είναι δομημένα XML αρχεία που περιέχουν ζεύγη κλειδιού-τιμής. Είναι ένας τρόπος αποθήκευσης μόνιμων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε ευαίσθητες πληροφορίες σε αυτά τα αρχεία. Συνιστάται να ελέγχετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά τη χρήση της εντατικά για να δείτε αν έχουν γραφτεί νέα δεδομένα.

Ο πιο κοινός τρόπος για να διατηρηθούν τα δεδομένα σε αρχεία plist είναι μέσω της χρήσης του NSUserDefaults. Αυτό το αρχείο plist αποθηκεύεται μέσα στο sandbox της εφαρμογής στο Library/Preferences/<appBundleID>.plist

Η κλάση NSUserDefaults παρέχει μια προγραμματιστική διεπαφή για την αλληλεπίδραση με το προεπιλεγμένο σύστημα. Το προεπιλεγμένο σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόσει τη συμπεριφορά της σύμφωνα με τις προτιμήσεις του χρήστη. Τα δεδομένα που αποθηκεύονται από το NSUserDefaults μπορούν να προβληθούν στο πακέτο της εφαρμογής. Αυτή η κλάση αποθηκεύει δεδομένα σε ένα plist αρχείο, αλλά προορίζεται να χρησιμοποιείται με μικρές ποσότητες δεδομένων.

Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν απευθείας μέσω ενός αξιόπιστου υπολογιστή, αλλά μπορούν να προσπελαστούν εκτελώντας ένα backup.

Μπορείτε να dump τις πληροφορίες που αποθηκεύονται χρησιμοποιώντας το NSUserDefaults με την εντολή ios nsuserdefaults get του objection.

Για να βρείτε όλα τα plist που χρησιμοποιούνται από την εφαρμογή, μπορείτε να αποκτήσετε πρόσβαση στο /private/var/mobile/Containers/Data/Application/{APPID} και να εκτελέσετε:

find ./ -name "*.plist"

Για να μετατρέψετε αρχεία από XML ή δυαδική (bplist) μορφή σε XML, διατίθενται διάφορες μέθοδοι ανάλογα με το λειτουργικό σας σύστημα:

Για χρήστες macOS: Χρησιμοποιήστε την εντολή plutil. Είναι ένα ενσωματωμένο εργαλείο στο macOS (10.2+), σχεδιασμένο για αυτόν τον σκοπό:

$ plutil -convert xml1 Info.plist

Για Χρήστες Linux: Εγκαταστήστε πρώτα το libplist-utils, στη συνέχεια χρησιμοποιήστε το plistutil για να μετατρέψετε το αρχείο σας:

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

Μέσα σε μια συνεδρία Objection: Για την ανάλυση κινητών εφαρμογών, μια συγκεκριμένη εντολή σας επιτρέπει να μετατρέψετε αρχεία plist απευθείας:

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

Core Data

Core Data είναι ένα πλαίσιο για τη διαχείριση της μοντελοποιημένης στρώσης αντικειμένων στην εφαρμογή σας. Το Core Data μπορεί να χρησιμοποιήσει το SQLite ως μόνιμο αποθηκευτικό χώρο, αλλά το πλαίσιο αυτό καθαυτό δεν είναι μια βάση δεδομένων. Το CoreData δεν κρυπτογραφεί τα δεδομένα του από προεπιλογή. Ωστόσο, μπορεί να προστεθεί μια επιπλέον στρώση κρυπτογράφησης στο CoreData. Δείτε το GitHub Repo για περισσότερες λεπτομέρειες.

Μπορείτε να βρείτε τις πληροφορίες Core Data SQLite μιας εφαρμογής στη διαδρομή /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support

Εάν μπορείτε να ανοίξετε το SQLite και να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες, τότε έχετε βρει μια κακή ρύθμιση.

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

NSManagedObjectContext *context =[appDelegate managedObjectContext];

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

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

YapDatabase

YapDatabase είναι ένα αποθηκευτικό σύστημα κλειδιού/τιμής που έχει κατασκευαστεί πάνω από το SQLite. Δεδομένου ότι οι βάσεις δεδομένων Yap είναι βάσεις δεδομένων sqlite, μπορείτε να τις βρείτε χρησιμοποιώντας την προτεινόμενη εντολή στην προηγούμενη ενότητα.

Άλλες Βάσεις Δεδομένων SQLite

Είναι κοινό για τις εφαρμογές να δημιουργούν τη δική τους βάση δεδομένων sqlite. Μπορεί να αποθηκεύουν ευαίσθητα δεδομένα σε αυτές και να τα αφήνουν μη κρυπτογραφημένα. Επομένως, είναι πάντα ενδιαφέρον να ελέγχετε κάθε βάση δεδομένων μέσα στον κατάλογο των εφαρμογών. Επομένως, πηγαίνετε στον κατάλογο της εφαρμογής όπου αποθηκεύονται τα δεδομένα (/private/var/mobile/Containers/Data/Application/{APPID})

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

Firebase Real-Time Databases

Οι προγραμματιστές έχουν τη δυνατότητα να αποθηκεύουν και να συγχρονίζουν δεδομένα μέσα σε μια βάση δεδομένων NoSQL που φιλοξενείται στο cloud μέσω των Firebase Real-Time Databases. Αποθηκευμένα σε μορφή JSON, τα δεδομένα συγχρονίζονται σε όλους τους συνδεδεμένους πελάτες σε πραγματικό χρόνο.

Μπορείτε να βρείτε πώς να ελέγξετε για κακώς διαμορφωμένες βάσεις δεδομένων Firebase εδώ:

Firebase Database

Realm databases

Realm Objective-C και Realm Swift προσφέρουν μια ισχυρή εναλλακτική λύση για την αποθήκευση δεδομένων, που δεν παρέχεται από την Apple. Από προεπιλογή, αποθηκεύουν δεδομένα χωρίς κρυπτογράφηση, με κρυπτογράφηση διαθέσιμη μέσω συγκεκριμένης διαμόρφωσης.

Οι βάσεις δεδομένων βρίσκονται στη διεύθυνση: /private/var/mobile/Containers/Data/Application/{APPID}. Για να εξερευνήσετε αυτά τα αρχεία, μπορείτε να χρησιμοποιήσετε εντολές όπως:

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

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

Για την προβολή αυτών των αρχείων βάσης δεδομένων, προτείνεται το εργαλείο Realm Studio.

Για την υλοποίηση κρυπτογράφησης μέσα σε μια βάση δεδομένων Realm, μπορεί να χρησιμοποιηθεί το παρακάτω απόσπασμα κώδικα:

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

Couchbase Lite Databases

Couchbase Lite περιγράφεται ως μια ελαφριά και ενσωματωμένη μηχανή βάσης δεδομένων που ακολουθεί την προσανατολισμένη σε έγγραφα (NoSQL) προσέγγιση. Σχεδιασμένη να είναι εγγενής για iOS και macOS, προσφέρει τη δυνατότητα συγχρονισμού δεδομένων χωρίς προβλήματα.

Για να εντοπιστούν πιθανές βάσεις δεδομένων Couchbase σε μια συσκευή, θα πρέπει να ελεγχθεί ο παρακάτω φάκελος:

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

Cookies

Το iOS αποθηκεύει τα cookies των εφαρμογών στο Library/Cookies/cookies.binarycookies μέσα στον φάκελο κάθε εφαρμογής. Ωστόσο, οι προγραμματιστές μερικές φορές αποφασίζουν να τα αποθηκεύσουν στο keychain καθώς το αναφερόμενο cookie file μπορεί να προσπελαστεί σε αντίγραφα ασφαλείας.

Για να επιθεωρήσετε το αρχείο cookies μπορείτε να χρησιμοποιήσετε αυτό το python script ή να χρησιμοποιήσετε το ios cookies get του objection. Μπορείτε επίσης να χρησιμοποιήσετε το objection για να μετατρέψετε αυτά τα αρχεία σε μορφή JSON και να επιθεωρήσετε τα δεδομένα.

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

Cache

Από προεπιλογή, το NSURLSession αποθηκεύει δεδομένα, όπως HTTP αιτήματα και απαντήσεις στη βάση δεδομένων Cache.db. Αυτή η βάση δεδομένων μπορεί να περιέχει ευαίσθητα δεδομένα, εάν έχουν αποθηκευτεί tokens, ονόματα χρηστών ή οποιαδήποτε άλλη ευαίσθητη πληροφορία. Για να βρείτε τις αποθηκευμένες πληροφορίες, ανοίξτε τον κατάλογο δεδομένων της εφαρμογής (/var/mobile/Containers/Data/Application/<UUID>) και μεταβείτε στο /Library/Caches/<Bundle Identifier>. Η cache του WebKit αποθηκεύεται επίσης στο αρχείο Cache.db. Η Objection μπορεί να ανοίξει και να αλληλεπιδράσει με τη βάση δεδομένων με την εντολή sqlite connect Cache.db, καθώς είναι μια κανονική βάση δεδομένων SQLite.

Συνιστάται να απενεργοποιήσετε την αποθήκευση αυτών των δεδομένων, καθώς μπορεί να περιέχουν ευαίσθητες πληροφορίες στην αίτηση ή την απάντηση. Η παρακάτω λίστα δείχνει διάφορους τρόπους για να το επιτύχετε αυτό:

  1. Συνιστάται να αφαιρείτε τις αποθηκευμένες απαντήσεις μετά την αποσύνδεση. Αυτό μπορεί να γίνει με τη μέθοδο που παρέχει η Apple, που ονομάζεται removeAllCachedResponses. Μπορείτε να καλέσετε αυτή τη μέθοδο ως εξής:

URLCache.shared.removeAllCachedResponses()

Αυτή η μέθοδος θα αφαιρέσει όλα τα αποθηκευμένα αιτήματα και απαντήσεις από το αρχείο Cache.db. 2. Εάν δεν χρειάζεται να χρησιμοποιήσετε το πλεονέκτημα των cookies, θα ήταν προτιμότερο να χρησιμοποιήσετε την ιδιότητα διαμόρφωσης .ephemeral του URLSession, η οποία θα απενεργοποιήσει την αποθήκευση cookies και Caches.

Τεκμηρίωση Apple:

Ένα αντικείμενο διαμόρφωσης συνεδρίας ephemeral είναι παρόμοιο με μια προεπιλεγμένη διαμόρφωση συνεδρίας (βλ. προεπιλογή), εκτός από το ότι το αντίστοιχο αντικείμενο συνεδρίας δεν αποθηκεύει caches, αποθήκες διαπιστευτηρίων ή οποιαδήποτε δεδομένα που σχετίζονται με τη συνεδρία σε δίσκο. Αντίθετα, τα δεδομένα που σχετίζονται με τη συνεδρία αποθηκεύονται στη RAM. Η μόνη φορά που μια ephemeral συνεδρία γράφει δεδομένα σε δίσκο είναι όταν της πείτε να γράψει το περιεχόμενο μιας διεύθυνσης URL σε ένα αρχείο. 3. Η cache μπορεί επίσης να απενεργοποιηθεί ρυθμίζοντας την Πολιτική Cache σε .notAllowed. Αυτό θα απενεργοποιήσει την αποθήκευση της Cache με οποιονδήποτε τρόπο, είτε στη μνήμη είτε σε δίσκο.

Snapshots

Όποτε πατάτε το κουμπί αρχικής οθόνης, το iOS λαμβάνει μια στιγμιότυπο της τρέχουσας οθόνης για να μπορέσει να κάνει τη μετάβαση στην εφαρμογή με πολύ πιο ομαλό τρόπο. Ωστόσο, εάν υπάρχουν ευαίσθητα δεδομένα στην τρέχουσα οθόνη, θα αποθηκευτούν στην εικόνα (η οποία διατηρείται μετά από επανεκκινήσεις). Αυτά είναι τα στιγμιότυπα που μπορείτε επίσης να αποκτήσετε πρόσβαση διπλά πατώντας την αρχική οθόνη για να αλλάξετε μεταξύ εφαρμογών.

Εκτός εάν το iPhone είναι jailbroken, ο επιτιθέμενος χρειάζεται να έχει πρόσβαση στη σ συσκευή ξεκλειδωμένη για να δει αυτά τα στιγμιότυπα οθόνης. Από προεπιλογή, το τελευταίο στιγμιότυπο αποθηκεύεται στο sandbox της εφαρμογής στον φάκελο Library/Caches/Snapshots/ ή Library/SplashBoard/Snapshots (οι αξιόπιστοι υπολογιστές δεν μπορούν να έχουν πρόσβαση στο σύστημα αρχείων από το iOX 7.0).

Ένας τρόπος για να αποτρέψετε αυτή τη κακή συμπεριφορά είναι να βάλετε μια κενή οθόνη ή να αφαιρέσετε τα ευαίσθητα δεδομένα πριν από τη λήψη του στιγμιότυπου χρησιμοποιώντας τη λειτουργία ApplicationDidEnterBackground().

Ακολουθεί μια δείγμα μεθόδου αποκατάστασης που θα ορίσει ένα προεπιλεγμένο στιγμιότυπο οθόνης.

Swift:

private var backgroundImage: UIImageView?

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

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

Objective-C:

@property (UIImageView *)backgroundImage;

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

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

Αυτό ρυθμίζει την εικόνα φόντου σε overlayImage.png όποτε η εφαρμογή είναι στο παρασκήνιο. Αποτρέπει τις ευαίσθητες διαρροές δεδομένων επειδή το overlayImage.png θα υπερκαλύπτει πάντα την τρέχουσα προβολή.

Keychain

Για την πρόσβαση και τη διαχείριση του iOS keychain, είναι διαθέσιμα εργαλεία όπως το Keychain-Dumper, κατάλληλο για jailbroken συσκευές. Επιπλέον, το Objection παρέχει την εντολή ios keychain dump για παρόμοιους σκοπούς.

Αποθήκευση Διαπιστευτηρίων

Η κλάση NSURLCredential είναι ιδανική για την αποθήκευση ευαίσθητων πληροφοριών απευθείας στο keychain, παρακάμπτοντας την ανάγκη για NSUserDefaults ή άλλες περιτυλίξεις. Για την αποθήκευση διαπιστευτηρίων μετά την είσοδο, χρησιμοποιείται ο παρακάτω κώδικας Swift: