iOS Pentesting

Koristite Trickest da biste lako izgradili i automatizovali radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnove iOS-a

pageiOS Basics

Testno Okruženje

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

pageiOS Testing Environment

Početna Analiza

Osnovne operacije testiranja iOS-a

Tokom testiranja biće predložene neke operacije (povezivanje sa uređajem, čitanje/pisanje/otpisivanje/preuzimanje fajlova, korišćenje nekih alata...). Stoga, ako ne znate kako da izvršite bilo koju od ovih radnji, molimo vas, počnite sa čitanjem stranice:

pageiOS Basic Testing Operations

Za sledeće korake aplikacija treba biti instalirana na uređaju i već treba da ste dobili IPA fajl aplikacije. Pročitajte stranicu Osnovne operacije testiranja iOS-a da biste saznali kako to uraditi.

Osnovna Statistička Analiza

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

Identifikacija zaštita koje su prisutne u binarnom fajlu:

  • PIE (Position Independent Executable): Kada je omogućeno, aplikacija se učitava na nasumičnu memorijsku adresu svaki put kada se pokrene, čime se otežava predviđanje njene početne memorijske adrese.

otool -hv <app-binary> | grep PIE   # Trebalo bi da uključuje zastavicu PIE
  • Stack Canaries: Da bi se validirala celovitost steka, 'canary' vrednost se postavlja na stek pre poziva funkcije i ponovo se validira kada funkcija završi.

otool -I -v <app-binary> | grep stack_chk   # Trebalo bi da uključuje simbole: stack_chk_guard i stack_chk_fail
  • ARC (Automatic Reference Counting): Da bi se sprečile uobičajene greške u korupciji memorije

otool -I -v <app-binary> | grep objc_release   # Trebalo bi da uključuje simbol _objc_release
  • Enkriptovan Binarni Fajl: Binarni fajl treba da bude enkriptovan

otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # cryptid treba da bude 1

Identifikacija Osetljivih/Nesigurnih Funkcija

  • Slabi Hashing Algoritmi

# Na iOS uređaju
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# Na linux-u
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Nesigurne Random Funkcije

# Na iOS uređaju
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# Na linux-u
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Nesigurna 'Malloc' Funkcija

# Na iOS uređaju
otool -Iv <app> | grep -w "_malloc"

# Na linux-u
grep -iER "_malloc"
  • Nesigurne i Ranjive Funkcije

# Na iOS uređaju
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"

# Na linux-u
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"

Osnovna Dinamička Analiza

Pogledajte dinamičku analizu koju izvršava MobSF. Morate da pretražujete različite prikaze i interagujete sa njima, ali će povezivati nekoliko klasa i obavljati druge radnje, a izradiće izveštaj kada završite.

Lista Instaliranih Aplikacija

Koristite komandu frida-ps -Uai da biste odredili identifikator paketa instaliranih aplikacija:

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

Osnovna enumeracija i hakovanje

Saznajte kako enumerisati komponente aplikacije i kako lako hakovati metode i klase pomoću alata objection:

pageiOS Hooking With Objection

Struktura IPA fajla

Struktura IPA fajla je suštinski struktura zipovanog paketa. Preimenovanjem ekstenzije u .zip, može se dekompresovati kako bi se otkrili njegovi sadržaji. Unutar ove strukture, Bundle predstavlja potpuno zapakovanu aplikaciju spremnu za instalaciju. Unutar nje, pronaći ćete direktorijum nazvan <IME>.app, koji obuhvata resurse aplikacije.

  • Info.plist: Ovaj fajl sadrži specifične konfiguracione detalje aplikacije.

  • _CodeSignature/: Ovaj direktorijum uključuje plist fajl koji sadrži potpis, osiguravajući integritet svih fajlova u paketu.

  • Assets.car: Kompresovani arhiv koji čuva fajlove resursa poput ikona.

  • Frameworks/: Ovaj folder sadrži native biblioteke aplikacije, koje mogu biti u obliku .dylib ili .framework fajlova.

  • PlugIns/: Ovde se mogu nalaziti proširenja aplikacije, poznata kao .appex fajlovi, iako nisu uvek prisutni.

  • Core Data: Koristi se za čuvanje trajnih podataka vaše aplikacije za offline korišćenje, keširanje privremenih podataka i dodavanje funkcionalnosti poništavanja u vašu aplikaciju na jednom uređaju. Za sinhronizaciju podataka na više uređaja u jednom iCloud nalogu, Core Data automatski preslikava vašu šemu u CloudKit kontejner.

  • PkgInfo: Fajl PkgInfo je alternativni način za specificiranje tipa i kreator koda vaše aplikacije ili paketa.

  • en.lproj, fr.proj, Base.lproj: Su jezički paketi koji sadrže resurse za te specifične jezike, i podrazumevani resurs u slučaju da jezik nije podržan.

  • Bezbednost: Direktorijum _CodeSignature/ igra ključnu ulogu u bezbednosti aplikacije verifikujući integritet svih zapakovanih fajlova putem digitalnih potpisa.

  • Upravljanje resursima: Fajl Assets.car koristi kompresiju za efikasno upravljanje grafičkim resursima, što je ključno za optimizaciju performansi aplikacije i smanjenje njenog ukupnog obima.

  • Frameworks i PlugIns: Ovi direktorijumi ističu modularnost iOS aplikacija, omogućavajući programerima da uključe biblioteke sa ponovno iskoristivim kodom (Frameworks/) i prošire funkcionalnost aplikacije (PlugIns/).

  • Lokalizacija: Struktura podržava više jezika, olakšavajući globalni doseg aplikacije uključivanjem resursa za specifične jezičke pakete.

Info.plist

Info.plist služi kao osnova za iOS aplikacije, obuhvatajući ključne konfiguracione podatke u obliku ključ-vrednost parova. Ovaj fajl je obavezan ne samo za aplikacije već i za proširenja aplikacija i biblioteke upakovane unutar njih. Strukturiran je u XML ili binarnom formatu i sadrži kritične informacije koje se kreću od dozvola aplikacije do sigurnosnih konfiguracija. Za detaljno istraživanje dostupnih ključeva, možete se obratiti Apple Developer dokumentaciji.

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

  • Za macOS:

$ plutil -convert xml1 Info.plist
  • Za Linux:

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

Među mnoštvom informacija koje Info.plist datoteka može otkriti, značajni unosi uključuju niske dozvola aplikacije (UsageDescription), prilagođene URL sheme (CFBundleURLTypes), i konfiguracije za bezbednost transporta aplikacije (NSAppTransportSecurity). Ovi unosi, zajedno sa drugima poput izvezenih/uvezenih prilagođenih tipova dokumenata (UTExportedTypeDeclarations / UTImportedTypeDeclarations), mogu se lako pronaći inspekcijom datoteke ili korišćenjem jednostavne grep komande:

$ grep -i <keyword> Info.plist

Putanje podataka

U iOS okruženju, direktorijumi su posebno određeni za sistemsku aplikaciju i aplikacije koje je instalirao korisnik. Sistemski programi se nalaze u direktorijumu /Applications, dok se aplikacije koje je instalirao korisnik smeštaju u /var/mobile/containers/Data/Application/. Ove aplikacije su dodeljene jedinstveni identifikator poznat kao 128-bitni UUID, što čini zadatak ručnog lociranja fascikle aplikacije izazovnim zbog nasumičnosti imena direktorijuma.

Pošto aplikacije u iOS-u moraju biti u pesku, svaka aplikacija će takođe imati fasciklu unutar $HOME/Library/Containers sa CFBundleIdentifier aplikacije kao imenom fascikle.

Međutim, obe fascikle (data & container fascikle) sadrže datoteku .com.apple.mobile_container_manager.metadata.plist koja povezuje obe datoteke u ključu MCMetadataIdentifier).

Kako bi olakšao otkrivanje direktorijuma instalacije aplikacije koju je instalirao korisnik, objection alat pruža korisnu komandu, env. Ova komanda otkriva detaljne informacije o direktorijumu za datu aplikaciju. U nastavku je primer kako koristiti ovu komandu:

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

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

Alternativno, ime aplikacije može biti pretraženo unutar /private/var/containers korišćenjem find komande:

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

Komande poput ps i lsof takođe mogu biti iskorišćene za identifikaciju procesa aplikacije i listanje otvorenih fajlova, redom, pružajući uvid u putanje aktivnog direktorijuma aplikacije:

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

Direktorijum paketa:

  • AppName.app

  • Ovo je Aplikacioni Paket kao što je viđeno ranije u IPA, sadrži osnovne podatke aplikacije, statički sadržaj kao i kompilirani binarni fajl aplikacije.

  • Ovaj direktorijum je vidljiv korisnicima, ali korisnici ne mogu pisati u njega.

  • Sadržaj u ovom direktorijumu nije rezervisan.

  • Sadržaj ovog foldera se koristi za validaciju potpisa koda.

Direktorijum podataka:

  • Documents/

  • Sadrži sve podatke generisane od strane korisnika. Korisnik aplikacije pokreće kreiranje ovih podataka.

  • Vidljiv korisnicima i korisnici mogu pisati u njega.

  • Sadržaj u ovom direktorijumu je rezervisan.

  • Aplikacija može onemogućiti putanje postavljanjem NSURLIsExcludedFromBackupKey.

  • Library/

  • Sadrži sve fajlove koji nisu specifični za korisnika, kao što su keševi, postavke, kolačići, i fajlovi konfiguracije property list (plist).

  • iOS aplikacije obično koriste Application Support i Caches poddirektorijume, ali aplikacija može kreirati prilagođene poddirektorijume.

  • Library/Caches/

  • Sadrži polu-persistentne keširane fajlove.

  • Nevidljiv korisnicima i korisnici ne mogu pisati u njega.

  • Sadržaj u ovom direktorijumu nije rezervisan.

  • OS može automatski obrisati fajlove iz ovog direktorijuma kada aplikacija nije pokrenuta i kada je malo slobodnog prostora za skladištenje.

  • Library/Application Support/

  • Sadrži persistentne fajlove neophodne za pokretanje aplikacije.

  • Nevidljiv korisnicima i korisnici ne mogu pisati u njega.

  • Sadržaj u ovom direktorijumu je rezervisan.

  • Aplikacija može onemogućiti putanje postavljanjem NSURLIsExcludedFromBackupKey.

  • Library/Preferences/

  • Koristi se za čuvanje svojstava koja mogu persistirati čak i nakon restartovanja aplikacije.

  • Informacije se čuvaju, nešifrovane, unutar aplikacionog sandbox-a u plist fajlu nazvanom [BUNDLE_ID].plist.

  • Svi parovi ključ/vrednost sačuvani korišćenjem NSUserDefaults mogu se pronaći u ovom fajlu.

  • tmp/

  • Koristite ovaj direktorijum za pisanje privremenih fajlova koji ne moraju persistirati između pokretanja aplikacije.

  • Sadrži ne-persistentne keširane fajlove.

  • Nevidljiv korisnicima.

  • Sadržaj u ovom direktorijumu nije rezervisan.

  • OS može automatski obrisati fajlove iz ovog direktorijuma kada aplikacija nije pokrenuta i kada je malo slobodnog prostora za skladištenje.

