hacktricks/mobile-pentesting/ios-pentesting
2024-06-19 10:56:00 +00:00
..
basic-ios-testing-operations.md Translated to Turkish 2024-02-10 18:14:16 +00:00
burp-configuration-for-ios.md Translated ['crypto-and-stego/certificates.md', 'generic-methodologies-a 2024-05-06 11:16:55 +00:00
extracting-entitlements-from-compiled-application.md Translated to Turkish 2024-02-10 18:14:16 +00:00
frida-configuration-in-ios.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:43:52 +00:00
ios-app-extensions.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-basics.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-custom-uri-handlers-deeplinks-custom-schemes.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-hooking-with-objection.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-protocol-handlers.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-serialisation-and-encoding.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-testing-environment.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 22:43:52 +00:00
ios-uiactivity-sharing.md Translated to Turkish 2024-02-10 18:14:16 +00:00
ios-uipasteboard.md Translated ['binary-exploitation/rop-return-oriented-programing/ret2lib/ 2024-05-02 15:12:16 +00:00
ios-universal-links.md Translated ['mobile-pentesting/ios-pentesting/ios-universal-links.md'] t 2024-06-19 10:56:00 +00:00
ios-webviews.md Translated to Turkish 2024-02-10 18:14:16 +00:00
README.md Translated ['crypto-and-stego/certificates.md', 'generic-methodologies-a 2024-05-06 11:16:55 +00:00

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ı:

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 ı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 ve Caches 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:

  1. 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.

Apple belgeleri:

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:

  1. Xcode'u açın.
  2. iOS cihazını bağlayın.
  3. Window -> Devices and Simulators'e gidin.
  4. Cihazınızı seçin.
  5. Araştırdığınız sorunu tetikleyin.
  6. 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 ı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 simge
    • iTunesMetadata.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


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ı: