mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-29 16:10:54 +00:00
156 lines
11 KiB
Markdown
156 lines
11 KiB
Markdown
|
# macOS - AMFI - AppleMobileFileIntegrity
|
||
|
|
||
|
{% hint style="success" %}
|
||
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|
||
|
|
||
|
|
||
|
|
||
|
## AppleMobileFileIntegrity.kext i amfid
|
||
|
|
||
|
Fokusira se na sprovođenje integriteta koda koji se izvršava na sistemu, pružajući logiku iza verifikacije potpisa koda XNU. Takođe može da proveri prava i obavlja druge osetljive zadatke kao što su omogućavanje debagovanja ili dobijanje portova zadataka.
|
||
|
|
||
|
Štaviše, za neke operacije, kext preferira da kontaktira korisnički prostor koji pokreće demon `/usr/libexec/amfid`. Ova poverljiva veza je zloupotrebljena u nekoliko jailbreak-ova.
|
||
|
|
||
|
AMFI koristi **MACF** politike i registruje svoje hook-ove u trenutku kada se pokrene. Takođe, sprečavanje njegovog učitavanja ili pražnjenja može izazvati kernel panic. Međutim, postoje neki argumenti za pokretanje koji omogućavaju oslabiti AMFI:
|
||
|
|
||
|
* `amfi_unrestricted_task_for_pid`: Dozvoljava task\_for\_pid bez potrebnih prava
|
||
|
* `amfi_allow_any_signature`: Dozvoljava bilo koji potpis koda
|
||
|
* `cs_enforcement_disable`: Argument na sistemskom nivou koji se koristi za onemogućavanje sprovođenja potpisa koda
|
||
|
* `amfi_prevent_old_entitled_platform_binaries`: Poništava platforme binarne sa pravima
|
||
|
* `amfi_get_out_of_my_way`: Potpuno onemogućava amfi
|
||
|
|
||
|
Ovo su neke od MACF politika koje registruje:
|
||
|
|
||
|
* **`cred_check_label_update_execve:`** Ažuriranje oznake će biti izvršeno i vratiće 1
|
||
|
* **`cred_label_associate`**: Ažurira AMFI-ovu mac oznaku
|
||
|
* **`cred_label_destroy`**: Uklanja AMFI-ovu mac oznaku
|
||
|
* **`cred_label_init`**: Postavlja 0 u AMFI-ovu mac oznaku
|
||
|
* **`cred_label_update_execve`:** Proverava prava procesa da vidi da li bi trebalo da mu bude dozvoljeno da menja oznake.
|
||
|
* **`file_check_mmap`:** Proverava da li mmap stiče memoriju i postavlja je kao izvršivu. U tom slučaju proverava da li je potrebna validacija biblioteke i, ako jeste, poziva funkciju za validaciju biblioteke.
|
||
|
* **`file_check_library_validation`**: Poziva funkciju za validaciju biblioteke koja proverava, između ostalog, da li platforma binarna učitava drugu platformu binarnu ili da li proces i novo učitani fajl imaju isti TeamID. Određena prava će takođe omogućiti učitavanje bilo koje biblioteke.
|
||
|
* **`policy_initbsd`**: Postavlja poverljive NVRAM ključeve
|
||
|
* **`policy_syscall`**: Proverava DYLD politike kao što su da li binarna ima neograničene segmente, da li bi trebalo da dozvoli env varijable... ovo se takođe poziva kada se proces pokreće putem `amfi_check_dyld_policy_self()`.
|
||
|
* **`proc_check_inherit_ipc_ports`**: Proverava da li kada proces izvršava novu binarnu, drugi procesi sa SEND pravima nad portom zadatka procesa treba da ih zadrže ili ne. Platforme binarne su dozvoljene, `get-task-allow` pravo to dozvoljava, `task_for_pid-allow` prava su dozvoljena i binarne sa istim TeamID.
|
||
|
* **`proc_check_expose_task`**: sprovodi prava
|
||
|
* **`amfi_exc_action_check_exception_send`**: Poruka izuzetka se šalje debageru
|
||
|
* **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: Ciklus života oznake tokom obrade izuzetaka (debugging)
|
||
|
* **`proc_check_get_task`**: Proverava prava kao što su `get-task-allow` koja omogućava drugim procesima da dobiju portove zadataka i `task_for_pid-allow`, koja omogućava procesu da dobije portove zadataka drugih procesa. Ako nijedno od toga nije, poziva `amfid permitunrestricteddebugging` da proveri da li je dozvoljeno.
|
||
|
* **`proc_check_mprotect`**: Odbija ako je `mprotect` pozvan sa oznakom `VM_PROT_TRUSTED` koja ukazuje da region mora biti tretiran kao da ima validan potpis koda.
|
||
|
* **`vnode_check_exec`**: Poziva se kada se izvršne datoteke učitavaju u memoriju i postavlja `cs_hard | cs_kill` što će ubiti proces ako neka od stranica postane nevažeća
|
||
|
* **`vnode_check_getextattr`**: MacOS: Proverava `com.apple.root.installed` i `isVnodeQuarantined()`
|
||
|
* **`vnode_check_setextattr`**: Kao get + com.apple.private.allow-bless i interno-instalater-ekvivalentno pravo
|
||
|
*  **`vnode_check_signature`**: Kod koji poziva XNU da proveri potpis koda koristeći prava, trust cache i `amfid`
|
||
|
*  **`proc_check_run_cs_invalid`**: Presreće `ptrace()` pozive (`PT_ATTACH` i `PT_TRACE_ME`). Proverava za bilo koje od prava `get-task-allow`, `run-invalid-allow` i `run-unsigned-code` i ako nijedno, proverava da li je debagovanje dozvoljeno.
|
||
|
* **`proc_check_map_anon`**: Ako je mmap pozvan sa oznakom **`MAP_JIT`**, AMFI će proveriti za `dynamic-codesigning` pravo.
|
||
|
|
||
|
`AMFI.kext` takođe izlaže API za druge kernel ekstenzije, i moguće je pronaći njegove zavisnosti sa:
|
||
|
```bash
|
||
|
kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
|
||
|
Executing: /usr/bin/kmutil showloaded
|
||
|
No variant specified, falling back to release
|
||
|
8 com.apple.kec.corecrypto
|
||
|
19 com.apple.driver.AppleMobileFileIntegrity
|
||
|
22 com.apple.security.sandbox
|
||
|
24 com.apple.AppleSystemPolicy
|
||
|
67 com.apple.iokit.IOUSBHostFamily
|
||
|
70 com.apple.driver.AppleUSBTDM
|
||
|
71 com.apple.driver.AppleSEPKeyStore
|
||
|
74 com.apple.iokit.EndpointSecurity
|
||
|
81 com.apple.iokit.IOUserEthernet
|
||
|
101 com.apple.iokit.IO80211Family
|
||
|
102 com.apple.driver.AppleBCMWLANCore
|
||
|
118 com.apple.driver.AppleEmbeddedUSBHost
|
||
|
134 com.apple.iokit.IOGPUFamily
|
||
|
135 com.apple.AGXG13X
|
||
|
137 com.apple.iokit.IOMobileGraphicsFamily
|
||
|
138 com.apple.iokit.IOMobileGraphicsFamily-DCP
|
||
|
162 com.apple.iokit.IONVMeFamily
|
||
|
```
|
||
|
## amfid
|
||
|
|
||
|
Ovo je demon koji se pokreće u korisničkom režimu i koji `AMFI.kext` koristi za proveru potpisa koda u korisničkom režimu.\
|
||
|
Da bi `AMFI.kext` komunicirao sa demonom, koristi mach poruke preko porta `HOST_AMFID_PORT`, koji je poseban port `18`.
|
||
|
|
||
|
Napomena: u macOS-u više nije moguće da root procesi preuzmu posebne portove jer su zaštićeni `SIP`-om i samo launchd može da ih dobije. U iOS-u se proverava da proces koji šalje odgovor ima hardkodovani CDHash `amfid`.
|
||
|
|
||
|
Moguće je videti kada se `amfid` traži da proveri binarni fajl i odgovor na to tako što se debaguje i postavi breakpoint u `mach_msg`.
|
||
|
|
||
|
Kada se poruka primi putem posebnog porta, **MIG** se koristi za slanje svake funkcije funkciji koju poziva. Glavne funkcije su obrnute i objašnjene unutar knjige.
|
||
|
|
||
|
## Provisioning Profiles
|
||
|
|
||
|
Provisioning profil se može koristiti za potpisivanje koda. Postoje **Developer** profili koji se mogu koristiti za potpisivanje koda i njegovo testiranje, i **Enterprise** profili koji se mogu koristiti na svim uređajima.
|
||
|
|
||
|
Nakon što je aplikacija poslata u Apple Store, ako je odobrena, potpisuje je Apple i provisioning profil više nije potreban.
|
||
|
|
||
|
Profil obično koristi ekstenziju `.mobileprovision` ili `.provisionprofile` i može se dumpovati sa:
|
||
|
```bash
|
||
|
openssl asn1parse -inform der -in /path/to/profile
|
||
|
|
||
|
# Or
|
||
|
|
||
|
security cms -D -i /path/to/profile
|
||
|
```
|
||
|
Iako se ponekad nazivaju sertifikovanim, ovi profili za dodeljivanje imaju više od sertifikata:
|
||
|
|
||
|
* **AppIDName:** Identifikator aplikacije
|
||
|
* **AppleInternalProfile**: Oznaka da je ovo Apple interni profil
|
||
|
* **ApplicationIdentifierPrefix**: Prependovan AppIDName (isto kao TeamIdentifier)
|
||
|
* **CreationDate**: Datum u formatu `YYYY-MM-DDTHH:mm:ssZ`
|
||
|
* **DeveloperCertificates**: Niz (obično jedan) sertifikat(a), kodiran kao Base64 podaci
|
||
|
* **Entitlements**: Prava dozvoljena sa pravima za ovaj profil
|
||
|
* **ExpirationDate**: Datum isteka u formatu `YYYY-MM-DDTHH:mm:ssZ`
|
||
|
* **Name**: Ime aplikacije, isto kao AppIDName
|
||
|
* **ProvisionedDevices**: Niz (za sertifikate programera) UDID-ova za koje je ovaj profil važeći
|
||
|
* **ProvisionsAllDevices**: Boolean (true za preduzetničke sertifikate)
|
||
|
* **TeamIdentifier**: Niz (obično jedan) alfanumerički string(ovi) korišćeni za identifikaciju programera u svrhe interakcije između aplikacija
|
||
|
* **TeamName**: Ime koje je lako čitljivo i koristi se za identifikaciju programera
|
||
|
* **TimeToLive**: Važenje (u danima) sertifikata
|
||
|
* **UUID**: Univerzalno jedinstveni identifikator za ovaj profil
|
||
|
* **Version**: Trenutno postavljeno na 1
|
||
|
|
||
|
Napomena da će unos prava sadržati ograničen skup prava i profil za dodeljivanje će moći da dodeli samo ta specifična prava kako bi se sprečilo davanje privatnih prava Apple-u.
|
||
|
|
||
|
Napomena da se profili obično nalaze u `/var/MobileDeviceProvisioningProfiles` i moguće je proveriti ih sa **`security cms -D -i /path/to/profile`**
|
||
|
|
||
|
## **libmis.dyld**
|
||
|
|
||
|
Ovo je spoljašnja biblioteka koju `amfid` poziva kako bi pitao da li treba da dozvoli nešto ili ne. Ovo je istorijski zloupotrebljavano u jailbreak-u pokretanjem verzije sa backdoor-om koja bi dozvolila sve.
|
||
|
|
||
|
U macOS-u ovo je unutar `MobileDevice.framework`.
|
||
|
|
||
|
## AMFI Trust Caches
|
||
|
|
||
|
iOS AMFI održava listu poznatih hash-eva koji su potpisani ad-hoc, nazvanu **Trust Cache** i nalazi se u `__TEXT.__const` sekciji kext-a. Napomena da je u vrlo specifičnim i osetljivim operacijama moguće proširiti ovu Trust Cache sa spoljnim fajlom.
|
||
|
|
||
|
## References
|
||
|
|
||
|
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||
|
|
||
|
{% hint style="success" %}
|
||
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|