Hajde da detaljnije pogledamo Aplikacioni Paket (.app) direktorijum iGoat-Swift aplikacije unutar Bundle direktorijuma (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app):

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

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

Binarno Revertovanje

Unutar foldera <ime-aplikacije>.app pronaći ćete binarni fajl nazvan <ime-aplikacije>. Ovo je fajl koji će biti izvršen. Možete izvršiti osnovnu inspekciju binarnog fajla pomoću alata otool:

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

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

Proverite da li je aplikacija enkriptovana

Proverite da li postoji bilo kakav izlaz za:

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

Rastavljanje binarnog koda

Rastavite tekstualnu sekciju:

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

Da biste odštampali Objective-C segment uzorka aplikacije, možete koristiti:

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

Da biste dobili kompaktniji Objective-C kod, možete koristiti class-dump:

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

#pragma mark Named Structures

struct CGPoint {
double _field1;
double _field2;
};

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

struct CGSize {
double _field1;
double _field2;
};

Međutim, najbolje opcije za rastavljanje binarnog koda su: Hopper i IDA.

Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Pristupite danas:

Skladištenje podataka

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

pageiOS Basics

Sledeća mesta za čuvanje informacija treba proveriti odmah nakon instaliranja aplikacije, nakon provere svih funkcionalnosti aplikacije i čak nakon odjavljivanja sa jednog korisnika i prijavljivanja sa drugim. Cilj je pronaći nezaštićene osetljive informacije aplikacije (šifre, tokene), trenutnog korisnika i prethodno prijavljenih korisnika.

Plist

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

Najčešći način za trajno čuvanje podataka u plist fajlovima je kroz korišćenje NSUserDefaults. Ovaj plist fajl se čuva unutar aplikacije u pesku u Library/Preferences/<appBundleID>.plist

Klasa NSUserDefaults pruža programski interfejs za interakciju sa podrazumevanim sistemom. Podrazumevani sistem omogućava aplikaciji da prilagodi svoje ponašanje prema korisničkim preferencama. Podaci sačuvani pomoću NSUserDefaults mogu se pregledati u paketu aplikacije. Ova klasa čuva podatke u plist fajlu, ali je namenjena za korišćenje sa malim količinama podataka.

Ovi podaci ne mogu direktno biti pristupljeni putem pouzdanog računara, ali se mogu pristupiti pravljenjem rezervne kopije.

Možete izbaciti informacije sačuvane korišćenjem NSUserDefaults koristeći ios nsuserdefaults get u objection-u.

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

find ./ -name "*.plist"

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

Za korisnike macOS-a: Iskoristite plutil komandu. To je ugrađeni alat u macOS (verzija 10.2+), dizajniran za tu svrhu:

$ plutil -convert xml1 Info.plist

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

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

Unutar Objection sesije: Za analizu mobilnih aplikacija, određena komanda vam omogućava da direktno konvertujete plist fajlove:

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

Core Data

Core Data je okvir za upravljanje slojem modela objekata u vašoj aplikaciji. Core Data može koristiti SQLite kao svoje trajno skladište, ali sam okvir nije baza podataka. CoreData ne šifrira podatke prema zadanim postavkama. Međutim, dodatni sloj šifrovanja može se dodati CoreData-u. Pogledajte GitHub Repo za više detalja.

Informacije o SQLite Core Data aplikacije možete pronaći na putanji /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support

Ako možete otvoriti SQLite i pristupiti osetljivim informacijama, tada ste pronašli lošu konfiguraciju.

Kod iz iGoat-a
-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);

NSManagedObjectContext *context =[appDelegate managedObjectContext];

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

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

YapDatabase

YapDatabase je skladište ključ/vrednost izgrađeno na vrhu SQLite-a. Pošto su Yap baze podataka sqlite baze podataka, možete ih pronaći koristeći namensku komandu iz prethodnog odeljka.

Ostale SQLite baze podataka

Često se dešava da aplikacije kreiraju svoje sopstvene sqlite baze podataka. Mogu skladištiti osetljive podatke na njima i ostaviti ih nešifrovane. Stoga je uvek interesantno proveriti svaku bazu podataka unutar direktorijuma aplikacije. Zato idite u direktorijum aplikacije gde su podaci sačuvani (/private/var/mobile/Containers/Data/Application/{APPID}).

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

Firebase Real-Time Databases

Programeri su omogućeni da skladište i sinhronizuju podatke unutar NoSQL cloud-hosted baze podataka putem Firebase Real-Time Databases. Podaci se čuvaju u JSON formatu i sinhronizuju se sa svim povezanim klijentima u realnom vremenu.

Kako da proverite da li su Firebase baze podataka netačno konfigurisane možete pronaći ovde:

pageFirebase Database

Realm baze podataka

