hacktricks/mobile-pentesting/ios-pentesting/ios-basics.md

13 KiB

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Utenganishaji wa Haki na Sandbox

Katika iOS, kuna tofauti katika haki kati ya programu zinazoweza kufikiwa na mtumiaji na michakato ya msingi ya mfumo. Programu zinaendesha chini ya utambulisho wa mtumiaji mobile, wakati michakato muhimu ya mfumo inafanya kazi kama root. Utenganishaji huu unaboreshwa na mekanizma ya sandbox, ambayo inatoa mipaka madhubuti juu ya vitendo ambavyo programu zinaweza kuchukua. Kwa mfano, hata kama programu zinashiriki utambulisho sawa wa mtumiaji, zinakatazwa kufikia au kubadilisha data za kila mmoja.

Programu zinawekwa katika directory maalum (private/var/mobile/Applications/{random ID}) na zina upatikanaji wa kusoma uliozuiliwa kwa maeneo na kazi fulani za mfumo, kama vile SMS na simu. Upatikanaji wa maeneo yaliyolindwa unachochea ombi la kuruka kwa ruhusa ya mtumiaji.

Ulinzi wa Data

iOS inatoa waendelezaji Data Protection APIs, iliyojengwa juu ya Secure Enclave Processor (SEP) — co-processor maalum kwa ajili ya operesheni za kificho na usimamizi wa funguo. SEP inahakikisha ulinzi wa data kwa njia ya funguo maalum za kifaa, UID ya kifaa, iliyojumuishwa ndani yake.

Pale faili inapotengenezwa, funguo ya kipekee ya AES ya bit 256 inazalishwa, ikificha maudhui ya faili. Funguo hii ya kificho, pamoja na ID ya darasa, kisha inafichwa kwa kutumia funguo ya darasa na kuhifadhiwa ndani ya metadata ya faili. Kufichua faili kunahusisha kutumia funguo ya mfumo kufikia metadata, kupata funguo ya darasa na ID ya darasa, na kisha kufichua funguo ya kipekee ya kificho ya faili.

iOS inaelezea darasa nne za ulinzi kwa ajili ya usalama wa data, ambazo zinatofautisha wakati na jinsi data inaweza kufikiwa:

  • Ulinzi Kamili (NSFileProtectionComplete): Data haiwezi kufikiwa mpaka kifaa kifunguliwe kwa kutumia nambari ya siri ya mtumiaji.
  • Ililindwa Isipokuwa Iwapo Imefunguliwa (NSFileProtectionCompleteUnlessOpen): Inaruhusu upatikanaji wa faili hata baada ya kifaa kufungwa, ikiwa faili ilifunguliwa wakati kifaa kilifunguliwa.
  • Ililindwa Hadi Uthibitisho wa Kwanza wa Mtumiaji (NSFileProtectionCompleteUntilFirstUserAuthentication): Data inapatikana baada ya uthibitisho wa kwanza wa mtumiaji baada ya kuanzisha, ikibaki inapatikana hata kama kifaa kimefungwa tena.
  • Hakuna Ulinzi (NSFileProtectionNone): Data inalindwa tu na UID ya kifaa, ikiruhusu kufuta data kwa haraka kwa mbali.

Fichuo la madarasa yote, isipokuwa NSFileProtectionNone, linahusisha funguo inayotokana na UID ya kifaa na nambari ya siri ya mtumiaji, kuhakikisha kwamba kufichua kunawezekana tu kwenye kifaa chenye nambari sahihi ya siri. Kuanzia iOS 7 na kuendelea, darasa la ulinzi la kawaida ni "Ililindwa Hadi Uthibitisho wa Kwanza wa Mtumiaji".

Waendelezaji wanaweza kutumia FileDP, chombo cha kukagua darasa la ulinzi wa data wa faili kwenye iPhone.

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

Keychain

Katika iOS, Keychain inatumika kama konteina salama iliyo na usimbuaji kwa ajili ya kuhifadhi taarifa nyeti, inayopatikana tu na programu iliyohifadhi taarifa hizo au zile zilizoidhinishwa wazi. Usimbuaji huu unalindwa na nenosiri la kipekee lililotengenezwa na iOS, ambalo lenyewe limefichwa kwa AES. Mchakato huu wa usimbuaji unatumia PBKDF2 function, ukichanganya nambari ya siri ya mtumiaji na chumvi iliyotokana na UID ya kifaa, sehemu ambayo ni ya secure enclave chipset pekee inayoweza kufikiwa. Kwa hivyo, hata kama nambari ya siri ya mtumiaji inajulikana, maudhui ya Keychain yanabaki yasiyoweza kupatikana kwenye kifaa kingine chochote isipokuwa kile ambacho yalifichwa awali.

Usimamizi na ufikiaji wa data za Keychain unashughulikiwa na securityd daemon, kulingana na haki maalum za programu kama Keychain-access-groups na application-identifier.

Keychain API Operations

Keychain API, iliyoelezwa katika nyaraka za Keychain Services za Apple, inatoa kazi muhimu za usimamizi wa hifadhi salama:

  • SecItemAdd: Inaongeza kipengele kipya kwenye Keychain.
  • SecItemUpdate: Inaweza kuboresha kipengele kilichopo kwenye Keychain.
  • SecItemCopyMatching: Inapata kipengele kutoka kwenye Keychain.
  • SecItemDelete: Inafuta kipengele kutoka kwenye Keychain.

