mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without
This commit is contained in:
parent
766782ebd8
commit
bae025e3d7
@ -8,20 +8,20 @@ Le applicazioni firmate con l'**entitlement `get_task_allow`** consentono alle a
|
|||||||
|
|
||||||
Tuttavia, non è così semplice come estrarre l'IPA, firmarlo nuovamente con l'entitlement e ricaricarlo sul tuo dispositivo. Questo a causa della protezione FairPlay. Quando la firma dell'app cambia, la chiave DRM (Digital Rights Management) è **annullata e l'app non funzionerà**.
|
Tuttavia, non è così semplice come estrarre l'IPA, firmarlo nuovamente con l'entitlement e ricaricarlo sul tuo dispositivo. Questo a causa della protezione FairPlay. Quando la firma dell'app cambia, la chiave DRM (Digital Rights Management) è **annullata e l'app non funzionerà**.
|
||||||
|
|
||||||
Con un vecchio dispositivo jailbroken, è possibile installare l'IPA, **decrittarlo utilizzando il tuo strumento preferito** (come Iridium o frida-ios-dump) e estrarlo dal dispositivo. Anche se, se possibile, è consigliato chiedere semplicemente al cliente per l'IPA decrittato.
|
Con un vecchio dispositivo jailbroken, è possibile installare l'IPA, **decrittarlo utilizzando il tuo strumento preferito** (come Iridium o frida-ios-dump) e estrarlo di nuovo dal dispositivo. Anche se, se possibile, è consigliato chiedere semplicemente al cliente per l'IPA decrittato.
|
||||||
|
|
||||||
## Ottenere l'IPA decrittato
|
## Ottenere l'IPA decrittato
|
||||||
|
|
||||||
### Ottienilo da Apple
|
### Ottienilo da Apple
|
||||||
|
|
||||||
1. Installa l'app da pentestare sull'iPhone
|
1. Installa l'app da pentest nell'iPhone
|
||||||
2. Installa e avvia [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) sul tuo macos
|
2. Installa e avvia [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) sul tuo macos
|
||||||
3. Apri `Terminal` sul tuo Mac e cd a `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. L'IPA apparirà in questa cartella più tardi.
|
3. Apri `Terminal` sul tuo Mac e cd a `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. L'IPA apparirà in questa cartella più tardi.
|
||||||
4. Dovresti vedere il tuo dispositivo iOS. Fai doppio clic su di esso, quindi clicca su Aggiungi + → App dalla barra dei menu in alto.
|
4. Dovresti vedere il tuo dispositivo iOS. Fai doppio clic su di esso, quindi clicca su Aggiungi + → App dalla barra dei menu in alto.
|
||||||
5. Dopo aver cliccato su Aggiungi, Configurator scaricherà l'IPA da Apple e tenterà di inviarlo al tuo dispositivo. Se hai seguito la mia raccomandazione precedente e hai già installato l'IPA, apparirà un messaggio che ti chiede di reinstallare l'app.
|
5. Dopo aver cliccato su Aggiungi, Configurator scaricherà l'IPA da Apple e tenterà di inviarlo al tuo dispositivo. Se hai seguito la mia raccomandazione precedente e hai già installato l'IPA, apparirà un messaggio che ti chiede di reinstallare l'app.
|
||||||
6. L'IPA dovrebbe essere scaricato all'interno di `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` da dove puoi prenderlo.
|
6. L'IPA dovrebbe essere scaricato all'interno di `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` da dove puoi prenderlo.
|
||||||
|
|
||||||
Controlla [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) per ulteriori informazioni dettagliate su questo processo.
|
Controlla [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) per informazioni più dettagliate su questo processo.
|
||||||
|
|
||||||
### Decrittazione dell'app
|
### Decrittazione dell'app
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ unzip redacted.ipa -d unzipped
|
|||||||
```
|
```
|
||||||
Controlla il `Info.plist` per la versione minima supportata e se il tuo dispositivo è più vecchio di quella, modifica il valore affinché sia supportato.
|
Controlla il `Info.plist` per la versione minima supportata e se il tuo dispositivo è più vecchio di quella, modifica il valore affinché sia supportato.
|
||||||
|
|
||||||
Comprimi di nuovo l'IPA:
|
Zip di nuovo l'IPA:
|
||||||
```bash
|
```bash
|
||||||
cd unzipped
|
cd unzipped
|
||||||
zip -r ../no-min-version.ipa *
|
zip -r ../no-min-version.ipa *
|
||||||
@ -42,14 +42,14 @@ Quindi, installa l'IPA ad esempio con:
|
|||||||
```bash
|
```bash
|
||||||
ideviceinstaller -i no-min-version.ipa -w
|
ideviceinstaller -i no-min-version.ipa -w
|
||||||
```
|
```
|
||||||
Nota che potresti aver bisogno di **AppSync Unified tweak** da Cydia per prevenire eventuali errori di `invalid signature`.
|
Nota che potresti aver bisogno del **tweak AppSync Unified** da Cydia per prevenire eventuali errori di `invalid signature`.
|
||||||
|
|
||||||
Una volta installato, puoi utilizzare **Iridium tweak** da Cydia per ottenere l'IPA decrittografato.
|
Una volta installato, puoi utilizzare il **tweak Iridium** da Cydia per ottenere l'IPA decrittografato.
|
||||||
|
|
||||||
|
|
||||||
### Patch entitlements & re-sign
|
### Patch entitlements & re-sign
|
||||||
|
|
||||||
Per ri-firmare l'applicazione con il diritto `get-task-allow`, ci sono diversi strumenti disponibili come `app-signer`, `codesign` e `iResign`. `app-signer` ha un'interfaccia molto user-friendly che consente di ri-firmare molto facilmente un file IPA indicando l'IPA da ri-firmare, per **mettere `get-task-allow`** e il certificato e il profilo di provisioning da utilizzare.
|
Per ri-firmare l'applicazione con il diritto `get-task-allow`, ci sono diversi strumenti disponibili come `app-signer`, `codesign` e `iResign`. `app-signer` ha un'interfaccia molto user-friendly che consente di ri-firmare facilmente un file IPA indicando l'IPA da ri-firmare, per **mettere `get-task-allow`** e il certificato e il profilo di provisioning da utilizzare.
|
||||||
|
|
||||||
Per quanto riguarda i certificati e i profili di firma, Apple offre **profili di firma per sviluppatori gratuiti** per tutti gli account tramite Xcode. Basta creare un'app e configurarne uno. Quindi, configura l'**iPhone per fidarsi delle app degli sviluppatori** navigando su `Impostazioni` → `Privacy e Sicurezza`, e clicca su `Modalità Sviluppatore`.
|
Per quanto riguarda i certificati e i profili di firma, Apple offre **profili di firma per sviluppatori gratuiti** per tutti gli account tramite Xcode. Basta creare un'app e configurarne uno. Quindi, configura l'**iPhone per fidarsi delle app degli sviluppatori** navigando su `Impostazioni` → `Privacy e Sicurezza`, e clicca su `Modalità Sviluppatore`.
|
||||||
|
|
||||||
@ -67,11 +67,11 @@ Dall'iOS 16 Apple ha introdotto la **Modalità Sviluppatore**: qualsiasi binario
|
|||||||
2. Naviga su **Impostazioni → Privacy e Sicurezza → Modalità Sviluppatore** e attivala.
|
2. Naviga su **Impostazioni → Privacy e Sicurezza → Modalità Sviluppatore** e attivala.
|
||||||
3. Il dispositivo si riavvierà; dopo aver inserito il codice di accesso ti verrà chiesto di **Attivare** la Modalità Sviluppatore.
|
3. Il dispositivo si riavvierà; dopo aver inserito il codice di accesso ti verrà chiesto di **Attivare** la Modalità Sviluppatore.
|
||||||
|
|
||||||
La Modalità Sviluppatore rimane attiva fino a quando non la disabiliti o non ripristini il telefono, quindi questo passaggio deve essere eseguito solo una volta per dispositivo. [La documentazione Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) spiega le implicazioni di sicurezza.
|
La Modalità Sviluppatore rimane attiva fino a quando non la disabiliti o non ripristini il telefono, quindi questo passaggio deve essere eseguito solo una volta per dispositivo. [La documentazione di Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) spiega le implicazioni di sicurezza.
|
||||||
|
|
||||||
### Opzioni moderne di sideloading
|
### Opzioni moderne di sideloading
|
||||||
|
|
||||||
Ora ci sono diversi modi maturi per sideloadare e mantenere le IPA ri-firmate aggiornate senza un jailbreak:
|
Ora ci sono diversi modi maturi per sideloadare e mantenere aggiornate le IPA ri-firmate senza un jailbreak:
|
||||||
|
|
||||||
| Strumento | Requisiti | Punti di forza | Limitazioni |
|
| Strumento | Requisiti | Punti di forza | Limitazioni |
|
||||||
|-----------|-----------|----------------|-------------|
|
|-----------|-----------|----------------|-------------|
|
||||||
@ -94,7 +94,7 @@ Recenti versioni di Frida (>=16) gestiscono automaticamente l'autenticazione dei
|
|||||||
|
|
||||||
### Analisi dinamica automatizzata con MobSF (senza jailbreak)
|
### Analisi dinamica automatizzata con MobSF (senza jailbreak)
|
||||||
|
|
||||||
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) può strumentare un IPA firmato da sviluppatore su un dispositivo reale utilizzando la stessa tecnica (`get_task_allow`) e fornisce un'interfaccia web con browser di filesystem, cattura del traffico e console Frida【】. Il modo più veloce è eseguire MobSF in Docker e poi collegare il tuo iPhone tramite USB:
|
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) può strumentare un IPA firmato da sviluppatore su un dispositivo reale utilizzando la stessa tecnica (`get_task_allow`) e fornisce un'interfaccia web con browser di filesystem, cattura del traffico e console Frida【†L2-L3】. Il modo più veloce è eseguire MobSF in Docker e poi collegare il tuo iPhone tramite USB:
|
||||||
```bash
|
```bash
|
||||||
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
docker pull opensecurity/mobile-security-framework-mobsf:latest
|
||||||
docker run -p 8000:8000 --privileged \
|
docker run -p 8000:8000 --privileged \
|
||||||
@ -104,10 +104,10 @@ opensecurity/mobile-security-framework-mobsf:latest
|
|||||||
```
|
```
|
||||||
MobSF distribuirà automaticamente il binario, abiliterà un server Frida all'interno della sandbox dell'app e genererà un report interattivo.
|
MobSF distribuirà automaticamente il binario, abiliterà un server Frida all'interno della sandbox dell'app e genererà un report interattivo.
|
||||||
|
|
||||||
### iOS 17 e avvertenze sulla modalità Lockdown
|
### iOS 17 & avvertenze sulla modalità Lockdown
|
||||||
|
|
||||||
* **Modalità Lockdown** (Impostazioni → Privacy e Sicurezza) blocca il linker dinamico dal caricare librerie dinamiche non firmate o firmate esternamente. Quando si testano dispositivi che potrebbero avere questa modalità abilitata, assicurati che sia **disabilitata** o le tue sessioni Frida/objection termineranno immediatamente.
|
* **Modalità Lockdown** (Impostazioni → Privacy e Sicurezza) blocca il linker dinamico dal caricare librerie dinamiche non firmate o firmate esternamente. Quando si testano dispositivi che potrebbero avere questa modalità abilitata, assicurati che sia **disabilitata** o le tue sessioni Frida/objection termineranno immediatamente.
|
||||||
* L'Autenticazione dei Puntatori (PAC) è applicata a livello di sistema sui dispositivi A12+. Frida ≥16 gestisce in modo trasparente la rimozione del PAC: basta mantenere aggiornati sia *frida-server* che la toolchain Python/CLI quando viene rilasciata una nuova versione principale di iOS.
|
* L'Autenticazione del Puntatore (PAC) è applicata a livello di sistema sui dispositivi A12+. Frida ≥16 gestisce in modo trasparente la rimozione del PAC: basta mantenere aggiornati sia *frida-server* che la toolchain Python/CLI quando viene rilasciata una nuova versione principale di iOS.
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,100 @@
|
|||||||
# Richiesta di Smuggling nei Downgrade HTTP/2
|
# Request Smuggling in HTTP/2 Downgrades
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
**Controlla il post [https://portswigger.net/research/http-2-downgrades](https://portswigger.net/research/http-2-downgrades)**
|
HTTP/2 è generalmente considerato immune al classic request-smuggling perché la lunghezza di ogni frame DATA è esplicita. **Quella protezione scompare non appena un proxy front-end “downgrada” la richiesta a HTTP/1.x prima di inoltrarla a un back-end**. Nel momento in cui due parser diversi (il front-end HTTP/2 e il back-end HTTP/1) cercano di concordare su dove una richiesta finisce e la successiva inizia, tutti i vecchi trucchi di desync tornano – più alcuni nuovi.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Perché avvengono i downgrade
|
||||||
|
|
||||||
|
1. I browser parlano già HTTP/2, ma gran parte dell'infrastruttura legacy di origine comprende ancora solo HTTP/1.1.
|
||||||
|
2. I reverse-proxy (CDN, WAF, load-balancer) quindi terminano TLS + HTTP/2 al confine e **riscrivono ogni richiesta come HTTP/1.1** per l'origine.
|
||||||
|
3. Il passaggio di traduzione deve creare *entrambi* gli header `Content-Length` **e/o** `Transfer-Encoding: chunked` in modo che l'origine possa determinare la lunghezza del corpo.
|
||||||
|
|
||||||
|
Ogni volta che il front-end si fida della lunghezza del frame HTTP/2 **ma** il back-end si fida di CL o TE, un attaccante può costringerli a non essere d'accordo.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Due classi primitive dominanti
|
||||||
|
|
||||||
|
| Variante | Lunghezza front-end | Lunghezza back-end | Payload tipico |
|
||||||
|
|---------|---------------------|-------------------|-----------------|
|
||||||
|
| **H2.TE** | Frame HTTP/2 | `Transfer-Encoding: chunked` | Includere un corpo di messaggio chunked extra il cui finale `0\r\n\r\n` *non* viene inviato, quindi il back-end attende la “prossima” richiesta fornita dall'attaccante. |
|
||||||
|
| **H2.CL** | Frame HTTP/2 | `Content-Length` | Inviare un CL *più piccolo* rispetto al corpo reale, quindi il back-end legge oltre il confine nella richiesta successiva. |
|
||||||
|
|
||||||
|
> Questi sono identici nello spirito ai classici TE.CL / CL.TE, solo con HTTP/2 che sostituisce uno dei parser.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Identificare una catena di downgrade
|
||||||
|
|
||||||
|
1. Usa **ALPN** in un handshake TLS (`openssl s_client -alpn h2 -connect host:443`) o **curl**:
|
||||||
|
```bash
|
||||||
|
curl -v --http2 https://target
|
||||||
|
```
|
||||||
|
Se appare `* Using HTTP2`, il confine parla H2.
|
||||||
|
2. Invia una richiesta CL/TE deliberatamente malformata *sopra* HTTP/2 (Burp Repeater ora ha un menu a discesa per forzare HTTP/2). Se la risposta è un errore HTTP/1.1 come `400 Bad chunk`, hai la prova che il confine ha convertito il traffico per un parser HTTP/1 a valle.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Flusso di sfruttamento (esempio H2.TE)
|
||||||
|
```http
|
||||||
|
:method: POST
|
||||||
|
:path: /login
|
||||||
|
:scheme: https
|
||||||
|
:authority: example.com
|
||||||
|
content-length: 13 # ignored by the edge
|
||||||
|
transfer-encoding: chunked
|
||||||
|
|
||||||
|
5;ext=1\r\nHELLO\r\n
|
||||||
|
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
|
||||||
|
```
|
||||||
|
1. Il **front-end** legge esattamente 13 byte (`HELLO\r\n0\r\n\r\nGE`), pensa che la richiesta sia finita e inoltra tanto all'origine.
|
||||||
|
2. Il **back-end** si fida dell'intestazione TE, continua a leggere fino a vedere il *secondo* `0\r\n\r\n`, consumando così il prefisso della seconda richiesta dell'attaccante (`GET /admin …`).
|
||||||
|
3. Il resto (`GET /admin …`) è trattato come una *nuova* richiesta in coda dietro quella della vittima.
|
||||||
|
|
||||||
|
Sostituisci la richiesta smuggled con:
|
||||||
|
* `POST /api/logout` per forzare la fissazione della sessione
|
||||||
|
* `GET /users/1234` per rubare una risorsa specifica della vittima
|
||||||
|
|
||||||
|
---
|
||||||
|
## h2c smuggling (upgrade in chiaro)
|
||||||
|
|
||||||
|
Uno studio del 2023 ha mostrato che se un front-end passa l'intestazione HTTP/1.1 `Upgrade: h2c` a un back-end che supporta HTTP/2 in chiaro, un attaccante può tunnelare *frame* HTTP/2 *raw* attraverso un edge che ha convalidato solo HTTP/1.1. Questo bypassa la normalizzazione delle intestazioni, le regole WAF e persino la terminazione TLS.
|
||||||
|
|
||||||
|
Requisiti chiave:
|
||||||
|
* L'edge inoltra **entrambi** `Connection: Upgrade` e `Upgrade: h2c` invariati.
|
||||||
|
* L'origine incrementa a HTTP/2 e mantiene la semantica di riutilizzo della connessione che consente l'accodamento delle richieste.
|
||||||
|
|
||||||
|
La mitigazione è semplice: rimuovere o hard-codificare l'intestazione `Upgrade` all'edge tranne che per i WebSocket.
|
||||||
|
|
||||||
|
---
|
||||||
|
## CVE reali notevoli (2022-2025)
|
||||||
|
|
||||||
|
* **CVE-2023-25690** – Le regole di riscrittura mod_proxy di Apache HTTP Server potrebbero essere concatenate per la divisione e lo smuggling delle richieste. (risolto in 2.4.56)
|
||||||
|
* **CVE-2023-25950** – Smuggling di richieste/riposte in HAProxy 2.7/2.6 quando il parser HTX gestiva in modo errato le richieste in pipeline.
|
||||||
|
* **CVE-2022-41721** – Go `MaxBytesHandler` ha causato che i byte del corpo rimanenti venissero analizzati come frame **HTTP/2**, abilitando lo smuggling cross-protocol.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Strumenti
|
||||||
|
|
||||||
|
* **Burp Request Smuggler** – dalla versione v1.26 testa automaticamente H2.TE/H2.CL e il supporto ALPN nascosto. Abilita “HTTP/2 probing” nelle opzioni dell'estensione.
|
||||||
|
* **h2cSmuggler** – PoC Python di Bishop Fox per automatizzare l'attacco di upgrade in chiaro:
|
||||||
|
```bash
|
||||||
|
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
|
||||||
|
```
|
||||||
|
* **curl**/`hyper` – creazione di payload manuali: `curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Misure difensive
|
||||||
|
|
||||||
|
1. **HTTP/2 end-to-end** – eliminare completamente la traduzione di downgrade.
|
||||||
|
2. **Fonte unica di verità sulla lunghezza** – quando si effettua il downgrade, *generare sempre* un valido `Content-Length` **e** **rimuovere** eventuali intestazioni `Content-Length`/`Transfer-Encoding` fornite dall'utente.
|
||||||
|
3. **Normalizzare prima della rotta** – applicare la sanificazione delle intestazioni *prima* della logica di routing/riserve.
|
||||||
|
4. **Isolamento della connessione** – non riutilizzare le connessioni TCP del back-end tra gli utenti; “una richiesta per connessione” sconfigge gli exploit basati su coda.
|
||||||
|
5. **Rimuovere `Upgrade` a meno che non sia WebSocket** – previene il tunneling h2c.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Riferimenti
|
||||||
|
|
||||||
|
* PortSwigger Research – “HTTP/2: The Sequel is Always Worse” <https://portswigger.net/research/http2>
|
||||||
|
* Bishop Fox – “h2c Smuggling: request smuggling via HTTP/2 clear-text” <https://bishopfox.com/blog/h2c-smuggling-request>
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user