Realm Objective-C i Realm Swift nude moćnu alternativu za skladištenje podataka, što nije obezbeđeno od strane Apple-a. Podaci se podrazumevano čuvaju nešifrovano, sa mogućnošću enkripcije putem specifične konfiguracije.

Baze podataka se nalaze na: /private/var/mobile/Containers/Data/Application/{APPID}. Za istraživanje ovih fajlova, može se koristiti komande poput:

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

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

Za pregledanje ovih baza podataka preporučuje se alat Realm Studio.

Za implementaciju enkripcije unutar Realm baze podataka, može se koristiti sledeći kodni isečak:

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

Baze podataka Couchbase Lite

Couchbase Lite je opisan kao lagani i ugrađeni baza podataka koji sledi orijentisan prema dokumentima (NoSQL) pristup. Dizajniran da bude prirodan za iOS i macOS, nudi mogućnost sinhronizacije podataka bez problema.

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

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

Kolačići

iOS čuva kolačiće aplikacija u Library/Cookies/cookies.binarycookies unutar svake fascikle aplikacije. Međutim, programeri ponekad odluče da ih sačuvaju u keychain-u jer se pomenuti fajl sa kolačićima može pristupiti u rezervnim kopijama.

Da biste pregledali fajl sa kolačićima, možete koristiti ovaj Python skript ili koristiti objection-ovu komandu ios cookies get. Takođe možete koristiti objection da konvertujete ove fajlove u JSON format i pregledate podatke.

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

Keš

Podrazumevano, NSURLSession čuva podatke, poput HTTP zahteva i odgovora u Cache.db bazi podataka. Ova baza može sadržati osetljive podatke, ako su tokeni, korisnička imena ili bilo koje druge osetljive informacije keširane. Da biste pronašli keširane informacije, otvorite direktorijum podataka aplikacije (/var/mobile/Containers/Data/Application/<UUID>) i idite na /Library/Caches/<Bundle Identifier>. WebKit keš se takođe čuva u Cache.db fajlu. Objection može otvoriti i interagovati sa bazom podataka komandom sqlite connect Cache.db, jer je to obična SQLite baza podataka.

Preporučuje se onemogućavanje keširanja ovih podataka, jer može sadržati osetljive informacije u zahtevu ili odgovoru. U nastavku je prikazan spisak različitih načina postizanja ovoga:

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

URLCache.shared.removeAllCachedResponses()

Ova metoda će ukloniti sve keširane zahteve i odgovore iz Cache.db fajla. 2. Ako ne treba da koristite prednost kolačića, preporučuje se korišćenje svojstva konfiguracije .ephemeral URLSession, što će onemogućiti čuvanje kolačića i keša.

Apple dokumentacija:

Objekat konfiguracije sesije ephemeral je sličan objektu konfiguracije sesije po podrazumevanim vrednostima (videti default), osim što odgovarajući objekat sesije ne čuva keš, skladišta akreditacija ili bilo koje podatke vezane za sesiju na disku. Umesto toga, podaci vezani za sesiju se čuvaju u RAM-u. Jedini put kada sesija ephemeral piše podatke na disk je kada mu kažete da zapiše sadržaj URL-a u fajl. 3. Keš takođe može biti onemogućen postavljanjem politike keširanja na .notAllowed. Onemogućiće čuvanje keša na bilo koji način, bilo u memoriji ili na disku.

Snimci

Kada pritisnete dugme za početni ekran, iOS pravi snimak trenutnog ekrana kako bi mogao da izvrši tranziciju ka aplikaciji na mnogo glađi način. Međutim, ako je osetljivi podatak prisutan na trenutnom ekranu, biće sačuvan u slici (koja traje preko ponovnog pokretanja). Ovo su snimci do kojih možete pristupiti i dvostrukim dodirivanjem početnog ekrana kako biste prešli između aplikacija.

Osoba koja napada, osim ako iPhone nije jailbroken, mora imati pristup odblokiranom uređaju da bi videla ove snimke ekrana. Podrazumevano, poslednji snimak se čuva u sandbox-u aplikacije u Library/Caches/Snapshots/ ili Library/SplashBoard/Snapshots fascikli (poverena računari ne mogu pristupiti fajl sistemu od iOX 7.0).

Jedan način da se spreči ovo loše ponašanje je da se postavi prazan ekran ili ukloni osetljivi podatak pre nego što se napravi snimak koristeći funkciju ApplicationDidEnterBackground().

Sledeći je primer metode za otklanjanje problema koji će postaviti podrazumevani snimak.

Swift:

private var backgroundImage: UIImageView?

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

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

Objective-C:

@property (UIImageView *)backgroundImage;

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

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

Ovo postavlja pozadinsku sliku na overlayImage.png kada se aplikacija prebaci u pozadinu. To sprečava curenje osetljivih podataka jer će overlayImage.png uvek zameniti trenutni prikaz.

Keychain

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

Čuvanje akreditacija

Klasa NSURLCredential je idealna za čuvanje osetljivih informacija direktno u kešu, zaobilazeći potrebu za NSUserDefaults-om ili drugim omotačima. Za čuvanje akreditacija nakon prijave, koristi se sledeći Swift kod:

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

Za izvlačenje ovih sačuvanih akreditiva, koristi se Objection-ova komanda ios nsurlcredentialstorage dump.

Prilagođene tastature i keš tastature

