.. | ||
basic-ios-testing-operations.md | ||
burp-configuration-for-ios.md | ||
extracting-entitlements-from-compiled-application.md | ||
frida-configuration-in-ios.md | ||
ios-app-extensions.md | ||
ios-basics.md | ||
ios-custom-uri-handlers-deeplinks-custom-schemes.md | ||
ios-hooking-with-objection.md | ||
ios-protocol-handlers.md | ||
ios-serialisation-and-encoding.md | ||
ios-testing-environment.md | ||
ios-uiactivity-sharing.md | ||
ios-uipasteboard.md | ||
ios-universal-links.md | ||
ios-webviews.md | ||
README.md |
iOS Pentesting
Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatik iş akışlarını kolayca oluşturun ve otomatikleştirin.
Bugün Erişim Edinin:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek için ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR gönderin.
iOS Temelleri
{% content-ref url="ios-basics.md" %} ios-basics.md {% endcontent-ref %}
Test Ortamı
Bu sayfada iOS simülatörü, emülatörler ve jailbreak hakkında bilgi bulabilirsiniz:
{% content-ref url="ios-testing-environment.md" %} ios-testing-environment.md {% endcontent-ref %}
İlk Analiz
Temel iOS Test İşlemleri
Test sırasında çeşitli işlemler önerilecek (cihaza bağlanma, dosya okuma/yazma/yükleme/indirme, bazı araçları kullanma...). Bu nedenle, bu işlemlerin nasıl gerçekleştirileceğini bilmiyorsanız lütfen sayfayı okumaya başlayın:
{% content-ref url="basic-ios-testing-operations.md" %} basic-ios-testing-operations.md {% endcontent-ref %}
{% hint style="info" %}
Aşağıdaki adımlar için uygulamanın cihaza yüklenmiş olması ve uygulamanın IPA dosyasının zaten edinilmiş olması gerekmektedir.
Bunu nasıl yapılacağını öğrenmek için Temel iOS Test İşlemleri sayfasını okuyun.
{% endhint %}
Temel Statik Analiz
MobSF aracını kullanarak IPA dosyasına otomatik Statik Analiz yapmanız önerilir.
Binary'de bulunan korumaların tanımlanması:
- PIE (Konum Bağımsız Yürütülebilir): Etkinleştirildiğinde, uygulama her başlatıldığında rastgele bir bellek adresine yüklenir, başlangıç bellek adresini tahmin etmeyi zorlaştırır.
otool -hv <app-binary> | grep PIE # PIE bayrağını içermesi gerekmektedir
- Yığın Kanaryaları: Yığının bütünlüğünü doğrulamak için bir 'kanarya' değeri bir işlevi çağırmadan önce yığına yerleştirilir ve işlev sona erdiğinde yeniden doğrulanır.
otool -I -v <app-binary> | grep stack_chk # stack_chk_guard ve stack_chk_fail sembollerini içermesi gerekmektedir
- ARC (Otomatik Referans Sayımı): Ortak bellek bozulma hatalarını önlemek için
otool -I -v <app-binary> | grep objc_release # _objc_release sembolünü içermesi gerekmektedir
- Şifrelenmiş Binary: Binary şifrelenmiş olmalıdır
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # cryptid 1 olmalıdır
Hassas/Güvensiz Fonksiyonların Tanımlanması
- Zayıf Hashleme Algoritmaları
# iOS cihazında
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"
# Linux üzerinde
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
- Güvensiz Rastgele Fonksiyonlar
# iOS cihazında
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"
# Linux üzerinde
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
- Güvensiz 'Malloc' Fonksiyonu
# iOS cihazında
otool -Iv <app> | grep -w "_malloc"
# Linux üzerinde
grep -iER "_malloc"
- Güvensiz ve Kötüye Kullanılabilir Fonksiyonlar
# iOS cihazında
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"
# Linux üzerinde
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"
Temel Dinamik Analiz
MobSF tarafından gerçekleştirilen dinamik analize göz atın. Farklı görünümler arasında gezinmeniz ve etkileşimde bulunmanız gerekecek, ancak birçok sınıfa bağlanacak ve diğer işlemleri yapacak ve işiniz bittiğinde bir rapor hazırlayacaktır.
Yüklü Uygulamaların Listelenmesi
frida-ps -Uai
komutunu kullanarak yüklü uygulamaların paket tanımlayıcısını belirleyin:
$ 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 Numaralandırma ve Hooking
Uygulamanın bileşenlerini numaralandırma ve yöntemleri ve sınıfları kolayca hooklama yöntemlerini objection ile nasıl yapılacağını öğrenin:
{% content-ref url="ios-hooking-with-objection.md" %} ios-hooking-with-objection.md {% endcontent-ref %}
IPA Yapısı
Bir IPA dosyasının yapısı temelde bir sıkıştırılmış paketin yapısıdır. Uzantısını .zip
olarak değiştirerek, içeriğini ortaya çıkarmak için açılabilir. Bu yapı içinde, bir Paket uygulamanın kurulmaya hazır tamamen paketlenmiş bir uygulamayı temsil eder. İçinde, uygulamanın kaynaklarını kapsayan <NAME>.app
adında bir dizin bulacaksınız.
Info.plist
: Bu dosya uygulamanın belirli yapılandırma detaylarını tutar._CodeSignature/
: Bu dizin, paketteki tüm dosyaların bütünlüğünü sağlayan bir imza içeren bir plist dosyasını içerir.Assets.car
: Simgeler gibi varlık dosyalarını depolayan sıkıştırılmış bir arşiv.Frameworks/
: Bu klasör uygulamanın yerel kütüphanelerini barındırır, bu kütüphaneler.dylib
veya.framework
dosyaları şeklinde olabilir.PlugIns/
: Bu,.appex
dosyaları olarak bilinen uygulamanın uzantılarını içerebilir, ancak her zaman mevcut değillerdir.Core Data
: Uygulamanızın kalıcı verilerini çevrimdışı kullanım için kaydetmek, geçici verileri önbelleğe almak ve uygulamanıza tek bir cihazda geri alma işlevselliği eklemek için kullanılır. Bir iCloud hesabında birden fazla cihaz arasında veri senkronizasyonu için, Core Data şemanızı otomatik olarak bir CloudKit konteynerine yansıtır.PkgInfo
:PkgInfo
dosyası uygulamanızın veya paketinizin türünü ve yaratıcı kodlarını belirtmenin alternatif bir yoludur.- en.lproj, fr.proj, Base.lproj: Bu, belirli diller için kaynakları içeren dil paketleridir ve bir dil desteklenmiyorsa varsayılan bir kaynak içerir.
- 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.car
dosyası, grafiksel varlıkları etkin bir şekilde yönetmek için sıkıştırma kullanır, bu da uygulama performansını optimize etmek ve genel boyutunu azaltmak için önemlidir. - Kütüphaneler ve Eklentiler: Bu dizinler, iOS uygulamalarının modülerliğini vurgular, geliştiricilere tekrar kullanılabilir kod kütüphaneleri (
Frameworks/
) eklemeleri ve uygulama işlevselliğini genişletmelerine izin verir (PlugIns/
). - Yerelleştirme: Yapı, birden fazla dil desteğini destekler, belirli dil paketleri için kaynakları içererek küresel uygulama erişimini kolaylaştırır.
Info.plist
Info.plist, iOS uygulamaları için bir köşetaşı olarak hizmet eder, kritik bilgileri anahtar-değer çiftleri şeklinde kapsayan. Bu dosya sadece uygulamalar için değil, aynı zamanda uygulama uzantıları ve içinde bulunan çerçeveler için de gereklidir. XML veya ikili bir formatta yapılandırılmıştır ve uygulama izinlerinden güvenlik yapılandırmalarına kadar kritik bilgileri içerir. Mevcut anahtarlar hakkında detaylı bir keşif için, Apple Geliştirici Belgelerine başvurulabilir.
Bu dosya ile çalışmak isteyenler için daha erişilebilir bir formatta XML dönüşümü, macOS'ta (plutil
ile, 10.2 ve sonraki sürümlerde doğal olarak mevcuttur) veya Linux'ta (plistutil
ile) kolayca gerçekleştirilebilir. Dönüşüm için 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 ifşa edebileceği bilgi yığını arasında, dikkate değer girdiler arasında uygulama izni dizeleri (UsageDescription
), özel URL şemaları (CFBundleURLTypes
) ve Uygulama Taşıma Güvenliği için yapılandırmalar (NSAppTransportSecurity
) bulunmaktadır. Bu girdiler, grep
komutunu kullanarak dosyayı inceleyerek veya basitçe yerini tespit edebilir.
$ 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ına yerleştirilir. Bu uygulamalara 128-bit UUID olarak bilinen benzersiz bir tanımlayıcı atanır, bu da uygulamanın klasörünü manuel olarak bulmayı zorlaştırır çünkü dizin adlarının rastgele olması nedeniyle.
{% hint style="warning" %}
iOS'taki uygulamaların sandbox olması gerektiğinden, her uygulamanın CFBundleIdentifier
'ına sahip $HOME/Library/Containers
içinde bir klasörü olacaktır.
Ancak, hem veri hem de konteyner klasörlerinde .com.apple.mobile_container_manager.metadata.plist
adlı dosya bulunur ve bu dosyaları MCMetadataIdentifier
anahtarında bağlayan bir ilişki vardır.
{% endhint %}
Kullanıcı tarafından yüklenen bir uygulamanın kurulum dizinini keşfetmeyi kolaylaştırmak için objection aracı yararlı bir env
komutu sağlar. Bu komut, söz konusu uygulama için detaylı dizin bilgilerini ortaya çıkarır. Aşağıda bu komutun nasıl kullanılacağı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ı find
komutu kullanılarak /private/var/containers
içinde aranabilir:
find /private/var/containers -name "Progname*"
Komutlar olan ps
ve lsof
gibi, sırasıyla uygulamanın işlemini tanımlamak ve açık dosyaları listelemek için de kullanılabilir, uygulamanın etkin dizin yollarına dair içgörüler sağlar:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
Paket dizini:
- AppName.app
- Bu, IPA'da daha önce görüldüğü gibi Uygulama Paketi olup, temel uygulama verilerini, statik içeriği ve uygulamanın derlenmiş ikilisini içerir.
- Bu dizin kullanıcılara görünür, ancak kullanıcılar yazamaz.
- Bu dizindeki içerik yedeklenmez.
- Bu klasörün içeriği kod imzasını doğrulamak için kullanılır.
Veri dizini:
- Documents/
- Tüm kullanıcı tarafından oluşturulan verileri içerir. Uygulama son kullanıcı bu verilerin oluşturulmasını başlatır.
- Kullanıcılara görünür ve kullanıcılar yazabilir.
- Bu dizindeki içerik yedeklenir.
- Uygulama,
NSURLIsExcludedFromBackupKey
ayarlayarak yolları devre dışı bırakabilir. - Library/
- Kullanıcıya özgü olmayan dosyaları içerir, ön bellekler, tercihler, çerezler ve özellik listesi (plist) yapılandırma dosyaları gibi.
- iOS uygulamaları genellikle
Application Support
veCaches
alt dizinlerini kullanır, ancak uygulama özel alt dizinler oluşturabilir. - Library/Caches/
- Yarı kalıcı önbelleklenmiş dosyaları içerir.
- Kullanıcılara görünmez ve kullanıcılar yazamaz.
- Bu dizindeki içerik yedeklenmez.
- Uygulama çalışmıyorken ve depolama alanı azaldığında işletim sistemi bu dizinin dosyalarını otomatik olarak silebilir.
- Library/Application Support/
- Uygulamanın çalıştırılması için gerekli olan kalıcı dosyaları içerir.
- Kullanıcılara görünmez ve kullanıcılar yazamaz.
- Bu dizindeki içerik yedeklenir.
- Uygulama,
NSURLIsExcludedFromBackupKey
ayarlayarak yolları devre dışı bırakabilir. - Library/Preferences/
- Bir uygulama yeniden başlatıldıktan sonra bile kalıcı olabilen özellikleri depolamak için kullanılır.
- Bilgiler, [BUNDLE_ID].plist adlı bir plist dosyasında şifrelenmemiş olarak uygulama kum havuzunun içinde kaydedilir.
NSUserDefaults
kullanılarak depolanan tüm anahtar/değer çiftleri bu dosyada bulunabilir.- tmp/
- Uygulama başlatmaları arasında kalıcı olması gerekli olmayan geçici dosyaları yazmak için bu dizini kullanın.
- Kalıcı olmayan önbelleklenmiş dosyaları 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 dizinin dosyalarını otomatik olarak silebilir.
iGoat-Swift'in Uygulama Paketi (.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 Tersine Mühendislik
<application-name>.app
klasörü içinde <application-name>
adında bir ikili dosya bulacaksınız. Bu dosya çalıştırılacak dosyadır. İkili dosyayı temel bir inceleme yapmak 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 komut çıktısında herhangi bir şey var mı:
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
Binary dosyasının ayrıştırılması
Metin bölümünü ayrıştırın:
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
Kodunuzu daha kompakt hale getirmek için class-dump kullanabilirsiniz:
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;
};
Ancak, ikili dosyayı açmak için en iyi seçenekler: Hopper ve IDA.
Dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatikleştirilmiş iş akışları oluşturmak ve Trickest'i kullanın.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
Veri Depolama
iOS'un cihazda veri depolama yöntemlerini öğrenmek için bu sayfayı okuyun:
{% content-ref url="ios-basics.md" %} ios-basics.md {% endcontent-ref %}
{% hint style="warning" %}
Uygulama kurulduktan hemen sonra, uygulamanın tüm işlevleri kontrol edildikten sonra ve hatta bir kullanıcıdan çıkıp farklı bir kullanıcıya giriş yaptıktan sonra bilgi depolama yerleri kontrol edilmelidir.
Amaç, uygulamanın (şifreler, tokenlar), mevcut kullanıcının ve önceki oturum açmış kullanıcıların korumasız hassas bilgilerini bulmaktır.
{% endhint %}
Plist
plist dosyaları, anahtar-değer çiftlerini içeren yapılandırılmış XML dosyalarıdır. Kalıcı verileri depolamanın bir yoludur, bu nedenle bazen bu dosyalarda hassas bilgiler bulabilirsiniz. Uygulamayı yükledikten ve yoğun bir şekilde kullandıktan sonra bu dosyaları kontrol etmeniz önerilir.
Plist dosyalarında veri saklamanın en yaygın yolu NSUserDefaults'un kullanımıdır. Bu plist dosyası, Library/Preferences/<appBundleID>.plist
içinde uygulama sandbox'ında kaydedilir.
NSUserDefaults
sınıfı, varsayılan sistemle etkileşim için programatik bir arayüz sağlar. Varsayılan sistem, bir uygulamanın davranışını kullanıcı tercihlerine göre özelleştirmesine izin verir. NSUserDefaults
tarafından kaydedilen veriler uygulama paketi içinde görülebilir. Bu sınıf, veriyi bir plist dosyasında saklar, ancak küçük miktarlarda veriyle kullanılması amaçlanmıştır.
Bu veri doğrudan güvenilir bir bilgisayar üzerinden erişilemez, ancak bir yedekleme yaparak erişilebilir.
NSUserDefaults
kullanılarak kaydedilen bilgileri NSUserDefaults
kullanarak çöpe atabilirsiniz.
Uygulama tarafından kullanılan tüm plist dosyalarını bulmak için /private/var/mobile/Containers/Data/Application/{APPID}
'e erişebilir ve şunu çalıştırabilirsiniz:
find ./ -name "*.plist"
XML veya ikili (bplist) formatındaki dosyaları XML'e dönüştürmek için, işletim sisteminize bağlı olarak çeşitli yöntemler mevcuttur:
MacOS Kullanıcıları için: plutil
komutunu kullanın. Bu amaçla tasarlanmış olan macOS'ta (10.2+), yerleşik bir araçtır.
$ plutil -convert xml1 Info.plist
Linux Kullanıcıları için: İlk olarak libplist-utils
paketini yükleyin, 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
Objection Oturumu İçinde: 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 bir çerçevedir. Core Data, kalıcı depo olarak SQLite'i kullanabilir, ancak çerçeve kendisi bir veritabanı değildir.
CoreData, verilerini varsayılan olarak şifrelemez. Bununla birlikte, CoreData'ye ek bir şifreleme katmanı eklenebilir. Daha fazla ayrıntı için GitHub Repo'ya bakın.
Bir uygulamanın SQLite Core Data bilgilerini /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
yolunda bulabilirsiniz.
Eğer SQLite'i açabilir ve hassas bilgilere erişebilirseniz, yanlış yapılandırmayı buldunuz demektir.
{% code title="iGoat'tan Kod" %}
-(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");
}
}
{% endcode %}
YapDatabase
YapDatabase, SQLite üzerine inşa edilmiş bir anahtar/değer deposudur.
Yap veritabanları sqlite veritabanları olduğundan, bunları önceki bölümde belirtilen amaçlı komutu kullanarak bulabilirsiniz.
Diğer SQLite Veritabanları
Uygulamaların kendi sqlite veritabanlarını oluşturması yaygındır. Bu veritabanlarında duyarlı veriler saklayabilir ve bunları şifrelememiş olabilirler. Bu nedenle, her veritabanını kontrol etmek her zaman ilginç olacaktır. Bu nedenle, verilerin saklandığı uygulama dizinine gidin (/private/var/mobile/Containers/Data/Application/{APPID}
).
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Gerçek Zamanlı Veritabanları
Geliştiricilere Firebase Gerçek Zamanlı Veritabanları aracılığıyla veri depolama ve senkronizasyonu imkanı sunulur. JSON formatında depolanan veriler, gerçek zamanlı olarak tüm bağlı istemcilere senkronize edilir.
Yanlış yapılandırılmış Firebase veritabanlarını nasıl kontrol edeceğinizi buradan bulabilirsiniz:
{% content-ref url="../../network-services-pentesting/pentesting-web/buckets/firebase-database.md" %} firebase-database.md {% endcontent-ref %}
Realm veritabanları
Realm Objective-C ve Realm Swift, Apple tarafından sağlanmayan güçlü bir veri depolama alternatifi sunar. Varsayılan olarak, veriler şifrelenmeden depolanır ve şifreleme belirli yapılandırmalar aracılığıyla sağlanır.
Veritabanları şurada bulunur: /private/var/mobile/Containers/Data/Application/{APPID}
. Bu dosyaları keşfetmek için şu gibi komutlar kullanılabilir:
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.
Bir Realm veritabanı içinde şifreleme uygulamak için aşağıdaki kod parçacığı 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 yerleşik bir veritabanı motoru olarak tanımlanmaktadır ve belge odaklı (NoSQL) yaklaşımı benimsemektedir. iOS ve macOS için yerel olarak tasarlanmış olup verileri sorunsuz bir şekilde senkronize etme yeteneği sunmaktadır.
Bir cihazda potansiyel Couchbase veritabanlarını tanımlamak için aşağıdaki dizin incelenmelidir:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Çerezler
iOS, uygulamaların çerezlerini her uygulamanın klasörü içindeki Library/Cookies/cookies.binarycookies
içinde saklar. Bununla birlikte, geliştiriciler bazen bu çerezleri anahtarlık içinde saklamayı tercih eder çünkü bahsedilen çerez dosyasına yedeklerden erişilebilir.
Çerez dosyasını incelemek için bu python betiğini kullanabilir veya objection'ın ios cookies get
komutunu kullanabilirsiniz.
Ayrıca objection'ı kullanarak bu dosyaları JSON formatına dönüştürebilir ve verileri 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
NSURLSession varsayılan olarak HTTP isteklerini ve yanıtlarını Cache.db veritabanında saklar. Bu veritabanı, eğer tokenlar, kullanıcı adları veya başka hassas bilgiler önbelleğe alındıysa hassas veriler içerebilir. Önbelleğe alınan bilgileri bulmak için uygulamanın veri dizinini (/var/mobile/Containers/Data/Application/<UUID>
) açın ve /Library/Caches/<Bundle Identifier>
dizinine gidin. WebKit önbelleği de Cache.db dosyasında saklanmaktadır. Objection, bu veritabanını sqlite connect Cache.db
komutuyla açıp etkileşimde bulunabilir, çünkü bu normal bir SQLite veritabanıdır.
Bu verilerin önbelleğe alınmasını devre dışı bırakmanız önerilir, çünkü istek veya yanıtlarda hassas bilgiler olabilir. Aşağıdaki liste farklı yöntemlerle bunu başarmanın yollarını göstermektedir:
- Oturum kapatıldıktan sonra önbelleğe alınan yanıtların kaldırılması önerilir. Bu, Apple'ın sağladığı
removeAllCachedResponses
adlı yöntemle yapılabilir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz:
URLCache.shared.removeAllCachedResponses()
Bu yöntem, Cache.db dosyasındaki tüm önbelleğe alınan istekleri ve yanıtları kaldıracaktır. 2. Çerezlerin avantajından faydalanmanıza gerek yoksa, URLSession'ın .ephemeral yapılandırma özelliğini kullanmanız önerilir, bu da çerezleri ve önbelleği kaydetmeyi devre dışı bırakacaktır.
Bir geçici oturum yapılandırma nesnesi, varsayılan bir oturum yapılandırmasıyla (bkz. default) benzerdir, ancak karşılık gelen oturum nesnesi önbellekleri, kimlik bilgisi depolarını veya diske herhangi bir oturumla ilgili veriyi saklamaz. Bunun yerine, oturumla ilgili veriler RAM'de saklanır. Bir geçici oturumun verileri diske yazdığı tek zaman, bir URL'nin içeriğini bir dosyaya yazmasını söylediğinizde olur.
3. Önbellek, .notAllowed Önbellek Politikası'na ayarlanarak da devre dışı bırakılabilir. Bu, önbelleğin hafızada veya diske herhangi bir şekilde saklanmasını devre dışı bırakacaktır.
Anlık Görüntüler
Ev düğmesine bastığınızda, iOS mevcut ekranın bir anlık görüntüsünü alır ve uygulamaya geçişi çok daha akıcı hale getirmek için kullanır. Ancak, eğer mevcut ekranda hassas veriler varsa, bu veriler resimde saklanır (ki bu yeniden başlatmalara karşı kalıcıdır). Bu, uygulamalar arasında geçiş yapmak için ev ekranına çift dokunarak erişebileceğiniz anlık görüntülerdir.
iPhone jailbreak yapılmamışsa, saldırganın bu ekran görüntülerini görmek için cihaza erişime ihtiyacı vardır ve cihazın kilitli olmaması 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'dan itibaren dosya sistemine erişemez).
Bu kötü davranışı önlemenin bir yolu, anlık görüntü almadan önce duyarlı verileri kaldırmak veya bir boş ekran kullanmaktır, ApplicationDidEnterBackground()
işlevini kullanarak.
Aşağıdaki, varsayılan bir ekran görüntüsü ayarlayan örnek bir düzeltme yöntemidir.
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:
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];
}
Anahtarlık
iOS anahtarlığına erişmek ve yönetmek için, jailbreak yapılmış cihazlar için uygun olan Keychain-Dumper gibi araçlar mevcuttur. Ayrıca, benzer amaçlar için Objection ios keychain dump
komutunu sağlar.
Kimlik Bilgilerini Saklama
NSURLCredential sınıfı, hassas bilgileri doğrudan anahtarlıkta saklamak için idealdir ve NSUserDefaults veya diğer sarmallara gerek kalmadan kullanılır. Giriş yaptıktan 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];
Storedaki bu kimlik bilgilerini çıkarmak için Objection'ın ios nsurlcredentialstorage dump
komutu kullanılır.
Özel Klavyeler ve Klavye Önbelleği
iOS 8.0'dan itibaren kullanıcılar, Ayarlar > Genel > Klavye > Klavyeler altında yönetilebilen özel klavye uzantıları yükleyebilirler. Bu klavyeler genişletilmiş işlevsellik sunarken, tuş vuruşu kaydı tutma ve verileri harici sunuculara iletim riski oluştururlar, ancak kullanıcılar ağ erişimi gerektiren klavyeler hakkında 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:
- Güvenliği artırmak için üçüncü taraf klavyelerin devre dışı bırakılması önerilir.
Library/Keyboard/{locale}-dynamic-text.dat
veya/private/var/mobile/Library/Keyboard/dynamic-text.dat
konumunda bulunan önbellek dosyalarında hassas bilgileri saklayabilecek varsayılan iOS klavyesinin otomatik düzeltme ve otomatik öneriler özelliklerine dikkat edilmelidir. Bu önbellek dosyaları düzenli olarak hassas veriler açısından kontrol edilmelidir. Önbellek verilerini temizlemek için Ayarlar > Genel > Sıfırla > Klavye Sözlüğünü Sıfırla üzerinden klavye sözlüğünün sıfırlanması önerilir.- Ağ trafiğinin dinlenmesi, özel bir klavyenin tuş vuruşlarını uzaktan iletip iletip etmediğini ortaya çıkarabilir.
Metin Alanı Önbelleğini Önleme
UITextInputTraits protokolü, otomatik düzeltme ve güvenli metin girişini yönetmek için gerekli olan özellikler sunar. Örneğin, otomatik düzeltmeyi devre dışı bırakma ve güvenli metin girişini etkinleştirme şu şekilde gerçekleştirilebilir:
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
Ek olarak, geliştiriciler metin alanlarının, özellikle şifreler ve PIN'ler gibi hassas bilgilerin girildiği alanların önbelleğe alınmasını engellemek için autocorrectionType
'ı UITextAutocorrectionTypeNo
olarak ve secureTextEntry
'i YES
olarak ayarlayarak güvence altına almalıdır.
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Kayıtlar
Hata ayıklama kodu genellikle günlüğü kullanmayı gerektirir. Kayıtlar hassas bilgiler içerebileceğinden risk içerir. Daha önce, iOS 6 ve daha eski sürümlerde, günlüklere tüm uygulamalar erişebiliyordu, bu da hassas veri sızıntısı riski oluşturuyordu. Şimdi, uygulamalar yalnızca kendi günlüklerine erişebilirler.
Bu kısıtlamalara rağmen, kilitli bir cihaza fiziksel erişimi olan bir saldırgan, cihazı bir bilgisayara bağlayarak bunu hala sömürebilir ve kayıtları okuyabilir. Kayıtların uygulamanın kaldırılmasından sonra bile diske kaydedildiğini unutmamak önemlidir.
Riskleri azaltmak için, uygulama ile detaylı etkileşimde bulunmak, tüm işlevlerini ve girdilerini keşfetmek ve yanlışlıkla hassas bilgilerin kaydedilmediğinden emin olmak önerilir.
Potansiyel sızıntılar için uygulamanın kaynak kodunu inceleyerek, hem önceden tanımlanmış hem de özel günlükleme ifadelerini arayın. Dahili işlevler için NSLog
, NSAssert
, NSCAssert
, fprintf
anahtar kelimelerini ve özel uygulamalar için Logging
veya Logfile
ifadelerini arayın.
Sistem Kayıtlarını İzleme
Uygulamalar çeşitli hassas bilgileri kaydeder. Bu kayıtları izlemek için, araçlar ve komutlar gibi:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
Ayrıca, Xcode konsol log'larını toplamanın bir yolunu sağlar:
- Xcode'u açın.
- iOS cihazını bağlayın.
- Window -> Devices and Simulators'e gidin.
- Cihazınızı seçin.
- Araştırdığınız sorunu tetikleyin.
- Logları yeni bir pencerede görüntülemek için Open Console düğmesini kullanın.
Daha gelişmiş günlükleme için, cihaz kabuğuna bağlanmak ve socat kullanarak gerçek zamanlı log izleme sağlamak mümkündür:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Log aktivitelerini gözlemlemek için kullanılan komutlar, sorunları teşhis etmek veya günlüklerde potansiyel veri sızıntılarını belirlemek için son derece değerli olabilir.
Trickest kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatik iş akışları oluşturabilir ve otomatikleştirebilirsiniz.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
Yedeklemeler
iOS'e entegre edilmiş otomatik yedekleme özellikleri, iTunes (macOS Catalina'ya kadar), Finder (macOS Catalina'dan itibaren) veya iCloud aracılığıyla cihaz veri kopyalarının oluşturulmasını kolaylaştırır. Bu yedeklemeler neredeyse tüm cihaz verilerini kapsar, Apple Pay ayrıntıları ve Touch ID yapılandırmaları gibi son derece hassas unsurları hariç tutar.
Güvenlik Riskleri
Yedeklemelerde kurulu uygulamalar ve verilerinin bulunması, potansiyel veri sızıntısı sorununu ve yedekleme değişikliklerinin uygulama işlevselliğini değiştirebileceği riskini ortaya çıkarır. Bu riskleri azaltmak için duyarlı bilgileri düz metin olarak saklamamak önerilir.
Yedeklemelerden Dosyaları Hariç Tutma
Documents/
ve Library/Application Support/
içindeki dosyalar varsayılan olarak yedeklenir. Geliştiriciler, belirli dosyaları veya dizinleri yedeklemelerden hariç tutmak için NSURLIsExcludedFromBackupKey
ile NSURL setResourceValue:forKey:error:
kullanabilir. Bu uygulama, hassas verilerin yedeklemelere dahil edilmesini engellemek için önemlidir.
Zafiyetlerin Test Edilmesi
Bir uygulamanın yedekleme güvenliğini değerlendirmek için, Finder kullanarak bir yedekleme oluşturun ve ardından Apple'ın resmi belgelerinden rehberlik alarak yedeği bulun. Yedeği, uygulama davranışını etkileyebilecek hassas veriler veya yapılandırmalar açısından analiz edin.
Hassas bilgiler, komut satırı araçları veya iMazing gibi uygulamalar kullanılarak aranabilir. Şifreli yedeklemeler için, şifrelemenin varlığı, yedeğin kökünde bulunan "Manifest.plist" dosyasındaki "IsEncrypted" anahtarını kontrol ederek 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>
Şifreli Yedeklemelerle Başa Çıkma
DinoSec'in GitHub deposunda bulunan backup_tool.py ve backup_passwd.py gibi Python betikleri, şifreli yedeklemelerle başa çıkmak için kullanışlı olabilir, ancak muhtemelen en son iTunes/Finder sürümleriyle uyumluluğu sağlamak için ayarlamalar gerekebilir. Şifre korumalı yedeklemelerdeki dosyalara erişim için başka bir seçenek olan iOSbackup aracı bulunmaktadır.
Uygulama Davranışını Değiştirme
Yedekleme değişiklikleri aracılığıyla uygulama davranışını değiştirme örneği, Bither bitcoin cüzdan uygulamasında gösterilmektedir, burada UI kilidi PIN'inin pin_code anahtarı altında net.bither.plist
içinde depolandığı. Bu anahtarı plist dosyasından kaldırarak ve yedeği geri yükleyerek PIN gereksinimini kaldırarak sınırsız erişim sağlanabilir.
Hassas Veriler İçin Bellek Testi Özeti
Bir uygulamanın belleğinde depolanan hassas bilgilerle uğraşırken, bu verilerin maruz kalma süresini sınırlamak çok önemlidir. Bellek içeriğini incelemek için iki temel yaklaşım vardır: bir bellek dökümü oluşturma ve belleği gerçek zamanlı olarak analiz etme. Her iki yöntemin de, döküm süreci veya analiz sırasında önemli verileri kaçırma potansiyeli gibi zorlukları vardır.
Bir Bellek Dökümünü Alıp Analiz Etme
Hem jailbreak yapılmış hem de yapılmamış cihazlar için, objection ve Fridump gibi araçlar bir uygulamanın işlem belleğini dökme imkanı sağlar. Bir kez döküldüğünde, bu verileri analiz etmek, aradığınız bilginin doğasına bağlı olarak çeşitli araçlar gerektirir.
Bir bellek dökümünden dizeleri çıkarmak için strings
veya rabin2 -zz
gibi komutlar kullanılabilir:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
Daha detaylı bir analiz için, belirli veri tipleri veya desenler aramak için radare2, kapsamlı arama yetenekleri sunar:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
Çalışma Zamanı Bellek Analizi
r2frida, bir uygulamanın belleğini bir bellek dökümüne ihtiyaç duymadan gerçek zamanlı olarak incelemek için güçlü bir alternatif sunar. Bu araç, çalışan uygulamanın belleği üzerinde arama komutlarının doğrudan yürütülmesini sağlar:
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
Kırık Şifreleme
Zayıf Anahtar Yönetimi Süreçleri
Bazı geliştiriciler hassas verileri yerel depolamada saklar ve kodda sabit/tahmin edilebilir bir anahtarla şifreler. Bu yapılmamalı çünkü bazı tersine mühendislik saldırıları, saldırganların gizli bilgileri çıkarmasına izin verebilir.
Güvensiz ve/veya Kullanımdan Kaldırılmış Algoritmaların Kullanımı
Geliştiriciler kullanımdan kaldırılmış algoritmaları kullanmamalıdır yetkilendirme kontrolü, veri depolama veya gönderme işlemleri için. Bu algoritmaların bazıları şunlardır: RC4, MD4, MD5, SHA1... Örneğin şifreleri depolamak için hash kullanılıyorsa, hashlerin tuz ile birlikte kullanıldığı brute-force dayanıklı olmalıdır.
Kontrol
Yapılması gereken ana kontroller, kod içinde sabitlenmiş şifreler/sırlar bulunup bulunamayacağını, bunların tahmin edilebilir olup olmadığını ve kodun bazı türde zayıf şifreleme algoritmalarını kullanıp kullanmadığını bulmaktır.
İlginçtir ki, objection kullanarak bazı şifreleme kütüphanelerini otomatik olarak izleyebilirsiniz:
ios monitor crypt
iOS şifreleme API'ları ve kütüphaneleri hakkında daha fazla bilgi için https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography'e erişin
Yerel Kimlik Doğrulama
Yerel kimlik doğrulama, özellikle uzaktaki bir uç noktaya şifreleme yöntemleri aracılığıyla erişimi koruma konusunda önemli bir rol oynar. Buradaki esas nokta, uygun şekilde uygulanmadığında yerel kimlik doğrulama mekanizmalarının atlatılabilir olabileceğidir.
Apple'ın Yerel Kimlik Doğrulama çerçevesi ve anahtarlık geliştiricilere kullanıcı kimlik doğrulama iletişim kutularını kolaylaştırmak ve sırlı verileri güvenli bir şekilde işlemek için sağlam API'lar sağlar. Güvenli Kasa, Parmak İzi Kimliği için parmak izi kimliğini güvence altına alırken, Yüz Kimliği biyometrik verileri tehlikeye atmadan yüz tanıma üzerine kuruludur.
Touch ID/Face ID'yi entegre etmek için geliştiricilerin iki API seçeneği vardır:
- Yüksek seviyeli kullanıcı kimlik doğrulama için
LocalAuthentication.framework
. - Düşük seviyeli anahtarlık hizmetlerine erişim için
Security.framework
, biyometrik kimlik doğrulaması ile sırlı verileri güvence altına alır. Çeşitli açık kaynaklı sarmallar anahtarlık erişimini daha basit hale getirir.
{% hint style="danger" %}
Ancak, hem LocalAuthentication.framework
hem de Security.framework
güvenlik açıkları sunar, çünkü genellikle kimlik doğrulama süreçleri için veri iletmeksizin öncelikle boolean değerler döndürürler, bu da atlanabilirliklerine duyarlı hale getirir (bkz. Don't touch me that way, by David Lindner et al).
{% endhint %}
Yerel Kimlik Doğrulaması Uygulamak
Kullanıcıları kimlik doğrulaması için yönlendirmek için geliştiricilerin LAContext
sınıfı içindeki evaluatePolicy
yöntemini kullanmaları gerekmektedir, şu seçenekler arasından seçim yapabilirler:
deviceOwnerAuthentication
: Parmak İzi veya cihaz şifresi için yönlendirme yapar, ikisi de etkin değilse başarısız olur.deviceOwnerAuthenticationWithBiometrics
: Yalnızca Parmak İzi için yönlendirme yapar.
Başarılı bir kimlik doğrulama, evaluatePolicy
yönteminden dönen boolean bir değerle gösterilir, bu da potansiyel bir güvenlik açığına işaret eder.
Anahtarlık Kullanarak Yerel Kimlik Doğrulaması
iOS uygulamalarında yerel kimlik doğrulaması uygulamak, kimlik doğrulama belgeleri gibi sırlı verileri güvenli bir şekilde saklamak için anahtarlık API'lerinin kullanımını içerir. Bu süreç, verinin yalnızca kullanıcı tarafından, cihaz şifresi veya Parmak İzi gibi biyometrik kimlik doğrulama kullanılarak erişilebileceğini sağlar.
Anahtarlık, SecAccessControl
özniteliği ile öğeleri ayarlamak için yetenek sunar, bu da öğeye yalnızca kullanıcının Parmak İzi veya cihaz şifresi ile başarılı bir şekilde kimlik doğrulamasını yapana kadar erişimi kısıtlar. Bu özellik güvenliği artırmak için önemlidir.
Aşağıda, Swift ve Objective-C'de bir dizeyi anahtarlığa kaydetme ve geri almayı gösteren kod örnekleri bulunmaktadır, bu güvenlik özelliklerini kullanarak erişim kontrolünü ayarlamayı ve verinin yalnızca ayarlandığı cihazda, bir cihaz şifresinin yapılandırıldığı koşul altında erişilebilir olmasını sağlamayı özellikle göstermektedir.
{% tabs %} {% tab title="Swift" %}
// 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
}
{% endtab %}
{% tab title="Objective-C" %}
iOS uygulamalarını incelemek için Objective-C kodunu anlamak önemlidir. Objective-C, iOS uygulamalarının geliştirilmesinde yaygın olarak kullanılan bir programlama dilidir. Uygulamanın davranışını anlamak ve güvenlik açıklarını tespit etmek için Objective-C kodunu okuyabilme yeteneği önemlidir.
{% endtab %}
// 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
}
{% endtab %} {% endtabs %}
Artık anahtarlıkta kayıtlı öğeyi isteyebiliriz. Anahtarlık hizmetleri, kullanıcıya kimlik doğrulama iletişim kutusunu sunacak ve uygun bir parmak izi sağlanıp sağlanmadığına bağlı olarak veri veya nil değerini döndürecektir.
// 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
}
{% endtab %}
{% tab title="Objective-C" %}
Objective-C
Objective-C, Apple'ın geliştirdiği bir programlama dilidir ve iOS uygulamaları geliştirmek için kullanılmaktadır. Objective-C ile yazılmış uygulamalar, genellikle .m uzantılı dosyalarda bulunur.
Objective-C kodlarını incelemek ve anlamak için uygulamanın .ipa dosyasını açabilir ve içindeki .m dosyalarını analiz edebilirsiniz. Bu dosyalarda uygulamanın işlevselliği ve güvenlik açıkları hakkında bilgi bulabilirsiniz.
Objective-C kodlarını analiz etmek için Hopper Disassembler gibi araçlar kullanabilirsiniz. Bu araçlar sayesinde uygulamanın kaynak kodunu daha iyi anlayabilir ve güvenlik testleri yapabilirsiniz.
Objective-C ile yazılmış uygulamalarda sıkça karşılaşılan güvenlik zafiyetleri arasında bellek sızıntıları, kötü niyetli yazılım enjeksiyonu ve veri doğrulama hataları bulunmaktadır. Bu tür zafiyetlerin tespit edilip giderilmesi önemlidir.
{% endtab %}
// 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");
}
Tespit
Uygulamadaki çerçevelerin kullanımı, uygulama ikili dosyasının paylaşılan dinamik kütüphaneler listesini analiz edilerek de tespit edilebilir. Bunun için otool
kullanılabilir:
$ otool -L <AppName>.app/<AppName>
Eğer bir uygulamada LocalAuthentication.framework
kullanılıyorsa, çıktı hem aşağıdaki satırları içerecektir (unutmayın ki LocalAuthentication.framework
aslında Security.framework
'ü kullanmaktadır):
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
Eğer Security.framework
kullanılıyorsa, sadece ikinci olan gösterilecektir.
Yerel Kimlik Doğrulama Çerçevesi Atlatma
Objection
Objection Biyometrik Atlatma aracılığıyla, bu GitHub sayfasında bulunan bir teknik, LocalAuthentication mekanizmasını aşmak için kullanılabilir. Bu yaklaşımın özü, evaluatePolicy
fonksiyonunu manipüle etmek için Frida'yı kullanmaktır, böylece gerçek kimlik doğrulama başarısından bağımsız olarak sürekli olarak True
bir sonuç vermesini sağlar. Bu, hatalı biyometrik kimlik doğrulama süreçlerini atlamak için özellikle yararlıdır.
Bu atlatmayı 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 bir görev kaydettiği bir sırayı başlatır ve evaluatePolicy
kontrolünün sonucunu etkili bir şekilde True
olarak değiştirir.
Frida
evaluatePolicy
'nin bir kullanım örneği DVIA-v2 uygulamasından:
+(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"];
});
}
}
Yerel Kimlik Doğrulamasının atlatılması için bir Frida betiği yazılır. Bu betik, evaluatePolicy kontrolünü hedef alarak, geri aramasını onaylamak için onu engeller ve success=1 değerini döndürmesini sağlar. Geri aramanın davranışını değiştirerek, kimlik doğrulama kontrolü etkili bir şekilde atlatılmış olur.
Aşağıdaki betik, evaluatePolicy yönteminin sonucunu değiştirmek için enjekte edilir. Geri aramanın sonucunu her zaman başarı olarak gösterir.
// 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 betiği enjekte etmek ve biyometrik kimlik doğrulamasını atlamak için aşağıdaki komut kullanılır:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
IPC Aracılığıyla Hassas Fonksiyonelliğin Açığa Çıkması
Özel URI İşleyicileri / Derin Bağlantılar / Özel Şemalar
{% content-ref url="ios-custom-uri-handlers-deeplinks-custom-schemes.md" %} ios-custom-uri-handlers-deeplinks-custom-schemes.md {% endcontent-ref %}
Evrensel Bağlantılar
{% content-ref url="ios-universal-links.md" %} ios-universal-links.md {% endcontent-ref %}
UIActivity Paylaşımı
{% content-ref url="ios-uiactivity-sharing.md" %} ios-uiactivity-sharing.md {% endcontent-ref %}
UIPasteboard
{% content-ref url="ios-uipasteboard.md" %} ios-uipasteboard.md {% endcontent-ref %}
Uygulama Uzantıları
{% content-ref url="ios-app-extensions.md" %} ios-app-extensions.md {% endcontent-ref %}
Web Görünümleri
{% content-ref url="ios-webviews.md" %} ios-webviews.md {% endcontent-ref %}
Serileştirme ve Kodlama
{% content-ref url="ios-serialisation-and-encoding.md" %} ios-serialisation-and-encoding.md {% endcontent-ref %}
Ağ İletişimi
Şifreleme olmadan gerçekleşen iletişimi kontrol etmek ve uygulamanın sunucunun TLS sertifikasını doğru bir şekilde doğrulamasını sağlamak önemlidir.
Bu tür sorunları kontrol etmek için Burp gibi bir proxy kullanabilirsiniz:
{% content-ref url="burp-configuration-for-ios.md" %} burp-configuration-for-ios.md {% endcontent-ref %}
Ana Bilgisayar Adı Kontrolü
TLS sertifikasını doğrularken karşılaşılan yaygın bir sorun, sertifikanın bir güvenilir CA tarafından imzalandığını kontrol etmek, ancak sertifikanın erişilen ana bilgisayar adı olup olmadığını kontrol etmemektir.
Bu sorunu Burp kullanarak kontrol etmek için, iPhone'da Burp CA'ya güven verdikten sonra, farklı bir ana bilgisayar adı için Burp ile yeni bir sertifika oluşturabilir ve kullanabilirsiniz. Uygulama hala çalışıyorsa, bir zafiyet bulunmaktadır.
Sertifika Pinleme
Bir uygulama doğru şekilde SSL Pinning kullanıyorsa, uygulama yalnızca beklenen sertifika olduğunda çalışacaktır. Bir uygulamayı test ederken bu bir sorun olabilir çünkü Burp kendi sertifikasını sunacaktır.
Bu korumayı bir jailbroken cihazda atlamak için, uygulamayı SSL Kill Switch veya Burp Mobile Assistant yükleyebilirsiniz.
Ayrıca objection'ın ios sslpinning disable
komutunu da kullanabilirsiniz.
Çeşitli
/System/Library
içinde, sistem uygulamaları tarafından kullanılan telefon üzerinde yüklü çerçeveleri bulabilirsiniz.- Kullanıcı tarafından App Store'dan yüklenen uygulamalar
/User/Applications
içinde bulunur. - Ve
/User/Library
kullanıcı düzeyi uygulamalar tarafından kaydedilen verileri içerir. - Uygulama içinde kaydedilen notları okumak için
/User/Library/Notes/notes.sqlite
'e erişebilirsiniz. - Yüklenen bir uygulamanın klasörü içinde (
/User/Applications/<APP ID>/
) bazı ilginç dosyalar bulabilirsiniz:iTunesArtwork
: Uygulama tarafından kullanılan simgeiTunesMetadata.plist
: App Store'da kullanılan uygulama bilgileri/Library/*
: Tercihleri ve önbelleği içerir./Library/Cache/Snapshots/*
içinde, uygulamanın arka planda gönderilmeden önce yapılan anlık görüntüsünü bulabilirsiniz.
Sıcak Yama/Zorunlu Güncelleme
Geliştiriciler, uygulamalarının tüm yüklemelerine anında yama uygulayabilirler ve uygulamayı App Store'a yeniden gönderip onaylanmasını beklemek zorunda kalmazlar.
Bu amaçla genellikle JSPatch** gibi kullanılır.** Ancak Siren ve react-native-appstore-version-checker gibi diğer seçenekler de vardır.
Bu, kötü niyetli üçüncü taraf SDK'ları tarafından kötüye kullanılabilecek tehlikeli bir mekanizmadır, bu nedenle otomatik güncelleme için hangi yöntemin kullanıldığını kontrol etmeniz ve test etmeniz önerilir. Bu amaçla uygulamanın önceki bir sürümünü indirmeyi deneyebilirsiniz.
Üçüncü Taraflar
3. taraf SDK'ları ile önemli bir zorluk, işlevsellikleri üzerinde ayrıntılı kontrol eksikliğidir. Geliştiriciler, ya SDK'yı entegre eder ve potansiyel güvenlik açıkları ve gizlilik endişeleri de dahil olmak üzere tüm özelliklerini kabul eder ya da tamamen faydalarından vazgeçer. Genellikle, geliştiriciler bu SDK'ların içindeki güvenlik açıklarını kendileri yamayamazlar. Dahası, SDK'lar topluluk içinde güven kazandıkça, bazıları kötü amaçlı yazılım içerebilir.
Üçüncü taraf SDK'ların sağladığı hizmetler, kullanıcı davranışı izleme, reklam gösterimi veya kullanıcı deneyimi iyileştirmelerini içerebilir. Ancak, bu, geliştiricilerin bu kütüphaneler tarafından yürütülen kodun tam olarak farkında olmamaları nedeniyle potansiyel gizlilik ve güvenlik risklerini beraberinde getirir. Üçüncü taraf hizmetlerle paylaşılan bilgilerin sınırlı olması ve hassas verilerin açığa çıkarılmamasının sağlanması önemlidir.
Üçüncü taraf hizmetlerin uygulanması genellikle iki şekilde gerçekleşir: bağımsız bir kütüphane veya tam bir SDK. Bu hizmetlerle paylaşılan verilerin, Kişisel Tanımlanabilir Bilgilerin (PII) ifşasını önlemek için anonimleştirilmiş olması gerekmektedir.
Uygulamanın kullandığı kütüphaneleri belirlemek için otool
komutu kullanılabilir. Bu araç, uygulama ve kullandığı her paylaşılan kütüphane üzerinde çalıştırılmalıdır, ek kütüphaneleri keşfetmek için.
otool -L <application_path>
Referanslar ve Daha Fazla Kaynaklar
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering
- iOS ve Mobil Uygulama 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
Trickest kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ios-pentesting" %}
Sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerine göz atın
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuzu keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR'lar göndererek paylaşın.