Kujaribu kufungua nenosiri la Keychain kunahusisha ama kushambulia funguo zilizofichwa moja kwa moja au kujaribu kukisia nambari ya siri kwenye kifaa chenyewe, ambayo inakabiliwa kwa kiasi kikubwa na utekelezaji wa secure enclave wa kuchelewesha kati ya majaribio yasiyofanikiwa.

Configuring Keychain Item Data Protection

Viwango vya ulinzi wa data kwa vipengele vya Keychain vinakabiliwa kwa kutumia sifa ya kSecAttrAccessible wakati wa kuunda au kuboresha kipengele. Viwango hivi, kama ilivyoainishwa na Apple, vinatambulisha wakati na jinsi vipengele vya Keychain vinavyopatikana:

  • kSecAttrAccessibleAlways: Inapatikana wakati wowote, bila kujali hali ya kufunga kifaa.
  • kSecAttrAccessibleAlwaysThisDeviceOnly: Inapatikana kila wakati, lakini haijajumuishwa kwenye nakala za akiba.
  • kSecAttrAccessibleAfterFirstUnlock: Inapatikana baada ya kufungua mara ya kwanza baada ya kuanzisha upya.
  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Kama ilivyo hapo juu, lakini haiwezi kuhamishwa kwa vifaa vipya.
  • kSecAttrAccessibleWhenUnlocked: Inapatikana tu wakati kifaa kimefunguliwa.
  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Inapatikana wakati kimefunguliwa, haijajumuishwa kwenye nakala za akiba.
  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Inahitaji nambari ya siri ya kifaa, haijajumuishwa kwenye nakala za akiba.

AccessControlFlags zinaboresha zaidi mbinu za ufikiaji, kuruhusu uthibitisho wa kibaiolojia au matumizi ya nambari ya siri.

Jailbroken Devices Warning

{% hint style="warning" %} Katika vifaa vilivyovunjwa, ulinzi wa Keychain umeharibiwa, na kuleta hatari kubwa ya usalama. {% endhint %}

Persistence of Keychain Data

Tofauti na data maalum za programu zinazofutwa wakati wa kufuta programu, data za Keychain zinadumu kwenye kifaa. Tabia hii inaweza kuwapa wamiliki wapya wa kifaa cha pili ufikiaji wa data za programu za mmiliki wa awali kwa kuanzisha upya programu. Wanakuza wanashauriwa kufuta data za Keychain kwa hiari wakati wa usakinishaji wa programu au wakati wa kutoka ili kupunguza hatari hii. Hapa kuna mfano wa msimbo wa Swift unaoonyesha jinsi ya kufuta data za Keychain wakati wa uzinduzi wa kwanza wa programu:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

App Capabilities

Katika eneo la maendeleo ya programu, sandboxing ina jukumu muhimu katika kuimarisha usalama. Mchakato huu unahakikisha kwamba kila programu inafanya kazi ndani ya directory yake ya nyumbani, hivyo kuzuia kufikia faili za mfumo au data zinazomilikiwa na programu nyingine. Utekelezaji wa vizuizi hivi unafanywa kupitia sera za sandbox, ambazo ni sehemu ya Trusted BSD (MAC) Mandatory Access Control Framework.

Wakuu wa programu wana uwezo wa kuunda uwezo au ruhusa fulani kwa programu zao, kama vile Data Protection au Keychain Sharing. Ruhusa hizi zinatumika mara moja baada ya programu kufungwa. Hata hivyo, ili kufikia rasilimali fulani zilizolindwa, programu inapaswa kupata idhini wazi kutoka kwa mtumiaji wakati wa jaribio la kwanza. Hii inafanywa kupitia matumizi ya purpose strings au usage description strings, ambazo zinawasilishwa kwa watumiaji katika arifa ya ombi la ruhusa.

Kwa wale wenye ufikiaji wa msimbo wa chanzo, uthibitisho wa ruhusa zilizo katika faili ya Info.plist unaweza kufanywa kwa:

  1. Kufungua mradi katika Xcode.
  2. Kutafuta na kufungua faili ya Info.plist.
  3. Kutafuta funguo zilizoanzishwa na "Privacy -", ikiwa na chaguo la kuona funguo/thamani za asili kwa uwazi.

Wakati wa kushughulikia faili ya IPA, hatua zifuatazo zinaweza kufuatwa:

  1. Fungua faili la IPA.
  2. Tafuta faili ya Info.plist ndani ya Payload/<appname>.app/.
  3. Geuza faili kuwa katika muundo wa XML ikiwa ni lazima, kwa ajili ya ukaguzi rahisi.

Kwa mfano, purpose strings katika faili ya Info.plist zinaweza kuonekana kama hii:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

Device Capabilities

Faili la Info.plist la programu linaeleza uwezo wa kifaa ambao husaidia Duka la Programu kuchuja programu kwa ajili ya ulinganifu wa kifaa. Hizi zimefafanuliwa chini ya UIRequiredDeviceCapabilities ufunguo. Kwa mfano:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

This example indicates that the app is compatible with the armv7 instruction set. Developers may also specify capabilities like nfc to ensure their app is only available to devices supporting NFC.

Entitlements

Entitlements ni kipengele kingine muhimu katika maendeleo ya programu za iOS, kinachofanya kazi kama jozi za funguo-thamani ambazo zinawapa programu ruhusa ya kufanya operesheni fulani zaidi ya ukaguzi wa wakati wa utekelezaji. Kwa mfano, kuwezesha Data Protection katika programu kunahusisha kuongeza ruhusa maalum katika mradi wa Xcode, ambayo kisha inaonyeshwa katika faili za ruhusa za programu au faili ya mkataba wa simu iliyojumuishwa kwa IPAs.

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}