Od iOS 8.0 nadalje, korisnici mogu instalirati prilagođene ekstenzije tastatura, koje se mogu upravljati pod Settings > General > Keyboard > Keyboards. Iako ove tastature nude proširene funkcionalnosti, predstavljaju rizik od beleženja pritisnutih tastera i slanja podataka eksternim serverima, iako korisnici dobijaju obaveštenje o tastaturama koje zahtevaju pristup mreži. Aplikacije mogu, i trebalo bi, ograničiti upotrebu prilagođenih tastatura za unos osetljivih informacija.

Preporuke za bezbednost:

  • Preporučuje se onemogućavanje tastatura trećih strana radi poboljšane bezbednosti.

  • Budite svesni funkcija automatske ispravke i automatskih predloga podrazumevane iOS tastature, koje mogu sačuvati osetljive informacije u keš fajlovima smeštenim u Library/Keyboard/{locale}-dynamic-text.dat ili /private/var/mobile/Library/Keyboard/dynamic-text.dat. Ovi keš fajlovi treba redovno proveravati radi osetljivih podataka. Preporučuje se resetovanje rečnika tastature putem Settings > General > Reset > Reset Keyboard Dictionary radi brisanja keširanih podataka.

  • Presretanje mrežnog saobraćaja može otkriti da li prilagođena tastatura daljinski prenosi pritisnute tastere.

Prevencija keširanja polja za unos teksta

Protokol UITextInputTraits nudi osobine za upravljanje automatskom ispravkom i bezbednim unosom teksta, što je ključno za sprečavanje keširanja osetljivih informacija. Na primer, onemogućavanje automatske ispravke i omogućavanje bezbednog unosa teksta može se postići sa:

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

Dodatno, programeri treba da se pobrinu da tekstualna polja, posebno ona za unos osetljivih informacija poput lozinki i PIN-ova, onemoguće keširanje postavljanjem autocorrectionType na UITextAutocorrectionTypeNo i secureTextEntry na YES.

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

Logovi

Debugiranje koda često uključuje korišćenje logova. Postoji rizik jer logovi mogu sadržavati osetljive informacije. Ranije, u iOS 6 i starijim verzijama, logovi su bili dostupni svim aplikacijama, što je predstavljalo rizik od curenja osetljivih podataka. Sada su aplikacije ograničene na pristup samo svojim logovima.

Uprkos ovim ograničenjima, napadač sa fizičkim pristupom otključanom uređaju i dalje može iskoristiti ovo povezivanjem uređaja sa računarom i čitanjem logova. Važno je napomenuti da logovi ostaju na disku čak i nakon deinstalacije aplikacije.

Da bi se smanjili rizici, preporučuje se temeljno interagovanje sa aplikacijom, istražujući sve njene funkcionalnosti i ulaze kako bi se osiguralo da se slučajno ne beleže osetljive informacije.

Prilikom pregleda izvornog koda aplikacije radi potencijalnih curenja, potražite kako unapred definisane tako i prilagođene izjave za logovanje koristeći ključne reči poput NSLog, NSAssert, NSCAssert, fprintf za ugrađene funkcije, i bilo kakve pomenute Logging ili Logfile za prilagođene implementacije.

Pratite Logove Sistemskog Sistem

Aplikacije beleže različite informacije koje mogu biti osetljive. Za praćenje ovih logova, alati i komande poput:

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

Su korisne. Dodatno, Xcode pruža način za prikupljanje konzolnih zapisa:

  1. Otvorite Xcode.

  2. Povežite iOS uređaj.

  3. Idite na Prozor -> Uređaji i Simulatori.

  4. Izaberite svoj uređaj.

  5. Pokrenite problem koji istražujete.

  6. Koristite dugme Otvori konzolu da biste pregledali zapise u novom prozoru.

Za naprednije beleženje, povezivanje sa ljuskom uređaja i korišćenje socat-a može omogućiti praćenje logova u realnom vremenu:

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

Prateći komande za posmatranje aktivnosti dnevnika, koje mogu biti od neprocenjive vrednosti za dijagnostikovanje problema ili identifikaciju potencijalnog curenja podataka u dnevnicima.


Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Dobijte pristup danas:

Rezervne Kopije

Automatske funkcije rezervnog kopiranja su integrisane u iOS, olakšavajući kreiranje kopija podataka uređaja putem iTunes-a (do macOS Catalina), Finder-a (od macOS Catalina nadalje) ili iCloud-a. Ove rezervne kopije obuhvataju skoro sve podatke uređaja, isključujući visoko osetljive elemente poput detalja Apple Pay-a i konfiguracija Touch ID-a.

Bezbednosni Rizici

Uključivanje instaliranih aplikacija i njihovih podataka u rezervne kopije postavlja pitanje potencijalnog curenja podataka i rizika da modifikacije rezervne kopije mogu promeniti funkcionalnost aplikacije. Preporučuje se ne čuvati osetljive informacije u običnom tekstu unutar direktorijuma bilo koje aplikacije ili njenih poddirektorijuma kako bi se umanjili ovi rizici.

Isključivanje Fajlova iz Rezervnih Kopija

Fajlovi u Documents/ i Library/Application Support/ se podrazumevano rezervno kopiraju. Razvojni programeri mogu isključiti određene fajlove ili direktorijume iz rezervnih kopija koristeći NSURL setResourceValue:forKey:error: sa NSURLIsExcludedFromBackupKey. Ova praksa je ključna za zaštitu osetljivih podataka od uključivanja u rezervne kopije.

