iOS Pentesting
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
iOS Temelleri
Test Ortamı
Bu sayfada iOS simulator, emulators ve jailbreaking hakkında bilgi bulabilirsiniz:
İlk Analiz
Temel iOS Test İşlemleri
Test sırasında birkaç işlem önerilecektir (cihaza bağlanmak, dosyaları okuma/yazma/yükleme/indirme, bazı araçları kullanmak…). Bu nedenle, bu eylemlerden herhangi birini nasıl yapacağınızı bilmiyorsanız lütfen sayfayı okumaya başlayın:
Tip
For the following steps the app should be installed in the device and should have already obtained the IPA file of the application.
Read the Temel iOS Test İşlemleri page to learn how to do this.
Temel Statik Analiz
Bazı ilginç iOS - IPA dosyası dekompilerleri:
IPA dosyasına otomatik bir statik analiz uygulamak için MobSF aracını kullanmanız tavsiye edilir.
İkili dosyada bulunan korumaların tespiti:
- PIE (Position Independent Executable): Etkin olduğunda, uygulama her başlatıldığında rastgele bir bellek adresine yüklenir; bu da başlangıç bellek adresini tahmin etmeyi zorlaştırır.
otool -hv <app-binary> | grep PIE # It should include the PIE flag
- Stack Canaries: Yığın bütünlüğünü doğrulamak için, bir fonksiyon çağrılmadan önce yığına bir ‘canary’ değeri yerleştirilir ve fonksiyon sona erdiğinde tekrar doğrulanır.
otool -I -v <app-binary> | grep stack_chk # It should include the symbols: stack_chk_guard and stack_chk_fail
- ARC (Automatic Reference Counting): Yaygın bellek bozulma hatalarını önlemek için
otool -I -v <app-binary> | grep objc_release # It should include the _objc_release symbol
- Encrypted Binary: İkili dosya şifrelenmiş olmalıdır
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # The cryptid should be 1
Hassas/Güvensiz Fonksiyonların Tespiti
- Weak Hashing Algorithms
# On the iOS device
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"
# On linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
- Insecure Random Functions
# On the iOS device
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"
# On linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
- Insecure ‘Malloc’ Function
# On the iOS device
otool -Iv <app> | grep -w "_malloc"
# On linux
grep -iER "_malloc"
- Insecure and Vulnerable Functions
# On the iOS device
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"
# On linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"
Yaygın jailbreak tespit yöntemleri
- File System Checks: /Applications/Cydia.app veya /Library/MobileSubstrate/MobileSubstrate.dylib gibi yaygın jailbreak dosya ve dizinlerinin varlığını kontrol edin.
- Sandbox Violations: Jailbreak değilken engellenmesi gereken dosya sistemi alanlarına erişmeyi deneyin.
- API Checks:
fork()gibi yasak çağrıların kullanılıp kullanılamayacağını veyasystem()ile /bin/sh varlığını kontrol edin. - Process Checks:
Cydia,Substrateveyasshgibi bilinen jailbreak ilişkili süreçlerin varlığını izleyin. - Kernel Exploits: Jailbreak’lerde yaygın olarak kullanılan kernel exploitlerinin varlığını kontrol edin.
- Environment Variables:
DYLD_INSERT_LIBRARIESgibi jailbreak belirtisi olabilecek ortam değişkenlerini inceleyin. - Libraries Check: Uygulama sürecine yüklenen kütüphaneleri kontrol edin.
- Check schemes: Örneğin
canOpenURL(URL(string: "cydia://"))gibi scheme kontrollerini yapın.
Yaygın Anti-Debugging tespit yöntemleri
- Check for Debugger Presence: Bir debugger’ın takılı olup olmadığını kontrol etmek için
sysctlveya diğer yöntemleri kullanın. - Anti-Debugging APIs:
ptraceveyaSIGSTOPgibi anti-debugging API çağrılarını (ör.ptrace(PT_DENY_ATTACH, 0, 0, 0)) arayın. - Timing Checks: Bazı işlemlerin süresini ölçün ve debugging’e işaret edebilecek tutarsızlıkları arayın.
- Memory Checks: Bilinen debugger artifaktları veya değişiklikleri için belleği inceleyin.
- Environment Variables: Debug oturumunu gösterebilecek ortam değişkenlerini kontrol edin.
- Mach Ports: Mach exception portlarının debugger’lar tarafından kullanılıp kullanılmadığını tespit edin.
Anti-Debugging & Anti-Tamper Teknikleri (Katmanlı Kontroller)
Gerçek dünya uygulamaları genellikle pre-exec, on-attach ve sürekli kontrolleri katmanlı olarak uygular. Aranacak yaygın kalıplar (ve test sırasında bunları nasıl etkisizleştireceğiniz):
- Private API side-channel fingerprinting: Örneğin
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptionsgibi private launch API’leri, dönen kodlar/loglara göre kurulu bundle ID’leri (com.opa334.TrollStore,org.coolstar.SileoStore,com.tigisoftware.Filza, vb.) sorgulamak için kötüye kullanılabilir. Çağrıyı hook’layın ve argümanları/geri dönüş değerlerini temizleyerek temiz bir cihazı taklit edin. - Self-attestation via code-signing state:
csops()ileCS_OPS_ENTITLEMENTS_BLOBgibi entitlements okunur; beklenmeyen değerler çıkışa neden olur. Bunu, kaynakların CRC32/MD5’i, sertifika doğrulaması,LC_ENCRYPTION_INFO_64gibi Mach-O metadatası ile bütünlük kontrolleri ile birlikte kullanırlar. Bu rutinleri enstrümante edin ve analiz sırasında “beklenen” sonuçları zorlayın. - Kill-on-attach:
ptrace(PT_DENY_ATTACH)ile birlikteabort()/exit()çağrıları ile attach edildiğinde sonlandırma. Sonlandırma yolunu etkisizleştirerek veyaptrace’i deny etmeyecek şekilde hook’layarak atlatın. - Crash forensics sabotage: Çökmeden önce CPU register’larını üzerine yazarak backtrace’leri yok ederler. Çökme loglarına güvenmek yerine tespit yolundaki daha erken noktalarda breakpoint/hook kullanmayı tercih edin.
- Jetsam-based termination: Jetsam tetiklemek için kasıtlı bellek baskısı oluşturarak normal çökme logu bırakmayabilirler. Tespit mantığının çevresinde büyük tahsisatlar arayın ve logların tutulması için bu tahsisatları sınırlayın/kısa devre edin.
- Continuous checks with delayed enforcement: Kalp atışı timerları tespitleri tekrar çalıştırır ve daha sonra yaptırım uygular. Timer/dispatch source’ları izleyin ve gecikmeli kill yolunu atlatmak için işlemi canlı tutun.
Temel Dinamik Analiz
MobSF tarafından yapılan dinamik analizi inceleyin. Farklı görünümler arasında gezinip onlarla etkileşimde bulunmanız gerekecek; ancak MobSF bazı sınıfları hook’layacak ve işlem tamamlandığında bir rapor hazırlayacaktır.
Yüklü Uygulamaları Listeleme
Yüklü uygulamaların bundle identifier’ını belirlemek için frida-ps -Uai komutunu kullanın:
$ 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
Temel Enumeration & Hooking
Uygulamanın bileşenlerini enumerate etmeyi ve objection ile yöntemleri ve sınıfları kolayca hook etmeyi öğrenin:
IPA Yapısı
Bir IPA file’ın yapısı esasen bir zipped package’ın yapısıdır. Uzantısını .zip olarak değiştirerek içeriğini açabilir ve dosyalarını görebilirsiniz. Bu yapıda bir Bundle, yüklemeye hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçeride uygulamanın kaynaklarını kapsayan <NAME>.app adlı bir dizin bulunur.
Info.plist: Bu dosya uygulamanın belirli yapılandırma ayrıntılarını içerir._CodeSignature/: Bu dizin, bir imza içeren bir plist dosyası barındırır; bu da bundle içindeki tüm dosyaların bütünlüğünü sağlar.Assets.car: İkonlar gibi varlık dosyalarını depolayan sıkıştırılmış bir arşivdir.Frameworks/: Bu klasör, uygulamanın native kütüphanelerini barındırır; bunlar.dylibveya.frameworkdosyaları şeklinde olabilir.PlugIns/: Bu klasör, uygulamaya eklenti olarak.appexdosyalarını içerebilir; ancak bunlar her zaman bulunmayabilir. *Core Data: Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve tek bir cihazda geri alma (undo) işlevi eklemek için kullanılır. Tek bir iCloud hesabındaki birden fazla cihaz arasında verileri senkronize etmek için Core Data, şemanızı otomatik olarak bir CloudKit container’ına yansıtır.PkgInfo:PkgInfodosyası, uygulamanızın veya bundle’ınızın type ve creator kodlarını belirtmek için alternatif bir yoldur.- en.lproj, fr.proj, Base.lproj: Belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmiyorsa varsayılan kaynak sağlar.
- Güvenlik:
_CodeSignature/dizini, dijital imzalar aracılığıyla paketlenmiş tüm dosyaların bütünlüğünü doğrulayarak uygulamanın güvenliğinde kritik bir rol oynar. - Varlık Yönetimi:
Assets.cardosyası, grafik varlıklarını verimli şekilde yönetmek için sıkıştırma kullanır; bu, uygulama performansının optimize edilmesi ve toplam boyutunun azaltılması için önemlidir. - Frameworks ve PlugIns: Bu dizinler, iOS uygulamalarının modülerliğini vurgular; geliştiricilerin yeniden kullanılabilir kod kütüphaneleri (
Frameworks/) eklemesine ve uygulama işlevselliğini (PlugIns/) genişletmesine olanak tanır. - Yerelleştirme: Yapı, belirli dil paketleri için kaynaklar dahil ederek çoklu dilleri destekler ve uygulamanın küresel erişimini kolaylaştırır.
Info.plist
Info.plist, iOS uygulamaları için temel bir bileşen olarak hizmet eder; önemli yapılandırma verilerini key-value çiftleri halinde kapsar. Bu dosya yalnızca uygulamalar için değil, aynı zamanda paketlenmiş app extension’lar ve framework’ler için de gereklidir. XML veya binary formatında yapılandırılabilir ve uygulama izinlerinden güvenlik ayarlarına kadar kritik bilgileri barındırır. Mevcut anahtarların detaylı bir incelemesi için Apple Developer Documentation başvurabilirsiniz.
Bu dosya ile daha erişilebilir bir formatta çalışmak isteyenler için XML dönüşümü, macOS’ta yerel olarak bulunan plutil (10.2 ve sonrasında) veya Linux’ta plistutil kullanılarak kolayca gerçekleştirilebilir. Dönüşüm için kullanılacak komutlar şunlardır:
- macOS için:
$ plutil -convert xml1 Info.plist
- Linux için:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Info.plist dosyasının açığa çıkarabileceği çok sayıdaki bilgi arasında, dikkat çekici girdiler uygulama izin dizeleri (UsageDescription), özel URL şemaları (CFBundleURLTypes) ve App Transport Security için yapılandırmalar (NSAppTransportSecurity) gibi öğelerdir. Bu girdiler, UTExportedTypeDeclarations / UTImportedTypeDeclarations gibi dışa/içe aktarılan özel belge türleriyle birlikte, dosyayı inceleyerek veya basit bir grep komutu kullanarak kolayca bulunabilir:
$ grep -i <keyword> Info.plist
Veri Yolları
iOS ortamında dizinler özellikle sistem uygulamaları ve kullanıcı tarafından yüklenen uygulamalar için ayrılmıştır. Sistem uygulamaları /Applications dizininde bulunurken, kullanıcı tarafından yüklenen uygulamalar /var/mobile/containers/Data/Application/ altında yer alır. Bu uygulamalara 128-bit UUID olarak bilinen benzersiz bir kimlik atanır; dizin adlarının rastgele olması nedeniyle bir uygulamanın klasörünü elle bulmak zorlaşır.
Warning
iOS’ta uygulamaların sandbox içinde olması gerektiğinden, her uygulamanın ayrıca
$HOME/Library/Containersiçinde uygulamanınCFBundleIdentifierdeğerini klasör adı olarak kullanan bir klasörü olur.Ancak, her iki klasörde (data & container klasörleri) de her iki dosyayı
MCMetadataIdentifieranahtarında birbirine bağlayan.com.apple.mobile_container_manager.metadata.plistdosyası bulunur).
Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini bulmayı kolaylaştırmak için objection tool env adlı kullanışlı bir komut sağlar. Bu komut ilgili uygulama için ayrıntılı dizin bilgilerini gösterir. Aşağıda bu komutun nasıl kullanıldığına dair bir örnek bulunmaktadır:
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
Alternatif olarak, uygulama adı /private/var/containers içinde find komutunu kullanarak aranabilir:
find /private/var/containers -name "Progname*"
ps ve lsof gibi komutlar ayrıca uygulamanın sürecini tespit etmek ve açık dosyaları sırasıyla listelemek için kullanılabilir; bu da uygulamanın aktif dizin yolları hakkında bilgi sağlar:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
Bundle dizini:
- AppName.app
- Bu, IPA’da daha önce gördüğümüz Application Bundle’dır; temel uygulama verilerini, statik içeriği ve uygulamanın derlenmiş ikili dosyasını içerir.
- Bu dizin kullanıcılara görünür, ancak kullanıcılar buraya yazamaz.
- Bu dizindeki içerik yedeklenmez.
- Bu klasörün içeriği kod imzasını doğrulamak için kullanılır.
Data dizini:
- Documents/
- Tüm kullanıcı tarafından oluşturulan verileri içerir. Bu verilerin oluşturulmasını uygulama son kullanıcısı başlatır.
- Kullanıcılara görünür ve kullanıcılar buraya yazabilir.
- Bu dizindeki içerik yedeklenir.
- Uygulama,
NSURLIsExcludedFromBackupKeyanahtarını ayarlayarak yolların yedeklenmesini devre dışı bırakabilir. - Library/
- Kullanıcıya özel olmayan tüm dosyaları içerir; örneğin caches, preferences, cookies ve property list (plist) yapılandırma dosyaları.
- iOS uygulamaları genellikle
Application SupportveCachesalt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir. - Library/Caches/
- Yarı kalıcı önbellek dosyalarını içerir.
- Kullanıcılara görünmez ve kullanıcılar buraya yazamaz.
- Bu dizindeki içerik yedeklenmez.
- Uygulama çalışmıyorken ve depolama alanı azaldığında, işletim sistemi bu dizindeki dosyaları otomatik olarak silebilir.
- Library/Application Support/
- Uygulamanın çalışması için gerekli kalıcı dosyaları içerir.
- Kullanıcılara görünmezdir ve kullanıcılar buraya yazamaz.
- Bu dizindeki içerik yedeklenir.
- Uygulama,
NSURLIsExcludedFromBackupKeyanahtarını ayarlayarak yolların yedeklenmesini devre dışı bırakabilir. - Library/Preferences/
- Uygulama yeniden başlatıldığında bile kalıcı olabilen özellikleri depolamak için kullanılır.
- Bilgiler uygulama sandbox’ı içinde, [BUNDLE_ID].plist adlı bir plist dosyasında şifrelenmemiş olarak kaydedilir.
NSUserDefaultsile saklanan tüm anahtar/değer çiftleri bu dosyada bulunabilir.- tmp/
- Bu dizini, uygulama başlatmaları arasında kalması gerekmeyen geçici dosyaları yazmak için kullanın.
- Kalıcı olmayan önbellek dosyalarını içerir.
- Kullanıcılara görünmez.
- Bu dizindeki içerik yedeklenmez.
- Uygulama çalışmıyorken ve depolama alanı azaldığında, işletim sistemi bu dizindeki dosyaları otomatik olarak silebilir.
Bundle dizini içindeki iGoat-Swift’in Application Bundle (.app) dizinine (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app) daha yakından bakalım:
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 klasörünün içinde <application-name> adlı bir binary dosyası bulacaksınız. Bu, çalıştırılacak dosyadır. Binary dosyasını temel olarak incelemek için otool aracını kullanabilirsiniz:
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)
[...]
Uygulamanın şifrelenip şifrelenmediğini kontrol edin
Aşağıdaki için herhangi bir çıktı olup olmadığını kontrol edin:
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
Binary’i disassemble etme
text section’ını disassemble et:
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
Örnek uygulamanın Objective-C segmentini yazdırmak için şunu kullanabilirsiniz:
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
Daha kompakt bir Objective-C kodu elde etmek için 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;
};
Bununla birlikte, ikiliyi disassemble etmek için en iyi seçenekler: Hopper and IDA.
Veri Depolama
iOS’un cihazda verileri nasıl sakladığını öğrenmek için bu sayfayı okuyun:
Warning
Aşağıdaki bilgi saklama yerleri uygulamayı kurduktan hemen sonra, uygulamanın tüm fonksiyonlarını kontrol ettikten sonra ve hatta bir kullanıcıdan çıkış yapıp başka bir kullanıcı ile giriş yaptıktan sonra kontrol edilmelidir.
Amaç, uygulamanın (parolalar, tokenlar), mevcut kullanıcının ve önceden oturum açmış kullanıcıların korumasız hassas bilgilerini bulmaktır.
Plist
plist dosyaları yapılandırılmış XML dosyalarıdır ve anahtar-değer çiftleri içerir. Bu, kalıcı veri saklamanın bir yoludur; bu yüzden bazen bu dosyalarda hassas bilgiler bulabilirsiniz. Yeni verilerin yazılıp yazılmadığını görmek için bu dosyaları uygulamayı yükledikten sonra ve yoğun kullandıktan sonra kontrol etmeniz önerilir.
Plist dosyalarında veri kalıcılığı sağlamanın en yaygın yolu NSUserDefaults kullanımıdır. Bu plist dosyası uygulama sandbox’ı içinde Library/Preferences/<appBundleID>.plist konumuna kaydedilir.
The NSUserDefaults sınıfı, varsayılan sistem ile etkileşim kurmak için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın davranışını kullanıcı tercihleri doğrultusunda özelleştirmesine izin verir. NSUserDefaults ile kaydedilen veriler uygulama paketinde görüntülenebilir. Bu sınıf verileri bir plist dosyasında saklar, ancak küçük miktarlardaki veri için kullanılmak üzere tasarlanmıştır.
Bu verilere artık doğrudan güvenilir bir bilgisayar üzerinden erişilemez, ancak bir yedekleme yapılarak erişilebilir.
Kayıtlı bilgileri dump etmek için objection’ın ios nsuserdefaults get komutunu kullanabilirsiniz
Uygulama tarafından kullanılan tüm plist’leri bulmak için /private/var/mobile/Containers/Data/Application/{APPID} dizinine erişip şu komutu çalıştırabilirsiniz:
find ./ -name "*.plist"
Dosyaları XML veya ikili (bplist) formatından XML’e dönüştürmek için işletim sisteminize bağlı çeşitli yöntemler mevcuttur:
macOS Kullanıcıları için: plutil komutunu kullanın. Bu amaç için macOS (10.2+) içinde yerleşik bir araçtır:
$ plutil -convert xml1 Info.plist
Linux Kullanıcıları İçin: Önce libplist-utils paketini kurun, ardından dosyanızı dönüştürmek için plistutil kullanın:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Within an Objection Session: Mobil uygulamaları analiz etmek için, belirli bir komut plist dosyalarını doğrudan dönüştürmenizi sağlar:
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
Core Data
Core Data uygulamanızdaki nesnelerin model katmanını yönetmek için kullanılan bir framework’tür. Core Data can use SQLite as its persistent store, ancak framework kendisi bir veritabanı değildir.
CoreData varsayılan olarak verilerini şifrelemez. Ancak CoreData’ya ek bir şifreleme katmanı eklenebilir. Daha fazla bilgi için GitHub Repo’ya bakın.
You can find the SQLite Core Data information of an application in the path /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
Eğer SQLite’ı açıp hassas bilgilere erişebiliyorsanız, yanlış bir yapılandırma buldunuz.
-(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 üzerine inşa edilmiş bir anahtar/değer deposudur.
Yap veritabanları sqlite veritabanları olduğundan, bunları önceki bölümde önerilen komutu kullanarak bulabilirsiniz.
Diğer SQLite Databases
Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bunlar üzerinde hassas veri saklayabilirler ve şifrelenmemiş bırakılabilir. Bu yüzden uygulama dizinindeki tüm veritabanlarını kontrol etmek her zaman faydalıdır. Bu yüzden verilerin kaydedildiği uygulama dizinine gidin (/private/var/mobile/Containers/Data/Application/{APPID})
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Real-Time Databases
Geliştiriciler, Firebase Real-Time Databases aracılığıyla verileri bir NoSQL bulut barındırılan veritabanında depolayıp senkronize edebilirler. JSON formatında saklanan veriler, gerçek zamanlı olarak tüm bağlı istemcilere eşzamanlanır.
You can find how to check for misconfigured Firebase databases here:
Realm databases
Realm Objective-C ve Realm Swift Apple tarafından sağlanmayan veri depolama için güçlü bir alternatif sunar. Varsayılan olarak verileri şifrelenmemiş olarak saklarlar; şifreleme ise belirli yapılandırmalar aracılığıyla kullanılabilir.
The databases are located at: /private/var/mobile/Containers/Data/Application/{APPID}. To explore these files, one can utilize commands like:
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*"
Bu veritabanı dosyalarını görüntülemek için Realm Studio aracı önerilir.
Realm veritabanı içinde şifreleme uygulamak için aşağıdaki kod parçası kullanılabilir:
// 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 Veritabanları
Couchbase Lite hafif ve gömülü bir veritabanı motoru olarak tanımlanır ve belge-odaklı (NoSQL) yaklaşımı takip eder. iOS ve macOS için yerel olarak tasarlanmıştır ve verileri sorunsuz bir şekilde senkronize etme yeteneği sunar.
Bir cihazda potansiyel Couchbase veritabanlarını tespit etmek için aşağıdaki dizin incelenmelidir:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Cookies
iOS uygulamaların çerezlerini her uygulamanın klasörü içindeki Library/Cookies/cookies.binarycookies dosyasında saklar. Ancak geliştiriciler bazen bunları keychain’e kaydetmeyi tercih ederler; çünkü bahsedilen cookie dosyasına yedeklerden erişilebilir.
Çerez dosyasını incelemek için this python script veya objection’ın ios cookies get. komutunu kullanabilirsiniz.
Ayrıca objection’ı kullanarak bu dosyaları JSON formatına dönüştürüp veriyi inceleyebilirsiniz.
...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"
}
]
Önbellek
Varsayılan olarak NSURLSession, HTTP istekleri ve yanıtları gibi verileri Cache.db veritabanında saklar. Bu veritabanı, tokenler, kullanıcı adları veya başka hassas bilgilerin önbelleğe alınması durumunda hassas veriler içerebilir. Önbelleğe alınmış bilgileri bulmak için uygulamanın veri dizinini (/var/mobile/Containers/Data/Application/<UUID>) açıp /Library/Caches/<Bundle Identifier> dizinine gidin. WebKit cache’i de Cache.db dosyasında saklanır. Objection, bunun normal bir SQLite veritabanı olması nedeniyle sqlite connect Cache.db komutuyla veritabanını açıp etkileşime girebilir.
Bu verilerin önbelleğe alınmasının devre dışı bırakılması önerilir, çünkü istek veya yanıtta hassas bilgiler bulunabilir. Aşağıdaki liste bunu başarmak için çeşitli yolları gösterir:
- Logout sonrası önbelleğe alınmış yanıtların kaldırılması önerilir. Bu, Apple tarafından sağlanan
removeAllCachedResponsesadlı yöntemle yapılabilir. Bu yöntemi şu şekilde çağırabilirsiniz:
URLCache.shared.removeAllCachedResponses()
Bu yöntem Cache.db dosyasından tüm önbelleğe alınmış istekleri ve yanıtları kaldırır.
- Eğer cookies avantajını kullanmanıza gerek yoksa, URLSession’ın .ephemeral yapılandırma özelliğini kullanmanız önerilir; bu, cookies ve önbelleklerin kaydedilmesini devre dışı bırakır.
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, Cache Policy’i .notAllowed olarak ayarlayarak da devre dışı bırakılabilir. Bu, hem bellekte hem de diskte herhangi bir şekilde Cache depolamayı engeller.
Anlık Görüntüler
Ana düğmeye basıldığında, iOS geçerli ekranın bir anlık görüntüsünü alır; bu, uygulama geçişlerini daha akıcı yapmak içindir. Ancak, geçerli ekranda hassas veri varsa, bu görüntüde kaydedilir (ve bu görüntü yeniden başlatmalar arasında kalıcıdır). Bunlar, uygulamalar arasında geçiş yapmak için ana ekrana çift dokunduğunuzda erişebileceğiniz anlık görüntülerdir.
iPhone jailbreakli değilse, bu ekran görüntülerini görmek için saldırganın cihazın kilidinin açık olması gerekir. Varsayılan olarak son anlık görüntü uygulamanın sandbox’ında Library/Caches/Snapshots/ veya Library/SplashBoard/Snapshots klasöründe saklanır (güvenilir bilgisayarlar iOX 7.0’ten itibaren dosya sistemine erişemez).
Bu istenmeyen davranışı önlemenin bir yolu, ApplicationDidEnterBackground() fonksiyonunu kullanarak anlık görüntü alınmadan önce boş bir ekran göstermek veya hassas verileri kaldırmaktır.
Aşağıda varsayılan bir ekran görüntüsü ayarlayacak örnek bir düzeltme yöntemi bulunmaktadır.
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];
}
Bu, uygulama arka plana alındığında arka plan resmini overlayImage.png olarak ayarlar. overlayImage.png her zaman mevcut görünümün yerini alacağı için hassas veri leak’lerini önler.
Keychain
iOS keychain’e erişim ve yönetim için, jailbroken cihazlar için uygun olan Keychain-Dumper gibi araçlar mevcuttur. Ayrıca, Objection benzer amaçlar için ios keychain dump komutunu sağlar.
Kimlik Bilgilerini Saklama
NSURLCredential sınıfı, hassas bilgileri doğrudan keychain’e kaydetmek için idealdir; NSUserDefaults veya diğer sarıcıları kullanmaya gerek bırakmaz. Girişten sonra kimlik bilgilerini saklamak için aşağıdaki Swift kodu kullanılır:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Bu saklı kimlik bilgilerini çıkarmak için Objection’ın ios nsurlcredentialstorage dump komutu kullanılır.
Özel Klavyeler ve Klavye Önbelleği
iOS 8.0 ve sonrasında kullanıcılar Settings > General > Keyboard > Keyboards altında yönetilebilen özel klavye eklentileri yükleyebilir. Bu klavyeler gelişmiş işlevsellik sunsa da keystroke logging ve verilerin harici sunuculara iletilmesi riski taşır; ağ erişimi gerektiren klavyeler hakkında kullanıcılar bilgilendirilir. Uygulamalar, hassas bilgi girişi için özel klavyelerin kullanımını kısıtlayabilir ve kısıtlamalıdır.
Güvenlik Önerileri:
- Artırılmış güvenlik için üçüncü taraf klavyelerin devre dışı bırakılması önerilir.
- Varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneriler özelliklerinin
Library/Keyboard/{locale}-dynamic-text.datveya/private/var/mobile/Library/Keyboard/dynamic-text.datkonumlarındaki önbellek dosyalarında hassas bilgileri saklayabileceğinin farkında olun. Bu önbellek dosyaları düzenli olarak hassas veriler açısından kontrol edilmelidir. Önbelleğe alınmış verileri temizlemek için Settings > General > Reset > Reset Keyboard Dictionary ile klavye sözlüğünün sıfırlanması önerilir. - Ağ trafiğinin yakalanması, bir özel klavyenin tuş vuruşlarını (keystrokes) uzaktan iletip iletmediğini ortaya çıkarabilir.
Metin Alanı Önbelleklemesini Önleme
The UITextInputTraits protocol offers properties to manage autocorrection and secure text entry, sensitive information caching’ini önlemek için önemlidir. Örneğin, otomatik düzeltmeyi devre dışı bırakmak ve güvenli metin girişini etkinleştirmek şu şekilde yapılabilir:
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
Ayrıca geliştiriciler, özellikle şifre ve PIN gibi hassas bilgilerin girildiği metin alanlarının önbelleklemenin devre dışı bırakıldığından emin olmalıdır; bunun için autocorrectionType değerini UITextAutocorrectionTypeNo ve secureTextEntry değerini YES olarak ayarlamalıdır.
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Logs
Kod hata ayıklama genellikle logging kullanımını içerir. Bir risk vardır çünkü logs hassas bilgiler içerebilir. Önceden, iOS 6 ve önceki sürümlerde, logs tüm uygulamalar tarafından erişilebiliyordu ve bu durum hassas verilerin leak riskini doğuruyordu. Şimdi, uygulamalar yalnızca kendi logs’larına erişebilmektedir.
Bu kısıtlamalara rağmen, kilidi açık bir cihaza fiziksel erişimi olan bir attacker yine de cihazı bir bilgisayara bağlayarak bunu istismar edebilir ve logs’ları okuyabilir. Uygulama kaldırıldıktan sonra bile logs’ların disk üzerinde kaldığını not etmek önemlidir.
Riski azaltmak için, uygulama ile tam kapsamlı etkileşimde bulunmanız, tüm işlevleri ve girdileri test etmeniz ve istemeden hassas bilgi kaydedilmediğinden emin olmanız önerilir.
Uygulamanın kaynak kodunu potansiyel leakler için incelerken, hem predefined hem de custom logging statements için yerleşik fonksiyonlarda NSLog, NSAssert, NSCAssert, fprintf gibi anahtar kelimeleri ve custom implementasyonlar için Logging veya Logfile gibi ifadeleri arayın.
Monitoring System Logs
Uygulamalar hassas olabilecek çeşitli bilgiler kaydeder. Bu logs’ları izlemek için şu tür araçlar ve komutlar kullanılabilir:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
kullanışlıdır. Ayrıca, Xcode konsol günlüklerini toplamak için bir yol sağlar:
- Xcode’u açın.
- iOS cihazını bağlayın.
- Window -> Devices and Simulators menüsüne gidin.
- Cihazınızı seçin.
- İncelediğiniz sorunu tetikleyin.
- Kayıtları yeni bir pencerede görmek için Open Console düğmesini kullanın.
Daha gelişmiş günlükleme için, cihaza shell ile bağlanmak ve socat kullanmak gerçek zamanlı günlük izlemesi sağlayabilir:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Log aktivitelerini gözlemlemek için verilen komutlar, sorunları teşhis etmek veya loglarda potansiyel data leakage tespit etmek için çok değerli olabilir.
Yedekler
Otomatik yedekleme özellikleri iOS’a entegre edilmiştir ve iTunes (macOS Catalina’ya kadar), Finder (macOS Catalina’dan itibaren) veya iCloud aracılığıyla cihaz verilerinin kopyalarının oluşturulmasını kolaylaştırır. Bu yedekler Apple Pay bilgileri ve Touch ID yapılandırmaları gibi son derece hassas öğeler hariç neredeyse tüm cihaz verilerini kapsar.
Güvenlik Riskleri
Yedeklere yüklü uygulamalar ve verileri dahil edilmesi, potansiyel data leakage ve yedek üzerinde yapılan değişikliklerin uygulama işlevselliğini değiştirebilme riski gibi sorunları gündeme getirir. Bu riskleri azaltmak için herhangi bir uygulamanın dizininde veya alt dizinlerinde hassas bilgileri açık metin olarak saklamamak tavsiye edilir.
Yedeklerden Dosyaları Hariç Tutma
Documents/ ve Library/Application Support/ içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, belirli dosya veya dizinleri yedeklerden hariç tutmak için NSURL setResourceValue:forKey:error: ile NSURLIsExcludedFromBackupKey’i kullanabilir. Bu uygulama, hassas verilerin yedeklere dahil edilmesini önlemek için kritiktir.
Zayıflıkları Test Etme
Bir uygulamanın yedek güvenliğini değerlendirmek için önce Finder kullanarak bir yedek oluşturun, sonra Apple’ın resmi dokümantasyonundaki rehbere göre yedeğin yerini bulun. Uygulama davranışını etkileyebilecek şekilde değiştirilebilecek hassas veri veya yapılandırmaları analiz edin.
Hassas bilgiler, komut satırı araçları veya iMazing gibi uygulamalar kullanılarak aranabilir. Şifreli yedekler için, yedeğin kökündeki “Manifest.plist” dosyasındaki “IsEncrypted” anahtarına bakılarak şifrelemenin varlığı doğrulanabilir.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>
For dealing with encrypted backups, Python scripts available in DinoSec’s GitHub repo, like backup_tool.py and backup_passwd.py, may be useful, albeit potentially requiring adjustments for compatibility with the latest iTunes/Finder versions. The iOSbackup tool is another option for accessing files within password-protected backups.
Modifying App Behavior
An example of altering app behavior through backup modifications is demonstrated in the Bither bitcoin wallet app, where the UI lock PIN is stored within net.bither.plist under the pin_code key. Removing this key from the plist and restoring the backup removes the PIN requirement, providing unrestricted access.
Summary on Memory Testing for Sensitive Data
Bir uygulamanın belleğinde saklanan hassas bilgilerle uğraşırken, bu verilerin açık kalma süresini sınırlamak çok önemlidir. Bellek içeriğini incelemenin iki temel yaklaşımı vardır: creating a memory dump ve analyzing the memory in real time. Her iki yöntemin de, döküm veya analiz sırasında kritik verilerin kaçırılması ihtimali dahil olmak üzere zorlukları vardır.
Retrieving and Analyzing a Memory Dump
For both jailbroken and non-jailbroken devices, tools like objection and Fridump allow for the dumping of an app’s process memory. Once dumped, analyzing this data requires various tools, depending on the nature of the information you’re searching for.
To extract strings from a memory dump, commands such as strings or rabin2 -zz can be used:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
Daha ayrıntılı analiz için, belirli veri türlerini veya desenleri aramak da dahil olmak üzere, radare2 kapsamlı arama yetenekleri sunar:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
Çalışma Zamanı Bellek Analizi
r2frida gerçek zamanlı olarak bir uygulamanın belleğini, memory dump gerektirmeden incelemek için güçlü bir alternatif sunar. Bu araç, çalışmakta olan uygulamanın belleği üzerinde doğrudan search commands çalıştırmaya olanak sağlar:
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
Kırık Kriptografi
Zayıf Anahtar Yönetim Süreçleri
Bazı geliştiriciler hassas verileri local storage’a kaydeder ve kod içinde hardcoded/predictable bir anahtarla şifreler. Bu yapılmamalıdır çünkü bazı reversing işlemleri saldırganların gizli bilgileri çıkarmasına izin verebilir.
Güvensiz ve/veya Deprecated Algorithms Kullanımı
Geliştiriciler yetkilendirme checks yapmak, verileri store etmek veya sendmek için deprecated algorithms kullanmamalıdır. Bu algoritmalardan bazıları: RC4, MD4, MD5, SHA1… Örneğin parolaları depolamak için hashes kullanılıyorsa, hash’ler brute-force resistant olacak şekilde ve salt ile birlikte kullanılmalıdır.
Kontrol
Yapılması gereken ana kontroller, kod içinde hardcoded passwords/secrets olup olmadığını, bunların predictable olup olmadığını ve kodun bazı weak cryptography algoritmaları kullanıp kullanmadığını kontrol etmektir.
Bazı crypto libraries’i otomatik olarak monitor edebileceğinizi bilmek ilginçtir; bunu objection ile şu şekilde yapabilirsiniz:
ios monitor crypt
For more information about iOS cryptographic APIs and libraries access https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography
Yerel Kimlik Doğrulama
Yerel kimlik doğrulama özellikle kriptografik yöntemlerle uzak bir uç noktanın erişimini korumak söz konusu olduğunda kritik bir rol oynar. Özü şu ki, uygun şekilde uygulanmadığında yerel kimlik doğrulama mekanizmaları atlatılabilir.
Apple’ın Local Authentication framework ve keychain geliştiricilere sırasıyla kullanıcı kimlik doğrulama diyaloglarını kolaylaştırmak ve gizli verileri güvenli şekilde işlemek için sağlam API’ler sağlar. Secure Enclave, Touch ID için parmak izi kimliğini güvence altına alırken, Face ID biyometrik verileri tehlikeye atmadan yüz tanımaya dayanır.
Touch ID/Face ID entegrasyonu için geliştiricilerin iki API seçeneği vardır:
LocalAuthentication.framework— biyometrik verilere erişim olmadan yüksek seviyeli kullanıcı kimlik doğrulaması için.Security.framework— düşük seviyeli keychain servislerine erişim için; gizli verileri biyometrik kimlik doğrulamayla güvence altına alır. Çeşitli open-source wrappers keychain erişimini basitleştirir.
Caution
Ancak hem
LocalAuthentication.frameworkhem deSecurity.frameworkzafiyetler barındırır; bunlar öncelikle kimlik doğrulama işlemleri için veri iletmeden boolean değerler döndürdüğünden atlatılmaya açık olabilirler (bkz. Don’t touch me that way, by David Lindner et al).
Implementing Local Authentication
Kullanıcıyı kimlik doğrulama için istemek üzere geliştiriciler LAContext sınıfındaki evaluatePolicy metodunu kullanmalı ve şu seçenekler arasından seçim yapmalıdır:
deviceOwnerAuthentication: Touch ID veya cihaz parola kodu ister; hiçbiri etkin değilse başarısız olur.deviceOwnerAuthenticationWithBiometrics: Yalnızca Touch ID için ister.
Başarılı bir kimlik doğrulama evaluatePolicy’un boolean döndürmesiyle gösterilir; bu da potansiyel bir güvenlik açığını ortaya koyar.
Keychain Kullanarak Yerel Kimlik Doğrulama
iOS uygulamalarında yerel kimlik doğrulama uygulamak, authentication tokenları gibi gizli verileri güvenli şekilde depolamak için keychain API’lerinin kullanılmasını içerir. Bu işlem, verilerin yalnızca kullanıcı tarafından, cihaz parola kodu veya Touch ID gibi biyometrik doğrulama kullanılarak erişilebilmesini sağlar.
Keychain, öğeleri SecAccessControl özniteliğiyle ayarlama olanağı sunar; bu, kullanıcı Touch ID veya cihaz parola kodu ile başarılı bir şekilde kimlik doğrulaması yapana kadar öğeye erişimi kısıtlar. Bu özellik güvenliğin artırılması açısından kritik öneme sahiptir.
Aşağıda Swift ve Objective-C’de, bu güvenlik özelliklerinden yararlanarak bir stringin keychain’e nasıl kaydedilip geri alınacağını gösteren kod örnekleri yer almaktadır. Örnekler özellikle Touch ID kimlik doğrulamasını gerektirecek şekilde erişim kontrolünün nasıl ayarlanacağını ve verinin yalnızca oluşturulduğu cihazda, cihaz parola kodu yapılandırılmışsa erişilebilir olacağının nasıl sağlanacağını gösterir.
// 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
}
Artık keychain’den kaydedilmiş öğeyi isteyebiliriz. Keychain services kullanıcıya kimlik doğrulama iletişim kutusunu gösterir ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veri veya nil döndürür.
// 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
}
Tespit
Bir uygulamadaki framework kullanımını, uygulama ikili dosyasının paylaşılan dinamik kütüphaneler listesini analiz ederek tespit etmek de mümkündür. Bu, otool kullanılarak yapılabilir:
$ otool -L <AppName>.app/<AppName>
Eğer bir uygulamada LocalAuthentication.framework kullanılıyorsa, çıktı aşağıdaki iki satırı içerecektir (unutmayın ki LocalAuthentication.framework arka planda Security.framework’i kullanır):
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
Eğer Security.framework kullanılıyorsa, yalnızca ikincisi gösterilecektir.
Local Authentication Framework Bypass
Objection
Bu Objection Biometrics Bypass, located at this GitHub page, üzerinden LocalAuthentication mekanizmasını aşmak için kullanılabilecek bir tekniktir. Bu yöntemin özü, evaluatePolicy fonksiyonunu manipüle etmek için Frida kullanmaya dayanır; böylece gerçek kimlik doğrulama sonucundan bağımsız olarak True döndürmesi sağlanır. Bu, hatalı biyometrik kimlik doğrulama süreçlerini atlatmak için özellikle kullanışlıdır.
Bu bypass’ı etkinleştirmek için aşağıdaki komut kullanılır:
...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
Bu komut, Objection’ın evaluatePolicy kontrolünün sonucunu etkin bir şekilde True olarak değiştiren bir görevi kaydettiği bir diziyi başlatır.
Frida
Aşağıda DVIA-v2 application içindeki evaluatePolicy kullanımına bir örnek verilmiştir:
+(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"];
});
}
}
Local Authentication’ın bypass’ını gerçekleştirmek için bir Frida scripti yazılır. Bu script, evaluatePolicy kontrolünü hedefler ve callback’ini keserek success=1 döndürmesini sağlar. Callback’in davranışını değiştirerek, authentication check etkili bir şekilde bypass edilir.
Aşağıdaki script, evaluatePolicy method’unun sonucunu değiştirmek için enjekte edilir. Callback’in sonucunu her zaman success gösterecek şekilde değiştirir.
// 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!");
}
Frida script’ini enjekte etmek ve biyometrik kimlik doğrulamayı atlatmak için aşağıdaki komut kullanılır:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
IPC Yoluyla Hassas Fonksiyonellik İfşası
Custom URI Handlers / Deeplinks / Custom Schemes
iOS Custom URI Handlers / Deeplinks / Custom Schemes
Universal Links
UIActivity Sharing
UIPasteboard
App Extensions
WebViews
Serialisation and Encoding
iOS Serialisation and Encoding
Network Communication
İletişimin şifreleme olmadan gerçekleşmediğini ve uygulamanın sunucunun TLS sertifikasını doğru şekilde doğruladığını kontrol etmek önemlidir.
Bu tür sorunları kontrol etmek için Burp gibi bir proxy kullanabilirsiniz:
Hostname kontrolü
TLS sertifikasının doğrulanmasında sık rastlanan bir sorun, sertifikanın güvenilir bir CA tarafından imzalandığının kontrol edilmesi fakat sertifikanın hostname’inin erişilen hostname ile eşleşip eşleşmediğinin kontrol edilmemesidir.
Bu sorunu Burp ile kontrol etmek için, iPhone’da Burp CA’ya güven verdikten sonra, Burp ile farklı bir hostname için yeni bir sertifika oluşturabilir ve bunu kullanabilirsiniz. Uygulama hâlâ çalışıyorsa, uygulama bu açıdan kırılgandır.
Certificate Pinning
Eğer bir uygulama SSL Pinning’i doğru şekilde kullanıyorsa, uygulama yalnızca beklenen sertifika kullanıldığında çalışır. Bir uygulamayı test ederken bu sorun yaratabilir çünkü Burp kendi sertifikasını sunar.
Bu korumayı jailbreakli bir cihaz içinde bypass etmek için uygulamayı SSL Kill Switch ile yükleyebilir veya Burp Mobile Assistant kurabilirsiniz.
Ayrıca objection’ın ios sslpinning disable komutunu da kullanabilirsiniz.
Diğer
- In
/System/Libraryyou can find the frameworks installed in the phone used by system applications - The applications installed by the user from the App Store are located inside
/User/Applications - And the
/User/Librarycontains data saved by the user level applications - You can access
/User/Library/Notes/notes.sqliteto read the notes saved inside the application. - Inside the folder of an installed application (
/User/Applications/<APP ID>/) you can find some interesting files: iTunesArtwork: The icon used by the appiTunesMetadata.plist: Info of the app used in the App Store/Library/*: Contains the preferences and cache. In/Library/Cache/Snapshots/*you can find the snapshot performed to the application before sending it to the background.
Hot Patching/Enforced Updateing
Geliştiriciler, uygulamalarının tüm kurulumlarını uzaktan anında patch’leyebilir; uygulamayı App Store’a yeniden göndermeye ve onay beklemeye gerek kalmaz.
Bu amaçla genellikle JSPatch kullanılır. Ancak Siren ve react-native-appstore-version-checker gibi diğer seçenekler de mevcuttur.
Bu, kötü niyetli üçüncü taraf SDK’lar tarafından kötüye kullanılabilecek tehlikeli bir mekanizmadır; bu nedenle otomatik güncelleme yöntemi (varsa) kontrol edilmeli ve test edilmelidir. Bu amaçla uygulamanın önceki bir sürümünü indirmeyi deneyebilirsiniz.
Third Parties
3rd party SDK’lar ile ilgili önemli bir zorluk, işlevleri üzerinde ince ayar yapılamamasıdır. Geliştiriciler ya SDK’yı entegre edip tüm özelliklerini (potansiyel güvenlik ve gizlilik riskleri dahil) kabul etmek zorunda ya da SDK’nın sunduğu avantajlardan tamamen vazgeçmek zorunda kalırlar. Çoğu zaman geliştiriciler bu SDK’ların içindeki zafiyetleri kendileri düzeltemezler. Ayrıca, SDK’lar toplulukta güven kazandıkça bazılarında kötü amaçlı yazılım barınmaya başlayabilir.
Üçüncü taraf SDK’ların sunduğu hizmetler kullanıcı davranışı takibi, reklam gösterimi veya kullanıcı deneyimini iyileştirme gibi işlevleri içerebilir. Ancak bu, geliştiricilerin bu kütüphaneler tarafından çalıştırılan koddan tam olarak haberdar olmamasına ve dolayısıyla gizlilik ve güvenlik risklerinin ortaya çıkmasına neden olabilir. Üçüncü taraf hizmetlerle paylaşılan bilgilerin gerekli olanla sınırlandırılması ve hassas verilerin ifşa edilmemesinin sağlanması önemlidir.
Üçüncü taraf hizmetlerin uygulanması genellikle bağımsız bir kütüphane veya tam bir SDK şeklinde olur. Kullanıcı gizliliğini korumak için bu hizmetlerle paylaşılan veriler PII’nin (Personal Identifiable Information) ifşasını önleyecek şekilde anonimleştirilmelidir.
Bir uygulamanın hangi kütüphaneleri kullandığını belirlemek için otool komutu kullanılabilir. Bu araç, uygulama ve kullandığı paylaşılan kütüphaneler üzerinde çalıştırılarak ek kütüphaneler keşfedilebilir.
otool -L <application_path>
İlginç Zafiyetler ve Vaka İncelemeleri
Air Keyboard Remote Input Injection
Itunesstored Bookassetd Sandbox Escape
Zero Click Messaging Image Parser Chains
Referanslar ve Diğer Kaynaklar
- https://blog.calif.io/p/taking-apart-ios-apps-anti-debugging
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering
- iOS & Mobile App Pentesting - INE
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0057/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0058/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0059/
- https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage
- https://coderwall.com/p/kjb3lw/storing-password-in-keychain-the-smart-way
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0055/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0053
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0060/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0058
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0060
- https://mas.owasp.org/MASTG/Android/0x05f-Testing-Local-Authentication/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064
- https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054
- https://github.com/ivRodriguezCA/RE-iOS-Apps/ iOS ücretsiz kursu([https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/])
- https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577
- https://www.slideshare.net/RyanISI/ios-appsecurityminicourse
- https://github.com/prateek147/DVIA
- https://github.com/prateek147/DVIA-v2
- https://github.com/OWASP/MSTG-Hacking-Playground%20
- OWASP iGoat https://github.com/OWASP/igoat <<< Objective-C sürümü https://github.com/OWASP/iGoat-Swift <<< Swift sürümü
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/nabla-c0d3/ssl-kill-switch2
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


