Translated ['mobile-pentesting/ios-pentesting/README.md'] to it

This commit is contained in:
Translator 2024-04-23 20:58:36 +00:00
parent ad5efd1c6f
commit 92d5b8586d

View file

@ -1,9 +1,9 @@
# iOS Pentesting
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
\
Utilizza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) per creare facilmente e **automatizzare flussi di lavoro** supportati dagli strumenti della community più avanzati al mondo.\
Utilizza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) per creare e **automatizzare flussi di lavoro** con gli strumenti della community più avanzati al mondo.\
Ottieni l'accesso oggi:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -14,11 +14,11 @@ Ottieni l'accesso oggi:
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>
@ -28,7 +28,7 @@ Altri modi per supportare HackTricks:
[ios-basics.md](ios-basics.md)
{% endcontent-ref %}
## Ambiente di test
## Ambiente di testing
In questa pagina puoi trovare informazioni sul **simulatore iOS**, **emulatori** e **jailbreaking:**
@ -38,9 +38,9 @@ In questa pagina puoi trovare informazioni sul **simulatore iOS**, **emulatori**
## Analisi iniziale
### Operazioni di base di test di iOS
### Operazioni di base di testing su iOS
Durante il test **saranno suggerite diverse operazioni** (connettersi al dispositivo, leggere/scrivere/caricare/scaricare file, utilizzare alcuni strumenti...). Pertanto, se non sai come eseguire una qualsiasi di queste azioni, **inizia leggendo la pagina**:
Durante il testing **saranno suggerite diverse operazioni** (connettersi al dispositivo, leggere/scrivere/caricare/scaricare file, utilizzare alcuni strumenti...). Pertanto, se non sai come eseguire una di queste azioni, **inizia leggendo la pagina**:
{% content-ref url="basic-ios-testing-operations.md" %}
[basic-ios-testing-operations.md](basic-ios-testing-operations.md)
@ -48,7 +48,7 @@ Durante il test **saranno suggerite diverse operazioni** (connettersi al disposi
{% hint style="info" %}
Per i passaggi seguenti **l'applicazione dovrebbe essere installata** sul dispositivo e dovresti aver già ottenuto il **file IPA** dell'applicazione.\
Leggi la pagina [Operazioni di base di test di iOS](basic-ios-testing-operations.md) per imparare come farlo.
Leggi la pagina [Operazioni di base di testing su iOS](basic-ios-testing-operations.md) per imparare come fare ciò.
{% endhint %}
### Analisi statica di base
@ -149,7 +149,7 @@ Controlla l'analisi dinamica che [**MobSF**](https://github.com/MobSF/Mobile-Sec
### Elencazione delle App Installate
Utilizza il comando `frida-ps -Uai` per determinare il **bundle identifier** delle app installate:
Utilizza il comando `frida-ps -Uai` per determinare l'**identificatore del bundle** delle app installate:
```bash
$ frida-ps -Uai
PID Name Identifier
@ -172,24 +172,24 @@ Scopri come **enumerare i componenti dell'applicazione** e come **agganciare fac
### Struttura IPA
La struttura di un file **IPA** è essenzialmente quella di un **pacchetto compresso**. Rinominando l'estensione in `.zip`, è possibile **decomprimere** il file per rivelarne i contenuti. All'interno di questa struttura, un **Bundle** rappresenta un'applicazione completamente confezionata pronta per l'installazione. All'interno, troverai una directory chiamata `<NAME>.app`, che racchiude le risorse dell'applicazione.
La struttura di un file **IPA** è essenzialmente quella di un **pacchetto compresso**. Rinominando l'estensione in `.zip`, può essere **decompresso** per rivelarne i contenuti. All'interno di questa struttura, un **Bundle** rappresenta un'applicazione completamente confezionata pronta per l'installazione. All'interno, troverai una directory chiamata `<NAME>.app`, che racchiude le risorse dell'applicazione.
* **`Info.plist`**: Questo file contiene dettagli specifici di configurazione dell'applicazione.
* **`Info.plist`**: Questo file contiene dettagli di configurazione specifici dell'applicazione.
* **`_CodeSignature/`**: Questa directory include un file plist che contiene una firma, garantendo l'integrità di tutti i file nel bundle.
* **`Assets.car`**: Un archivio compresso che memorizza file di risorse come icone.
* **`Frameworks/`**: Questa cartella contiene le librerie native dell'applicazione, che possono essere file `.dylib` o `.framework`.
* **`PlugIns/`**: Questo può includere estensioni dell'applicazione, conosciute come file `.appex`, anche se non sono sempre presenti.
* **`Frameworks/`**: Questa cartella contiene le librerie native dell'applicazione, che possono essere sotto forma di file `.dylib` o `.framework`.
* **`PlugIns/`**: Questo può includere estensioni dell'applicazione, note come file `.appex`, anche se non sono sempre presenti.
* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Viene utilizzato per salvare i dati permanenti dell'applicazione per un uso offline, per memorizzare dati temporanei e per aggiungere funzionalità di annullamento all'applicazione su un singolo dispositivo. Per sincronizzare i dati su più dispositivi in un singolo account iCloud, Core Data replica automaticamente lo schema in un contenitore CloudKit.
* [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): Il file `PkgInfo` è un modo alternativo per specificare i codici di tipo e creatore della tua applicazione o bundle.
* **en.lproj, fr.proj, Base.lproj**: Sono i pacchetti linguistici che contengono risorse per quelle lingue specifiche e una risorsa predefinita nel caso in cui una lingua non sia supportata.
* **Sicurezza**: La directory `_CodeSignature/` svolge un ruolo critico nella sicurezza dell'app verificando l'integrità di tutti i file inclusi attraverso firme digitali.
* **Gestione delle Risorse**: Il file `Assets.car` utilizza la compressione per gestire efficientemente le risorse grafiche, essenziale per ottimizzare le prestazioni dell'applicazione e ridurne le dimensioni complessive.
* **Gestione delle Risorse**: Il file `Assets.car` utilizza la compressione per gestire efficientemente le risorse grafiche, essenziale per ottimizzare le performance dell'applicazione e ridurne le dimensioni complessive.
* **Frameworks e PlugIns**: Queste directory sottolineano la modularità delle applicazioni iOS, consentendo agli sviluppatori di includere librerie di codice riutilizzabili (`Frameworks/`) ed estendere la funzionalità dell'app (`PlugIns/`).
* **Localizzazione**: La struttura supporta più lingue, facilitando la portata globale dell'applicazione includendo risorse per pacchetti linguistici specifici.
* **Localizzazione**: La struttura supporta più lingue, facilitando il raggiungimento globale dell'applicazione includendo risorse per pacchetti linguistici specifici.
**Info.plist**
L'**Info.plist** funge da fondamento per le applicazioni iOS, racchiudendo dati di configurazione chiave sotto forma di coppie **chiave-valore**. Questo file è un requisito non solo per le applicazioni ma anche per le estensioni dell'app e i framework inclusi. È strutturato in formato XML o binario e contiene informazioni critiche che vanno dai permessi dell'app alle configurazioni di sicurezza. Per una dettagliata esplorazione delle chiavi disponibili, si può fare riferimento alla [**Documentazione per Sviluppatori Apple**](https://developer.apple.com/documentation/bundleresources/information\_property\_list?language=objc).
L'**Info.plist** funge da fondamento per le applicazioni iOS, racchiudendo dati di configurazione chiave sotto forma di coppie **chiave-valore**. Questo file è un requisito non solo per le applicazioni ma anche per le estensioni delle app e i framework inclusi. È strutturato in formato XML o binario e contiene informazioni critiche che vanno dalle autorizzazioni dell'app alle configurazioni di sicurezza. Per una dettagliata esplorazione delle chiavi disponibili, si può fare riferimento alla [**Documentazione per Sviluppatori Apple**](https://developer.apple.com/documentation/bundleresources/information\_property\_list?language=objc).
Per coloro che desiderano lavorare con questo file in un formato più accessibile, la conversione in XML può essere ottenuta facilmente tramite l'uso di `plutil` su macOS (disponibile nativamente nelle versioni 10.2 e successive) o `plistutil` su Linux. I comandi per la conversione sono i seguenti:
@ -202,13 +202,19 @@ $ plutil -convert xml1 Info.plist
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
```
Tra le miriadi di informazioni che il file **Info.plist** può rivelare, vanno menzionate le stringhe di autorizzazione dell'app (`UsageDescription`), gli schemi URL personalizzati (`CFBundleURLTypes`), e le configurazioni per la Sicurezza del Trasporto dell'App (`NSAppTransportSecurity`). Queste voci, insieme ad altre come i tipi di documento personalizzati esportati/importati (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), possono essere facilmente individuate ispezionando il file o utilizzando un semplice comando `grep`:
Tra le miriadi di informazioni che il file **Info.plist** può divulgare, le voci degne di nota includono le stringhe delle autorizzazioni dell'app (`UsageDescription`), gli schemi URL personalizzati (`CFBundleURLTypes`), e le configurazioni per la Sicurezza del Trasporto dell'App (`NSAppTransportSecurity`). Queste voci, insieme ad altre come i tipi di documento personalizzati esportati/importati (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), possono essere facilmente individuate ispezionando il file o utilizzando un semplice comando `grep`:
```bash
$ grep -i <keyword> Info.plist
```
**Percorsi dei Dati**
**Percorsi dei dati**
Nell'ambiente iOS, le directory sono designate specificamente per le **applicazioni di sistema** e le **applicazioni installate dall'utente**. Le applicazioni di sistema risiedono nella directory `/Applications`, mentre le app installate dall'utente sono collocate sotto `/private/var/containers/`. Queste applicazioni sono assegnate un identificatore univoco noto come un **UUID a 128 bit**, rendendo difficile il compito di individuare manualmente la cartella di un'app a causa della casualità dei nomi delle directory.
Nell'ambiente iOS, ci sono directory designate specificamente per le **applicazioni di sistema** e le **applicazioni installate dall'utente**. Le applicazioni di sistema risiedono nella directory `/Applications`, mentre le app installate dall'utente sono collocate sotto `/var/mobile/containers/Data/Application/`. Queste applicazioni sono assegnate un identificatore univoco noto come **UUID a 128 bit**, rendendo difficile individuare manualmente la cartella di un'app a causa della casualità dei nomi delle directory.
{% hint style="warning" %}
Poiché le applicazioni in iOS devono essere sandboxate, ogni app avrà anche una cartella all'interno di **`$HOME/Library/Containers`** con l'**`CFBundleIdentifier`** dell'app come nome della cartella.
Tuttavia, entrambe le cartelle (dati e cartelle dei contenitori) contengono il file **`.com.apple.mobile_container_manager.metadata.plist`** che collega entrambi i file nella chiave `MCMetadataIdentifier`).
{% endhint %}
Per facilitare la scoperta della directory di installazione di un'app installata dall'utente, lo strumento **objection** fornisce un comando utile, `env`. Questo comando rivela informazioni dettagliate sulla directory dell'app in questione. Di seguito è riportato un esempio di come utilizzare questo comando:
```bash
@ -225,7 +231,7 @@ In alternativa, il nome dell'app può essere cercato all'interno di `/private/va
```bash
find /private/var/containers -name "Progname*"
```
I comandi come `ps` e `lsof` possono essere utilizzati per identificare il processo dell'app e elencare i file aperti, rispettivamente, fornendo informazioni sui percorsi attivi dell'applicazione:
I comandi come `ps` e `lsof` possono anche essere utilizzati per identificare il processo dell'app e elencare i file aperti, rispettivamente, fornendo informazioni sui percorsi attivi dell'applicazione:
```bash
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
@ -255,7 +261,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
* Il sistema operativo potrebbe eliminare automaticamente i file di questa directory quando l'applicazione non è in esecuzione e lo spazio di archiviazione è scarso.
* **Library/Application Support/**
* Contiene **file persistenti necessari per l'esecuzione dell'applicazione**.
* **Invisibile agli utenti** e gli utenti non possono scriverci.
* **Invisibile** **agli** **utenti** e gli utenti non possono scriverci.
* I contenuti in questa directory **vengono salvati**.
* L'applicazione può disabilitare i percorsi impostando `NSURLIsExcludedFromBackupKey`.
* **Library/Preferences/**
@ -283,7 +289,7 @@ Regular 420 None ... LICENSE.txt
Regular 420 None ... Sentinel.txt
Regular 420 None ... README.txt
```
### Analisi Binaria
### Reverse Engineering Binario
All'interno della cartella `<nome-applicazione>.app` troverai un file binario chiamato `<nome-applicazione>`. Questo è il file che verrà **eseguito**. Puoi effettuare un'ispezione di base del binario con lo strumento **`otool`**:
```bash
@ -301,13 +307,13 @@ DVIA-v2:
```
**Verifica se l'app è crittografata**
Controlla se c'è un output per:
Verifica se c'è un output per:
```bash
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
```
**Disassemblare il binario**
Disassemblare la sezione di testo:
Disassembla la sezione di testo:
```bash
otool -tV DVIA-v2
DVIA-v2:
@ -321,7 +327,7 @@ DVIA-v2:
0000000100004acc adrp x10, 1098 ; 0x10044e000
0000000100004ad0 add x10, x10, #0x268
```
Per stampare il segmento **Objective-C** dell'applicazione di esempio, è possibile utilizzare:
Per stampare il segmento **Objective-C** dell'applicazione di esempio si può utilizzare:
```bash
otool -oV DVIA-v2
DVIA-v2:
@ -363,7 +369,7 @@ double _field2;
```
Tuttavia, le migliori opzioni per disassemblare il binario sono: [**Hopper**](https://www.hopperapp.com/download.html?) e [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/).
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
\
Utilizza [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) per creare e **automatizzare flussi di lavoro** con gli strumenti della community più avanzati al mondo.\
@ -373,7 +379,7 @@ Ottieni l'accesso oggi:
## Archiviazione dei dati
Per apprendere come iOS archivia i dati nel dispositivo, leggi questa pagina:
Per capire come iOS archivia i dati nel dispositivo, leggi questa pagina:
{% content-ref url="ios-basics.md" %}
[ios-basics.md](ios-basics.md)
@ -386,15 +392,15 @@ L'obiettivo è trovare **informazioni sensibili non protette** dell'applicazione
### Plist
I file **plist** sono file XML strutturati che **contengono coppie chiave-valore**. È un modo per archiviare dati persistenti, quindi a volte potresti trovare **informazioni sensibili in questi file**. È consigliabile controllare questi file dopo l'installazione dell'app e dopo averlo utilizzato intensivamente per vedere se vengono scritti nuovi dati.
I file **plist** sono file XML strutturati che **contengono coppie chiave-valore**. È un modo per memorizzare dati persistenti, quindi a volte potresti trovare **informazioni sensibili in questi file**. È consigliabile controllare questi file dopo l'installazione dell'app e dopo averlo utilizzato intensivamente per vedere se vengono scritti nuovi dati.
Il modo più comune per persistere i dati nei file plist è tramite l'uso di **NSUserDefaults**. Questo file plist viene salvato all'interno del sandbox dell'app in **`Library/Preferences/<appBundleID>.plist`**
La classe [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) fornisce un'interfaccia programmatica per interagire con il sistema predefinito. Il sistema predefinito consente a un'applicazione di personalizzare il suo comportamento in base alle **preferenze dell'utente**. I dati salvati da `NSUserDefaults` possono essere visualizzati nel bundle dell'applicazione. Questa classe archivia **dati** in un **file plist**, ma è destinata ad essere utilizzata con piccole quantità di dati.
La classe [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) fornisce un'interfaccia programmatica per interagire con il sistema predefinito. Il sistema predefinito consente a un'applicazione di personalizzare il suo comportamento in base alle **preferenze dell'utente**. I dati salvati da `NSUserDefaults` possono essere visualizzati nel bundle dell'applicazione. Questa classe memorizza **dati** in un **file plist**, ma è destinata ad essere utilizzata con piccole quantità di dati.
Questi dati non possono essere più accessibili direttamente tramite un computer attendibile, ma possono essere accessibili eseguendo un **backup**.
Puoi **dumpare** le informazioni salvate utilizzando **`NSUserDefaults`** utilizzando `ios nsuserdefaults get` di objection.
Puoi **estrarre** le informazioni salvate utilizzando **`NSUserDefaults`** utilizzando `ios nsuserdefaults get` di objection.
Per trovare tutti i plist utilizzati dall'applicazione, puoi accedere a `/private/var/mobile/Containers/Data/Application/{APPID}` e eseguire:
```bash
@ -411,19 +417,17 @@ $ plutil -convert xml1 Info.plist
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
```
**All'interno di una sessione di Objection:** Per analizzare le applicazioni mobili, un comando specifico ti consente di convertire direttamente i file plist:
**All'interno di una sessione di Objection:** Per analizzare le applicazioni mobili, un comando specifico consente di convertire direttamente i file plist:
```bash
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
```
### Core Data
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) è un framework per gestire il livello di modello degli oggetti nella tua applicazione. [Core Data può utilizzare SQLite come archivio persistente](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ma il framework stesso non è un database. CoreData non crittografa i suoi dati di default. Tuttavia, è possibile aggiungere uno strato di crittografia aggiuntivo a CoreData. Consulta il [GitHub Repo](https://github.com/project-imas/encrypted-core-data) per ulteriori dettagli.
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) è un framework per gestire il livello di modello degli oggetti nella tua applicazione. [Core Data può utilizzare SQLite come archivio persistente](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), ma il framework stesso non è un database. CoreData non crittografa i suoi dati per impostazione predefinita. Tuttavia, è possibile aggiungere uno strato di crittografia aggiuntivo a CoreData. Consulta il [GitHub Repo](https://github.com/project-imas/encrypted-core-data) per ulteriori dettagli.
È possibile trovare le informazioni di SQLite Core Data di un'applicazione nel percorso `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support`
**Se riesci ad aprire il SQLite e accedere a informazioni sensibili, allora hai trovato una cattiva configurazione.**
{% code title="Codice da iGoat" %}
**Se riesci ad aprire il file SQLite e accedere a informazioni sensibili, allora hai trovato una configurazione errata.**
```objectivec
-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);
@ -464,15 +468,15 @@ find ./ -name "*.sqlite" -or -name "*.db"
Ai developer è consentito **memorizzare e sincronizzare dati** all'interno di un **database ospitato su cloud NoSQL** tramite il Database in tempo reale di Firebase. Memorizzati in formato JSON, i dati vengono sincronizzati in tempo reale su tutti i client connessi.
Puoi scoprire come verificare la presenza di database Firebase mal configurati qui:
Puoi scoprire come verificare la presenza di database Firebase configurati in modo errato qui:
{% content-ref url="../../network-services-pentesting/pentesting-web/buckets/firebase-database.md" %}
[firebase-database.md](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
{% endcontent-ref %}
### Database di Realm
### Database Realm
[Realm Objective-C](https://realm.io/docs/objc/latest/) e [Realm Swift](https://realm.io/docs/swift/latest/) offrono un'alternativa potente per la memorizzazione dei dati, non fornita da Apple. Per impostazione predefinita, **memorizzano dati non crittografati**, con la crittografia disponibile tramite configurazioni specifiche.
[Realm Objective-C](https://realm.io/docs/objc/latest/) e [Realm Swift](https://realm.io/docs/swift/latest/) offrono un'alternativa potente per lo storage dei dati, non fornita da Apple. Per impostazione predefinita, **memorizzano dati non crittografati**, con la crittografia disponibile tramite configurazioni specifiche.
I database si trovano in: `/private/var/mobile/Containers/Data/Application/{APPID}`. Per esplorare questi file, è possibile utilizzare comandi come:
```bash
@ -505,7 +509,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
```
### Cookies
iOS memorizza i cookie delle app nella cartella **`Library/Cookies/cookies.binarycookies`** all'interno di ciascuna cartella dell'app. Tuttavia, a volte gli sviluppatori decidono di salvarli nell'**keychain** poiché il suddetto **file dei cookie può essere accessibile nei backup**.
iOS memorizza i cookie delle app nella cartella **`Library/Cookies/cookies.binarycookies`** all'interno di ciascuna cartella dell'app. Tuttavia, a volte gli sviluppatori decidono di salvarli nell'**portachiavi** poiché il suddetto **file dei cookie può essere accessibile nei backup**.
Per ispezionare il file dei cookie puoi utilizzare [**questo script python**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) o utilizzare il comando **`ios cookies get`** di objection.\
**Puoi anche utilizzare objection per** convertire questi file in formato JSON e ispezionare i dati.
@ -535,18 +539,18 @@ Di default NSURLSession memorizza i dati, come le **richieste e le risposte HTTP
`URLCache.shared.removeAllCachedResponses()`
Questo metodo rimuoverà tutte le richieste e risposte memorizzate dal file Cache.db.
2. Se non è necessario utilizzare i vantaggi dei cookie, sarebbe consigliabile utilizzare la proprietà di configurazione [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) di URLSession, che disabiliterà il salvataggio dei cookie e della cache.
2. Se non è necessario utilizzare i vantaggi dei cookie, sarebbe consigliabile utilizzare semplicemente la proprietà di configurazione [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) di URLSession, che disabiliterà il salvataggio dei cookie e della cache.
[Documentazione Apple](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
`Un oggetto di configurazione di sessione effimera è simile a una configurazione di sessione predefinita (vedi predefinito), tranne che l'oggetto di sessione corrispondente non memorizza cache, archivi di credenziali o dati correlati alla sessione su disco. Invece, i dati correlati alla sessione sono memorizzati in RAM. L'unica volta in cui una sessione effimera scrive dati su disco è quando gli si dice di scrivere i contenuti di un URL su un file.`
`Un oggetto di configurazione della sessione effimera è simile a un oggetto di configurazione della sessione predefinita (vedi predefinito), tranne che l'oggetto di sessione corrispondente non memorizza cache, archivi di credenziali o dati correlati alla sessione su disco. Invece, i dati correlati alla sessione sono memorizzati in RAM. L'unica volta in cui una sessione effimera scrive dati su disco è quando gli si dice di scrivere i contenuti di un URL su un file.`
3. La cache può essere disabilitata impostando la Policy della Cache su [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Ciò disabiliterà la memorizzazione della cache in qualsiasi modo, sia in memoria che su disco.
### Snapshots
Ogni volta che si preme il pulsante home, iOS **fa uno snapshot dello schermo corrente** per poter effettuare la transizione all'applicazione in modo più fluido. Tuttavia, se sono presenti **dati sensibili** nello schermo corrente, verranno **salvati** nell'**immagine** (che **persiste** **attraverso** **riavvii**). Questi sono gli snapshot a cui è possibile accedere anche facendo doppio tap sullo schermo home per passare tra le app.
Ogni volta che si preme il pulsante home, iOS **fa uno snapshot dello schermo corrente** per poter effettuare la transizione all'applicazione in modo più fluido. Tuttavia, se sono presenti **dati sensibili** nello schermo corrente, verranno **salvati** nell'**immagine** (che **persiste** **attraverso** **riavvii**). Questi sono gli snapshot a cui è possibile accedere anche facendo doppio tap sullo schermo home per passare da un'app all'altra.
A meno che l'iPhone non sia stato sottoposto a jailbreak, l'**attaccante** deve avere **accesso** al **dispositivo** **sbloccato** per vedere queste schermate. Di default, l'ultimo snapshot è memorizzato nella sandbox dell'applicazione nella cartella `Library/Caches/Snapshots/` o `Library/SplashBoard/Snapshots` (i computer fidati non possono accedere al filesystem da iOS 7.0).
A meno che l'iPhone non sia jailbroken, l'**attaccante** deve avere **accesso** al **dispositivo** **sbloccato** per vedere queste schermate. Di default, l'ultimo snapshot è memorizzato nella sandbox dell'applicazione nella cartella `Library/Caches/Snapshots/` o `Library/SplashBoard/Snapshots` (i computer fidati non possono accedere al filesystem da iOS 7.0).
Un modo per prevenire questo comportamento indesiderato è quello di mettere uno schermo vuoto o rimuovere i dati sensibili prima di fare lo snapshot utilizzando la funzione `ApplicationDidEnterBackground()`.
@ -568,8 +572,6 @@ backgroundImage?.removeFromSuperview()
}
```
**Objective-C:**
**Obiettivo-C:**
```
@property (UIImageView *)backgroundImage;
@ -584,7 +586,7 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.backgroundImage removeFromSuperview];
}
```
Questo imposta l'immagine di sfondo su `overlayImage.png` ogni volta che l'applicazione passa in background. Ciò previene perdite di dati sensibili poiché `overlayImage.png` sovrascriverà sempre la vista corrente.
Questo imposta l'immagine di sfondo su `overlayImage.png` ogni volta che l'applicazione passa in background. Ciò impedisce perdite di dati sensibili perché `overlayImage.png` sovrascriverà sempre la vista corrente.
### Portachiavi
@ -602,7 +604,7 @@ Per estrarre queste credenziali memorizzate, viene utilizzato il comando `ios ns
## **Tastiere personalizzate e cache della tastiera**
Con iOS 8.0 in poi, gli utenti possono installare estensioni di tastiera personalizzate, gestibili in **Impostazioni > Generali > Tastiera > Tastiere**. Anche se queste tastiere offrono funzionalità estese, rappresentano un rischio di registrazione dei tasti premuti e di trasmissione dei dati a server esterni, anche se agli utenti viene notificato riguardo alle tastiere che richiedono l'accesso alla rete. Le app possono, e dovrebbero, limitare l'uso delle tastiere personalizzate per l'inserimento di informazioni sensibili.
Con iOS 8.0 in poi, gli utenti possono installare estensioni di tastiera personalizzate, gestibili in **Impostazioni > Generali > Tastiera > Tastiere**. Anche se queste tastiere offrono funzionalità estese, pongono il rischio di registrazione dei tasti premuti e di trasmissione dei dati a server esterni, anche se agli utenti viene notificato riguardo alle tastiere che richiedono l'accesso alla rete. Le app possono e dovrebbero limitare l'uso delle tastiere personalizzate per l'inserimento di informazioni sensibili.
**Raccomandazioni di sicurezza:**
@ -612,12 +614,12 @@ Con iOS 8.0 in poi, gli utenti possono installare estensioni di tastiera persona
### **Prevenire la memorizzazione nella cache dei campi di testo**
Il protocollo [UITextInputTraits](https://developer.apple.com/reference/uikit/uitextinputtraits) offre proprietà per gestire l'autocorrezione e l'inserimento di testo sicuro, essenziali per prevenire la memorizzazione di informazioni sensibili. Ad esempio, è possibile disabilitare l'autocorrezione e abilitare l'inserimento di testo sicuro con:
Il [protocollo UITextInputTraits](https://developer.apple.com/reference/uikit/uitextinputtraits) offre proprietà per gestire l'autocorrezione e l'inserimento di testo sicuro, essenziali per prevenire la memorizzazione di informazioni sensibili nella cache. Ad esempio, è possibile disabilitare l'autocorrezione e abilitare l'inserimento di testo sicuro con:
```objectivec
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
```
Inoltre, gli sviluppatori dovrebbero assicurarsi che i campi di testo, specialmente quelli per l'inserimento di informazioni sensibili come password e PIN, disabilitino la memorizzazione nella cache impostando `autocorrectionType` su `UITextAutocorrectionTypeNo` e `secureTextEntry` su `YES`.
Inoltre, gli sviluppatori dovrebbero assicurarsi che i campi di testo, specialmente quelli per inserire informazioni sensibili come password e PIN, disabilitino la memorizzazione nella cache impostando `autocorrectionType` su `UITextAutocorrectionTypeNo` e `secureTextEntry` su `YES`.
```objectivec
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
@ -626,7 +628,7 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
Il debug del codice spesso implica l'uso del **logging**. C'è un rischio in quanto **i log possono contenere informazioni sensibili**. In precedenza, in iOS 6 e nelle versioni precedenti, i log erano accessibili a tutte le app, creando un rischio di perdita di dati sensibili. **Ora, le applicazioni sono limitate ad accedere solo ai propri log**.
Nonostante queste restrizioni, un **attaccante con accesso fisico** a un dispositivo sbloccato può comunque sfruttarlo collegando il dispositivo a un computer e **leggendo i log**. È importante notare che i log rimangono sul disco anche dopo la disinstallazione dell'app.
Nonostante queste restrizioni, un **attaccante con accesso fisico** a un dispositivo sbloccato può ancora sfruttarlo collegando il dispositivo a un computer e **leggendo i log**. È importante notare che i log rimangono sul disco anche dopo la disinstallazione dell'app.
Per mitigare i rischi, si consiglia di **interagire approfonditamente con l'app**, esplorando tutte le sue funzionalità e input per garantire che non vengano registrate informazioni sensibili per errore.
@ -643,23 +645,23 @@ Sono utili. Inoltre, **Xcode** fornisce un modo per raccogliere i log della cons
1. Apri Xcode.
2. Collega il dispositivo iOS.
3. Vai su **Finestra** -> **Dispositivi e Simulatori**.
3. Vai su **Finestra** -> **Dispositivi e simulatori**.
4. Seleziona il tuo dispositivo.
5. Attiva il problema che stai investigando.
5. Provoca il problema che stai investigando.
6. Utilizza il pulsante **Apri Console** per visualizzare i log in una nuova finestra.
Per una registrazione più avanzata, connettersi alla shell del dispositivo e utilizzare **socat** può fornire il monitoraggio dei log in tempo reale:
Per una registrazione più avanzata, connettersi alla shell del dispositivo e utilizzare **socat** può fornire un monitoraggio dei log in tempo reale:
```bash
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
```
Seguito dai comandi per osservare le attività di log, che possono essere preziosi per diagnosticare problemi o identificare potenziali fughe di dati nei log.
Seguito dai comandi per osservare le attività di log, che possono essere preziose per diagnosticare problemi o identificare potenziali fughe di dati nei log.
***
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
\
Usa [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) per creare facilmente e **automatizzare flussi di lavoro** supportati dagli strumenti della comunità più avanzati al mondo.\
Utilizza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) per creare facilmente e **automatizzare flussi di lavoro** supportati dagli strumenti della comunità più avanzati al mondo.\
Ottieni l'accesso oggi:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -674,13 +676,13 @@ L'inclusione delle **app installate e dei loro dati** nei backup solleva il prob
### Escludere File dai Backup
I file in `Documents/` e `Library/Application Support/` vengono automaticamente inclusi nei backup. Gli sviluppatori possono escludere file o directory specifiche dai backup utilizzando `NSURL setResourceValue:forKey:error:` con la chiave `NSURLIsExcludedFromBackupKey`. Questa pratica è cruciale per proteggere i dati sensibili dall'inclusione nei backup.
I file in `Documents/` e `Library/Application Support/` vengono di default inclusi nei backup. Gli sviluppatori possono escludere file o directory specifiche dai backup utilizzando `NSURL setResourceValue:forKey:error:` con la chiave `NSURLIsExcludedFromBackupKey`. Questa pratica è cruciale per proteggere i dati sensibili dall'inclusione nei backup.
### Test per le Vulnerabilità
Per valutare la sicurezza del backup di un'app, inizia con la **creazione di un backup** utilizzando Finder, quindi individualo seguendo le indicazioni della [documentazione ufficiale di Apple](https://support.apple.com/en-us/HT204215). Analizza il backup per individuare dati sensibili o configurazioni che potrebbero essere modificate per influenzare il comportamento dell'app.
Per valutare la sicurezza del backup di un'app, inizia con la **creazione di un backup** utilizzando Finder, quindi individualo seguendo le indicazioni della [documentazione ufficiale di Apple](https://support.apple.com/en-us/HT204215). Analizza il backup per dati sensibili o configurazioni che potrebbero essere modificate per influenzare il comportamento dell'app.
Le informazioni sensibili possono essere cercate utilizzando strumenti a riga di comando o applicazioni come [iMazing](https://imazing.com). Per i backup criptati, la presenza di crittografia può essere confermata controllando la chiave "IsEncrypted" nel file "Manifest.plist" nella radice del backup.
Le informazioni sensibili possono essere individuate utilizzando strumenti a riga di comando o applicazioni come [iMazing](https://imazing.com). Per i backup criptati, la presenza di crittografia può essere confermata controllando la chiave "IsEncrypted" nel file "Manifest.plist" nella radice del backup.
```xml
<?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">
@ -693,21 +695,21 @@ Le informazioni sensibili possono essere cercate utilizzando strumenti a riga di
...
</plist>
```
Per gestire i backup crittografati, gli script Python disponibili nel [repository GitHub di DinoSec](https://github.com/dinosec/iphone-dataprotection/tree/master/python\_scripts), come **backup\_tool.py** e **backup\_passwd.py**, potrebbero essere utili, sebbene potrebbero richiedere modifiche per essere compatibili con le ultime versioni di iTunes/Finder. Lo strumento [**iOSbackup**](https://pypi.org/project/iOSbackup/) è un'altra opzione per accedere ai file all'interno dei backup protetti da password.
Per gestire i backup crittografati, gli script Python disponibili nel [repository GitHub di DinoSec](https://github.com/dinosec/iphone-dataprotection/tree/master/python\_scripts), come **backup\_tool.py** e **backup\_passwd.py**, potrebbero essere utili, sebbene potenzialmente richiedano modifiche per essere compatibili con le ultime versioni di iTunes/Finder. Lo strumento [**iOSbackup**](https://pypi.org/project/iOSbackup/) è un'altra opzione per accedere ai file all'interno dei backup protetti da password.
### Modifica del Comportamento dell'App
Un esempio di modifica del comportamento dell'app attraverso modifiche al backup è dimostrato nell'app portafoglio bitcoin [Bither](https://github.com/bither/bither-ios), dove il PIN di blocco dell'interfaccia utente è memorizzato all'interno di `net.bither.plist` sotto la chiave **pin\_code**. Rimuovendo questa chiave dal plist e ripristinando il backup si elimina il requisito del PIN, fornendo accesso illimitato.
Un esempio di modifica del comportamento dell'app attraverso modifiche al backup è dimostrato nell'app del portafoglio bitcoin [Bither](https://github.com/bither/bither-ios), dove il PIN di blocco dell'interfaccia utente è memorizzato all'interno di `net.bither.plist` sotto la chiave **pin\_code**. Rimuovendo questa chiave dal plist e ripristinando il backup si elimina il requisito del PIN, fornendo accesso illimitato.
## Riassunto sul Testing della Memoria per Dati Sensibili
Quando si tratta di informazioni sensibili memorizzate nella memoria di un'applicazione, è cruciale limitare il tempo di esposizione di questi dati. Ci sono due approcci principali per investigare il contenuto della memoria: **creare un dump della memoria** e **analizzare la memoria in tempo reale**. Entrambi i metodi hanno le loro sfide, inclusa la possibilità di perdere dati critici durante il processo di dump o di analisi.
Quando si tratta di informazioni sensibili memorizzate nella memoria di un'applicazione, è cruciale limitare il tempo di esposizione di questi dati. Ci sono due approcci principali per investigare il contenuto della memoria: **creare un dump della memoria** e **analizzare la memoria in tempo reale**. Entrambi i metodi hanno le loro sfide, inclusa la potenziale perdita di dati critici durante il processo di dump o di analisi.
## **Recupero e Analisi di un Dump della Memoria**
Per dispositivi jailbroken e non jailbroken, strumenti come [objection](https://github.com/sensepost/objection) e [Fridump](https://github.com/Nightbringer21/fridump) consentono il dump della memoria del processo di un'app. Una volta effettuato il dump, per analizzare questi dati sono necessari vari strumenti, a seconda della natura delle informazioni che si sta cercando.
Per dispositivi jailbroken e non jailbroken, strumenti come [objection](https://github.com/sensepost/objection) e [Fridump](https://github.com/Nightbringer21/fridump) consentono di effettuare il dump della memoria del processo di un'app. Una volta effettuato il dump, per analizzare questi dati sono necessari vari strumenti, a seconda della natura delle informazioni che si sta cercando.
Per estrarre stringhe da un dump di memoria, è possibile utilizzare comandi come `strings` o `rabin2 -zz`:
Per estrarre stringhe da un dump di memoria, possono essere utilizzati comandi come `strings` o `rabin2 -zz`:
```bash
# Extracting strings using strings command
$ strings memory > strings.txt
@ -721,28 +723,28 @@ $ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
```
## **Analisi della memoria in esecuzione**
## **Analisi della Memoria in Esecuzione**
**r2frida** fornisce una potente alternativa per ispezionare la memoria di un'app in tempo reale, senza la necessità di un dump di memoria. Questo strumento consente l'esecuzione di comandi di ricerca direttamente sulla memoria dell'applicazione in esecuzione:
**r2frida** fornisce un'alternativa potente per ispezionare la memoria di un'app in tempo reale, senza la necessità di un dump di memoria. Questo strumento consente l'esecuzione di comandi di ricerca direttamente sulla memoria dell'applicazione in esecuzione:
```bash
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
```
## Crittografia Danneggiata
### Processi di Gestione Chiave Scadenti
### Processi di Gestione delle Chiavi Scadenti
Alcuni sviluppatori salvano dati sensibili nello storage locale e li crittografano con una chiave codificata/prevedibile nel codice. Questo non dovrebbe essere fatto poiché un'operazione di reverse engineering potrebbe consentire agli attaccanti di estrarre le informazioni confidenziali.
Alcuni sviluppatori salvano dati sensibili nello storage locale e li crittografano con una chiave codificata/prevedibile nel codice. Questo non dovrebbe essere fatto poiché un'operazione di reversing potrebbe consentire agli attaccanti di estrarre le informazioni confidenziali.
### Utilizzo di Algoritmi Insicuri e/o Obsoleti
### Utilizzo di Algoritmi Insicuri e/o Deprecati
Gli sviluppatori non dovrebbero utilizzare **algoritmi obsoleti** per eseguire **controlli** di autorizzazione, **memorizzare** o **inviare** dati. Alcuni di questi algoritmi sono: RC4, MD4, MD5, SHA1... Se vengono utilizzati **hash** per memorizzare le password, ad esempio, dovrebbero essere utilizzati hash **resistenti** agli attacchi di forza bruta con salt.
Gli sviluppatori non dovrebbero utilizzare **algoritmi deprecati** per eseguire **controlli** di autorizzazione, **memorizzare** o **inviare** dati. Alcuni di questi algoritmi sono: RC4, MD4, MD5, SHA1... Se vengono utilizzati **hash** per memorizzare le password, ad esempio, dovrebbero essere utilizzati hash **resistenti** agli attacchi di forza bruta con salt.
### Controllo
I principali controlli da effettuare sono la ricerca di password/segnreti **codificati** nel codice, o se questi sono **prevedibili**, e se il codice utilizza qualche tipo di algoritmi di **crittografia** **deboli**.
È interessante sapere che è possibile **monitorare** alcune **librerie crittografiche** automaticamente utilizzando **objection** con:
È interessante sapere che è possibile **monitorare** automaticamente alcune **librerie crittografiche** utilizzando **objection** con:
```swift
ios monitor crypt
```
@ -750,9 +752,9 @@ Per **ulteriori informazioni** sulle API e le librerie crittografiche di iOS, ac
## Autenticazione Locale
L'**autenticazione locale** svolge un ruolo cruciale, specialmente quando si tratta di proteggere l'accesso a un endpoint remoto attraverso metodi crittografici. L'essenza qui è che senza un'implementazione corretta, i meccanismi di autenticazione locale possono essere aggirati.
**L'autenticazione locale** svolge un ruolo cruciale, specialmente quando si tratta di proteggere l'accesso a un endpoint remoto attraverso metodi crittografici. L'essenza qui è che senza un'implementazione corretta, i meccanismi di autenticazione locale possono essere aggirati.
Il [**framework di autenticazione locale di Apple**](https://developer.apple.com/documentation/localauthentication) e il [**portachiavi**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) forniscono API robuste per consentire agli sviluppatori di facilitare i dialoghi di autenticazione degli utenti e gestire in modo sicuro dati segreti, rispettivamente. Il Secure Enclave protegge l'ID dell'impronta digitale per il Touch ID, mentre il Face ID si basa sul riconoscimento facciale senza compromettere i dati biometrici.
Il [**framework di autenticazione locale di Apple**](https://developer.apple.com/documentation/localauthentication) e il [**portachiavi**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) forniscono API robuste per consentire agli sviluppatori di facilitare i dialoghi di autenticazione degli utenti e gestire in modo sicuro i dati segreti, rispettivamente. Il Secure Enclave protegge l'ID dell'impronta digitale per il Touch ID, mentre il Face ID si basa sul riconoscimento facciale senza compromettere i dati biometrici.
Per integrare il Touch ID/Face ID, gli sviluppatori hanno due scelte di API:
@ -767,7 +769,7 @@ Tuttavia, sia `LocalAuthentication.framework` che `Security.framework` presentan
Per richiedere agli utenti l'autenticazione, gli sviluppatori dovrebbero utilizzare il metodo **`evaluatePolicy`** all'interno della classe **`LAContext`**, scegliendo tra:
* **`deviceOwnerAuthentication`**: Richiede il Touch ID o il codice di accesso del dispositivo, fallendo se nessuno dei due è abilitato.
* **`deviceOwnerAuthentication`**: Richiede l'ID dell'impronta digitale o il codice di accesso del dispositivo, fallendo se nessuno dei due è abilitato.
* **`deviceOwnerAuthenticationWithBiometrics`**: Richiede esclusivamente il Touch ID.
Un'autenticazione riuscita è indicata da un valore booleano restituito da **`evaluatePolicy`**, evidenziando una potenziale falla di sicurezza.
@ -778,7 +780,7 @@ L'implementazione dell'**autenticazione locale** nelle app iOS coinvolge l'uso d
Il portachiavi offre la capacità di impostare elementi con l'attributo `SecAccessControl`, che limita l'accesso all'elemento fino a quando l'utente non si autentica con successo tramite il Touch ID o il codice di accesso del dispositivo. Questa funzionalità è cruciale per migliorare la sicurezza.
Di seguito sono riportati esempi di codice in Swift e Objective-C che mostrano come salvare e recuperare una stringa dal portachiavi, sfruttando queste funzionalità di sicurezza. Gli esempi mostrano specificamente come configurare il controllo degli accessi per richiedere l'autenticazione del Touch ID e garantire che i dati siano accessibili solo sul dispositivo su cui sono stati impostati, a condizione che sia configurato un codice di accesso al dispositivo.
Di seguito sono riportati esempi di codice in Swift e Objective-C che mostrano come salvare e recuperare una stringa dal portachiavi, sfruttando queste funzionalità di sicurezza. Gli esempi mostrano specificamente come configurare il controllo degli accessi per richiedere l'autenticazione del Touch ID e garantire che i dati siano accessibili solo sul dispositivo su cui sono stati impostati, a condizione che sia configurato un codice di accesso del dispositivo.
{% tabs %}
{% tab title="Swift" %}
@ -878,36 +880,25 @@ let password = String(data: queryResult as! Data, encoding: .utf8)!
{% tab title="Objective-C" %}
## Introduzione
### Metodi per aggirare la sicurezza di iOS
L'obiettivo di questa sezione è fornire una panoramica sulle tecniche di pentesting per le applicazioni iOS scritte in Objective-C.
1. **Utilizzo di strumenti di decompilazione**: Utilizzare strumenti come Hopper o IDA per decompilare l'applicazione e analizzare il codice sorgente.
### Strumenti e Framework
2. **Analisi del traffico di rete**: Utilizzare strumenti come Burp Suite o Wireshark per analizzare il traffico di rete generato dall'applicazione.
Alcuni degli strumenti e framework comunemente utilizzati per il pentesting delle applicazioni iOS scritte in Objective-C includono:
3. **Injection di codice**: Iniettare codice dannoso nell'applicazione per ottenere accesso non autorizzato o per manipolare il comportamento dell'applicazione.
- **Cycript**: Utilizzato per eseguire script in tempo reale su applicazioni in esecuzione.
- **Clutch**: Utilizzato per decodificare le applicazioni iOS.
- **Dumpdecrypted**: Utilizzato per decodificare i binari delle applicazioni iOS.
- **Frida**: Utilizzato per l'iniezione di script, il monitoraggio e la modifica del comportamento delle applicazioni.
- **MobSF**: Utilizzato per l'analisi statica delle applicazioni iOS.
- **Needle**: Utilizzato per l'analisi dinamica delle applicazioni iOS.
4. **Analisi delle vulnerabilità**: Identificare e sfruttare le vulnerabilità presenti nell'applicazione per compromettere la sua sicurezza.
### Metodologia di Pentesting
5. **Reverse engineering**: Utilizzare tecniche di reverse engineering per comprendere il funzionamento interno dell'applicazione e identificare possibili punti deboli.
La metodologia di pentesting per le applicazioni iOS scritte in Objective-C di solito include le seguenti fasi:
6. **Interazione con l'applicazione**: Interagire direttamente con l'applicazione per identificare potenziali falle di sicurezza o vulnerabilità.
1. **Raccolta di informazioni**: Raccogliere informazioni sull'applicazione target e sul suo ambiente.
2. **Analisi dell'applicazione**: Analizzare l'applicazione per identificare potenziali vulnerabilità.
3. **Manipolazione dell'applicazione**: Manipolare l'applicazione per identificare e sfruttare vulnerabilità.
4. **Segnalazione delle vulnerabilità**: Documentare e segnalare le vulnerabilità identificate.
7. **Analisi delle autorizzazioni**: Analizzare le autorizzazioni concesse all'applicazione per identificare possibili rischi per la sicurezza.
### Risorse Aggiuntive
8. **Manipolazione dei dati**: Manipolare i dati memorizzati dall'applicazione per ottenere informazioni sensibili o per alterare il suo comportamento.
Per ulteriori informazioni sul pentesting delle applicazioni iOS scritte in Objective-C, è possibile fare riferimento alle risorse seguenti:
- [OWASP Mobile Security Testing Guide](https://owasp.org/www-project-mobile-security-testing-guide/)
- [iOS Hacker's Handbook](https://www.wiley.com/en-us/iOS+Hacker%27s+Handbook-p-9781118204122)
Questi metodi possono essere utilizzati durante un test di penetrazione per identificare e sfruttare le vulnerabilità di sicurezza presenti in un'applicazione iOS.
{% endtab %}
```objectivec
@ -930,13 +921,16 @@ NSLog(@"%@", password);
NSLog(@"Something went wrong");
}
```
{% endtab %}
{% endtabs %}
### Rilevamento
L'utilizzo di framework in un'app può anche essere rilevato analizzando l'elenco delle librerie dinamiche condivise dell'applicazione binaria. Questo può essere fatto utilizzando `otool`:
```bash
$ otool -L <AppName>.app/<AppName>
```
Se `LocalAuthentication.framework` è utilizzato in un'applicazione, l'output conterrà entrambe le seguenti righe (ricorda che `LocalAuthentication.framework` utilizza `Security.framework` sotto il cofano):
Se `LocalAuthentication.framework` viene utilizzato in un'applicazione, l'output conterrà entrambe le seguenti righe (ricorda che `LocalAuthentication.framework` utilizza `Security.framework` internamente):
```bash
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
@ -992,7 +986,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
```
Per ottenere il **bypass** dell'Autenticazione Locale, viene scritto uno script Frida. Questo script mira al controllo **evaluatePolicy**, intercettando il suo callback per garantire che restituisca **success=1**. Modificando il comportamento del callback, il controllo di autenticazione viene bypassato in modo efficace.
Lo script di seguito viene iniettato per modificare il risultato del metodo **evaluatePolicy**. Modifica il risultato del callback per indicare sempre il successo.
Lo script di seguito viene iniettato per modificare il risultato del metodo **evaluatePolicy**. Cambia il risultato del callback per indicare sempre il successo.
```swift
// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) {
@ -1064,7 +1058,7 @@ frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-i
## Comunicazione di Rete
È importante verificare che non ci siano comunicazioni **senza crittografia** e che l'applicazione stia correttamente **validando il certificato TLS** del server.\
È importante verificare che non ci siano comunicazioni in corso **senza crittografia** e che l'applicazione stia correttamente **validando il certificato TLS** del server.\
Per verificare questo tipo di problemi, è possibile utilizzare un proxy come **Burp**:
{% content-ref url="burp-configuration-for-ios.md" %}
@ -1073,12 +1067,12 @@ Per verificare questo tipo di problemi, è possibile utilizzare un proxy come **
### Controllo del Nome Host
Un problema comune nella convalida del certificato TLS è controllare se il certificato è stato firmato da una **CA attendibile**, ma **non controllare** se **il nome host** del certificato è il nome host a cui si accede.\
Per verificare questo problema utilizzando Burp, dopo aver fidato della CA di Burp nell'iPhone, è possibile **creare un nuovo certificato con Burp per un nome host diverso** e utilizzarlo. Se l'applicazione funziona ancora, allora c'è una vulnerabilità.
Un problema comune nella convalida del certificato TLS è controllare che il certificato sia stato firmato da una **CA attendibile**, ma **non controllare** se **il nome host** del certificato corrisponde all'host a cui si accede.\
Per verificare questo problema utilizzando Burp, dopo aver fidato della CA di Burp sull'iPhone, è possibile **creare un nuovo certificato con Burp per un nome host diverso** e utilizzarlo. Se l'applicazione funziona ancora, allora c'è una vulnerabilità.
### Pinning del Certificato
Se un'applicazione sta utilizzando correttamente il Pinning SSL, allora l'applicazione funzionerà solo se il certificato è quello atteso. Durante il test di un'applicazione **questo potrebbe essere un problema poiché Burp servirà il proprio certificato.**\
Se un'applicazione utilizza correttamente il Pinning SSL, l'applicazione funzionerà solo se il certificato è quello atteso. Durante il test di un'applicazione **questo potrebbe essere un problema poiché Burp servirà il proprio certificato.**\
Per aggirare questa protezione all'interno di un dispositivo jailbroken, è possibile installare l'applicazione [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) o installare [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
È anche possibile utilizzare il comando `ios sslpinning disable` di **objection**
@ -1096,23 +1090,23 @@ Per aggirare questa protezione all'interno di un dispositivo jailbroken, è poss
### Patching in Tempo Reale/Aggiornamenti Forzati
Gli sviluppatori possono **patchare remotamente tutte le installazioni della propria app istantaneamente** senza dover inviare nuovamente l'applicazione allo Store e attendere l'approvazione.\
Gli sviluppatori possono **applicare patch remotamente a tutte le installazioni della propria app istantaneamente** senza dover inviare nuovamente l'applicazione allo store e attendere l'approvazione.\
Per questo scopo di solito si utilizza [**JSPatch**](https://github.com/bang590/JSPatch)**.** Ma ci sono anche altre opzioni come [Siren](https://github.com/ArtSabintsev/Siren) e [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker).\
**Si tratta di un meccanismo pericoloso che potrebbe essere abusato da SDK di terze parti malintenzionati, pertanto si consiglia di verificare quale metodo viene utilizzato per l'aggiornamento automatico (se presente) e testarlo.** Si potrebbe provare a scaricare una versione precedente dell'app a questo scopo.
**Si tratta di un meccanismo pericoloso che potrebbe essere abusato da SDK di terze parti malintenzionati, pertanto è consigliabile verificare quale metodo viene utilizzato per l'aggiornamento automatico (se presente) e testarlo.** È possibile provare a scaricare una versione precedente dell'app a questo scopo.
### Terze Parti
Una sfida significativa con **SDK di terze parti** è la **mancanza di controllo granulare** sulle loro funzionalità. Gli sviluppatori si trovano di fronte a una scelta: integrare lo SDK e accettare tutte le sue funzionalità, comprese potenziali vulnerabilità di sicurezza e preoccupazioni sulla privacy, oppure rinunciare completamente ai suoi benefici. Spesso, gli sviluppatori non sono in grado di correggere le vulnerabilità all'interno di questi SDK da soli. Inoltre, poiché gli SDK guadagnano fiducia nella comunità, alcuni potrebbero iniziare a contenere malware.
Una sfida significativa con **SDK di terze parti** è la **mancanza di controllo granulare** sulle loro funzionalità. Gli sviluppatori si trovano di fronte a una scelta: integrare lo SDK e accettare tutte le sue funzionalità, comprese potenziali vulnerabilità di sicurezza e preoccupazioni sulla privacy, oppure rinunciare completamente ai suoi vantaggi. Spesso, gli sviluppatori non sono in grado di correggere le vulnerabilità all'interno di questi SDK da soli. Inoltre, poiché gli SDK guadagnano fiducia nella comunità, alcuni potrebbero iniziare a contenere malware.
I servizi forniti dagli SDK di terze parti possono includere il tracciamento del comportamento dell'utente, la visualizzazione di annunci o il miglioramento dell'esperienza utente. Tuttavia, ciò introduce un rischio poiché gli sviluppatori potrebbero non essere pienamente consapevoli del codice eseguito da queste librerie, portando a potenziali rischi per la privacy e la sicurezza. È fondamentale limitare le informazioni condivise con i servizi di terze parti a ciò che è necessario e garantire che nessun dato sensibile venga esposto.
I servizi forniti dagli SDK di terze parti possono includere il tracciamento del comportamento dell'utente, la visualizzazione di annunci o miglioramenti dell'esperienza utente. Tuttavia, ciò introduce un rischio poiché gli sviluppatori potrebbero non essere pienamente consapevoli del codice eseguito da queste librerie, portando a potenziali rischi per la privacy e la sicurezza. È fondamentale limitare le informazioni condivise con i servizi di terze parti a ciò che è necessario e garantire che nessun dato sensibile venga esposto.
L'implementazione dei servizi di terze parti di solito avviene in due forme: una libreria autonoma o uno SDK completo. Per proteggere la privacy dell'utente, qualsiasi dato condiviso con questi servizi dovrebbe essere **anonimizzato** per evitare la divulgazione di Informazioni di Identificazione Personale (PII).
L'implementazione dei servizi di terze parti di solito avviene in due forme: una libreria autonoma o uno SDK completo. Per proteggere la privacy dell'utente, tutti i dati condivisi con questi servizi dovrebbero essere **anonimizzati** per evitare la divulgazione di Informazioni di Identificazione Personale (PII).
Per identificare le librerie utilizzate da un'applicazione, è possibile utilizzare il comando **`otool`**. Questo strumento dovrebbe essere eseguito contro l'applicazione e ciascuna libreria condivisa utilizzata per scoprire eventuali librerie aggiuntive.
```bash
otool -L <application_path>
```
## **Riferimenti e Altre Risorse**
## **Riferimenti e Altri Risorse**
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering)
* [iOS & Mobile App Pentesting - INE](https://my.ine.com/CyberSecurity/courses/089d060b/ios-mobile-app-pentesting)
@ -1140,7 +1134,7 @@ otool -L <application_path>
* [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
* [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
\
Utilizza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) per costruire facilmente e **automatizzare flussi di lavoro** supportati dagli strumenti della comunità più avanzati al mondo.\
@ -1155,9 +1149,9 @@ Ottieni l'accesso oggi:
Altri modi per supportare HackTricks:
* Se desideri vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusivi [**NFT**](https://opensea.io/collection/the-peass-family)
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repository di Github.
</details>