Testiranje Ranjivosti

Da biste procenili sigurnost rezervne kopije aplikacije, počnite sa kreiranjem rezervne kopije koristeći Finder, zatim je locirajte koristeći uputstva iz zvanične dokumentacije Apple-a. Analizirajte rezervnu kopiju u potrazi za osetljivim podacima ili konfiguracijama koje bi mogle biti promenjene da bi uticale na ponašanje aplikacije.

Osetljive informacije mogu biti pronađene korišćenjem alata komandne linije ili aplikacija poput iMazing. Za enkriptovane rezervne kopije, prisustvo enkripcije se može potvrditi proverom ključa "IsEncrypted" u fajlu "Manifest.plist" na korenu rezervne kopije.

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

Za rukovanje sa enkriptovanim rezervnim kopijama, Python skripte dostupne u DinoSec-ovom GitHub repozitorijumu, poput backup_tool.py i backup_passwd.py, mogu biti korisne, iako potencijalno zahtevaju prilagođavanje za kompatibilnost sa najnovijim verzijama iTunes/Finder-a. iOSbackup alat je još jedna opcija za pristupanje fajlovima unutar zaštićenih lozinkom rezervnih kopija.

Modifikovanje Ponašanja Aplikacije

Primer modifikovanja ponašanja aplikacije putem modifikacija rezervne kopije je prikazan u Bither bitcoin novčanik aplikaciji, gde se UI zaključavanje PIN-a čuva unutar net.bither.plist pod ključem pin_code. Uklanjanje ovog ključa iz plist datoteke i vraćanje rezervne kopije uklanja zahtev za PIN-om, pružajući neograničen pristup.

Rezime Testiranja Memorije za Osetljive Podatke

Kada se bavite osetljivim informacijama koje se čuvaju u memoriji aplikacije, ključno je ograničiti vreme izlaganja ovih podataka. Postoje dva osnovna pristupa za istraživanje sadržaja memorije: kreiranje dump-a memorije i analiza memorije u realnom vremenu. Oba metoda imaju svoje izazove, uključujući potencijal da se propuste ključni podaci tokom procesa dump-a ili analize.

Dobijanje i Analiza Dump-a Memorije

Za jailbroken i ne-jailbroken uređaje, alati poput objection i Fridump omogućavaju dump-ovanje memorije procesa aplikacije. Nakon što se dump-uje, analiza ovih podataka zahteva različite alate, zavisno od prirode informacija koje tražite.

Za izvlačenje stringova iz dump-a memorije, mogu se koristiti komande poput strings ili rabin2 -zz:

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

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

Za detaljniju analizu, uključujući pretragu specifičnih tipova podataka ili obrazaca, radare2 nudi obimne mogućnosti pretrage:

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

Analiza memorije u toku izvršavanja

r2frida pruža moćnu alternativu za inspekciju memorije aplikacije u realnom vremenu, bez potrebe za memorijalnim ispuštanjem. Ovaj alat omogućava izvršavanje pretraga direktno na memoriji aplikacije koja se izvršava:

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

Oštećena Kriptografija

Loši Procesi Upravljanja Ključevima

Neki programeri čuvaju osetljive podatke u lokalnom skladištu i šifriraju ih ključem koji je unapred definisan/predvidljiv u kodu. Ovo ne bi trebalo raditi jer neko ko vrši reverzni inženjering može izvući poverljive informacije.

Korišćenje Nesigurnih i/ili Zastarelih Algoritama

Programeri ne bi trebalo da koriste zastarele algoritme za obavljanje provera autorizacije, čuvanje ili slanje podataka. Neki od ovih algoritama su: RC4, MD4, MD5, SHA1... Ako se heševi koriste za čuvanje lozinki na primer, trebalo bi koristiti heševe otporne na napade brute-force zajedno sa solju.

Provera

Glavne provere koje treba obaviti su da li možete pronaći unapred definisane lozinke/tajne u kodu, ili da li su one predvidljive, i da li kod koristi neku vrstu slabih kriptografskih algoritama.

Zanimljivo je znati da možete nadgledati neke kripto biblioteke automatski koristeći objection sa:

ios monitor crypt

Za više informacija o iOS kriptografskim API-ima i bibliotekama posetite https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography

Lokalna Autentikacija

Lokalna autentikacija igra ključnu ulogu, posebno kada je u pitanju obezbeđivanje pristupa na udaljenom krajnjem tačkom putem kriptografskih metoda. Suština ovde je da bez pravilne implementacije, mehanizmi lokalne autentikacije mogu biti zaobiđeni.

Apple-ov Local Authentication framework i keychain pružaju snažne API-je za developere kako bi olakšali dijaloge autentikacije korisnika i sigurno rukovali tajnim podacima, redom. Secure Enclave obezbeđuje otisak prsta za Touch ID, dok se Face ID oslanja na prepoznavanje lica bez ugrožavanja biometrijskih podataka.

Za integraciju Touch ID/Face ID, developeri imaju dva API izbora:

  • LocalAuthentication.framework za autentikaciju korisnika na visokom nivou bez pristupa biometrijskim podacima.

  • Security.framework za pristup uslugama nižeg nivoa keychain-a, obezbeđujući tajne podatke biometrijskom autentikacijom. Različiti open-source omotači olakšavaju pristup keychain-u.

Međutim, kako LocalAuthentication.framework i Security.framework uglavnom vraćaju boolean vrednosti bez slanja podataka za autentikacione procese, podložni su zaobilaženju (videti Ne dodiruj me na taj način, od strane Davida Lindnera i drugih).

Implementacija Lokalne Autentikacije

Da bi korisnike uputili na autentikaciju, developeri treba da koriste metodu evaluatePolicy unutar klase LAContext, birajući između:

  • deviceOwnerAuthentication: Traži Touch ID ili šifru uređaja, neuspešno ako nijedno nije omogućeno.

  • deviceOwnerAuthenticationWithBiometrics: Isključivo traži Touch ID.

Uspešna autentikacija se označava boolean vrednošću koja se vraća iz evaluatePolicy, ističući potencijalnu sigurnosnu manu.

Lokalna Autentikacija korišćenjem Keychain-a

Implementacija lokalne autentikacije u iOS aplikacijama uključuje korišćenje keychain API-ja za sigurno čuvanje tajnih podataka kao što su autentikacioni tokeni. Ovaj proces osigurava da podaci mogu biti pristupljeni samo od strane korisnika, korišćenjem šifre uređaja ili biometrijske autentikacije poput Touch ID-a.

Keychain nudi mogućnost postavljanja stavki sa atributom SecAccessControl, koji ograničava pristup stavci dok korisnik uspešno autentikuje putem Touch ID-a ili šifre uređaja. Ova funkcija je ključna za unapređenje sigurnosti.

Ispod su primeri koda u Swift-u i Objective-C-u koji demonstriraju kako sačuvati i povratiti string u/from keychain-a, koristeći ove sigurnosne funkcije. Primeri posebno pokazuju kako postaviti kontrolu pristupa da zahteva autentikaciju putem Touch ID-a i osigura da su podaci dostupni samo na uređaju na kojem su postavljeni, pod uslovom da je konfigurisana šifra uređaja.

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

Analiza statičkog koda

Analiza statičkog koda je proces pregledanja izvornog koda aplikacije kako bi se pronašle potencijalne ranjivosti ili sigurnosni propusti. Ovaj proces može otkriti probleme poput hardkodiranih lozinki, nedovoljne provjere dozvola ili drugih sigurnosnih propusta koji bi mogli biti iskorišćeni od strane napadača. Postoje alati poput Clang Static Analyzer koji mogu pomoći u otkrivanju ovih problema u Objective-C kodu.

Analiza dinamičkog koda

Analiza dinamičkog koda uključuje praćenje izvršavanja aplikacije u stvarnom vremenu kako bi se identifikovali sigurnosni propusti ili ranjivosti. Ovo može uključivati praćenje mrežnih zahteva, interakciju sa uređajem ili otkrivanje potencijalnih propusta u rukovanju podacima. Korišćenje alata poput Cycript ili Frida može olakšati analizu dinamičkog koda Objective-C aplikacija.

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

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

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

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

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

Sada možemo zatražiti sačuvanu stavku iz lanca ključeva. Usluge lanca ključeva će prikazati dijalog za autentifikaciju korisniku i vratiti podatke ili nil u zavisnosti da li je pružen odgovarajući otisak prsta ili ne.

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

Objective-C

Objective-C je primarni jezik koji se koristi za razvoj iOS aplikacija. Kada vršite testiranje sigurnosti iOS aplikacija, važno je razumeti osnove Objective-C jezika kako biste mogli da identifikujete potencijalne ranjivosti.

Korisni resursi

Alati

  • class-dump: Alat koji se koristi za analizu iOS aplikacija koje su napisane u Objective-C jeziku. Omogućava vam da izvučete deklaracije klasa, metoda i promenljivih iz iOS aplikacije.

  • Cycript: Alat koji omogućava interaktivno izvršavanje JavaScript koda unutar iOS aplikacija. Može biti koristan za analizu i manipulaciju aplikacije u realnom vremenu.

  • Hopper Disassembler: Alat za dekompilaciju i analizu iOS aplikacija. Omogućava vam da proučite unutrašnju strukturu aplikacije i identifikujete potencijalne ranjivosti.

// 1. define query
NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecReturnData: @YES,
(__bridge id)kSecAttrAccount: @"My Name1",
(__bridge id)kSecAttrLabel: @"com.me.myapp.password",
(__bridge id)kSecUseOperationPrompt: @"Please, pass authorisation to enter this area" };

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

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

Otkrivanje

Korišćenje okvira u aplikaciji takođe može biti otkriveno analiziranjem liste deljenih dinamičkih biblioteka aplikacije. To se može uraditi korišćenjem otool:

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

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

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

Ako se koristi Security.framework, prikazan će biti samo drugi.

Bypass okvira za lokalnu autentikaciju

Prigovor

Putem Objection Biometrics Bypass, koji se nalazi na ovoj GitHub stranici, dostupna je tehnika za prevazilaženje mehanizma LocalAuthentication. Srž ovog pristupa uključuje korišćenje Fride za manipulaciju funkcije evaluatePolicy, osiguravajući da uvek daje rezultat True, bez obzira na stvarni uspeh autentikacije. Ovo je posebno korisno za zaobilaženje nesavršenih biometrijskih autentikacionih procesa.

Za aktiviranje ovog zaobilaska, koristi se sledeća komanda:

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

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

Frida

Primer korišćenja evaluatePolicy iz aplikacije DVIA-v2:

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

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

Za postizanje bypass-a lokalne autentikacije, napisan je Frida skript. Ovaj skript cilja proveru evaluatePolicy, presrećući njen povratni poziv kako bi se osiguralo da vraća success=1. Menjanjem ponašanja povratnog poziva, provera autentikacije efikasno se zaobilazi.

Skript ispod je ubačen kako bi modifikovao rezultat metode evaluatePolicy. Menja rezultat povratnog poziva kako bi uvek pokazivao uspeh.

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

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

Da biste ubacili Frida skriptu i zaobišli biometrijsku autentikaciju, koristi se sledeća komanda:

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

Otkrivanje Osetljive Funkcionalnosti Putem IPC

Prilagođeni URI rukovaoci / Duboki linkovi / Prilagođene šeme

pageiOS Custom URI Handlers / Deeplinks / Custom Schemes

Univerzalni Linkovi

pageiOS Universal Links

Deljenje UIActivity

pageiOS UIActivity Sharing

UIPasteboard

pageiOS UIPasteboard

App Ekstenzije

pageiOS App Extensions

Veb Pregledači

pageiOS WebViews

Serijalizacija i Kodiranje

pageiOS Serialisation and Encoding

Komunikacija Mreže

Važno je proveriti da li se komunikacija odvija bez enkripcije i takođe da li aplikacija pravilno validira TLS sertifikat servera. Da biste proverili ovakve probleme, možete koristiti proxy poput Burp:

pageiOS Burp Suite Configuration

Provera Hostname-a

Jedan uobičajeni problem prilikom validacije TLS sertifikata je provera da li je sertifikat potpisan od strane pouzdanog CA, ali ne proverava da li je hostname sertifikata hostname koji se pristupa. Da biste proverili ovaj problem koristeći Burp, nakon što poverite Burp CA na iPhone-u, možete kreirati novi sertifikat sa Burp-om za drugi hostname i koristiti ga. Ako aplikacija i dalje radi, onda je nešto ranjivo.

Pinovanje Sertifikata

Ako aplikacija pravilno koristi SSL Pinovanje, tada će aplikacija raditi samo ako je sertifikat onaj koji se očekuje. Prilikom testiranja aplikacije ovo može biti problem jer će Burp poslužiti svoj sertifikat. Da biste zaobišli ovu zaštitu unutar jailbroken uređaja, možete instalirati aplikaciju SSL Kill Switch ili instalirati Burp Mobile Assistant

Takođe možete koristiti ios sslpinning disable iz objection-a

Razno

  • U /System/Library možete pronaći okvire instalirane u telefonu koje koriste sistemski programi

  • Aplikacije instalirane od strane korisnika iz App Store-a se nalaze unutar /User/Applications

  • A /User/Library sadrži podatke sačuvane od strane aplikacija na nivou korisnika

  • Možete pristupiti /User/Library/Notes/notes.sqlite da biste pročitali beleške sačuvane unutar aplikacije.

  • Unutar fascikle instalirane aplikacije (/User/Applications/<APP ID>/) možete pronaći neke zanimljive datoteke:

    • iTunesArtwork: Ikona korišćena od strane aplikacije

    • iTunesMetadata.plist: Informacije o aplikaciji korišćene u App Store-u

    • /Library/*: Sadrži postavke i keš. U /Library/Cache/Snapshots/* možete pronaći snimak izvršen pre slanja aplikacije u pozadinu.

Vruće Popravljanje/Prinudno Ažuriranje

Programeri mogu daljinski popraviti sve instalacije svoje aplikacije odmah bez potrebe da ponovo podnesu aplikaciju App Store-u i čekaju odobrenje. Za tu svrhu se obično koristi JSPatch. Ali postoje i druge opcije poput Siren i react-native-appstore-version-checker. Ovo je opasan mehanizam koji bi mogao biti zloupotrebljen od strane zlonamernih SDK-ova, stoga se preporučuje provera koji metod se koristi za automatsko ažuriranje (ako postoji) i testiranje. Možete pokušati da preuzmete prethodnu verziju aplikacije u tu svrhu.

Treće Strane

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

Usluge koje pružaju SDK-ovi trećih strana mogu uključivati praćenje ponašanja korisnika, prikazivanje reklama ili poboljšanja korisničkog iskustva. Međutim, ovo uvodi rizik jer programeri možda nisu potpuno svesni koda koji se izvršava od strane ovih biblioteka, što dovodi do potencijalnih rizika po privatnost i sigurnost. Od suštinskog je značaja ograničiti informacije koje se dele sa uslugama trećih strana na ono što je neophodno i osigurati da osetljivi podaci nisu izloženi.

Implementacija usluga trećih strana obično dolazi u dva oblika: samostalna biblioteka ili potpuni SDK. Da bi se zaštitila privatnost korisnika, svi podaci podeljeni sa ovim uslugama trebalo bi da budu anonimizovani kako bi se sprečilo otkrivanje lično identifikacionih informacija (PII).

Da bi se identifikovale biblioteke koje aplikacija koristi, može se koristiti komanda otool. Ovaj alat treba pokrenuti protiv aplikacije i svake deljene biblioteke koju koristi kako bi se otkrile dodatne biblioteke.

otool -L <application_path>

Reference & Dodatni Resursi

Koristite Trickest da lako izgradite i automatizujete radne tokove pokretane najnaprednijim alatima zajednice na svetu. Dobijte pristup danas:

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated