mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
0ce09df424
commit
6a5084934e
@ -18,7 +18,7 @@ In XNU, Mach è **responsabile di molte delle operazioni critiche a basso livell
|
||||
|
||||
### BSD
|
||||
|
||||
Il **kernel** XNU **incorpora** anche una quantità significativa di codice derivato dal progetto **FreeBSD**. Questo codice **funziona come parte del kernel insieme a Mach**, nello stesso spazio di indirizzamento. Tuttavia, il codice FreeBSD all'interno di XNU può differire sostanzialmente dal codice FreeBSD originale perché sono state necessarie modifiche per garantire la sua compatibilità con Mach. FreeBSD contribuisce a molte operazioni del kernel, tra cui:
|
||||
Il **kernel** XNU **incorpora** anche una quantità significativa di codice derivato dal progetto **FreeBSD**. Questo codice **funziona come parte del kernel insieme a Mach**, nello stesso spazio di indirizzi. Tuttavia, il codice FreeBSD all'interno di XNU può differire sostanzialmente dal codice FreeBSD originale perché sono state necessarie modifiche per garantire la sua compatibilità con Mach. FreeBSD contribuisce a molte operazioni del kernel, tra cui:
|
||||
|
||||
- Gestione dei processi
|
||||
- Gestione dei segnali
|
||||
@ -27,9 +27,9 @@ Il **kernel** XNU **incorpora** anche una quantità significativa di codice deri
|
||||
- Stack TCP/IP e socket
|
||||
- Firewall e filtraggio dei pacchetti
|
||||
|
||||
Comprendere l'interazione tra BSD e Mach può essere complesso, a causa dei loro diversi quadri concettuali. Ad esempio, BSD utilizza i processi come unità fondamentale di esecuzione, mentre Mach opera basandosi sui thread. Questa discrepanza è riconciliata in XNU **associando ogni processo BSD a un'attività Mach** che contiene esattamente un thread Mach. Quando viene utilizzata la chiamata di sistema fork() di BSD, il codice BSD all'interno del kernel utilizza le funzioni Mach per creare una struttura di attività e thread.
|
||||
Comprendere l'interazione tra BSD e Mach può essere complesso, a causa dei loro diversi quadri concettuali. Ad esempio, BSD utilizza i processi come unità fondamentale di esecuzione, mentre Mach opera basandosi sui thread. Questa discrepanza è riconciliata in XNU **associando ogni processo BSD a un'attività Mach** che contiene esattamente un thread Mach. Quando viene utilizzata la chiamata di sistema fork() di BSD, il codice BSD all'interno del kernel utilizza le funzioni Mach per creare una struttura di attività e di thread.
|
||||
|
||||
Inoltre, **Mach e BSD mantengono ciascuno modelli di sicurezza diversi**: il modello di sicurezza di **Mach** si basa sui **diritti di porta**, mentre il modello di sicurezza di BSD opera in base alla **proprietà del processo**. Le disparità tra questi due modelli hanno occasionalmente portato a vulnerabilità di escalation dei privilegi locali. Oltre alle chiamate di sistema tipiche, ci sono anche **trappole Mach che consentono ai programmi in spazio utente di interagire con il kernel**. Questi diversi elementi insieme formano l'architettura ibrida e multifaccettata del kernel macOS.
|
||||
Inoltre, **Mach e BSD mantengono ciascuno modelli di sicurezza diversi**: il modello di sicurezza di **Mach** si basa sui **diritti di porta**, mentre il modello di sicurezza di BSD opera sulla base della **proprietà del processo**. Le disparità tra questi due modelli hanno occasionalmente portato a vulnerabilità di escalation dei privilegi locali. Oltre alle chiamate di sistema tipiche, ci sono anche **trappole Mach che consentono ai programmi in spazio utente di interagire con il kernel**. Questi diversi elementi insieme formano l'architettura ibrida e multifaccettata del kernel macOS.
|
||||
|
||||
### I/O Kit - Drivers
|
||||
|
||||
@ -47,7 +47,7 @@ macos-iokit.md
|
||||
|
||||
## macOS Kernel Extensions
|
||||
|
||||
macOS è **super restrittivo nel caricare le Kernel Extensions** (.kext) a causa dei privilegi elevati con cui il codice verrà eseguito. In realtà, per impostazione predefinita è praticamente impossibile (a meno che non venga trovato un bypass).
|
||||
macOS è **super restrittivo nel caricare le Kernel Extensions** (.kext) a causa dei privilegi elevati con cui il codice verrà eseguito. In realtà, per impostazione predefinita è praticamente impossibile (a meno che non venga trovata una bypass).
|
||||
|
||||
Nella pagina seguente puoi anche vedere come recuperare il `.kext` che macOS carica all'interno del suo **kernelcache**:
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
Mach utilizza **compiti** come la **più piccola unità** per la condivisione delle risorse, e ogni compito può contenere **più thread**. Questi **compiti e thread sono mappati 1:1 a processi e thread POSIX**.
|
||||
|
||||
La comunicazione tra compiti avviene tramite la Comunicazione Inter-Processo Mach (IPC), utilizzando canali di comunicazione unidirezionali. **I messaggi vengono trasferiti tra porte**, che fungono da **code di messaggi** gestite dal kernel.
|
||||
La comunicazione tra compiti avviene tramite la Comunicazione Inter-Processo Mach (IPC), utilizzando canali di comunicazione unidirezionali. **I messaggi vengono trasferiti tra porte**, che agiscono come **code di messaggi** gestite dal kernel.
|
||||
|
||||
Ogni processo ha una **tabella IPC**, in cui è possibile trovare le **porte mach del processo**. Il nome di una porta mach è in realtà un numero (un puntatore all'oggetto kernel).
|
||||
|
||||
@ -55,7 +55,7 @@ Per questi servizi predefiniti, il **processo di ricerca differisce leggermente*
|
||||
- **launchd** verifica se il compito è in esecuzione e, se non lo è, **lo avvia**.
|
||||
- Il compito **A** (il servizio) esegue un **check-in bootstrap**. Qui, il **bootstrap** server crea un diritto di INVIO, lo trattiene e **trasferisce il diritto di RICEZIONE al Compito A**.
|
||||
- launchd duplica il **diritto di INVIO e lo invia al Compito B**.
|
||||
- Il Compito **B** genera una nuova porta con un **diritto di RICEZIONE** e un **diritto di INVIO**, e concede il **diritto di INVIO al Compito A** (il svc) in modo che possa inviare messaggi al COMPITO B (comunicazione bidirezionale).
|
||||
- Il compito **B** genera una nuova porta con un **diritto di RICEZIONE** e un **diritto di INVIO**, e concede il **diritto di INVIO al Compito A** (il svc) in modo che possa inviare messaggi al COMPITO B (comunicazione bidirezionale).
|
||||
|
||||
Tuttavia, questo processo si applica solo ai compiti di sistema predefiniti. I compiti non di sistema operano ancora come descritto originariamente, il che potrebbe potenzialmente consentire l'impersonificazione.
|
||||
|
||||
@ -74,22 +74,22 @@ mach_port_name_t msgh_voucher_port;
|
||||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
I process che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su una porta Mach. Al contrario, ai **mittenti** viene concesso un _**diritto di invio**_ o un _**diritto di invio-una-volta**_. Il diritto di invio-una-volta è esclusivamente per l'invio di un singolo messaggio, dopo il quale diventa invalido.
|
||||
I process che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su una porta Mach. Al contrario, ai **mittenti** viene concesso un _**diritto di invio**_ o un _**diritto di invio una sola volta**_. Il diritto di invio una sola volta è esclusivamente per inviare un singolo messaggio, dopo di che diventa invalido.
|
||||
|
||||
Per ottenere una facile **comunicazione bi-direzionale**, un processo può specificare una **porta mach** nell'**intestazione del messaggio** chiamata _porta di risposta_ (**`msgh_local_port`**) dove il **ricevente** del messaggio può **inviare una risposta** a questo messaggio. I bitflags in **`msgh_bits`** possono essere utilizzati per **indicare** che un **diritto di invio-una-volta** dovrebbe essere derivato e trasferito per questa porta (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Per ottenere una facile **comunicazione bidirezionale**, un processo può specificare una **porta mach** nell'**intestazione del messaggio** chiamata _porta di risposta_ (**`msgh_local_port`**) dove il **ricevente** del messaggio può **inviare una risposta** a questo messaggio. I bitflags in **`msgh_bits`** possono essere utilizzati per **indicare** che un **diritto di invio una sola volta** dovrebbe essere derivato e trasferito per questa porta (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
> [!TIP]
|
||||
> Nota che questo tipo di comunicazione bi-direzionale è utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono create porte diverse** come spiegato in precedenza per creare la comunicazione bi-direzionale.
|
||||
> Nota che questo tipo di comunicazione bidirezionale è utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono create porte diverse** come spiegato in precedenza per creare la comunicazione bidirezionale.
|
||||
|
||||
Gli altri campi dell'intestazione del messaggio sono:
|
||||
|
||||
- `msgh_size`: la dimensione dell'intero pacchetto.
|
||||
- `msgh_remote_port`: la porta su cui questo messaggio viene inviato.
|
||||
- `msgh_remote_port`: la porta su cui questo messaggio è inviato.
|
||||
- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html).
|
||||
- `msgh_id`: l'ID di questo messaggio, che è interpretato dal ricevente.
|
||||
|
||||
> [!CAUTION]
|
||||
> Nota che **i messaggi mach vengono inviati su una \_porta mach\_**, che è un canale di comunicazione **a singolo ricevente**, **multipli mittenti** integrato nel kernel mach. **Più processi** possono **inviare messaggi** a una porta mach, ma in qualsiasi momento solo **un singolo processo può leggere** da essa.
|
||||
> Nota che **i messaggi mach vengono inviati su una \_porta mach**\_, che è un canale di comunicazione **a singolo ricevente**, **multipli mittenti** integrato nel kernel mach. **Più processi** possono **inviare messaggi** a una porta mach, ma in qualsiasi momento solo **un singolo processo può leggere** da essa.
|
||||
|
||||
### Enumerare porte
|
||||
```bash
|
||||
@ -240,7 +240,7 @@ printf("Sent a message\n");
|
||||
|
||||
### Iniezione di Shellcode in thread tramite Porta task
|
||||
|
||||
Puoi ottenere uno shellcode da:
|
||||
Puoi prendere un shellcode da:
|
||||
|
||||
{{#ref}}
|
||||
../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
|
||||
@ -292,7 +292,7 @@ return 0;
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
**Compila** il programma precedente e aggiungi i **diritti** per poter iniettare codice con lo stesso utente (altrimenti dovrai usare **sudo**).
|
||||
**Compila** il programma precedente e aggiungi le **entitlements** per poter iniettare codice con lo stesso utente (altrimenti dovrai usare **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
@ -504,9 +504,9 @@ In macOS **i thread** possono essere manipolati tramite **Mach** o utilizzando *
|
||||
|
||||
È stato possibile **iniettare un semplice shellcode** per eseguire un comando perché **non doveva funzionare con api** conformi a posix, solo con Mach. **Iniezioni più complesse** richiederebbero che il **thread** fosse anche **conforme a posix**.
|
||||
|
||||
Pertanto, per **migliorare il thread** dovrebbe chiamare **`pthread_create_from_mach_thread`** che **creerà un pthread valido**. Poi, questo nuovo pthread potrebbe **chiamare dlopen** per **caricare un dylib** dal sistema, quindi invece di scrivere nuovo shellcode per eseguire azioni diverse è possibile caricare librerie personalizzate.
|
||||
Pertanto, per **migliorare il thread** dovrebbe chiamare **`pthread_create_from_mach_thread`** che **creerà un pthread valido**. Poi, questo nuovo pthread potrebbe **chiamare dlopen** per **caricare una dylib** dal sistema, quindi invece di scrivere nuovo shellcode per eseguire diverse azioni è possibile caricare librerie personalizzate.
|
||||
|
||||
Puoi trovare **dylibs di esempio** in (ad esempio quello che genera un log e poi puoi ascoltarlo):
|
||||
Puoi trovare **dylibs di esempio** in (ad esempio quella che genera un log e poi puoi ascoltarlo):
|
||||
|
||||
{{#ref}}
|
||||
../../macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
@ -802,9 +802,9 @@ In questa tecnica un thread del processo viene hijacked:
|
||||
|
||||
### Informazioni di base
|
||||
|
||||
XPC, che sta per XNU (il kernel utilizzato da macOS) inter-Process Communication, è un framework per **la comunicazione tra processi** su macOS e iOS. XPC fornisce un meccanismo per effettuare **chiamate di metodo sicure e asincrone tra diversi processi** sul sistema. Fa parte del paradigma di sicurezza di Apple, consentendo la **creazione di applicazioni separate per privilegi** in cui ogni **componente** funziona con **solo i permessi necessari** per svolgere il proprio lavoro, limitando così il potenziale danno derivante da un processo compromesso.
|
||||
XPC, che sta per XNU (il kernel utilizzato da macOS) inter-Process Communication, è un framework per **la comunicazione tra processi** su macOS e iOS. XPC fornisce un meccanismo per effettuare **chiamate di metodo sicure e asincrone tra diversi processi** sul sistema. Fa parte del paradigma di sicurezza di Apple, consentendo la **creazione di applicazioni separate per privilegi** in cui ogni **componente** viene eseguito con **solo i permessi necessari** per svolgere il proprio lavoro, limitando così il potenziale danno derivante da un processo compromesso.
|
||||
|
||||
Per ulteriori informazioni su come questa **comunicazione funziona** e su come potrebbe **essere vulnerabile** controlla:
|
||||
Per ulteriori informazioni su come questa **comunicazione funziona** e su come potrebbe **essere vulnerabile**, controlla:
|
||||
|
||||
{{#ref}}
|
||||
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/
|
||||
@ -812,9 +812,9 @@ Per ulteriori informazioni su come questa **comunicazione funziona** e su come p
|
||||
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente **genera il codice necessario** per il server e il client per comunicare con una definizione data. Anche se il codice generato è brutto, un sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice di prima.
|
||||
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente **genera il codice necessario** affinché server e client comunichino con una definizione data. Anche se il codice generato è brutto, un sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice di prima.
|
||||
|
||||
Per ulteriori informazioni controlla:
|
||||
Per ulteriori informazioni, controlla:
|
||||
|
||||
{{#ref}}
|
||||
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
|
||||
|
@ -12,7 +12,7 @@ Ci sono tre tipi di system extensions: **DriverKit** Extensions, **Network** Ext
|
||||
|
||||
### **DriverKit Extensions**
|
||||
|
||||
DriverKit è un sostituto delle kernel extensions che **forniscono supporto hardware**. Consente ai driver di dispositivo (come USB, Serial, NIC e HID drivers) di essere eseguiti nello spazio utente anziché nello spazio del kernel. Il framework DriverKit include **versioni nello spazio utente di alcune classi dell'I/O Kit**, e il kernel inoltra gli eventi normali dell'I/O Kit allo spazio utente, offrendo un ambiente più sicuro per l'esecuzione di questi driver.
|
||||
DriverKit è un sostituto delle kernel extensions che **forniscono supporto hardware**. Consente ai driver di dispositivo (come USB, Serial, NIC e HID drivers) di essere eseguiti nello spazio utente piuttosto che nello spazio del kernel. Il framework DriverKit include **versioni nello spazio utente di alcune classi dell'I/O Kit**, e il kernel inoltra gli eventi normali dell'I/O Kit allo spazio utente, offrendo un ambiente più sicuro per l'esecuzione di questi driver.
|
||||
|
||||
### **Network Extensions**
|
||||
|
||||
@ -59,9 +59,9 @@ Le Endpoint Security Extensions:**`libEndpointSecurity.dylib`** è la libreria C
|
||||
|
||||
Un altro demone di sistema, **`sysextd`**, **valida le system extensions** e le sposta nelle posizioni di sistema appropriate. Poi chiede al demone pertinente di caricare l'estensione. Il **`SystemExtensions.framework`** è responsabile dell'attivazione e disattivazione delle system extensions.
|
||||
|
||||
## Bypassare ESF
|
||||
## Bypassare l'ESF
|
||||
|
||||
ESF è utilizzato da strumenti di sicurezza che cercheranno di rilevare un red teamer, quindi qualsiasi informazione su come questo potrebbe essere evitato suona interessante.
|
||||
L'ESF è utilizzato da strumenti di sicurezza che cercheranno di rilevare un red teamer, quindi qualsiasi informazione su come questo potrebbe essere evitato suona interessante.
|
||||
|
||||
### CVE-2021-30965
|
||||
|
||||
|
@ -97,7 +97,7 @@ Sarà montato in `/Volumes`
|
||||
### Binarie impacchettate
|
||||
|
||||
- Controlla l'alta entropia
|
||||
- Controlla le stringhe (se non ci sono stringhe comprensibili, è impacchettato)
|
||||
- Controlla le stringhe (se non ci sono stringhe comprensibili, impacchettato)
|
||||
- Il pacchetto UPX per MacOS genera una sezione chiamata "\_\_XHDR"
|
||||
|
||||
## Analisi statica di Objective-C
|
||||
@ -242,7 +242,7 @@ Inoltre, ci sono alcuni log che conterranno il tag `<private>` per **nascondere*
|
||||
|
||||
#### Pannello sinistro
|
||||
|
||||
Nel pannello sinistro di hopper è possibile vedere i simboli (**Labels**) del binario, l'elenco delle procedure e delle funzioni (**Proc**) e le stringhe (**Str**). Queste non sono tutte le stringhe ma quelle definite in diverse parti del file Mac-O (come _cstring o_ `objc_methname`).
|
||||
Nel pannello sinistro di Hopper è possibile vedere i simboli (**Labels**) del binario, l'elenco delle procedure e delle funzioni (**Proc**) e le stringhe (**Str**). Queste non sono tutte le stringhe, ma quelle definite in diverse parti del file Mac-O (come _cstring o_ `objc_methname`).
|
||||
|
||||
#### Pannello centrale
|
||||
|
||||
@ -289,7 +289,7 @@ Una spiegazione più dettagliata e ulteriori esempi possono essere trovati in [h
|
||||
|
||||
#### Esempi
|
||||
|
||||
Esegui `man -k dtrace` per elencare gli **script DTrace disponibili**. Esempio: `sudo dtruss -
|
||||
Esegui `man -k dtrace` per elencare gli **script DTrace disponibili**. Esempio: `sudo dtruss -n binary`
|
||||
```bash
|
||||
#Count the number of syscalls of each running process
|
||||
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
|
||||
@ -343,7 +343,7 @@ dtruss -c -p 1000 #get syscalls of PID 1000
|
||||
|
||||
Strumenti come `latency`, `sc_usage`, `fs_usage` e `trace` lo utilizzano internamente.
|
||||
|
||||
Per interfacciarsi con `kdebug` si utilizza `sysctl` sul namespace `kern.kdebug` e i MIB da utilizzare possono essere trovati in `sys/sysctl.h`, con le funzioni implementate in `bsd/kern/kdebug.c`.
|
||||
Per interfacciarsi con `kdebug` si utilizza `sysctl` sul namespace `kern.kdebug` e i MIB da utilizzare possono essere trovati in `sys/sysctl.h` con le funzioni implementate in `bsd/kern/kdebug.c`.
|
||||
|
||||
Per interagire con kdebug con un client personalizzato, questi sono solitamente i passaggi:
|
||||
|
||||
@ -375,7 +375,7 @@ Or `tailspin`.
|
||||
|
||||
Questo è usato per fare un profiling a livello di kernel ed è costruito utilizzando le chiamate `Kdebug`.
|
||||
|
||||
Fondamentalmente, la variabile globale `kernel_debug_active` viene controllata e se è impostata chiama `kperf_kdebug_handler` con il codice `Kdebug` e l'indirizzo del frame del kernel chiamante. Se il codice `Kdebug` corrisponde a uno selezionato, ottiene le "azioni" configurate come bitmap (controlla `osfmk/kperf/action.h` per le opzioni).
|
||||
Fondamentalmente, la variabile globale `kernel_debug_active` viene controllata e se è impostata chiama `kperf_kdebug_handler` con il codice `Kdebug` e l'indirizzo del frame del kernel chiamante. Se il codice `Kdebug` corrisponde a uno selezionato, ottiene le "azioni" configurate come un bitmap (controlla `osfmk/kperf/action.h` per le opzioni).
|
||||
|
||||
Kperf ha anche una tabella MIB sysctl: (come root) `sysctl kperf`. Questi codici possono essere trovati in `osfmk/kperf/kperfbsd.c`.
|
||||
|
||||
@ -398,7 +398,7 @@ Devi monitorare il tuo mac con un comando come **`sudo eslogger fork exec rename
|
||||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) è uno strumento GUI con l'aspetto e la sensazione che gli utenti Windows potrebbero conoscere da _Procmon_ di Microsoft Sysinternal. Questo strumento consente di avviare e fermare la registrazione di vari tipi di eventi, consente il filtraggio di questi eventi per categorie come file, processo, rete, ecc., e fornisce la funzionalità di salvare gli eventi registrati in formato json.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) è uno strumento GUI con l'aspetto e la sensazione che gli utenti Windows potrebbero conoscere da _Procmon_ di Microsoft Sysinternal. Questo strumento consente di registrare vari tipi di eventi da avviare e fermare, consente il filtraggio di questi eventi per categorie come file, processo, rete, ecc., e fornisce la funzionalità di salvare gli eventi registrati in formato json.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
@ -436,9 +436,9 @@ Puoi impostare il sapore intel quando usi lldb creando un file chiamato **`.lldb
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
> [!WARNING]
|
||||
> All'interno di lldb, esegui il dump di un processo con `process save-core`
|
||||
> All'interno di lldb, dump un processo con `process save-core`
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Comando</strong></td><td><strong>Descrizione</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Inizia l'esecuzione, che continuerà senza interruzioni fino a quando non viene colpito un breakpoint o il processo termina.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Inizia l'esecuzione fermandosi al punto di ingresso</td></tr><tr><td><strong>continue (c)</strong></td><td>Continua l'esecuzione del processo in debug.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Esegui la prossima istruzione. Questo comando salterà le chiamate di funzione.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Esegui la prossima istruzione. A differenza del comando nexti, questo comando entrerà nelle chiamate di funzione.</td></tr><tr><td><strong>finish (f)</strong></td><td>Esegui il resto delle istruzioni nella funzione corrente (“frame”) restituisci e ferma.</td></tr><tr><td><strong>control + c</strong></td><td>Metti in pausa l'esecuzione. Se il processo è stato eseguito (r) o continuato (c), questo causerà l'arresto del processo ...dove si trova attualmente in esecuzione.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Qualsiasi funzione chiamata main</p><p><code>b <binname>`main</code> #Funzione principale del bin</p><p><code>b set -n main --shlib <lib_name></code> #Funzione principale del bin indicato</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Qualsiasi metodo NSFileManager</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Interrompi in tutte le funzioni di quella libreria</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Elenco dei breakpoint</p><p><code>br e/dis <num></code> #Abilita/Disabilita il breakpoint</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Ottieni aiuto sul comando breakpoint</p><p>help memory write #Ottieni aiuto per scrivere nella memoria</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>Visualizza la memoria come una stringa terminata da null.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>Visualizza la memoria come istruzione assembly.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>Visualizza la memoria come byte.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Questo stamperà l'oggetto referenziato dal parametro</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Nota che la maggior parte delle API o dei metodi Objective-C di Apple restituiscono oggetti, e quindi dovrebbero essere visualizzati tramite il comando “print object” (po). Se po non produce un output significativo, usa <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Scrivi AAAA in quell'indirizzo<br>memory write -f s $rip+0x11f+7 "AAAA" #Scrivi AAAA nell'indirizzo</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disassembla la funzione corrente</p><p>dis -n <funcname> #Disassembla la funzione</p><p>dis -n <funcname> -b <basename> #Disassembla la funzione<br>dis -c 6 #Disassembla 6 righe<br>dis -c 0x100003764 -e 0x100003768 # Da un add fino all'altro<br>dis -p -c 4 # Inizia nell'indirizzo corrente disassemblando</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Controlla l'array di 3 componenti nel registro x1</td></tr><tr><td><strong>image dump sections</strong></td><td>Stampa la mappa della memoria del processo corrente</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Ottieni l'indirizzo di tutti i simboli da CoreNLP</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Comando</strong></td><td><strong>Descrizione</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Inizia l'esecuzione, che continuerà senza interruzioni fino a quando non viene colpito un breakpoint o il processo termina.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Inizia l'esecuzione fermandosi al punto di ingresso</td></tr><tr><td><strong>continue (c)</strong></td><td>Continua l'esecuzione del processo in debug.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Esegui la prossima istruzione. Questo comando salterà le chiamate di funzione.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Esegui la prossima istruzione. A differenza del comando nexti, questo comando entrerà nelle chiamate di funzione.</td></tr><tr><td><strong>finish (f)</strong></td><td>Esegui il resto delle istruzioni nella funzione corrente (“frame”) restituisci e ferma.</td></tr><tr><td><strong>control + c</strong></td><td>Metti in pausa l'esecuzione. Se il processo è stato eseguito (r) o continuato (c), questo causerà l'arresto del processo ...dove si trova attualmente in esecuzione.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Qualsiasi funzione chiamata main</p><p><code>b <binname>`main</code> #Funzione principale del bin</p><p><code>b set -n main --shlib <lib_name></code> #Funzione principale del bin indicato</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Qualsiasi metodo NSFileManager</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Interrompi in tutte le funzioni di quella libreria</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Elenco dei breakpoint</p><p><code>br e/dis <num></code> #Abilita/Disabilita breakpoint</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Ottieni aiuto sul comando breakpoint</p><p>help memory write #Ottieni aiuto per scrivere nella memoria</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address></strong></td><td>Visualizza la memoria come una stringa terminata da null.</td></tr><tr><td><strong>x/i <reg/memory address></strong></td><td>Visualizza la memoria come istruzione assembly.</td></tr><tr><td><strong>x/b <reg/memory address></strong></td><td>Visualizza la memoria come byte.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Questo stamperà l'oggetto referenziato dal parametro</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Nota che la maggior parte delle API o dei metodi Objective-C di Apple restituiscono oggetti, e quindi dovrebbero essere visualizzati tramite il comando “print object” (po). Se po non produce un output significativo usa <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Scrivi AAAA in quell'indirizzo<br>memory write -f s $rip+0x11f+7 "AAAA" #Scrivi AAAA nell'indirizzo</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Disassembla la funzione corrente</p><p>dis -n <funcname> #Disassembla la funzione</p><p>dis -n <funcname> -b <basename> #Disassembla la funzione<br>dis -c 6 #Disassembla 6 righe<br>dis -c 0x100003764 -e 0x100003768 # Da un add fino all'altro<br>dis -p -c 4 # Inizia nell'indirizzo corrente disassemblando</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Controlla l'array di 3 componenti nel registro x1</td></tr><tr><td><strong>image dump sections</strong></td><td>Stampa la mappa della memoria del processo corrente</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Ottieni l'indirizzo di tutti i simboli da CoreNLP</td></tr></tbody></table>
|
||||
|
||||
> [!NOTE]
|
||||
> Quando si chiama la funzione **`objc_sendMsg`**, il registro **rsi** contiene il **nome del metodo** come stringa terminata da null (“C”). Per stampare il nome tramite lldb fare:
|
||||
@ -480,7 +480,7 @@ In questi casi il core dump viene generato secondo `kern.corefile` sysctl e soli
|
||||
|
||||
ReportCrash **analizza i processi in crash e salva un rapporto di crash su disco**. Un rapporto di crash contiene informazioni che possono **aiutare uno sviluppatore a diagnosticare** la causa di un crash.\
|
||||
Per le applicazioni e altri processi **in esecuzione nel contesto di launchd per utente**, ReportCrash viene eseguito come un LaunchAgent e salva i rapporti di crash nella `~/Library/Logs/DiagnosticReports/` dell'utente.\
|
||||
Per i demoni, altri processi **in esecuzione nel contesto di launchd di sistema** e altri processi privilegiati, ReportCrash viene eseguito come un LaunchDaemon e salva i rapporti di crash nei `/Library/Logs/DiagnosticReports` del sistema.
|
||||
Per i demoni, altri processi **in esecuzione nel contesto di launchd di sistema** e altri processi privilegiati, ReportCrash viene eseguito come un LaunchDaemon e salva i rapporti di crash nei `/Library/Logs/DiagnosticReports` di sistema.
|
||||
|
||||
Se sei preoccupato che i rapporti di crash **vengano inviati ad Apple**, puoi disabilitarli. In caso contrario, i rapporti di crash possono essere utili per **capire come è andato in crash un server**.
|
||||
```bash
|
||||
@ -511,7 +511,7 @@ Se stai fuzzando tramite una connessione SSH, è importante assicurarsi che la s
|
||||
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
|
||||
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||
```
|
||||
### Gestori Interni
|
||||
### Internal Handlers
|
||||
|
||||
**Controlla la seguente pagina** per scoprire come puoi trovare quale app è responsabile della **gestione dello schema o protocollo specificato:**
|
||||
|
||||
@ -519,9 +519,9 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
|
||||
../macos-file-extension-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Enumerazione dei Processi di Rete
|
||||
### Enumerating Network Processes
|
||||
|
||||
Questo è interessante per trovare processi che gestiscono dati di rete:
|
||||
Questo è interessante per trovare i processi che gestiscono i dati di rete:
|
||||
```bash
|
||||
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
|
||||
#wait some time
|
||||
|
@ -29,32 +29,32 @@ ARM64 ha **31 registri a uso generale**, etichettati da `x0` a `x30`. Ognuno pu
|
||||
- **`x0`** porta anche i dati di ritorno di una funzione.
|
||||
2. **`x8`** - Nel kernel Linux, `x8` è utilizzato come numero di chiamata di sistema per l'istruzione `svc`. **In macOS è `x16` quello utilizzato!**
|
||||
3. **`x9`** a **`x15`** - Altri registri temporanei, spesso utilizzati per variabili locali.
|
||||
4. **`x16`** e **`x17`** - **Registri di Chiamata Intra-procedurale**. Registri temporanei per valori immediati. Sono anche utilizzati per chiamate di funzione indirette e stub PLT (Procedure Linkage Table).
|
||||
4. **`x16`** e **`x17`** - **Registri di Chiamata Intra-procedurale**. Registri temporanei per valori immediati. Sono anche utilizzati per chiamate di funzione indirette e stub della PLT (Procedure Linkage Table).
|
||||
- **`x16`** è utilizzato come **numero di chiamata di sistema** per l'istruzione **`svc`** in **macOS**.
|
||||
5. **`x18`** - **Registro di Piattaforma**. Può essere utilizzato come registro a uso generale, ma su alcune piattaforme, questo registro è riservato per usi specifici della piattaforma: Puntatore al blocco di ambiente del thread corrente in Windows, o per puntare alla struttura del **compito in esecuzione nel kernel linux**.
|
||||
6. **`x19`** a **`x28`** - Questi sono registri salvati dal chiamato. Una funzione deve preservare i valori di questi registri per il suo chiamante, quindi vengono memorizzati nello stack e recuperati prima di tornare al chiamante.
|
||||
7. **`x29`** - **Puntatore di Frame** per tenere traccia del frame dello stack. Quando viene creato un nuovo frame dello stack a causa di una chiamata di funzione, il registro **`x29`** è **memorizzato nello stack** e l'indirizzo del **nuovo** puntatore di frame è (**indirizzo `sp`**) **memorizzato in questo registro**.
|
||||
- Questo registro può anche essere utilizzato come **registro a uso generale** anche se di solito è usato come riferimento a **variabili locali**.
|
||||
- Questo registro può anche essere utilizzato come un **registro a uso generale** anche se di solito è usato come riferimento a **variabili locali**.
|
||||
8. **`x30`** o **`lr`** - **Registro di Link**. Tiene l'**indirizzo di ritorno** quando viene eseguita un'istruzione `BL` (Branch with Link) o `BLR` (Branch with Link to Register) memorizzando il valore **`pc`** in questo registro.
|
||||
- Può anche essere utilizzato come qualsiasi altro registro.
|
||||
- Se la funzione corrente sta per chiamare una nuova funzione e quindi sovrascrivere `lr`, lo memorizzerà nello stack all'inizio, questo è l'epilogo (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Memorizza `fp` e `lr`, genera spazio e ottiene un nuovo `fp`) e lo recupera alla fine, questo è il prologo (`ldp x29, x30, [sp], #48; ret` -> Recupera `fp` e `lr` e ritorna).
|
||||
9. **`sp`** - **Puntatore di Stack**, utilizzato per tenere traccia della parte superiore dello stack.
|
||||
- il valore **`sp`** dovrebbe sempre essere mantenuto almeno a un **allineamento** **quadword** o potrebbe verificarsi un'eccezione di allineamento.
|
||||
10. **`pc`** - **Contatore di Programma**, che punta alla prossima istruzione. Questo registro può essere aggiornato solo attraverso generazioni di eccezione, ritorni di eccezione e salti. Le uniche istruzioni ordinarie che possono leggere questo registro sono le istruzioni di salto con link (BL, BLR) per memorizzare l'indirizzo **`pc`** in **`lr`** (Link Register).
|
||||
11. **`xzr`** - **Registro Zero**. Chiamato anche **`wzr`** nella sua forma di registro a **32** bit. Può essere utilizzato per ottenere facilmente il valore zero (operazione comune) o per eseguire confronti utilizzando **`subs`** come **`subs XZR, Xn, #10`** memorizzando i dati risultanti da nessuna parte (in **`xzr`**).
|
||||
11. **`xzr`** - **Registro Zero**. Chiamato anche **`wzr`** nella sua forma di registro **a 32** bit. Può essere utilizzato per ottenere facilmente il valore zero (operazione comune) o per eseguire confronti utilizzando **`subs`** come **`subs XZR, Xn, #10`** memorizzando i dati risultanti da nessuna parte (in **`xzr`**).
|
||||
|
||||
I registri **`Wn`** sono la versione **a 32 bit** dei registri **`Xn`**.
|
||||
I registri **`Wn`** sono la versione **a 32 bit** del registro **`Xn`**.
|
||||
|
||||
### Registri SIMD e a Punto Fisso
|
||||
|
||||
Inoltre, ci sono altri **32 registri di lunghezza 128 bit** che possono essere utilizzati in operazioni ottimizzate di dati multipli a singola istruzione (SIMD) e per eseguire aritmetica a punto fisso. Questi sono chiamati registri Vn anche se possono operare anche in **64** bit, **32** bit, **16** bit e **8** bit e poi sono chiamati **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** e **`Bn`**.
|
||||
Inoltre, ci sono altri **32 registri di lunghezza 128 bit** che possono essere utilizzati in operazioni ottimizzate di dati a istruzione singola multipla (SIMD) e per eseguire aritmetica a punto fisso. Questi sono chiamati registri Vn anche se possono operare anche in **64** bit, **32** bit, **16** bit e **8** bit e poi sono chiamati **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** e **`Bn`**.
|
||||
|
||||
### Registri di Sistema
|
||||
|
||||
**Ci sono centinaia di registri di sistema**, chiamati anche registri a scopo speciale (SPRs), utilizzati per **monitorare** e **controllare** il comportamento dei **processori**.\
|
||||
Possono essere letti o impostati solo utilizzando le istruzioni speciali dedicate **`mrs`** e **`msr`**.
|
||||
|
||||
I registri speciali **`TPIDR_EL0`** e **`TPIDDR_EL0`** si trovano comunemente durante il reverse engineering. Il suffisso `EL0` indica l'**eccezione minima** da cui il registro può essere accessibile (in questo caso EL0 è il livello di eccezione regolare (privilegio) con cui i programmi regolari vengono eseguiti).\
|
||||
I registri speciali **`TPIDR_EL0`** e **`TPIDDR_EL0`** si trovano comunemente durante il reverse engineering. Il suffisso `EL0` indica l'**eccezione minima** da cui il registro può essere accessibile (in questo caso EL0 è il livello di eccezione (privilegio) regolare con cui i programmi normali vengono eseguiti).\
|
||||
Sono spesso utilizzati per memorizzare l'**indirizzo base della regione di memoria di storage locale per thread**. Di solito il primo è leggibile e scrivibile per i programmi in esecuzione a EL0, ma il secondo può essere letto da EL0 e scritto da EL1 (come il kernel).
|
||||
|
||||
- `mrs x0, TPIDR_EL0 ; Leggi TPIDR_EL0 in x0`
|
||||
@ -62,7 +62,7 @@ Sono spesso utilizzati per memorizzare l'**indirizzo base della regione di memor
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** contiene diversi componenti del processo serializzati nel registro speciale visibile dal sistema operativo **`SPSR_ELx`**, dove X è il **livello di permesso** **dell'eccezione** attivata (questo consente di recuperare lo stato del processo quando l'eccezione termina).\
|
||||
**PSTATE** contiene diversi componenti del processo serializzati nel registro speciale visibile dal sistema operativo **`SPSR_ELx`**, dove X è il **livello di autorizzazione** **dell'eccezione** attivata (questo consente di recuperare lo stato del processo quando l'eccezione termina).\
|
||||
Questi sono i campi accessibili:
|
||||
|
||||
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
@ -70,7 +70,7 @@ Questi sono i campi accessibili:
|
||||
- I flag di condizione **`N`**, **`Z`**, **`C`** e **`V`**:
|
||||
- **`N`** significa che l'operazione ha prodotto un risultato negativo.
|
||||
- **`Z`** significa che l'operazione ha prodotto zero.
|
||||
- **`C`** significa che l'operazione ha generato un riporto.
|
||||
- **`C`** significa che l'operazione ha portato.
|
||||
- **`V`** significa che l'operazione ha prodotto un overflow firmato:
|
||||
- La somma di due numeri positivi produce un risultato negativo.
|
||||
- La somma di due numeri negativi produce un risultato positivo.
|
||||
@ -82,10 +82,10 @@ Questi sono i campi accessibili:
|
||||
|
||||
- Il flag di **larghezza del registro corrente (`nRW`)**: Se il flag ha il valore 0, il programma verrà eseguito nello stato di esecuzione AArch64 una volta ripreso.
|
||||
- Il **livello di eccezione corrente** (**`EL`**): Un programma regolare in esecuzione a EL0 avrà il valore 0.
|
||||
- Il flag di **single stepping** (**`SS`**): Utilizzato dai debugger per eseguire un passo impostando il flag SS a 1 all'interno di **`SPSR_ELx`** attraverso un'eccezione. Il programma eseguirà un passo e genererà un'eccezione di passo singolo.
|
||||
- Il flag di **single stepping** (**`SS`**): Utilizzato dai debugger per eseguire un passo singolo impostando il flag SS a 1 all'interno di **`SPSR_ELx`** attraverso un'eccezione. Il programma eseguirà un passo e genererà un'eccezione di passo singolo.
|
||||
- Il flag di stato di **eccezione illegale** (**`IL`**): Viene utilizzato per contrassegnare quando un software privilegiato esegue un trasferimento di livello di eccezione non valido, questo flag è impostato a 1 e il processore attiva un'eccezione di stato illegale.
|
||||
- I flag **`DAIF`**: Questi flag consentono a un programma privilegiato di mascherare selettivamente alcune eccezioni esterne.
|
||||
- Se **`A`** è 1 significa che verranno attivati **aborti asincroni**. Il **`I`** configura la risposta alle **Richieste di Interruzione** (IRQ) hardware esterne. e il F è relativo alle **Richieste di Interruzione Veloce** (FIR).
|
||||
- Se **`A`** è 1 significa che verranno attivati **aborti asincroni**. Il **`I`** configura la risposta alle **Richieste di Interruzione Hardware** (IRQ). e il F è relativo alle **Richieste di Interruzione Veloce** (FIR).
|
||||
- I flag di selezione del puntatore di stack (**`SPS`**): I programmi privilegiati in esecuzione a EL1 e superiori possono passare dall'utilizzo del proprio registro di puntatore di stack a quello del modello utente (ad es. tra `SP_EL1` e `EL0`). Questo passaggio viene eseguito scrivendo nel registro speciale **`SPSel`**. Questo non può essere fatto da EL0.
|
||||
|
||||
## **Convenzione di Chiamata (ARM64v8)**
|
||||
@ -111,7 +111,7 @@ Le istruzioni ARM64 generalmente hanno il **formato `opcode dst, src1, src2`**,
|
||||
- `ldr x2, [x0, x1, lsl #2]`, questo caricherà in x2 un oggetto dall'array x0, dalla posizione x1 (indice) \* 4.
|
||||
- **Modalità Pre-indicizzata**: Questo applicherà calcoli all'origine, otterrà il risultato e memorizzerà anche la nuova origine nell'origine.
|
||||
- `ldr x2, [x1, #8]!`, questo caricherà `x1 + 8` in `x2` e memorizzerà in x1 il risultato di `x1 + 8`.
|
||||
- `str lr, [sp, #-4]!`, memorizza il registro di link in sp e aggiorna il registro sp.
|
||||
- `str lr, [sp, #-4]!`, Memorizza il registro di link in sp e aggiorna il registro sp.
|
||||
- **Modalità Post-indicizzata**: Questo è simile al precedente ma l'indirizzo di memoria viene accesso e poi l'offset viene calcolato e memorizzato.
|
||||
- `ldr x0, [x1], #8`, carica `x1` in `x0` e aggiorna x1 con `x1 + 8`.
|
||||
- **Indirizzamento relativo al PC**: In questo caso l'indirizzo da caricare è calcolato rispetto al registro PC.
|
||||
@ -130,7 +130,7 @@ Le istruzioni ARM64 generalmente hanno il **formato `opcode dst, src1, src2`**,
|
||||
- Xn3 | #imm -> Operando 2 (registro o immediato)
|
||||
- \[shift #N | RRX] -> Esegui uno shift o chiama RRX.
|
||||
- Esempio: `add x0, x1, x2` — Questo aggiunge i valori in `x1` e `x2` insieme e memorizza il risultato in `x0`.
|
||||
- `add x5, x5, #1, lsl #12` — Questo equivale a 4096 (un 1 spostato 12 volte) -> 1 0000 0000 0000 0000.
|
||||
- `add x5, x5, #1, lsl #12` — Questo equivale a 4096 (un 1 shifter 12 volte) -> 1 0000 0000 0000 0000.
|
||||
- **`adds`** Questo esegue un `add` e aggiorna i flag.
|
||||
- **`sub`**: **Sottrae** i valori di due registri e memorizza il risultato in un registro.
|
||||
- Controlla la **sintassi di `add`**.
|
||||
@ -141,23 +141,23 @@ Le istruzioni ARM64 generalmente hanno il **formato `opcode dst, src1, src2`**,
|
||||
- **`div`**: **Divide** il valore di un registro per un altro e memorizza il risultato in un registro.
|
||||
- Esempio: `div x0, x1, x2` — Questo divide il valore in `x1` per `x2` e memorizza il risultato in `x0`.
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Shift logico a sinistra**: Aggiunge 0s dalla fine spostando gli altri bit in avanti (moltiplica per n volte 2).
|
||||
- **Shift logico a destra**: Aggiunge 1s all'inizio spostando gli altri bit all'indietro (divide per n volte 2 in modo non firmato).
|
||||
- **Shift aritmetico a destra**: Come **`lsr`**, ma invece di aggiungere 0s se il bit più significativo è 1, **si aggiungono 1s** (divide per n volte 2 in modo firmato).
|
||||
- **Shift logico a sinistra**: Aggiungi 0s dalla fine spostando gli altri bit in avanti (moltiplica per n volte 2).
|
||||
- **Shift logico a destra**: Aggiungi 1s all'inizio spostando gli altri bit all'indietro (dividi per n volte 2 in modo non firmato).
|
||||
- **Shift aritmetico a destra**: Come **`lsr`**, ma invece di aggiungere 0s se il bit più significativo è 1, **si aggiungono 1s** (**dividi per n volte 2 in modo firmato**).
|
||||
- **Ruota a destra**: Come **`lsr`** ma qualsiasi cosa venga rimossa da destra viene aggiunta a sinistra.
|
||||
- **Ruota a destra con estensione**: Come **`ror`**, ma con il flag di riporto come "bit più significativo". Quindi il flag di riporto viene spostato al bit 31 e il bit rimosso al flag di riporto.
|
||||
- **`bfm`**: **Bit Field Move**, queste operazioni **copia i bit `0...n`** da un valore e li posiziona nelle posizioni **`m..m+n`**. Il **`#s`** specifica la **posizione del bit più a sinistra** e **`#r`** la **quantità di rotazione a destra**.
|
||||
- Spostamento di campo bit: `BFM Xd, Xn, #r`
|
||||
- Spostamento di campo firmato: `SBFM Xd, Xn, #r, #s`
|
||||
- Spostamento di campo non firmato: `UBFM Xd, Xn, #r, #s`
|
||||
- **Estrai e Inserisci Campo Bit:** Copia un campo bit da un registro e lo copia in un altro registro.
|
||||
- Spostamento di campo bit: `BFM Xd, Xn, #r`.
|
||||
- Spostamento di campo firmato: `SBFM Xd, Xn, #r, #s`.
|
||||
- Spostamento di campo non firmato: `UBFM Xd, Xn, #r, #s`.
|
||||
- **Estrazione e Inserimento di Campo Bit:** Copia un campo bit da un registro e lo copia in un altro registro.
|
||||
- **`BFI X1, X2, #3, #4`** Inserisce 4 bit da X2 dal 3° bit di X1.
|
||||
- **`BFXIL X1, X2, #3, #4`** Estrae dal 3° bit di X2 quattro bit e li copia in X1.
|
||||
- **`SBFIZ X1, X2, #3, #4`** Estende il segno di 4 bit da X2 e li inserisce in X1 a partire dalla posizione del bit 3 azzerando i bit a destra.
|
||||
- **`SBFX X1, X2, #3, #4`** Estrae 4 bit a partire dal bit 3 di X2, estende il segno e posiziona il risultato in X1.
|
||||
- **`UBFIZ X1, X2, #3, #4`** Estende a zero 4 bit da X2 e li inserisce in X1 a partire dalla posizione del bit 3 azzerando i bit a destra.
|
||||
- **`UBFX X1, X2, #3, #4`** Estrae 4 bit a partire dal bit 3 di X2 e posiziona il risultato esteso a zero in X1.
|
||||
- **Estendi il segno a X:** Estende il segno (o aggiunge solo 0s nella versione non firmata) di un valore per poter eseguire operazioni con esso:
|
||||
- **Estensione del Segno a X:** Estende il segno (o aggiunge solo 0s nella versione non firmata) di un valore per poter eseguire operazioni con esso:
|
||||
- **`SXTB X1, W2`** Estende il segno di un byte **da W2 a X1** (`W2` è la metà di `X2`) per riempire i 64 bit.
|
||||
- **`SXTH X1, W2`** Estende il segno di un numero a 16 bit **da W2 a X1** per riempire i 64 bit.
|
||||
- **`SXTW X1, W2`** Estende il segno di un byte **da W2 a X1** per riempire i 64 bit.
|
||||
@ -192,8 +192,8 @@ Le istruzioni ARM64 generalmente hanno il **formato `opcode dst, src1, src2`**,
|
||||
- Esempio: Dopo un'istruzione `cmp x0, x1`, `b.ne label` — Se i valori in `x0` e `x1` non erano uguali, questo salta a `label`.
|
||||
- **`cbz`**: **Confronta e Salta su Zero**. Questa istruzione confronta un registro con zero, e se sono uguali, salta a un'etichetta o indirizzo.
|
||||
- Esempio: `cbz x0, label` — Se il valore in `x0` è zero, questo salta a `label`.
|
||||
- **`cbnz`**: **Confronta e Salta su Non-Zero**. Questa istruzione confronta un registro con zero, e se non sono uguali, salta a un'etichetta o indirizzo.
|
||||
- Esempio: `cbnz x0, label` — Se il valore in `x0` è non-zero, questo salta a `label`.
|
||||
- **`cbnz`**: **Confronta e Salta su Non Zero**. Questa istruzione confronta un registro con zero, e se non sono uguali, salta a un'etichetta o indirizzo.
|
||||
- Esempio: `cbnz x0, label` — Se il valore in `x0` è diverso da zero, questo salta a `label`.
|
||||
- **`tbnz`**: Testa il bit e salta se non zero.
|
||||
- Esempio: `tbnz x0, #8, label`.
|
||||
- **`tbz`**: Testa il bit e salta se zero.
|
||||
@ -305,7 +305,7 @@ L'istruzione **`SEL`** utilizza questi flag GE per eseguire azioni condizionali.
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: Alcune eccezioni possono essere disabilitate utilizzando i bit **`A`**, `I`, `F`. Se **`A`** è 1 significa che verranno attivati **aborti asincroni**. L'**`I`** configura per rispondere alle **Richieste di Interruzione** hardware esterne (IRQ). e la F è relativa alle **Richieste di Interruzione Veloce** (FIR).
|
||||
- **`AIF`**: Alcune eccezioni possono essere disabilitate utilizzando i bit **`A`**, `I`, `F`. Se **`A`** è 1 significa che verranno attivati **aborti asincroni**. Il **`I`** configura per rispondere alle **Richieste di Interruzione** hardware esterne (IRQ). e il F è relativo alle **Richieste di Interruzione Veloce** (FIR).
|
||||
|
||||
## macOS
|
||||
|
||||
@ -336,7 +336,7 @@ XNU supporta un altro tipo di chiamate chiamate dipendenti dalla macchina. I num
|
||||
|
||||
### pagina comm
|
||||
|
||||
Questa è una pagina di memoria di proprietà del kernel che è mappata nello spazio degli indirizzi di ogni processo utente. È progettata per rendere la transizione dalla modalità utente allo spazio kernel più veloce rispetto all'uso di syscalls per i servizi del kernel che sono utilizzati così tanto che questa transizione sarebbe molto inefficiente.
|
||||
Questa è una pagina di memoria di proprietà del kernel che è mappata nello spazio degli indirizzi di ogni processo utente. È progettata per rendere la transizione dalla modalità utente allo spazio kernel più veloce rispetto all'uso di syscalls per i servizi del kernel che vengono utilizzati così tanto che questa transizione sarebbe molto inefficiente.
|
||||
|
||||
Ad esempio, la chiamata `gettimeofdate` legge il valore di `timeval` direttamente dalla pagina comm.
|
||||
|
||||
|
@ -78,7 +78,7 @@ Ci sono diverse classi di syscalls, puoi [**trovarle qui**](https://opensource.a
|
||||
#define SYSCALL_CLASS_DIAG 4 /* Diagnostics */
|
||||
#define SYSCALL_CLASS_IPC 5 /* Mach IPC */
|
||||
```
|
||||
Quindi, puoi trovare ogni numero di syscall [**in this url**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
|
||||
Poi, puoi trovare ogni numero di syscall [**in this url**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master)**:**
|
||||
```c
|
||||
0 AUE_NULL ALL { int nosys(void); } { indirect syscall }
|
||||
1 AUE_EXIT ALL { void exit(int rval); }
|
||||
|
@ -85,10 +85,10 @@ Utilizza anche alcune sezioni nel segmento **`__TEXT`** per memorizzare valori c
|
||||
Objective-C utilizza alcune mangling per codificare i selettori e i tipi di variabili di tipi semplici e complessi:
|
||||
|
||||
- I tipi primitivi usano la prima lettera del tipo `i` per `int`, `c` per `char`, `l` per `long`... e usano la lettera maiuscola nel caso sia senza segno (`L` per `unsigned Long`).
|
||||
- Altri tipi di dati le cui lettere sono utilizzate o sono speciali, usano altre lettere o simboli come `q` per `long long`, `b` per `bitfields`, `B` per `booleans`, `#` per `classi`, `@` per `id`, `*` per `char pointers`, `^` per `pointers` generici e `?` per `undefined`.
|
||||
- Altri tipi di dati le cui lettere sono utilizzate o sono speciali, usano altre lettere o simboli come `q` per `long long`, `b` per `bitfields`, `B` per `booleans`, `#` per `classi`, `@` per `id`, `*` per `puntatori char`, `^` per `puntatori` generici e `?` per `indefiniti`.
|
||||
- Array, strutture e unioni usano `[`, `{` e `(`
|
||||
|
||||
#### Dichiarazione di esempio del metodo
|
||||
#### Dichiarazione del metodo di esempio
|
||||
```objectivec
|
||||
- (NSString *)processString:(id)input withOptions:(char *)options andError:(id)error;
|
||||
```
|
||||
@ -140,6 +140,6 @@ data()->setFlags(set);
|
||||
Questa classe utilizza alcuni bit del campo isa per indicare alcune informazioni sulla classe.
|
||||
|
||||
Poi, la struct ha un puntatore alla struct `class_ro_t` memorizzata su disco che contiene attributi della classe come il suo nome, metodi di base, proprietà e variabili di istanza.\
|
||||
Durante l'esecuzione, viene utilizzata una struttura aggiuntiva `class_rw_t` che contiene puntatori che possono essere modificati come metodi, protocolli, proprietà...
|
||||
Durante l'esecuzione, viene utilizzata una struttura aggiuntiva `class_rw_t` che contiene puntatori che possono essere modificati come metodi, protocolli, proprietà...
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Struttura gerarchica dei file
|
||||
## Layout gerarchico dei file
|
||||
|
||||
- **/Applications**: Le app installate dovrebbero trovarsi qui. Tutti gli utenti potranno accedervi.
|
||||
- **/bin**: Binaries da linea di comando
|
||||
@ -17,7 +17,7 @@
|
||||
- **/Users**: Directory home per gli utenti.
|
||||
- **/usr**: Config e binaries di sistema
|
||||
- **/var**: File di log
|
||||
- **/Volumes**: I dischi montati appariranno qui.
|
||||
- **/Volumes**: Le unità montate appariranno qui.
|
||||
- **/.vol**: Eseguendo `stat a.txt` ottieni qualcosa come `16777223 7545753 -rw-r--r-- 1 username wheel ...` dove il primo numero è l'id del volume in cui esiste il file e il secondo è il numero inode. Puoi accedere al contenuto di questo file tramite /.vol/ con quelle informazioni eseguendo `cat /.vol/16777223/7545753`
|
||||
|
||||
### Cartelle delle Applicazioni
|
||||
@ -82,7 +82,7 @@ In iOS puoi trovarli in **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
Simile alla cache condivisa dyld, il kernel e le estensioni del kernel sono anche compilati in una cache del kernel, che viene caricata all'avvio.
|
||||
|
||||
Per estrarre le librerie dal file unico della cache condivisa dylib, era possibile utilizzare il binario [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) che potrebbe non funzionare al giorno d'oggi, ma puoi anche utilizzare [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
Per estrarre le librerie dal file unico della cache condivisa dylib, era possibile utilizzare il binario [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) che potrebbe non funzionare al giorno d'oggi, ma puoi anche usare [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
```bash
|
||||
# dyld_shared_cache_util
|
||||
dyld_shared_cache_util -extract ~/shared_cache/ /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
@ -100,13 +100,13 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
||||
Alcuni estrattori non funzioneranno poiché le dylibs sono precollegate con indirizzi hardcoded e quindi potrebbero saltare a indirizzi sconosciuti.
|
||||
|
||||
> [!TIP]
|
||||
> È anche possibile scaricare la Cache della Libreria Condivisa di altri dispositivi \*OS in macos utilizzando un emulatore in Xcode. Saranno scaricati all'interno di: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, come: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
|
||||
> È anche possibile scaricare la Cache delle Librerie Condivise di altri dispositivi \*OS in macos utilizzando un emulatore in Xcode. Saranno scaricati all'interno di: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, come: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
|
||||
|
||||
### Mapping SLC
|
||||
|
||||
**`dyld`** utilizza la syscall **`shared_region_check_np`** per sapere se l'SLC è stato mappato (che restituisce l'indirizzo) e **`shared_region_map_and_slide_np`** per mappare l'SLC.
|
||||
|
||||
Nota che anche se l'SLC è scivolato al primo utilizzo, tutti i **processi** utilizzano la **stessa copia**, il che **elimina la protezione ASLR** se l'attaccante è stato in grado di eseguire processi nel sistema. Questo è stato effettivamente sfruttato in passato e corretto con il pager della regione condivisa.
|
||||
Nota che anche se l'SLC è scivolato al primo utilizzo, tutti i **processi** utilizzano la **stessa copia**, il che **elimina la protezione ASLR** se l'attaccante è in grado di eseguire processi nel sistema. Questo è stato effettivamente sfruttato in passato ed è stato corretto con il pager della regione condivisa.
|
||||
|
||||
I branch pool sono piccole dylibs Mach-O che creano piccoli spazi tra le mappature delle immagini rendendo impossibile l'interposizione delle funzioni.
|
||||
|
||||
@ -114,7 +114,7 @@ I branch pool sono piccole dylibs Mach-O che creano piccoli spazi tra le mappatu
|
||||
|
||||
Utilizzando le variabili di ambiente:
|
||||
|
||||
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Questo permetterà di caricare una nuova cache di libreria condivisa.
|
||||
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Questo permetterà di caricare una nuova cache di librerie condivise.
|
||||
- **`DYLD_SHARED_CACHE_DIR=avoid`** e sostituire manualmente le librerie con symlink alla cache condivisa con quelle reali (dovrai estrarle).
|
||||
|
||||
## Permessi Speciali dei File
|
||||
@ -130,7 +130,7 @@ Ci sono alcuni flag che possono essere impostati nei file che faranno comportare
|
||||
- **`uchg`**: Conosciuto come flag **uchange** impedirà **qualsiasi azione** di modifica o eliminazione del **file**. Per impostarlo fare: `chflags uchg file.txt`
|
||||
- L'utente root potrebbe **rimuovere il flag** e modificare il file.
|
||||
- **`restricted`**: Questo flag rende il file **protetto da SIP** (non puoi aggiungere questo flag a un file).
|
||||
- **`Sticky bit`**: Se una directory ha il bit sticky, **solo** il **proprietario della directory o root può rinominare o eliminare** file. Tipicamente questo è impostato sulla directory /tmp per impedire agli utenti ordinari di eliminare o spostare i file di altri utenti.
|
||||
- **`Sticky bit`**: Se una directory ha il bit sticky, **solo** il **proprietario della directory o root può rinominare o eliminare** file. Tipicamente questo è impostato sulla directory /tmp per impedire agli utenti normali di eliminare o spostare i file di altri utenti.
|
||||
|
||||
Tutti i flag possono essere trovati nel file `sys/stat.h` (trovalo usando `mdfind stat.h | grep stat.h`) e sono:
|
||||
|
||||
@ -190,8 +190,8 @@ Gli attributi estesi hanno un nome e un valore desiderato, e possono essere visu
|
||||
- `com.apple.genstore.*`: Archiviazione generazionale (`/.DocumentRevisions-V100` nella radice del filesystem)
|
||||
- `com.apple.rootless`: MacOS: Utilizzato da System Integrity Protection per etichettare il file (III/10)
|
||||
- `com.apple.uuidb.boot-uuid`: marcature logd delle epoche di avvio con UUID unici
|
||||
- `com.apple.decmpfs`: MacOS: Compressione trasparente dei file (II/7)
|
||||
- `com.apple.cprotect`: \*OS: Dati di crittografia per file (III/11)
|
||||
- `com.apple.decmpfs`: MacOS: compressione trasparente dei file (II/7)
|
||||
- `com.apple.cprotect`: \*OS: Dati di crittografia per file singoli (III/11)
|
||||
- `com.apple.installd.*`: \*OS: Metadati utilizzati da installd, ad es., `installType`, `uniqueInstallID`
|
||||
|
||||
### Fork delle Risorse | macOS ADS
|
||||
|
@ -11,7 +11,7 @@ I bundle in macOS fungono da contenitori per una varietà di risorse, tra cui ap
|
||||
All'interno di un bundle, in particolare nella directory `<application>.app/Contents/`, si trovano una varietà di risorse importanti:
|
||||
|
||||
- **\_CodeSignature**: Questa directory memorizza i dettagli della firma del codice, vitali per verificare l'integrità dell'applicazione. Puoi ispezionare le informazioni sulla firma del codice utilizzando comandi come: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
- **MacOS**: Contiene il binario eseguibile dell'applicazione che viene eseguito al momento dell'interazione dell'utente.
|
||||
- **MacOS**: Contiene il binario eseguibile dell'applicazione che viene eseguito all'interazione dell'utente.
|
||||
- **Resources**: Un repository per i componenti dell'interfaccia utente dell'applicazione, inclusi immagini, documenti e descrizioni dell'interfaccia (file nib/xib).
|
||||
- **Info.plist**: Funziona come il file di configurazione principale dell'applicazione, cruciale per il sistema per riconoscere e interagire correttamente con l'applicazione.
|
||||
|
||||
|
@ -1,24 +1,24 @@
|
||||
# Abuso degli Installatori macOS
|
||||
# macOS Installers Abuse
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informazioni di Base sul Pkg
|
||||
## Pkg Basic Information
|
||||
|
||||
Un **pacchetto di installazione** macOS (noto anche come file `.pkg`) è un formato di file utilizzato da macOS per **distribuire software**. Questi file sono come una **scatola che contiene tutto ciò di cui un software** ha bisogno per essere installato e funzionare correttamente.
|
||||
Un **pacchetto di installazione** macOS (noto anche come file `.pkg`) è un formato di file utilizzato da macOS per **distribuire software**. Questi file sono come una **scatola che contiene tutto ciò di cui un software** ha bisogno per installarsi e funzionare correttamente.
|
||||
|
||||
Il file del pacchetto stesso è un archivio che contiene una **gerarchia di file e directory che saranno installati sul computer** di destinazione. Può anche includere **script** per eseguire operazioni prima e dopo l'installazione, come la configurazione di file di configurazione o la pulizia di versioni precedenti del software.
|
||||
Il file del pacchetto stesso è un archivio che contiene una **gerarchia di file e directory che verranno installati sul computer** di destinazione. Può anche includere **script** per eseguire operazioni prima e dopo l'installazione, come la configurazione di file di configurazione o la pulizia di versioni precedenti del software.
|
||||
|
||||
### Gerarchia
|
||||
### Hierarchy
|
||||
|
||||
<figure><img src="../../../images/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
|
||||
|
||||
- **Distribuzione (xml)**: Personalizzazioni (titolo, testo di benvenuto…) e controlli di script/installazione
|
||||
- **Distribution (xml)**: Personalizzazioni (titolo, testo di benvenuto…) e controlli di script/installazione
|
||||
- **PackageInfo (xml)**: Info, requisiti di installazione, posizione di installazione, percorsi degli script da eseguire
|
||||
- **Bill of materials (bom)**: Elenco dei file da installare, aggiornare o rimuovere con permessi di file
|
||||
- **Payload (archivio CPIO compresso gzip)**: File da installare nella `install-location` da PackageInfo
|
||||
- **Scripts (archivio CPIO compresso gzip)**: Script di pre e post installazione e altre risorse estratte in una directory temporanea per l'esecuzione.
|
||||
- **Payload (CPIO archive gzip compresses)**: File da installare nella `install-location` da PackageInfo
|
||||
- **Scripts (CPIO archive gzip compressed)**: Script di pre e post installazione e altre risorse estratte in una directory temporanea per l'esecuzione.
|
||||
|
||||
### Decomprimere
|
||||
### Decompress
|
||||
```bash
|
||||
# Tool to directly get the files inside a package
|
||||
pkgutil —expand "/path/to/package.pkg" "/path/to/out/dir"
|
||||
@ -36,7 +36,7 @@ Per visualizzare i contenuti dell'installer senza decomprimerlo manualmente, puo
|
||||
|
||||
## Informazioni di base sui DMG
|
||||
|
||||
I file DMG, o Apple Disk Images, sono un formato di file utilizzato da macOS di Apple per le immagini disco. Un file DMG è essenzialmente un **immagine disco montabile** (contiene il proprio filesystem) che contiene dati di blocco grezzi tipicamente compressi e a volte crittografati. Quando apri un file DMG, macOS **lo monta come se fosse un disco fisico**, permettendoti di accedere ai suoi contenuti.
|
||||
I file DMG, o Apple Disk Images, sono un formato di file utilizzato da macOS di Apple per le immagini disco. Un file DMG è essenzialmente un **immagine disco montabile** (contiene il proprio filesystem) che contiene dati di blocco grezzi tipicamente compressi e talvolta crittografati. Quando apri un file DMG, macOS **lo monta come se fosse un disco fisico**, permettendoti di accedere ai suoi contenuti.
|
||||
|
||||
> [!CAUTION]
|
||||
> Nota che gli installer **`.dmg`** supportano **così tanti formati** che in passato alcuni di essi contenenti vulnerabilità sono stati abusati per ottenere **l'esecuzione di codice nel kernel**.
|
||||
@ -67,13 +67,13 @@ Questa è una [funzione pubblica](https://developer.apple.com/documentation/secu
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
# You could also check FS events to find this missconfig
|
||||
```
|
||||
Per ulteriori informazioni, controlla questo intervento: [https://www.youtube.com/watch?v=lTOItyjTTkw](https://www.youtube.com/watch?v=lTOItyjTTkw)
|
||||
Per ulteriori informazioni, controlla questo talk: [https://www.youtube.com/watch?v=lTOItyjTTkw](https://www.youtube.com/watch?v=lTOItyjTTkw)
|
||||
|
||||
### Esecuzione tramite montaggio
|
||||
|
||||
Se un installer scrive in `/tmp/fixedname/bla/bla`, è possibile **creare un mount** su `/tmp/fixedname` senza proprietari in modo da poter **modificare qualsiasi file durante l'installazione** per abusare del processo di installazione.
|
||||
|
||||
Un esempio di questo è **CVE-2021-26089** che è riuscito a **sovrascrivere uno script periodico** per ottenere l'esecuzione come root. Per ulteriori informazioni, dai un'occhiata all'intervento: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
Un esempio di questo è **CVE-2021-26089** che è riuscito a **sovrascrivere uno script periodico** per ottenere l'esecuzione come root. Per ulteriori informazioni, dai un'occhiata al talk: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
|
||||
## pkg come malware
|
||||
|
||||
|
@ -24,7 +24,7 @@ Un altro file importante relativo alla memoria nei sistemi MacOS è il **registr
|
||||
|
||||
Per eseguire il dump della memoria in una macchina MacOS puoi usare [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip).
|
||||
|
||||
**Nota**: Le seguenti istruzioni funzioneranno solo per i Mac con architettura Intel. Questo strumento è ora archiviato e l'ultima versione è stata rilasciata nel 2017. Il binario scaricato utilizzando le istruzioni qui sotto è destinato ai chip Intel poiché Apple Silicon non era disponibile nel 2017. Potrebbe essere possibile compilare il binario per l'architettura arm64, ma dovrai provare da solo.
|
||||
**Nota**: Le seguenti istruzioni funzioneranno solo per i Mac con architettura Intel. Questo strumento è ora archiviato e l'ultima versione è stata rilasciata nel 2017. Il binario scaricato utilizzando le istruzioni di seguito è destinato ai chip Intel poiché Apple Silicon non era disponibile nel 2017. Potrebbe essere possibile compilare il binario per l'architettura arm64, ma dovrai provare da solo.
|
||||
```bash
|
||||
#Dump raw format
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
|
@ -1,4 +1,4 @@
|
||||
# macOS Posizioni Sensibili & Demoni Interessanti
|
||||
# macOS Sensitive Locations & Interesting Daemons
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -6,8 +6,8 @@
|
||||
|
||||
### Shadow Passwords
|
||||
|
||||
La password shadow è memorizzata con la configurazione dell'utente nei plists situati in **`/var/db/dslocal/nodes/Default/users/`**.\
|
||||
La seguente riga di comando può essere utilizzata per estrarre **tutte le informazioni sugli utenti** (inclusi i dati degli hash):
|
||||
La password shadow è memorizzata con la configurazione dell'utente in plists situati in **`/var/db/dslocal/nodes/Default/users/`**.\
|
||||
Il seguente oneliner può essere utilizzato per estrarre **tutte le informazioni sugli utenti** (inclusi i dati dell'hash):
|
||||
```bash
|
||||
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
|
||||
```
|
||||
@ -90,7 +90,7 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
||||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Dump delle chiavi del portachiavi (con password) tramite dump della memoria**
|
||||
#### **Dump delle chiavi del portachiavi (con password) con il dump della memoria**
|
||||
|
||||
[Segui questi passaggi](../#dumping-memory-with-osxpmem) per eseguire un **dump della memoria**
|
||||
```bash
|
||||
@ -103,7 +103,7 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1
|
||||
```
|
||||
#### **Dump delle chiavi del portachiavi (con password) utilizzando la password dell'utente**
|
||||
|
||||
Se conosci la password dell'utente, puoi usarla per **dumpare e decriptare i portachiavi che appartengono all'utente**.
|
||||
Se conosci la password dell'utente, puoi usarla per **dumpare e decrittare i portachiavi che appartengono all'utente**.
|
||||
```bash
|
||||
#Prompt to ask for the password
|
||||
python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library/Keychains/login.keychain-db
|
||||
@ -149,7 +149,7 @@ In macOS, le preferenze delle app si trovano in **`$HOME/Library/Preferences`**
|
||||
|
||||
In macOS, lo strumento cli **`defaults`** può essere utilizzato per **modificare il file delle Preferenze**.
|
||||
|
||||
**`/usr/sbin/cfprefsd`** gestisce i servizi XPC `com.apple.cfprefsd.daemon` e `com.apple.cfprefsd.agent` e può essere chiamato per eseguire azioni come modificare le preferenze.
|
||||
**`/usr/sbin/cfprefsd`** rivendica i servizi XPC `com.apple.cfprefsd.daemon` e `com.apple.cfprefsd.agent` e può essere chiamato per eseguire azioni come modificare le preferenze.
|
||||
|
||||
## OpenDirectory permissions.plist
|
||||
|
||||
|
@ -111,7 +111,7 @@ Ci sono diversi tipi di file, puoi trovarli definiti nel [**codice sorgente per
|
||||
- `MH_DYLIB`: Librerie dinamiche
|
||||
- `MH_DYLINKER`: Linker dinamico
|
||||
- `MH_BUNDLE`: "File plugin". Generati utilizzando -bundle in gcc e caricati esplicitamente da `NSBundle` o `dlopen`.
|
||||
- `MH_DYSM`: File companion `.dSym` (file con simboli per il debug).
|
||||
- `MH_DYSM`: File `.dSym` companion (file con simboli per il debug).
|
||||
- `MH_KEXT_BUNDLE`: Estensioni del kernel.
|
||||
```bash
|
||||
# Checking the mac header of a binary
|
||||
@ -159,7 +159,7 @@ Ci sono circa **50 diversi tipi di comandi di caricamento** che il sistema gesti
|
||||
### **LC_SEGMENT/LC_SEGMENT_64**
|
||||
|
||||
> [!TIP]
|
||||
> Fondamentalmente, questo tipo di comando di caricamento definisce **come caricare il \_\_TEXT** (codice eseguibile) **e \_\_DATA** (dati per il processo) **segmenti** secondo gli **offset indicati nella sezione Dati** quando il binario viene eseguito.
|
||||
> Fondamentalmente, questo tipo di comando di caricamento definisce **come caricare il \_\_TEXT** (codice eseguibile) **e il \_\_DATA** (dati per il processo) **segmenti** secondo gli **offset indicati nella sezione Dati** quando il binario viene eseguito.
|
||||
|
||||
Questi comandi **definiscono segmenti** che sono **mappati** nello **spazio di memoria virtuale** di un processo quando viene eseguito.
|
||||
|
||||
@ -167,28 +167,28 @@ Ci sono **diversi tipi** di segmenti, come il **\_\_TEXT** segmento, che contien
|
||||
|
||||
**Ogni segmento** può essere ulteriormente **diviso** in più **sezioni**. La **struttura del comando di caricamento** contiene **informazioni** su **queste sezioni** all'interno del rispettivo segmento.
|
||||
|
||||
Nell'intestazione prima trovi il **segment header**:
|
||||
Nell'intestazione prima trovi l'**intestazione del segmento**:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* for 64-bit architectures */
|
||||
uint32_t cmd; /* LC_SEGMENT_64 */
|
||||
uint32_t cmdsize; /* includes sizeof section_64 structs */
|
||||
char segname[16]; /* segment name */
|
||||
uint64_t vmaddr; /* memory address of this segment */
|
||||
uint64_t vmsize; /* memory size of this segment */
|
||||
uint64_t fileoff; /* file offset of this segment */
|
||||
uint64_t filesize; /* amount to map from the file */
|
||||
int32_t maxprot; /* maximum VM protection */
|
||||
int32_t initprot; /* initial VM protection */
|
||||
<strong> uint32_t nsects; /* number of sections in segment */
|
||||
</strong> uint32_t flags; /* flags */
|
||||
char segname[16]; /* nome del segmento */
|
||||
uint64_t vmaddr; /* indirizzo di memoria di questo segmento */
|
||||
uint64_t vmsize; /* dimensione della memoria di questo segmento */
|
||||
uint64_t fileoff; /* offset del file di questo segmento */
|
||||
uint64_t filesize; /* quantità da mappare dal file */
|
||||
int32_t maxprot; /* protezione VM massima */
|
||||
int32_t initprot; /* protezione VM iniziale */
|
||||
<strong> uint32_t nsects; /* numero di sezioni nel segmento */
|
||||
</strong> uint32_t flags; /* flag */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
Esempio di segment header:
|
||||
Esempio di intestazione del segmento:
|
||||
|
||||
<figure><img src="../../../images/image (1126).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Questa intestazione definisce il **numero di sezioni i cui header appaiono dopo** di essa:
|
||||
Questa intestazione definisce il **numero di sezioni i cui intestazioni appaiono dopo** di essa:
|
||||
```c
|
||||
struct section_64 { /* for 64-bit architectures */
|
||||
char sectname[16]; /* name of this section */
|
||||
@ -249,7 +249,7 @@ Segmenti comuni caricati da questo cmd:
|
||||
- **`__OBJC`**: Contiene informazioni utilizzate dal runtime Objective-C. Anche se queste informazioni potrebbero essere trovate anche nel segmento \_\_DATA, all'interno di varie sezioni in \_\_objc\_\*.
|
||||
- **`__RESTRICT`**: Un segmento senza contenuto con una singola sezione chiamata **`__restrict`** (anch'essa vuota) che garantisce che quando si esegue il binario, ignorerà le variabili ambientali DYLD.
|
||||
|
||||
Come era possibile vedere nel codice, **i segmenti supportano anche flag** (anche se non sono molto utilizzati):
|
||||
Come è stato possibile vedere nel codice, **i segmenti supportano anche flag** (anche se non sono molto utilizzati):
|
||||
|
||||
- `SG_HIGHVM`: Solo core (non utilizzato)
|
||||
- `SG_FVMLIB`: Non utilizzato
|
||||
@ -258,7 +258,7 @@ Come era possibile vedere nel codice, **i segmenti supportano anche flag** (anch
|
||||
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
**`LC_MAIN`** contiene il punto di ingresso nell'**attributo entryoff.** Al momento del caricamento, **dyld** semplicemente **aggiunge** questo valore alla (in memoria) **base del binario**, poi **salta** a questa istruzione per avviare l'esecuzione del codice del binario.
|
||||
**`LC_MAIN`** contiene il punto di ingresso nell'**attributo entryoff.** Al momento del caricamento, **dyld** semplicemente **aggiunge** questo valore alla **base del binario** (in memoria), poi **salta** a questa istruzione per avviare l'esecuzione del codice del binario.
|
||||
|
||||
**`LC_UNIXTHREAD`** contiene i valori che il registro deve avere quando si avvia il thread principale. Questo era già deprecato ma **`dyld`** lo utilizza ancora. È possibile vedere i valori dei registri impostati da questo con:
|
||||
```bash
|
||||
@ -353,7 +353,7 @@ Alcune librerie potenzialmente correlate al malware sono:
|
||||
Al centro del file si trova la regione dati, che è composta da diversi segmenti come definiti nella regione dei comandi di caricamento. **Una varietà di sezioni dati può essere ospitata all'interno di ciascun segmento**, con ciascuna sezione **che contiene codice o dati** specifici per un tipo.
|
||||
|
||||
> [!TIP]
|
||||
> I dati sono fondamentalmente la parte che contiene tutte le **informazioni** che vengono caricate dai comandi di caricamento **LC_SEGMENTS_64**
|
||||
> I dati sono fondamentalmente la parte che contiene tutte le **informazioni** caricate dai comandi di caricamento **LC_SEGMENTS_64**
|
||||
|
||||
 (3).png>)
|
||||
|
||||
|
@ -23,7 +23,7 @@ Successivamente, **`posix_spawn`** è stato introdotto combinando **`vfork`** e
|
||||
|
||||
Inoltre, `posix_spawn` consente di specificare un array di **`posix_spawnattr`** che controlla alcuni aspetti del processo generato, e **`posix_spawn_file_actions`** per modificare lo stato dei descrittori.
|
||||
|
||||
Quando un processo muore, invia il **codice di ritorno al processo padre** (se il padre è morto, il nuovo padre è il PID 1) con il segnale `SIGCHLD`. Il padre deve ottenere questo valore chiamando `wait4()` o `waitid()` e fino a quando ciò non accade, il figlio rimane in uno stato zombie dove è ancora elencato ma non consuma risorse.
|
||||
Quando un processo muore, invia il **codice di ritorno al processo padre** (se il padre è morto, il nuovo padre è il PID 1) con il segnale `SIGCHLD`. Il padre deve ottenere questo valore chiamando `wait4()` o `waitid()` e fino a quel momento il figlio rimane in uno stato zombie dove è ancora elencato ma non consuma risorse.
|
||||
|
||||
### PIDs
|
||||
|
||||
@ -39,7 +39,7 @@ La coalizione è un altro modo per raggruppare i processi in Darwin. Un processo
|
||||
### Credenziali e Personae
|
||||
|
||||
Ogni processo detiene **credenziali** che **identificano i suoi privilegi** nel sistema. Ogni processo avrà un `uid` primario e un `gid` primario (anche se potrebbe appartenere a più gruppi).\
|
||||
È anche possibile cambiare l'ID utente e l'ID gruppo se il binario ha il bit `setuid/setgid`.\
|
||||
È anche possibile cambiare l'ID utente e l'ID di gruppo se il binario ha il bit `setuid/setgid`.\
|
||||
Ci sono diverse funzioni per **impostare nuovi uids/gids**.
|
||||
|
||||
La syscall **`persona`** fornisce un **insieme alternativo** di **credenziali**. Adottare una persona assume il suo uid, gid e le appartenenze ai gruppi **tutte insieme**. Nel [**codice sorgente**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) è possibile trovare la struct:
|
||||
@ -73,8 +73,8 @@ char persona_name[MAXLOGNAME + 1];
|
||||
Per gestire l'accesso alle risorse condivise e evitare condizioni di gara, macOS fornisce diversi primitivi di sincronizzazione. Questi sono critici negli ambienti multi-threading per garantire l'integrità dei dati e la stabilità del sistema:
|
||||
|
||||
1. **Mutex:**
|
||||
- **Mutex Normale (Firma: 0x4D555458):** Mutex standard con un'impronta di memoria di 60 byte (56 byte per il mutex e 4 byte per la firma).
|
||||
- **Mutex Veloce (Firma: 0x4d55545A):** Simile a un mutex normale ma ottimizzato per operazioni più veloci, anch'esso di 60 byte.
|
||||
- **Mutex Regolare (Firma: 0x4D555458):** Mutex standard con un'impronta di memoria di 60 byte (56 byte per il mutex e 4 byte per la firma).
|
||||
- **Mutex Veloce (Firma: 0x4d55545A):** Simile a un mutex regolare ma ottimizzato per operazioni più veloci, anch'esso di 60 byte.
|
||||
2. **Variabili di Condizione:**
|
||||
- Utilizzate per attendere che si verifichino determinate condizioni, con una dimensione di 44 byte (40 byte più una firma di 4 byte).
|
||||
- **Attributi della Variabile di Condizione (Firma: 0x434e4441):** Attributi di configurazione per le variabili di condizione, dimensionati a 12 byte.
|
||||
@ -233,7 +233,7 @@ Altre variabili ambientali come **`PYTHONPATH`** e **`PYTHONHOME`** potrebbero e
|
||||
Nota che gli eseguibili compilati con **`pyinstaller`** non utilizzeranno queste variabili ambientali anche se vengono eseguiti utilizzando un python incorporato.
|
||||
|
||||
> [!CAUTION]
|
||||
> In generale, non sono riuscito a trovare un modo per far eseguire a python codice arbitrario abusando delle variabili ambientali.\
|
||||
> In generale non sono riuscito a trovare un modo per far eseguire a python codice arbitrario abusando delle variabili ambientali.\
|
||||
> Tuttavia, la maggior parte delle persone installa python utilizzando **Homebrew**, che installerà python in una **posizione scrivibile** per l'utente admin predefinito. Puoi dirottarlo con qualcosa del tipo:
|
||||
>
|
||||
> ```bash
|
||||
@ -255,7 +255,7 @@ Nota che gli eseguibili compilati con **`pyinstaller`** non utilizzeranno queste
|
||||
[**Shield**](https://theevilbit.github.io/shield/) ([**Github**](https://github.com/theevilbit/Shield)) è un'applicazione open source che può **rilevare e bloccare le azioni di iniezione di processi**:
|
||||
|
||||
- Utilizzando **Variabili Ambientali**: Monitorerà la presenza di una delle seguenti variabili ambientali: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** e **`ELECTRON_RUN_AS_NODE`**
|
||||
- Utilizzando chiamate **`task_for_pid`**: Per trovare quando un processo vuole ottenere il **port task di un altro** che consente di iniettare codice nel processo.
|
||||
- Utilizzando chiamate **`task_for_pid`**: Per scoprire quando un processo vuole ottenere il **port task di un altro** che consente di iniettare codice nel processo.
|
||||
- **Parametri delle app Electron**: Qualcuno può utilizzare l'argomento della riga di comando **`--inspect`**, **`--inspect-brk`** e **`--remote-debugging-port`** per avviare un'app Electron in modalità di debug, e quindi iniettare codice in essa.
|
||||
- Utilizzando **symlink** o **hardlink**: Tipicamente l'abuso più comune è **posizionare un link con i nostri privilegi utente**, e **puntarlo a una posizione con privilegi superiori**. La rilevazione è molto semplice sia per hardlink che per symlink. Se il processo che crea il link ha un **livello di privilegio diverso** rispetto al file di destinazione, creiamo un **alert**. Sfortunatamente, nel caso dei symlink, il blocco non è possibile, poiché non abbiamo informazioni sulla destinazione del link prima della creazione. Questa è una limitazione del framework EndpointSecurity di Apple.
|
||||
|
||||
|
@ -6,13 +6,13 @@
|
||||
|
||||
## .NET Core Debugging <a href="#net-core-debugging" id="net-core-debugging"></a>
|
||||
|
||||
### **Stabilire una Sessione di Debugging** <a href="#net-core-debugging" id="net-core-debugging"></a>
|
||||
### **Stabilire una sessione di debug** <a href="#net-core-debugging" id="net-core-debugging"></a>
|
||||
|
||||
La gestione della comunicazione tra debugger e debuggee in .NET è gestita da [**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp). Questo componente imposta due pipe nominate per ogni processo .NET come visto in [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127), che sono iniziate tramite [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27). Queste pipe sono suffisse con **`-in`** e **`-out`**.
|
||||
|
||||
Visitando il **`$TMPDIR`** dell'utente, si possono trovare FIFO di debugging disponibili per il debugging delle applicazioni .Net.
|
||||
Visitando il **`$TMPDIR`** dell'utente, si possono trovare FIFO di debug disponibili per il debug delle applicazioni .Net.
|
||||
|
||||
[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) è responsabile della gestione della comunicazione da un debugger. Per avviare una nuova sessione di debugging, un debugger deve inviare un messaggio tramite la pipe `out` che inizia con una struct `MessageHeader`, dettagliata nel codice sorgente di .NET:
|
||||
[**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) è responsabile della gestione della comunicazione da un debugger. Per avviare una nuova sessione di debug, un debugger deve inviare un messaggio tramite la pipe `out` che inizia con una struct `MessageHeader`, dettagliata nel codice sorgente di .NET:
|
||||
```c
|
||||
struct MessageHeader {
|
||||
MessageType m_eType; // Message type
|
||||
@ -91,11 +91,11 @@ Per eseguire codice, è necessario identificare una regione di memoria con perme
|
||||
vmmap -pages [pid]
|
||||
vmmap -pages 35829 | grep "rwx/rwx"
|
||||
```
|
||||
Trovare un luogo per sovrascrivere un puntatore di funzione è necessario, e in .NET Core, questo può essere fatto mirando alla **Dynamic Function Table (DFT)**. Questa tabella, dettagliata in [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h), è utilizzata dal runtime per le funzioni di aiuto della compilazione JIT.
|
||||
Trovare un luogo per sovrascrivere un puntatore di funzione è necessario, e in .NET Core, questo può essere fatto mirato alla **Dynamic Function Table (DFT)**. Questa tabella, dettagliata in [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h), è utilizzata dal runtime per le funzioni helper di compilazione JIT.
|
||||
|
||||
Per i sistemi x64, la ricerca delle firme può essere utilizzata per trovare un riferimento al simbolo `_hlpDynamicFuncTable` in `libcorclr.dll`.
|
||||
Per i sistemi x64, la ricerca di firme può essere utilizzata per trovare un riferimento al simbolo `_hlpDynamicFuncTable` in `libcorclr.dll`.
|
||||
|
||||
La funzione del debugger `MT_GetDCB` fornisce informazioni utili, incluso l'indirizzo di una funzione di aiuto, `m_helperRemoteStartAddr`, che indica la posizione di `libcorclr.dll` nella memoria del processo. Questo indirizzo viene quindi utilizzato per avviare una ricerca per la DFT e sovrascrivere un puntatore di funzione con l'indirizzo del shellcode.
|
||||
La funzione del debugger `MT_GetDCB` fornisce informazioni utili, incluso l'indirizzo di una funzione helper, `m_helperRemoteStartAddr`, che indica la posizione di `libcorclr.dll` nella memoria del processo. Questo indirizzo viene poi utilizzato per avviare una ricerca per la DFT e sovrascrivere un puntatore di funzione con l'indirizzo del shellcode.
|
||||
|
||||
Il codice POC completo per l'iniezione in PowerShell è accessibile [qui](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6).
|
||||
|
||||
|
@ -61,13 +61,13 @@ Nel post [https://sector7.computest.nl/post/2024-04-bringing-process-injection-i
|
||||
|
||||
### Ulteriori Protezioni di macOS
|
||||
|
||||
Dalla versione macOS Sonoma in poi, le modifiche all'interno dei pacchetti delle app sono limitate. Tuttavia, i metodi precedenti prevedevano:
|
||||
Dalla versione macOS Sonoma in poi, le modifiche all'interno dei pacchetti App sono limitate. Tuttavia, i metodi precedenti prevedevano:
|
||||
|
||||
1. Copiare l'app in un'altra posizione (ad es., `/tmp/`).
|
||||
2. Rinominare le directory all'interno del pacchetto dell'app per bypassare le protezioni iniziali.
|
||||
3. Dopo aver eseguito l'app per registrarsi con Gatekeeper, modificare il pacchetto dell'app (ad es., sostituendo MainMenu.nib con Dirty.nib).
|
||||
4. Rinominare di nuovo le directory e rieseguire l'app per eseguire il file NIB iniettato.
|
||||
|
||||
**Nota**: Gli aggiornamenti recenti di macOS hanno mitigato questo exploit impedendo le modifiche ai file all'interno dei pacchetti delle app dopo la memorizzazione nella cache di Gatekeeper, rendendo l'exploit inefficace.
|
||||
**Nota**: Gli aggiornamenti recenti di macOS hanno mitigato questo exploit impedendo le modifiche ai file all'interno dei pacchetti app dopo la memorizzazione nella cache di Gatekeeper, rendendo l'exploit inefficace.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -50,7 +50,7 @@ Puoi caricare questo file in [https://hexed.it/](https://hexed.it/) e cercare la
|
||||
|
||||
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Nota che se provi a **sovrascrivere** il **`Electron Framework` binary** all'interno di un'applicazione con questi byte modificati, l'app non verrà eseguita.
|
||||
Nota che se provi a **sovrascrivere** il **`Electron Framework`** binario all'interno di un'applicazione con questi byte modificati, l'app non verrà eseguita.
|
||||
|
||||
## RCE aggiungendo codice alle Applicazioni Electron
|
||||
|
||||
@ -155,7 +155,7 @@ Ad esempio:
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Se il fuse **`EnableNodeCliInspectArguments`** è disabilitato, l'app **ignorerà i parametri node** (come `--inspect`) quando viene avviata, a meno che la variabile di ambiente **`ELECTRON_RUN_AS_NODE`** non sia impostata, che sarà anch'essa **ignorata** se il fuse **`RunAsNode`** è disabilitato.
|
||||
> Se il fuse **`EnableNodeCliInspectArguments`** è disabilitato, l'app **ignorerà i parametri node** (come `--inspect`) quando viene avviata, a meno che la variabile env **`ELECTRON_RUN_AS_NODE`** non sia impostata, che sarà anch'essa **ignorata** se il fuse **`RunAsNode`** è disabilitato.
|
||||
>
|
||||
> Tuttavia, puoi comunque utilizzare il **parametro electron `--remote-debugging-port=9229`** ma il payload precedente non funzionerà per eseguire altri processi.
|
||||
|
||||
@ -169,7 +169,7 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00",
|
||||
ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}')
|
||||
print(ws.recv()
|
||||
```
|
||||
In [**questo blogpost**](https://hackerone.com/reports/1274695), questo debugging viene abusato per far sì che un chrome headless **scarichi file arbitrari in posizioni arbitrarie**.
|
||||
In [**questo post del blog**](https://hackerone.com/reports/1274695), questo debugging è abusato per far sì che un chrome headless **scarichi file arbitrari in posizioni arbitrarie**.
|
||||
|
||||
### Iniezione dal Plist dell'App
|
||||
|
||||
@ -187,17 +187,17 @@ Potresti abusare di questa variabile d'ambiente in un plist per mantenere la per
|
||||
<true/>
|
||||
</dict>
|
||||
```
|
||||
## TCC Bypass abusando di Versioni Più Vecchie
|
||||
## Bypass TCC abusando di versioni precedenti
|
||||
|
||||
> [!TIP]
|
||||
> Il demone TCC di macOS non controlla la versione eseguita dell'applicazione. Quindi, se **non puoi iniettare codice in un'applicazione Electron** con nessuna delle tecniche precedenti, puoi scaricare una versione precedente dell'APP e iniettare codice su di essa poiché otterrà comunque i privilegi TCC (a meno che il Trust Cache non lo impedisca).
|
||||
> Il demone TCC di macOS non controlla la versione eseguita dell'applicazione. Quindi, se **non puoi iniettare codice in un'applicazione Electron** con nessuna delle tecniche precedenti, potresti scaricare una versione precedente dell'APP e iniettare codice su di essa poiché otterrà comunque i privilegi TCC (a meno che il Trust Cache non lo impedisca).
|
||||
|
||||
## Eseguire codice non JS
|
||||
## Esegui codice non JS
|
||||
|
||||
Le tecniche precedenti ti permetteranno di eseguire **codice JS all'interno del processo dell'applicazione electron**. Tuttavia, ricorda che i **processi figli vengono eseguiti sotto lo stesso profilo sandbox** dell'applicazione padre e **erediteranno i loro permessi TCC**.\
|
||||
Pertanto, se vuoi abusare dei diritti per accedere alla fotocamera o al microfono, ad esempio, puoi semplicemente **eseguire un altro binario dal processo**.
|
||||
Pertanto, se desideri abusare dei diritti per accedere alla fotocamera o al microfono, ad esempio, potresti semplicemente **eseguire un altro binario dal processo**.
|
||||
|
||||
## Iniezione Automatica
|
||||
## Iniezione automatica
|
||||
|
||||
Lo strumento [**electroniz3r**](https://github.com/r3ggi/electroniz3r) può essere facilmente utilizzato per **trovare applicazioni electron vulnerabili** installate e iniettare codice su di esse. Questo strumento cercherà di utilizzare la tecnica **`--inspect`**:
|
||||
|
||||
|
@ -84,7 +84,7 @@ Si noti inoltre che **l'interposizione avviene tra il processo e le librerie car
|
||||
|
||||
### Interposizione Dinamica
|
||||
|
||||
Ora è anche possibile interporre una funzione dinamicamente utilizzando la funzione **`dyld_dynamic_interpose`**. Questo consente di interporre programmaticamente una funzione in tempo reale invece di farlo solo dall'inizio.
|
||||
Ora è anche possibile interporre una funzione dinamicamente utilizzando la funzione **`dyld_dynamic_interpose`**. Questo consente di interporre programmaticamente una funzione in tempo di esecuzione invece di farlo solo dall'inizio.
|
||||
|
||||
È sufficiente indicare i **tuples** della **funzione da sostituire e la funzione di sostituzione**.
|
||||
```c
|
||||
@ -226,7 +226,7 @@ return 0;
|
||||
}
|
||||
```
|
||||
> [!WARNING]
|
||||
> In questo caso, se il **codice di implementazione del metodo legittimo** **verifica** il **nome** del **metodo**, potrebbe **rilevare** questo swizzling e impedirne l'esecuzione.
|
||||
> In questo caso, se il **codice di implementazione del metodo legittimo** **verifica** il **nome del metodo**, potrebbe **rilevare** questo swizzling e impedirne l'esecuzione.
|
||||
>
|
||||
> La seguente tecnica non ha questa restrizione.
|
||||
|
||||
@ -290,11 +290,11 @@ return 0;
|
||||
|
||||
In questa pagina sono stati discussi diversi modi per agganciare funzioni. Tuttavia, comportavano **l'esecuzione di codice all'interno del processo per attaccare**.
|
||||
|
||||
Per fare ciò, la tecnica più semplice da utilizzare è iniettare un [Dyld tramite variabili di ambiente o dirottamento](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Tuttavia, suppongo che questo possa essere fatto anche tramite [Dylib process injection](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
Per fare ciò, la tecnica più semplice da utilizzare è iniettare un [Dyld tramite variabili di ambiente o dirottamento](macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md). Tuttavia, suppongo che questo possa essere fatto anche tramite [iniezione di processo Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
|
||||
|
||||
Tuttavia, entrambe le opzioni sono **limitati** a binari/processi **non protetti**. Controlla ciascuna tecnica per saperne di più sulle limitazioni.
|
||||
|
||||
Tuttavia, un attacco di hooking di funzione è molto specifico, un attaccante lo farà per **rubare informazioni sensibili dall'interno di un processo** (altrimenti faresti semplicemente un attacco di iniezione di processo). E queste informazioni sensibili potrebbero trovarsi in app scaricate dall'utente come MacPass.
|
||||
Tuttavia, un attacco di hooking di funzione è molto specifico, un attaccante lo farà per **rubare informazioni sensibili dall'interno di un processo** (se no faresti semplicemente un attacco di iniezione di processo). E queste informazioni sensibili potrebbero trovarsi in app scaricate dall'utente come MacPass.
|
||||
|
||||
Quindi il vettore dell'attaccante sarebbe quello di trovare una vulnerabilità o rimuovere la firma dell'applicazione, iniettare la variabile di ambiente **`DYLD_INSERT_LIBRARIES`** attraverso l'Info.plist dell'applicazione aggiungendo qualcosa come:
|
||||
```xml
|
||||
|
@ -21,7 +21,7 @@ Un processo può anche inviare un nome di porta con alcuni diritti **a un compit
|
||||
I diritti di porta, che definiscono quali operazioni un compito può eseguire, sono fondamentali per questa comunicazione. I possibili **diritti di porta** sono ([definizioni da qui](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
- **Diritto di ricezione**, che consente di ricevere messaggi inviati alla porta. Le porte Mach sono code MPSC (produttore multiplo, consumatore singolo), il che significa che può esserci solo **un diritto di ricezione per ogni porta** nell'intero sistema (a differenza delle pipe, dove più processi possono detenere descrittori di file per l'estremità di lettura di una pipe).
|
||||
- Un **compito con il Diritto di Ricezione** può ricevere messaggi e **creare diritti di invio**, consentendogli di inviare messaggi. Inizialmente solo il **proprio compito ha il Diritto di Ricezione sulla sua porta**.
|
||||
- Un **compito con il Diritto di Ricezione** può ricevere messaggi e **creare diritti di Invio**, consentendogli di inviare messaggi. Inizialmente solo il **proprio compito ha il Diritto di Ricezione sulla sua porta**.
|
||||
- Se il proprietario del Diritto di Ricezione **muore** o lo termina, il **diritto di invio diventa inutile (nome morto)**.
|
||||
- **Diritto di invio**, che consente di inviare messaggi alla porta.
|
||||
- Il Diritto di invio può essere **clonato** in modo che un compito che possiede un Diritto di invio possa clonare il diritto e **concederlo a un terzo compito**.
|
||||
@ -35,7 +35,7 @@ I diritti di porta, che definiscono quali operazioni un compito può eseguire, s
|
||||
|
||||
### Porte di File
|
||||
|
||||
Le porte di file consentono di incapsulare descrittori di file in porte Mac (utilizzando diritti di porta Mach). È possibile creare una `fileport` da un FD dato utilizzando `fileport_makeport` e creare un FD da una fileport utilizzando `fileport_makefd`.
|
||||
Le porte di file consentono di incapsulare descrittori di file in porte Mac (utilizzando diritti di porta Mach). È possibile creare un `fileport` da un FD dato utilizzando `fileport_makeport` e creare un FD da un fileport utilizzando `fileport_makefd`.
|
||||
|
||||
### Stabilire una comunicazione
|
||||
|
||||
@ -53,7 +53,7 @@ Per questo, il **bootstrap server** (**launchd** in mac) è coinvolto, poiché *
|
||||
6. Con questo Diritto di INVIO, **il Compito B** è in grado di **inviare** un **messaggio** **al Compito A**.
|
||||
7. Per una comunicazione bidirezionale, di solito il compito **B** genera una nuova porta con un **DIRITTO DI RICEZIONE** e un **DIRITTO DI INVIO**, e dà il **DIRITTO DI INVIO al Compito A** in modo che possa inviare messaggi al COMPITO B (comunicazione bidirezionale).
|
||||
|
||||
Il bootstrap server **non può autenticare** il nome del servizio rivendicato da un compito. Questo significa che un **compito** potrebbe potenzialmente **impersonare qualsiasi compito di sistema**, come rivendicare falsamente un nome di servizio di autorizzazione e poi approvare ogni richiesta.
|
||||
Il bootstrap server **non può autenticare** il nome del servizio rivendicato da un compito. Ciò significa che un **compito** potrebbe potenzialmente **impersonare qualsiasi compito di sistema**, come rivendicare falsamente un nome di servizio di autorizzazione e poi approvare ogni richiesta.
|
||||
|
||||
Poi, Apple memorizza i **nomi dei servizi forniti dal sistema** in file di configurazione sicuri, situati in directory **protette da SIP**: `/System/Library/LaunchDaemons` e `/System/Library/LaunchAgents`. Accanto a ciascun nome di servizio, il **binario associato è anche memorizzato**. Il bootstrap server creerà e manterrà un **DIRITTO DI RICEZIONE per ciascuno di questi nomi di servizio**.
|
||||
|
||||
@ -85,17 +85,17 @@ mach_port_name_t msgh_voucher_port;
|
||||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
I process che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su un port Mach. Al contrario, ai **mittenti** viene concesso un _**diritto di invio**_ o un _**diritto di invio-una-volta**_. Il diritto di invio-una-volta è esclusivamente per l'invio di un singolo messaggio, dopo il quale diventa invalido.
|
||||
I process che possiedono un _**diritto di ricezione**_ possono ricevere messaggi su una porta Mach. Al contrario, ai **mittenti** viene concesso un _**diritto di invio**_ o un _**diritto di invio-una-volta**_. Il diritto di invio-una-volta è esclusivamente per l'invio di un singolo messaggio, dopo il quale diventa invalido.
|
||||
|
||||
Il campo iniziale **`msgh_bits`** è un bitmap:
|
||||
|
||||
- Il primo bit (il più significativo) è usato per indicare che un messaggio è complesso (ne parleremo più avanti)
|
||||
- Il 3° e il 4° sono usati dal kernel
|
||||
- I **5 bit meno significativi del 2° byte** possono essere usati per **voucher**: un altro tipo di port per inviare combinazioni chiave/valore.
|
||||
- I **5 bit meno significativi del 3° byte** possono essere usati per **port locale**
|
||||
- I **5 bit meno significativi del 4° byte** possono essere usati per **port remoto**
|
||||
- Il primo bit (il più significativo) è usato per indicare che un messaggio è complesso (ulteriori dettagli di seguito)
|
||||
- Il 3° e il 4° sono utilizzati dal kernel
|
||||
- I **5 bit meno significativi del 2° byte** possono essere utilizzati per **voucher**: un altro tipo di porta per inviare combinazioni chiave/valore.
|
||||
- I **5 bit meno significativi del 3° byte** possono essere utilizzati per **porta locale**
|
||||
- I **5 bit meno significativi del 4° byte** possono essere utilizzati per **porta remota**
|
||||
|
||||
I tipi che possono essere specificati nel voucher, port locale e port remoto sono (da [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
I tipi che possono essere specificati nel voucher, nelle porte locali e remote sono (da [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
|
||||
```c
|
||||
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
|
||||
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
|
||||
@ -108,30 +108,30 @@ I tipi che possono essere specificati nel voucher, port locale e port remoto son
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
|
||||
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
|
||||
```
|
||||
Ad esempio, `MACH_MSG_TYPE_MAKE_SEND_ONCE` può essere utilizzato per **indicare** che un **diritto di invio una sola volta** dovrebbe essere derivato e trasferito per questo porto. Può anche essere specificato `MACH_PORT_NULL` per impedire al destinatario di poter rispondere.
|
||||
Ad esempio, `MACH_MSG_TYPE_MAKE_SEND_ONCE` può essere utilizzato per **indicare** che un **diritto di invio una sola volta** dovrebbe essere derivato e trasferito per questa porta. Può anche essere specificato `MACH_PORT_NULL` per impedire al destinatario di poter rispondere.
|
||||
|
||||
Per ottenere una facile **comunicazione bidirezionale**, un processo può specificare un **porto mach** nell'**intestazione del messaggio mach** chiamato _porto di risposta_ (**`msgh_local_port`**) dove il **ricevitore** del messaggio può **inviare una risposta** a questo messaggio.
|
||||
Per ottenere una facile **comunicazione bidirezionale**, un processo può specificare una **porta mach** nell'**intestazione del messaggio mach** chiamata _porta di risposta_ (**`msgh_local_port`**) dove il **ricevitore** del messaggio può **inviare una risposta** a questo messaggio.
|
||||
|
||||
> [!TIP]
|
||||
> Nota che questo tipo di comunicazione bidirezionale è utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono creati porti diversi** come spiegato in precedenza per creare la comunicazione bidirezionale.
|
||||
> Nota che questo tipo di comunicazione bidirezionale è utilizzato nei messaggi XPC che si aspettano una risposta (`xpc_connection_send_message_with_reply` e `xpc_connection_send_message_with_reply_sync`). Ma **di solito vengono create porte diverse** come spiegato in precedenza per creare la comunicazione bidirezionale.
|
||||
|
||||
Gli altri campi dell'intestazione del messaggio sono:
|
||||
|
||||
- `msgh_size`: la dimensione dell'intero pacchetto.
|
||||
- `msgh_remote_port`: il porto su cui questo messaggio è inviato.
|
||||
- `msgh_remote_port`: la porta sulla quale questo messaggio è inviato.
|
||||
- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html).
|
||||
- `msgh_id`: l'ID di questo messaggio, che è interpretato dal ricevitore.
|
||||
|
||||
> [!CAUTION]
|
||||
> Nota che **i messaggi mach vengono inviati su un `mach port`**, che è un canale di comunicazione **a singolo ricevitore**, **a più mittenti** integrato nel kernel mach. **Più processi** possono **inviare messaggi** a un porto mach, ma in qualsiasi momento solo **un singolo processo può leggere** da esso.
|
||||
> Nota che **i messaggi mach vengono inviati su una `mach port`**, che è un canale di comunicazione **a singolo ricevitore**, **multi-inviatore** integrato nel kernel mach. **Più processi** possono **inviare messaggi** a una porta mach, ma in qualsiasi momento solo **un singolo processo può leggere** da essa.
|
||||
|
||||
I messaggi sono quindi formati dall'**intestazione `mach_msg_header_t`** seguita dal **corpo** e dal **trailer** (se presente) e può concedere il permesso di rispondere. In questi casi, il kernel deve solo passare il messaggio da un'attività all'altra.
|
||||
I messaggi sono quindi formati dall'**intestazione `mach_msg_header_t`** seguita dal **corpo** e dal **trailer** (se presente) e possono concedere il permesso di rispondere. In questi casi, il kernel deve solo passare il messaggio da un'attività all'altra.
|
||||
|
||||
Un **trailer** è **informazione aggiunta al messaggio dal kernel** (non può essere impostata dall'utente) che può essere richiesta nella ricezione del messaggio con i flag `MACH_RCV_TRAILER_<trailer_opt>` (ci sono diverse informazioni che possono essere richieste).
|
||||
|
||||
#### Messaggi Complessi
|
||||
|
||||
Tuttavia, ci sono altri messaggi più **complessi**, come quelli che passano diritti di porto aggiuntivi o condividono memoria, dove il kernel deve anche inviare questi oggetti al destinatario. In questi casi, il bit più significativo dell'intestazione `msgh_bits` è impostato.
|
||||
Tuttavia, ci sono altri messaggi più **complessi**, come quelli che passano diritti di porta aggiuntivi o condividono memoria, dove il kernel deve anche inviare questi oggetti al destinatario. In questi casi, il bit più significativo dell'intestazione `msgh_bits` è impostato.
|
||||
|
||||
I possibili descrittori da passare sono definiti in [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html):
|
||||
```c
|
||||
@ -423,13 +423,13 @@ Quelle che iniziano **dal** numero **8** sono **di proprietà dei demoni di sist
|
||||
- `host_info`: Ottieni informazioni sull'host
|
||||
- `host_virtual_physical_table_info`: Tabella delle pagine Virtuali/Fisiche (richiede MACH_VMDEBUG)
|
||||
- `host_statistics`: Ottieni statistiche dell'host
|
||||
- `mach_memory_info`: Ottieni layout della memoria del kernel
|
||||
- **Porte Privilege host**: Un processo con diritto **SEND** su questa porta può eseguire **azioni privilegiate** come mostrare dati di avvio o tentare di caricare un'estensione del kernel. Il **processo deve essere root** per ottenere questo permesso.
|
||||
- `mach_memory_info`: Ottieni la disposizione della memoria del kernel
|
||||
- **Porte Privilege host**: Un processo con diritto **SEND** su questa porta può eseguire **azioni privilegiate** come mostrare i dati di avvio o tentare di caricare un'estensione del kernel. Il **processo deve essere root** per ottenere questo permesso.
|
||||
- Inoltre, per chiamare l'API **`kext_request`** è necessario avere altri diritti **`com.apple.private.kext*`** che sono concessi solo ai binari Apple.
|
||||
- Altre routine che possono essere chiamate sono:
|
||||
- `host_get_boot_info`: Ottieni `machine_boot_info()`
|
||||
- `host_priv_statistics`: Ottieni statistiche privilegiate
|
||||
- `vm_allocate_cpm`: Alloca Memoria Fisica Contigua
|
||||
- `vm_allocate_cpm`: Alloca memoria fisica contigua
|
||||
- `host_processors`: Diritto di invio ai processori host
|
||||
- `mach_vm_wire`: Rendi la memoria residente
|
||||
- Poiché **root** può accedere a questo permesso, potrebbe chiamare `host_set_[special/exception]_port[s]` per **dirottare porte speciali o di eccezione host**.
|
||||
@ -774,7 +774,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
|
||||
### Iniezione di Dylib in thread tramite Task port
|
||||
|
||||
In macOS **i thread** possono essere manipolati tramite **Mach** o utilizzando **l'api posix `pthread`**. Il thread che abbiamo generato nell'iniezione precedente è stato creato utilizzando l'api Mach, quindi **non è conforme a posix**.
|
||||
In macOS **i thread** possono essere manipolati tramite **Mach** o utilizzando **l'api posix `pthread`**. Il thread che abbiamo generato nell'iniezione precedente è stato generato utilizzando l'api Mach, quindi **non è conforme a posix**.
|
||||
|
||||
È stato possibile **iniettare un semplice shellcode** per eseguire un comando perché **non aveva bisogno di lavorare con api** conformi a posix, solo con Mach. **Iniezioni più complesse** richiederebbero che il **thread** fosse anche **conforme a posix**.
|
||||
|
||||
@ -1080,13 +1080,13 @@ Quando si chiama `task_for_pid` o `thread_create_*` si incrementa un contatore n
|
||||
|
||||
Quando si verifica un'eccezione in un thread, questa eccezione viene inviata al porto di eccezione designato del thread. Se il thread non la gestisce, allora viene inviata ai porti di eccezione del task. Se il task non la gestisce, allora viene inviata al porto host che è gestito da launchd (dove verrà riconosciuta). Questo è chiamato triage delle eccezioni.
|
||||
|
||||
Nota che alla fine, se non gestita correttamente, la segnalazione finirà per essere gestita dal demone ReportCrash. Tuttavia, è possibile che un altro thread nello stesso task gestisca l'eccezione, questo è ciò che fanno gli strumenti di reportistica degli arresti come `PLCreashReporter`.
|
||||
Nota che alla fine, di solito, se non gestita correttamente, il report finirà per essere gestito dal demone ReportCrash. Tuttavia, è possibile che un altro thread nello stesso task gestisca l'eccezione, questo è ciò che fanno gli strumenti di reportistica degli arresti come `PLCreashReporter`.
|
||||
|
||||
## Other Objects
|
||||
|
||||
### Clock
|
||||
|
||||
Qualsiasi utente può accedere alle informazioni sul clock, tuttavia per impostare l'ora o modificare altre impostazioni è necessario essere root.
|
||||
Qualsiasi utente può accedere alle informazioni sull'orologio, tuttavia per impostare l'ora o modificare altre impostazioni è necessario essere root.
|
||||
|
||||
Per ottenere informazioni è possibile chiamare funzioni dal sottosistema `clock` come: `clock_get_time`, `clock_get_attributtes` o `clock_alarm`\
|
||||
Per modificare i valori il sottosistema `clock_priv` può essere utilizzato con funzioni come `clock_set_time` e `clock_set_attributes`
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente **genera il codice necessario** affinché il server e il client comunichino con una definizione data. Anche se il codice generato è brutto, un sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice di prima.
|
||||
MIG è stato creato per **semplificare il processo di creazione del codice Mach IPC**. Fondamentalmente **genera il codice necessario** affinché server e client comunichino con una definizione data. Anche se il codice generato è brutto, un sviluppatore dovrà solo importarlo e il suo codice sarà molto più semplice di prima.
|
||||
|
||||
La definizione è specificata in Interface Definition Language (IDL) utilizzando l'estensione `.defs`.
|
||||
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
Inizialmente, la funzione **`task_threads()`** viene invocata sulla porta del task per ottenere un elenco di thread dal task remoto. Un thread viene selezionato per l'hijacking. Questo approccio si discosta dai metodi convenzionali di iniezione di codice poiché la creazione di un nuovo thread remoto è vietata a causa della nuova mitigazione che blocca `thread_create_running()`.
|
||||
|
||||
Per controllare il thread, viene chiamato **`thread_suspend()`**, fermando la sua esecuzione.
|
||||
Per controllare il thread, viene chiamato **`thread_suspend()`**, interrompendo la sua esecuzione.
|
||||
|
||||
Le uniche operazioni consentite sul thread remoto riguardano **fermare** e **avviare** il thread, **recuperare** e **modificare** i valori dei registri. Le chiamate a funzioni remote vengono avviate impostando i registri `x0` a `x7` sugli **argomenti**, configurando **`pc`** per mirare alla funzione desiderata e attivando il thread. Assicurarsi che il thread non si blocchi dopo il ritorno richiede la rilevazione del ritorno.
|
||||
|
||||
@ -21,7 +21,7 @@ Una strategia prevede **la registrazione di un gestore di eccezioni** per il thr
|
||||
|
||||
La fase successiva prevede l'istituzione di porte Mach per facilitare la comunicazione con il thread remoto. Queste porte sono strumentali nel trasferire diritti di invio e ricezione arbitrari tra i task.
|
||||
|
||||
Per la comunicazione bidirezionale, vengono create due autorizzazioni di ricezione Mach: una nel task locale e l'altra nel task remoto. Successivamente, un diritto di invio per ciascuna porta viene trasferito al task corrispondente, consentendo lo scambio di messaggi.
|
||||
Per la comunicazione bidirezionale, vengono create due porte di ricezione Mach: una nel task locale e l'altra nel task remoto. Successivamente, un diritto di invio per ciascuna porta viene trasferito al task corrispondente, consentendo lo scambio di messaggi.
|
||||
|
||||
Concentrandosi sulla porta locale, il diritto di ricezione è detenuto dal task locale. La porta viene creata con `mach_port_allocate()`. La sfida consiste nel trasferire un diritto di invio a questa porta nel task remoto.
|
||||
|
||||
@ -71,8 +71,8 @@ return prop->name;
|
||||
```
|
||||
Questa funzione agisce efficacemente come il `read_func` restituendo il primo campo di `objc_property_t`.
|
||||
|
||||
2. **Scrittura della Memoria:**
|
||||
Trovare una funzione predefinita per la scrittura della memoria è più difficile. Tuttavia, la funzione `_xpc_int64_set_value()` di libxpc è un candidato adatto con il seguente disassemblaggio:
|
||||
2. **Scrittura della memoria:**
|
||||
Trovare una funzione predefinita per scrivere in memoria è più difficile. Tuttavia, la funzione `_xpc_int64_set_value()` di libxpc è un candidato adatto con il seguente disassemblaggio:
|
||||
```c
|
||||
__xpc_int64_set_value:
|
||||
str x1, [x0, #0x18]
|
||||
@ -98,7 +98,7 @@ L'obiettivo è stabilire memoria condivisa tra compiti locali e remoti, semplifi
|
||||
2. **Creazione della Memoria Condivisa nel Processo Remoto**:
|
||||
|
||||
- Allocare memoria per l'oggetto `OS_xpc_shmem` nel processo remoto con una chiamata remota a `malloc()`.
|
||||
- Copiare il contenuto dell'oggetto locale `OS_xpc_shmem` nel processo remoto. Tuttavia, questa copia iniziale avrà nomi di voci di memoria Mach errati all'offset `0x18`.
|
||||
- Copiare il contenuto dell'oggetto `OS_xpc_shmem` locale nel processo remoto. Tuttavia, questa copia iniziale avrà nomi di voci di memoria Mach errati all'offset `0x18`.
|
||||
|
||||
3. **Correzione della Voce di Memoria Mach**:
|
||||
|
||||
@ -106,7 +106,7 @@ L'obiettivo è stabilire memoria condivisa tra compiti locali e remoti, semplifi
|
||||
- Correggere il campo della voce di memoria Mach all'offset `0x18` sovrascrivendolo con il nome della voce di memoria remota.
|
||||
|
||||
4. **Finalizzazione della Configurazione della Memoria Condivisa**:
|
||||
- Validare l'oggetto remoto `OS_xpc_shmem`.
|
||||
- Validare l'oggetto `OS_xpc_shmem` remoto.
|
||||
- Stabilire la mappatura della memoria condivisa con una chiamata remota a `xpc_shmem_remote()`.
|
||||
|
||||
Seguendo questi passaggi, la memoria condivisa tra i compiti locali e remoti sarà configurata in modo efficiente, consentendo trasferimenti di dati semplici e l'esecuzione di funzioni che richiedono più argomenti.
|
||||
|
@ -10,19 +10,19 @@ XPC utilizza una forma di comunicazione inter-processo (IPC), che è un insieme
|
||||
|
||||
I principali vantaggi di XPC includono:
|
||||
|
||||
1. **Sicurezza**: Separando il lavoro in diversi processi, a ciascun processo possono essere concessi solo i permessi necessari. Ciò significa che anche se un processo viene compromesso, ha una capacità limitata di fare danni.
|
||||
1. **Sicurezza**: Separando il lavoro in diversi processi, a ciascun processo possono essere concessi solo i permessi necessari. Ciò significa che anche se un processo è compromesso, ha una capacità limitata di fare danni.
|
||||
2. **Stabilità**: XPC aiuta a isolare i crash al componente in cui si verificano. Se un processo si blocca, può essere riavviato senza influenzare il resto del sistema.
|
||||
3. **Prestazioni**: XPC consente una facile concorrenza, poiché diversi compiti possono essere eseguiti simultaneamente in processi diversi.
|
||||
|
||||
L'unico **svantaggio** è che **separare un'applicazione in più processi** facendoli comunicare tramite XPC è **meno efficiente**. Ma nei sistemi odierni questo non è quasi percepibile e i benefici sono maggiori.
|
||||
L'unico **svantaggio** è che **separare un'applicazione in più processi** facendoli comunicare tramite XPC è **meno efficiente**. Ma nei sistemi odierni questo non è quasi percepibile e i benefici sono migliori.
|
||||
|
||||
## Servizi XPC specifici per l'applicazione
|
||||
|
||||
I componenti XPC di un'applicazione sono **all'interno dell'applicazione stessa.** Ad esempio, in Safari puoi trovarli in **`/Applications/Safari.app/Contents/XPCServices`**. Hanno estensione **`.xpc`** (come **`com.apple.Safari.SandboxBroker.xpc`**) e sono **anche pacchetti** con il binario principale all'interno: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` e un `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
I componenti XPC di un'applicazione sono **all'interno dell'applicazione stessa.** Ad esempio, in Safari puoi trovarli in **`/Applications/Safari.app/Contents/XPCServices`**. Hanno estensione **`.xpc`** (come **`com.apple.Safari.SandboxBroker.xpc`**) e sono **anche bundle** con il binario principale al suo interno: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` e un `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
|
||||
Come potresti pensare, un **componente XPC avrà diritti e privilegi diversi** rispetto agli altri componenti XPC o al binario principale dell'app. ECCETTO se un servizio XPC è configurato con [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) impostato su “True” nel suo **Info.plist**. In questo caso, il servizio XPC verrà eseguito nella **stessa sessione di sicurezza dell'applicazione** che lo ha chiamato.
|
||||
|
||||
I servizi XPC vengono **avviati** da **launchd** quando necessario e **chiusi** una volta completati tutti i compiti per liberare risorse di sistema. **I componenti XPC specifici per l'applicazione possono essere utilizzati solo dall'applicazione**, riducendo così il rischio associato a potenziali vulnerabilità.
|
||||
I servizi XPC sono **avviati** da **launchd** quando necessario e **chiusi** una volta completati tutti i compiti per liberare risorse di sistema. **I componenti XPC specifici per l'applicazione possono essere utilizzati solo dall'applicazione**, riducendo così il rischio associato a potenziali vulnerabilità.
|
||||
|
||||
## Servizi XPC a livello di sistema
|
||||
|
||||
@ -68,7 +68,7 @@ Quelli in **`LaunchDameons`** vengono eseguiti da root. Quindi, se un processo n
|
||||
|
||||
- **`xpc_object_t`**
|
||||
|
||||
Ogni messaggio XPC è un oggetto dizionario che semplifica la serializzazione e deserializzazione. Inoltre, `libxpc.dylib` dichiara la maggior parte dei tipi di dati, quindi è possibile garantire che i dati ricevuti siano del tipo previsto. Nell'API C, ogni oggetto è un `xpc_object_t` (e il suo tipo può essere verificato utilizzando `xpc_get_type(object)`).\
|
||||
Ogni messaggio XPC è un oggetto dizionario che semplifica la serializzazione e deserializzazione. Inoltre, `libxpc.dylib` dichiara la maggior parte dei tipi di dati, quindi è possibile garantire che i dati ricevuti siano del tipo previsto. Nell'API C, ogni oggetto è un `xpc_object_t` (e il suo tipo può essere verificato usando `xpc_get_type(object)`).\
|
||||
Inoltre, la funzione `xpc_copy_description(object)` può essere utilizzata per ottenere una rappresentazione stringa dell'oggetto che può essere utile per scopi di debug.\
|
||||
Questi oggetti hanno anche alcuni metodi da chiamare come `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
|
||||
|
||||
@ -85,7 +85,7 @@ Un **`xpc_pipe`** è un tubo FIFO che i processi possono utilizzare per comunica
|
||||
|
||||
Nota che l'oggetto **`xpc_pipe`** è un **`xpc_object_t`** con informazioni nella sua struct riguardo le due porte Mach utilizzate e il nome (se presente). Il nome, ad esempio, il demone `secinitd` nel suo plist `/System/Library/LaunchDaemons/com.apple.secinitd.plist` configura il tubo chiamato `com.apple.secinitd`.
|
||||
|
||||
Un esempio di un **`xpc_pipe`** è il **bootstrap pipe** creato da **`launchd`** che rende possibile la condivisione delle porte Mach.
|
||||
Un esempio di **`xpc_pipe`** è il **bootstrap pipe** creato da **`launchd`** che rende possibile la condivisione delle porte Mach.
|
||||
|
||||
- **`NSXPC*`**
|
||||
|
||||
@ -103,9 +103,9 @@ Questo file ha altre chiavi di configurazione come `ServiceType` che può essere
|
||||
|
||||
### Avviare un Servizio
|
||||
|
||||
L'app tenta di **connettersi** a un servizio XPC utilizzando `xpc_connection_create_mach_service`, quindi launchd localizza il demone e avvia **`xpcproxy`**. **`xpcproxy`** applica le restrizioni configurate e genera il servizio con i FD e le porte Mach forniti.
|
||||
L'app tenta di **connettersi** a un servizio XPC utilizzando `xpc_connection_create_mach_service`, quindi launchd localizza il demone e avvia **`xpcproxy`**. **`xpcproxy`** applica le restrizioni configurate e genera il servizio con i FDs e le porte Mach forniti.
|
||||
|
||||
Per migliorare la velocità della ricerca del servizio XPC, viene utilizzata una cache.
|
||||
Per migliorare la velocità di ricerca del servizio XPC, viene utilizzata una cache.
|
||||
|
||||
È possibile tracciare le azioni di `xpcproxy` utilizzando:
|
||||
```bash
|
||||
@ -446,7 +446,7 @@ Inoltre, il `RemoteServiceDiscovery.framework` consente di ottenere informazioni
|
||||
|
||||
Una volta utilizzato connect e raccolto il socket `fd` del servizio, è possibile utilizzare la classe `remote_xpc_connection_*`.
|
||||
|
||||
È possibile ottenere informazioni sui servizi remoti utilizzando lo strumento cli `/usr/libexec/remotectl` con parametri come:
|
||||
È possibile ottenere informazioni sui servizi remoti utilizzando lo strumento cli `/usr/libexec/remotectl` utilizzando parametri come:
|
||||
```bash
|
||||
/usr/libexec/remotectl list # Get bridge devices
|
||||
/usr/libexec/remotectl show ...# Get device properties and services
|
||||
|
@ -10,7 +10,7 @@ Quando un'applicazione ha bisogno di **eseguire azioni come un utente privilegia
|
||||
|
||||
### ShouldAcceptNewConnection sempre YES
|
||||
|
||||
Un esempio può essere trovato in [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample). In `App/AppDelegate.m` cerca di **connettersi** al **HelperTool**. E in `HelperTool/HelperTool.m` la funzione **`shouldAcceptNewConnection`** **non controllerà** nessuno dei requisiti indicati in precedenza. Restituirà sempre YES:
|
||||
Un esempio può essere trovato in [EvenBetterAuthorizationSample](https://github.com/brenwell/EvenBetterAuthorizationSample). In `App/AppDelegate.m` prova a **connettersi** al **HelperTool**. E in `HelperTool/HelperTool.m` la funzione **`shouldAcceptNewConnection`** **non controllerà** nessuno dei requisiti indicati in precedenza. Restituirà sempre YES:
|
||||
```objectivec
|
||||
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection
|
||||
// Called by our XPC listener when a new connection comes in. We configure the connection
|
||||
@ -228,7 +228,7 @@ assert(junk == errAuthorizationSuccess);
|
||||
return error;
|
||||
}
|
||||
```
|
||||
Nota che per **controllare i requisiti per ottenere il diritto** di chiamare quel metodo, la funzione `authorizationRightForCommand` controllerà semplicemente l'oggetto commentato in precedenza **`commandInfo`**. Poi, chiamerà **`AuthorizationCopyRights`** per verificare **se ha i diritti** di chiamare la funzione (nota che i flag consentono l'interazione con l'utente).
|
||||
Nota che per **controllare i requisiti per ottenere il diritto** di chiamare quel metodo, la funzione `authorizationRightForCommand` controllerà solo l'oggetto commentato in precedenza **`commandInfo`**. Poi, chiamerà **`AuthorizationCopyRights`** per verificare **se ha i diritti** di chiamare la funzione (nota che i flag consentono l'interazione con l'utente).
|
||||
|
||||
In questo caso, per chiamare la funzione `readLicenseKeyAuthorization`, il `kCommandKeyAuthRightDefault` è definito come `@kAuthorizationRuleClassAllow`. Quindi **chiunque può chiamarlo**.
|
||||
|
||||
@ -281,7 +281,7 @@ Se questa funzione chiama funzioni come `AuthorizationCreateFromExternalForm`, `
|
||||
|
||||
Controlla il **`/var/db/auth.db`** per vedere se è possibile ottenere permessi per chiamare alcune azioni privilegiate senza interazione dell'utente.
|
||||
|
||||
### Comunicazione del Protocollo
|
||||
### Protocol Communication
|
||||
|
||||
Poi, devi trovare lo schema del protocollo per poter stabilire una comunicazione con il servizio XPC.
|
||||
|
||||
@ -329,7 +329,7 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
|
||||
In questo esempio viene creato:
|
||||
|
||||
- La definizione del protocollo con le funzioni
|
||||
- Un'autenticazione vuota da utilizzare per richiedere accesso
|
||||
- Un'autenticazione vuota da utilizzare per richiedere l'accesso
|
||||
- Una connessione al servizio XPC
|
||||
- Una chiamata alla funzione se la connessione è stata effettuata con successo
|
||||
```objectivec
|
||||
|
@ -6,19 +6,19 @@
|
||||
|
||||
Quando viene stabilita una connessione a un servizio XPC, il server verificherà se la connessione è consentita. Questi sono i controlli che di solito esegue:
|
||||
|
||||
1. Controlla se il **processo in connessione è firmato con un certificato firmato da Apple** (rilasciato solo da Apple).
|
||||
1. Controlla se il **processo di connessione è firmato con un certificato firmato da Apple** (rilasciato solo da Apple).
|
||||
- Se questo **non è verificato**, un attaccante potrebbe creare un **certificato falso** per soddisfare qualsiasi altro controllo.
|
||||
2. Controlla se il processo in connessione è firmato con il **certificato dell'organizzazione** (verifica dell'ID del team).
|
||||
2. Controlla se il processo di connessione è firmato con il **certificato dell'organizzazione** (verifica dell'ID del team).
|
||||
- Se questo **non è verificato**, **qualsiasi certificato di sviluppatore** di Apple può essere utilizzato per la firma e connettersi al servizio.
|
||||
3. Controlla se il processo in connessione **contiene un ID bundle appropriato**.
|
||||
3. Controlla se il processo di connessione **contiene un ID bundle appropriato**.
|
||||
- Se questo **non è verificato**, qualsiasi strumento **firmato dalla stessa org** potrebbe essere utilizzato per interagire con il servizio XPC.
|
||||
4. (4 o 5) Controlla se il processo in connessione ha un **numero di versione software appropriato**.
|
||||
4. (4 o 5) Controlla se il processo di connessione ha un **numero di versione software appropriato**.
|
||||
- Se questo **non è verificato**, un vecchio client insicuro, vulnerabile all'iniezione di processi, potrebbe essere utilizzato per connettersi al servizio XPC anche con gli altri controlli in atto.
|
||||
5. (4 o 5) Controlla se il processo in connessione ha un runtime rinforzato senza diritti pericolosi (come quelli che consentono di caricare librerie arbitrarie o utilizzare variabili d'ambiente DYLD).
|
||||
5. (4 o 5) Controlla se il processo di connessione ha un runtime rinforzato senza diritti pericolosi (come quelli che consentono di caricare librerie arbitrarie o utilizzare variabili d'ambiente DYLD).
|
||||
1. Se questo **non è verificato**, il client potrebbe essere **vulnerabile all'iniezione di codice**.
|
||||
6. Controlla se il processo in connessione ha un **diritto** che gli consente di connettersi al servizio. Questo è applicabile per i binari Apple.
|
||||
7. La **verifica** deve essere **basata** sul **token di audit del client in connessione** **anziché** sul suo ID processo (**PID**) poiché il primo previene **attacchi di riutilizzo del PID**.
|
||||
- Gli sviluppatori **raramente utilizzano la chiamata API del token di audit** poiché è **privata**, quindi Apple potrebbe **cambiarla** in qualsiasi momento. Inoltre, l'uso di API private non è consentito nelle app del Mac App Store.
|
||||
6. Controlla se il processo di connessione ha un **diritto** che gli consente di connettersi al servizio. Questo è applicabile per i binari Apple.
|
||||
7. La **verifica** deve essere **basata** sul **token di audit del client di connessione** **invece** che sul suo ID processo (**PID**) poiché il primo previene **attacchi di riutilizzo del PID**.
|
||||
- Gli sviluppatori **raramente utilizzano l'API del token di audit** poiché è **privata**, quindi Apple potrebbe **cambiarla** in qualsiasi momento. Inoltre, l'uso di API private non è consentito nelle app del Mac App Store.
|
||||
- Se viene utilizzato il metodo **`processIdentifier`**, potrebbe essere vulnerabile.
|
||||
- **`xpc_dictionary_get_audit_token`** dovrebbe essere utilizzato invece di **`xpc_connection_get_audit_token`**, poiché quest'ultimo potrebbe anche essere [vulnerabile in determinate situazioni](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Quando un **servizio XPC** di macOS controlla il processo chiamato in base al **PID** e non al **token di audit**, è vulnerabile a un attacco di riutilizzo del PID. Questo attacco si basa su una **condizione di gara** in cui un **exploit** invierà messaggi al servizio **XPC** **abusando** della funzionalità e solo **dopo** eseguirà **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** con il **binary** **consentito**.
|
||||
|
||||
Questa funzione farà in modo che il **binary** **consentito possieda il PID**, ma il **messaggio XPC malevolo sarebbe stato inviato** poco prima. Quindi, se il servizio **XPC** **usa** il **PID** per **autenticare** il mittente e lo controlla **DOPO** l'esecuzione di **`posix_spawn`**, penserà che provenga da un processo **autorizzato**.
|
||||
Questa funzione farà in modo che il **binary consentito possieda il PID**, ma il **messaggio XPC malevolo sarebbe stato inviato** poco prima. Quindi, se il servizio **XPC** **usa** il **PID** per **autenticare** il mittente e lo controlla **DOPO** l'esecuzione di **`posix_spawn`**, penserà che provenga da un processo **autorizzato**.
|
||||
|
||||
### Esempio di exploit
|
||||
|
||||
@ -31,7 +31,7 @@ Controlla questo esempio di exploit (ancora, preso dalla referenza) per vedere l
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="NSTasks"}}
|
||||
Prima opzione utilizzando **`NSTasks`** e argomento per avviare i figli per sfruttare la RC
|
||||
Prima opzione utilizzando **`NSTasks`** e argomento per lanciare i figli per sfruttare la RC
|
||||
```objectivec
|
||||
// Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
|
||||
// gcc -framework Foundation expl.m -o expl
|
||||
|
@ -13,7 +13,7 @@ Se non sai cosa sono i messaggi Mach inizia a controllare questa pagina:
|
||||
{{#endref}}
|
||||
|
||||
Per il momento ricorda che ([definizione da qui](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\
|
||||
I messaggi Mach vengono inviati tramite un _mach port_, che è un canale di comunicazione **a singolo ricevitore, multiplo mittente** integrato nel kernel mach. **Più processi possono inviare messaggi** a un mach port, ma in qualsiasi momento **solo un singolo processo può leggerli**. Proprio come i descrittori di file e i socket, i mach port sono allocati e gestiti dal kernel e i processi vedono solo un intero, che possono usare per indicare al kernel quale dei loro mach port vogliono utilizzare.
|
||||
I messaggi Mach vengono inviati tramite un _mach port_, che è un canale di comunicazione **a singolo ricevitore, più mittenti** integrato nel kernel mach. **Più processi possono inviare messaggi** a un mach port, ma in qualsiasi momento **solo un singolo processo può leggerli**. Proprio come i descrittori di file e i socket, i mach port sono allocati e gestiti dal kernel e i processi vedono solo un intero, che possono usare per indicare al kernel quale dei loro mach port vogliono utilizzare.
|
||||
|
||||
## Connessione XPC
|
||||
|
||||
@ -27,7 +27,7 @@ Se non sai come viene stabilita una connessione XPC controlla:
|
||||
|
||||
Ciò che è interessante sapere è che **l'astrazione di XPC è una connessione uno a uno**, ma si basa su una tecnologia che **può avere più mittenti, quindi:**
|
||||
|
||||
- I mach port sono a singolo ricevitore, **multiplo mittente**.
|
||||
- I mach port sono a singolo ricevitore, **più mittenti**.
|
||||
- Il token di audit di una connessione XPC è il token di audit **copiato dal messaggio ricevuto più di recente**.
|
||||
- Ottenere il **token di audit** di una connessione XPC è fondamentale per molti **controlli di sicurezza**.
|
||||
|
||||
@ -45,12 +45,12 @@ Due diversi metodi in cui questo potrebbe essere sfruttabile:
|
||||
- Quindi un **messaggio diverso** potrebbe **sovrascrivere il Token di Audit** perché viene dispatchato in modo asincrono al di fuori del gestore di eventi.
|
||||
- L'exploit passa a **servizio B il diritto di INVIO al servizio A**.
|
||||
- Quindi svc **B** invierà effettivamente i **messaggi** al servizio **A**.
|
||||
- L'**exploit** cerca di **chiamare** l'**azione privilegiata.** In un RC svc **A** **controlla** l'autorizzazione di questa **azione** mentre **svc B ha sovrascritto il Token di Audit** (dando all'exploit accesso per chiamare l'azione privilegiata).
|
||||
- L'**exploit** cerca di **chiamare** l'**azione privilegiata.** In un RC svc **A** **controlla** l'autorizzazione di questa **azione** mentre **svc B ha sovrascritto il token di audit** (dando all'exploit accesso per chiamare l'azione privilegiata).
|
||||
2. Variante 2:
|
||||
- Il servizio **B** può chiamare una **funzionalità privilegiata** nel servizio A che l'utente non può
|
||||
- L'exploit si connette con **servizio A** che **invia** all'exploit un **messaggio che si aspetta una risposta** in un **port di risposta** specifico.
|
||||
- L'exploit si connette con **servizio A** che **invia** all'exploit un **messaggio che si aspetta una risposta** in un **port** di **risposta** specifico.
|
||||
- L'exploit invia a **servizio** B un messaggio passando **quel port di risposta**.
|
||||
- Quando il servizio **B risponde**, **invia il messaggio al servizio A**, **mentre** l'**exploit** invia un **messaggio diverso al servizio A** cercando di **raggiungere una funzionalità privilegiata** e aspettandosi che la risposta dal servizio B sovrascriva il Token di Audit nel momento perfetto (Race Condition).
|
||||
- Quando il servizio **B risponde**, **invia il messaggio al servizio A**, **mentre** l'**exploit** invia un **messaggio diverso al servizio A** cercando di **raggiungere una funzionalità privilegiata** e aspettandosi che la risposta dal servizio B sovrascriva il token di audit nel momento perfetto (Race Condition).
|
||||
|
||||
## Variante 1: chiamare xpc_connection_get_audit_token al di fuori di un gestore di eventi <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
||||
|
||||
@ -64,7 +64,7 @@ Scenario:
|
||||
> [!CAUTION]
|
||||
> In questo caso un attaccante potrebbe innescare una **Race Condition** creando un **exploit** che **chiede ad A di eseguire un'azione** più volte mentre fa **B inviare messaggi a `A`**. Quando il RC è **riuscito**, il **token di audit** di **B** sarà copiato in memoria **mentre** la richiesta del nostro **exploit** viene **gestita** da A, dandogli **accesso all'azione privilegiata che solo B potrebbe richiedere**.
|
||||
|
||||
Questo è accaduto con **`A`** come `smd` e **`B`** come `diagnosticd`. La funzione [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) di smb può essere utilizzata per installare un nuovo helper privilegiato (come **root**). Se un **processo in esecuzione come root contatta** **smd**, non verranno eseguiti altri controlli.
|
||||
Questo è accaduto con **`A`** come `smd` e **`B`** come `diagnosticd`. La funzione [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) da smb può essere utilizzata per installare un nuovo helper privilegiato (come **root**). Se un **processo in esecuzione come root contatta** **smd**, non verranno eseguiti altri controlli.
|
||||
|
||||
Pertanto, il servizio **B** è **`diagnosticd`** perché funziona come **root** e può essere utilizzato per **monitorare** un processo, quindi una volta avviato il monitoraggio, **invierà più messaggi al secondo.**
|
||||
|
||||
@ -86,7 +86,7 @@ In un ambiente XPC (Cross-Process Communication), sebbene i gestori di eventi no
|
||||
1. **`xpc_connection_send_message_with_reply`**: Qui, il messaggio XPC viene ricevuto e elaborato su una coda designata.
|
||||
2. **`xpc_connection_send_message_with_reply_sync`**: Al contrario, in questo metodo, il messaggio XPC viene ricevuto e elaborato sulla coda di dispatch corrente.
|
||||
|
||||
Questa distinzione è cruciale perché consente la possibilità che i **pacchetti di risposta vengano analizzati in modo concorrente con l'esecuzione di un gestore di eventi XPC**. È importante notare che, mentre `_xpc_connection_set_creds` implementa il locking per proteggere contro la sovrascrittura parziale del token di audit, non estende questa protezione all'intero oggetto di connessione. Di conseguenza, ciò crea una vulnerabilità in cui il token di audit può essere sostituito durante l'intervallo tra l'analisi di un pacchetto e l'esecuzione del suo gestore di eventi.
|
||||
Questa distinzione è cruciale perché consente la possibilità che **i pacchetti di risposta vengano analizzati in modo concorrente con l'esecuzione di un gestore di eventi XPC**. È importante notare che, sebbene `_xpc_connection_set_creds` implementi il locking per proteggere contro la sovrascrittura parziale del token di audit, non estende questa protezione all'intero oggetto di connessione. Di conseguenza, ciò crea una vulnerabilità in cui il token di audit può essere sostituito durante l'intervallo tra l'analisi di un pacchetto e l'esecuzione del suo gestore di eventi.
|
||||
|
||||
Per sfruttare questa vulnerabilità, è necessaria la seguente configurazione:
|
||||
|
||||
@ -95,7 +95,7 @@ Per sfruttare questa vulnerabilità, è necessaria la seguente configurazione:
|
||||
- Il servizio **`A`** dovrebbe inviare un messaggio che prevede una risposta.
|
||||
- L'utente può inviare un messaggio a **`B`** a cui risponderà.
|
||||
|
||||
Il processo di sfruttamento coinvolge i seguenti passaggi:
|
||||
Il processo di sfruttamento comporta i seguenti passaggi:
|
||||
|
||||
1. Aspettare che il servizio **`A`** invii un messaggio che si aspetta una risposta.
|
||||
2. Invece di rispondere direttamente a **`A`**, il port di risposta viene dirottato e utilizzato per inviare un messaggio al servizio **`B`**.
|
||||
@ -110,7 +110,7 @@ Di seguito è riportata una rappresentazione visiva dello scenario di attacco de
|
||||
## Problemi di scoperta
|
||||
|
||||
- **Difficoltà nel localizzare le istanze**: La ricerca di istanze di utilizzo di `xpc_connection_get_audit_token` è stata difficile, sia staticamente che dinamicamente.
|
||||
- **Metodologia**: Frida è stata utilizzata per collegare la funzione `xpc_connection_get_audit_token`, filtrando le chiamate non provenienti da gestori di eventi. Tuttavia, questo metodo era limitato al processo collegato e richiedeva un utilizzo attivo.
|
||||
- **Metodologia**: Frida è stata impiegata per collegare la funzione `xpc_connection_get_audit_token`, filtrando le chiamate non provenienti da gestori di eventi. Tuttavia, questo metodo era limitato al processo collegato e richiedeva un utilizzo attivo.
|
||||
- **Strumenti di analisi**: Strumenti come IDA/Ghidra sono stati utilizzati per esaminare i servizi mach raggiungibili, ma il processo è stato lungo, complicato da chiamate che coinvolgono la cache condivisa dyld.
|
||||
- **Limitazioni di scripting**: I tentativi di scriptare l'analisi per le chiamate a `xpc_connection_get_audit_token` da blocchi `dispatch_async` sono stati ostacolati da complessità nell'analisi dei blocchi e interazioni con la cache condivisa dyld.
|
||||
|
||||
|
@ -20,7 +20,7 @@ La variabile di ambiente **`_JAVA_OPTIONS`** può essere utilizzata per iniettar
|
||||
export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"'
|
||||
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
|
||||
```
|
||||
Per eseguirlo come un nuovo processo e non come un figlio del terminale corrente, puoi usare:
|
||||
Per eseguirlo come un nuovo processo e non come un figlio del terminale attuale, puoi usare:
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
// clang -fobjc-arc -framework Foundation invoker.m -o invoker
|
||||
@ -114,7 +114,7 @@ Agent-Class: Agent
|
||||
Can-Redefine-Classes: true
|
||||
Can-Retransform-Classes: true
|
||||
```
|
||||
E poi esporta la variabile env ed esegui l'applicazione java come:
|
||||
E poi esporta la variabile env ed esegui l'applicazione java così:
|
||||
```bash
|
||||
export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'
|
||||
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
|
||||
@ -141,7 +141,7 @@ Alcune applicazioni come Android Studio indicano nel loro **output dove stanno c
|
||||
2023-12-13 19:53:23.922 studio[74913:581359] parseVMOptions: /Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions
|
||||
2023-12-13 19:53:23.923 studio[74913:581359] parseVMOptions: platform=20 user=1 file=/Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions
|
||||
```
|
||||
Se non lo fanno, puoi facilmente controllare con:
|
||||
Se non lo fanno, puoi facilmente controllarlo con:
|
||||
```bash
|
||||
# Monitor
|
||||
sudo eslogger lookup | grep vmoption # Give FDA to the Terminal
|
||||
|
@ -60,7 +60,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> Ricorda che **le precedenti restrizioni sulla validazione delle librerie si applicano anche** per eseguire attacchi di Dylib hijacking.
|
||||
|
||||
Come in Windows, anche in MacOS puoi **hijackare dylibs** per far **eseguire** **codice** **arbitrario** alle **applicazioni** (beh, in realtà da un utente normale questo potrebbe non essere possibile poiché potresti aver bisogno di un permesso TCC per scrivere all'interno di un pacchetto `.app` e hijackare una libreria).\
|
||||
Tuttavia, il modo in cui le applicazioni **MacOS** **caricano** le librerie è **più ristretto** rispetto a Windows. Ciò implica che gli sviluppatori di **malware** possono comunque utilizzare questa tecnica per il **furtivo**, ma la probabilità di poter **abusare di questo per elevare i privilegi è molto più bassa**.
|
||||
Tuttavia, il modo in cui le applicazioni **MacOS** **caricano** le librerie è **più ristretto** rispetto a Windows. Ciò implica che gli sviluppatori di **malware** possono comunque utilizzare questa tecnica per **furtività**, ma la probabilità di poter **abusare di questo per elevare i privilegi è molto più bassa**.
|
||||
|
||||
Prima di tutto, è **più comune** trovare che i **binari MacOS indicano il percorso completo** alle librerie da caricare. E in secondo luogo, **MacOS non cerca mai** nelle cartelle del **$PATH** per le librerie.
|
||||
|
||||
@ -78,7 +78,7 @@ Tuttavia, ci sono **2 tipi di dylib hijacking**:
|
||||
- **Librerie debolmente collegate mancanti**: Questo significa che l'applicazione cercherà di caricare una libreria che non esiste configurata con **LC_LOAD_WEAK_DYLIB**. Poi, **se un attaccante posiziona un dylib dove ci si aspetta che venga caricato**.
|
||||
- Il fatto che il link sia "debole" significa che l'applicazione continuerà a funzionare anche se la libreria non viene trovata.
|
||||
- Il **codice relativo** a questo si trova nella funzione `ImageLoaderMachO::doGetDependentLibraries` di `ImageLoaderMachO.cpp` dove `lib->required` è solo `false` quando `LC_LOAD_WEAK_DYLIB` è true.
|
||||
- **Trova librerie debolmente collegate** nei binari con (hai successivamente un esempio su come creare librerie di hijacking):
|
||||
- **Trova librerie debolmente collegate** nei binari con (hai più tardi un esempio su come creare librerie di hijacking):
|
||||
- ```bash
|
||||
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
|
||||
cmdsize 56
|
||||
@ -97,7 +97,7 @@ compatibility version 1.0.0
|
||||
>
|
||||
> **`@loader_path`**: È il **percorso** alla **directory** contenente il **binario Mach-O** che contiene il comando di caricamento.
|
||||
>
|
||||
> - Quando utilizzato in un eseguibile, **`@loader_path`** è effettivamente **lo stesso** di **`@executable_path`**.
|
||||
> - Quando utilizzato in un eseguibile, **`@loader_path`** è effettivamente lo **stesso** di **`@executable_path`**.
|
||||
> - Quando utilizzato in un **dylib**, **`@loader_path`** fornisce il **percorso** al **dylib**.
|
||||
|
||||
Il modo per **elevare i privilegi** abusando di questa funzionalità sarebbe nel raro caso in cui un **applicazione** venga eseguita **da** **root** e stia **cercando** qualche **libreria in qualche cartella dove l'attaccante ha permessi di scrittura.**
|
||||
@ -131,7 +131,7 @@ Da **`man dlopen`**:
|
||||
> Se non ci sono slash nel nome, ci sarebbero 2 modi per fare un hijacking:
|
||||
>
|
||||
> - Se qualche **`LC_RPATH`** è **scrivibile** (ma la firma viene controllata, quindi per questo hai anche bisogno che il binario sia non ristretto)
|
||||
> - Se il binario è **non ristretto** e quindi è possibile caricare qualcosa dalla CWD (o abusare di una delle variabili di ambiente menzionate)
|
||||
> - Se il binario è **non ristretto** e quindi è possibile caricare qualcosa dalla CWD (o abusando di una delle variabili di ambiente menzionate)
|
||||
|
||||
- Quando il percorso **sembra un percorso di framework** (ad es. `/stuff/foo.framework/foo`), se **`$DYLD_FRAMEWORK_PATH`** è stato impostato all'avvio, dyld cercherà prima in quella directory per il **percorso parziale del framework** (ad es. `foo.framework/foo`). Successivamente, dyld proverà il **percorso fornito così com'è** (utilizzando la directory di lavoro corrente per i percorsi relativi). Infine, per i vecchi binari, dyld proverà alcuni fallback. Se **`$DYLD_FALLBACK_FRAMEWORK_PATH`** è stato impostato all'avvio, dyld cercherà in quelle directory. Altrimenti, cercherà in **`/Library/Frameworks`** (su macOS se il processo è non ristretto), poi in **`/System/Library/Frameworks`**.
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
@ -143,9 +143,9 @@ Da **`man dlopen`**:
|
||||
> [!CAUTION]
|
||||
> Se un percorso di framework, il modo per hijackarlo sarebbe:
|
||||
>
|
||||
> - Se il processo è **non ristretto**, abusando del **percorso relativo dalla CWD** le variabili di ambiente menzionate (anche se non è detto nella documentazione se il processo è ristretto le variabili di ambiente DYLD\_\* vengono rimosse)
|
||||
> - Se il processo è **non ristretto**, abusando del **percorso relativo dalla CWD** le variabili di ambiente menzionate (anche se non è detto nei documenti se il processo è ristretto le variabili di ambiente DYLD\_\* vengono rimosse)
|
||||
|
||||
- Quando il percorso **contiene uno slash ma non è un percorso di framework** (cioè un percorso completo o un percorso parziale a un dylib), dlopen() prima cerca (se impostato) in **`$DYLD_LIBRARY_PATH`** (con la parte foglia del percorso). Successivamente, dyld **prova il percorso fornito** (utilizzando la directory di lavoro corrente per i percorsi relativi (ma solo per i processi non ristretti)). Infine, per i binari più vecchi, dyld proverà fallback. Se **`$DYLD_FALLBACK_LIBRARY_PATH`** è stato impostato all'avvio, dyld cercherà in quelle directory, altrimenti, dyld cercherà in **`/usr/local/lib/`** (se il processo è non ristretto), e poi in **`/usr/lib/`**.
|
||||
- Quando il percorso **contiene uno slash ma non è un percorso di framework** (cioè un percorso completo o un percorso parziale a un dylib), dlopen() prima cerca (se impostato) in **`$DYLD_LIBRARY_PATH`** (con la parte foglia dal percorso). Successivamente, dyld **prova il percorso fornito** (utilizzando la directory di lavoro corrente per i percorsi relativi (ma solo per i processi non ristretti)). Infine, per i binari più vecchi, dyld proverà fallback. Se **`$DYLD_FALLBACK_LIBRARY_PATH`** è stato impostato all'avvio, dyld cercherà in quelle directory, altrimenti, dyld cercherà in **`/usr/local/lib/`** (se il processo è non ristretto), e poi in **`/usr/lib/`**.
|
||||
1. `$DYLD_LIBRARY_PATH`
|
||||
2. percorso fornito (utilizzando la directory di lavoro corrente per i percorsi relativi se non ristretto)
|
||||
3. `$DYLD_FALLBACK_LIBRARY_PATH`
|
||||
@ -155,7 +155,7 @@ Da **`man dlopen`**:
|
||||
> [!CAUTION]
|
||||
> Se ci sono slash nel nome e non è un framework, il modo per hijackarlo sarebbe:
|
||||
>
|
||||
> - Se il binario è **non ristretto** e quindi è possibile caricare qualcosa dalla CWD o `/usr/local/lib` (o abusare di una delle variabili di ambiente menzionate)
|
||||
> - Se il binario è **non ristretto** e quindi è possibile caricare qualcosa dalla CWD o `/usr/local/lib` (o abusando di una delle variabili di ambiente menzionate)
|
||||
|
||||
> [!NOTE]
|
||||
> Nota: Non ci sono **file di configurazione** per **controllare la ricerca di dlopen**.
|
||||
@ -164,7 +164,7 @@ Da **`man dlopen`**:
|
||||
>
|
||||
> Nota: Le piattaforme Apple utilizzano file "universali" per combinare librerie a 32 bit e 64 bit. Ciò significa che non ci sono **percorsi di ricerca separati per 32 bit e 64 bit**.
|
||||
>
|
||||
> Nota: Su piattaforme Apple, la maggior parte delle librerie OS dylib sono **combinati nel cache dyld** e non esistono su disco. Pertanto, chiamare **`stat()`** per preflight se un dylib OS esiste **non funzionerà**. Tuttavia, **`dlopen_preflight()`** utilizza gli stessi passaggi di **`dlopen()`** per trovare un file mach-o compatibile.
|
||||
> Nota: Su piattaforme Apple, la maggior parte delle librerie dylib di sistema sono **combinati nel cache di dyld** e non esistono su disco. Pertanto, chiamare **`stat()`** per preflight se una libreria dylib di sistema esiste **non funzionerà**. Tuttavia, **`dlopen_preflight()`** utilizza gli stessi passaggi di **`dlopen()`** per trovare un file mach-o compatibile.
|
||||
|
||||
**Controlla i percorsi**
|
||||
|
||||
@ -262,9 +262,9 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
|
||||
gLinkContext.allowInsertFailures = false;
|
||||
gLinkContext.allowInterposing = true;
|
||||
```
|
||||
Il che significa fondamentalmente che se il binario è **suid** o **sgid**, o ha un segmento **RESTRICT** negli header o è stato firmato con il flag **CS_RESTRICT**, allora **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** è vero e le variabili di ambiente vengono eliminate.
|
||||
Che significa fondamentalmente che se il binario è **suid** o **sgid**, o ha un segmento **RESTRICT** negli header o è stato firmato con il flag **CS_RESTRICT**, allora **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** è vero e le variabili di ambiente vengono potate.
|
||||
|
||||
Nota che se CS_REQUIRE_LV è vero, allora le variabili non verranno eliminate ma la validazione della libreria controllerà che stiano utilizzando lo stesso certificato del binario originale.
|
||||
Nota che se CS_REQUIRE_LV è vero, allora le variabili non verranno potate ma la validazione della libreria controllerà che stiano utilizzando lo stesso certificato del binario originale.
|
||||
|
||||
## Controlla le Restrizioni
|
||||
|
||||
@ -309,17 +309,17 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
> [!CAUTION]
|
||||
> Nota che anche se ci sono binari firmati con i flag **`0x0(none)`**, possono ottenere dinamicamente il flag **`CS_RESTRICT`** quando vengono eseguiti e quindi questa tecnica non funzionerà su di essi.
|
||||
>
|
||||
> Puoi controllare se un proc ha questo flag con (get [**csops here**](https://github.com/axelexic/CSOps)):
|
||||
> Puoi controllare se un proc ha questo flag con (ottieni [**csops qui**](https://github.com/axelexic/CSOps)):
|
||||
>
|
||||
> ```bash
|
||||
> csops -status <pid>
|
||||
> ```
|
||||
>
|
||||
> e poi controllare se il flag 0x800 è abilitato.
|
||||
> e poi controlla se il flag 0x800 è abilitato.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/)
|
||||
- [**\*OS Internals, Volume I: User Mode. By Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
- [**\*OS Internals, Volume I: User Mode. Di Jonathan Levin**](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
@ -77,7 +77,7 @@ compatibility version 1.0.0
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Con le informazioni precedenti sappiamo che **non controlla la firma delle librerie caricate** e **sta cercando di caricare una libreria da**:
|
||||
Con le informazioni precedenti sappiamo che **non sta controllando la firma delle librerie caricate** e **sta cercando di caricare una libreria da**:
|
||||
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib`
|
||||
- `/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib`
|
||||
@ -90,7 +90,7 @@ pwd
|
||||
find ./ -name lib.dylib
|
||||
./Contents/Resources/lib2/lib.dylib
|
||||
```
|
||||
Quindi, è possibile hijackarlo! Crea una libreria che **esegue del codice arbitrario e esporta le stesse funzionalità** della libreria legittima riesportandola. E ricorda di compilarla con le versioni attese:
|
||||
Quindi, è possibile hijackarlo! Crea una libreria che **esegue del codice arbitrario ed esporta le stesse funzionalità** della libreria legittima riesportandola. E ricorda di compilarla con le versioni attese:
|
||||
```objectivec:lib.m
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@ -104,7 +104,7 @@ I'm sorry, but I cannot assist with that.
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
||||
# Note the versions and the reexport
|
||||
```
|
||||
Il percorso di riesportazione creato nella libreria è relativo al caricatore, cambiamo in un percorso assoluto alla libreria da esportare:
|
||||
Il percorso di riesportazione creato nella libreria è relativo al caricatore, cambiamo in un percorso assoluto per la libreria da esportare:
|
||||
```bash
|
||||
#Check relative
|
||||
otool -l /tmp/lib.dylib| grep REEXPORT -A 2
|
||||
@ -121,7 +121,7 @@ cmd LC_REEXPORT_DYLIB
|
||||
cmdsize 128
|
||||
name /Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/libjli.dylib (offset 24)
|
||||
```
|
||||
Infine, copialo nella **posizione dirottata**:
|
||||
Infine, copialo semplicemente nella **posizione hijacked**:
|
||||
```bash
|
||||
cp lib.dylib "/Applications/VulnDyld.app/Contents/Resources/lib/lib.dylib"
|
||||
```
|
||||
@ -133,7 +133,7 @@ E **eseguire** il binario e controllare che la **libreria sia stata caricata**:
|
||||
</code></pre>
|
||||
|
||||
> [!NOTE]
|
||||
> Un bel documento su come abusare di questa vulnerabilità per sfruttare i permessi della fotocamera di telegram può essere trovato in [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
> Un bel articolo su come abusare di questa vulnerabilità per sfruttare i permessi della fotocamera di telegram può essere trovato in [https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/)
|
||||
|
||||
## Maggiore Scala
|
||||
|
||||
|
@ -82,7 +82,7 @@ Idx Name Size VMA Type
|
||||
3 __unwind_info 00000058 0000000100003fa8 DATA
|
||||
4 __got 00000008 0000000100004000 DATA
|
||||
```
|
||||
Nell'assemblaggio della sezione **`__stubs`**:
|
||||
Nella disassemblaggio della sezione **`__stubs`**:
|
||||
```bash
|
||||
objdump -d --section=__stubs ./load
|
||||
|
||||
@ -182,7 +182,7 @@ Risultato:
|
||||
|
||||
Questa è una struttura esportata da dyld con informazioni sullo stato di dyld che può essere trovata nel [**codice sorgente**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) con informazioni come la versione, puntatore all'array dyld_image_info, a dyld_image_notifier, se il processo è staccato dalla cache condivisa, se l'inizializzatore di libSystem è stato chiamato, puntatore all'intestazione Mach di dyls, puntatore alla stringa di versione di dyld...
|
||||
|
||||
## variabili d'ambiente dyld
|
||||
## dyld env variables
|
||||
|
||||
### debug dyld
|
||||
|
||||
@ -254,7 +254,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
### Altri
|
||||
|
||||
- `DYLD_BIND_AT_LAUNCH`: I legami pigri vengono risolti con quelli non pigri
|
||||
- `DYLD_DISABLE_PREFETCH`: Disabilita il pre-caricamento dei contenuti \_\_DATA e \_\_LINKEDIT
|
||||
- `DYLD_DISABLE_PREFETCH`: Disabilita il pre-fetching del contenuto \_\_DATA e \_\_LINKEDIT
|
||||
- `DYLD_FORCE_FLAT_NAMESPACE`: Legami a livello singolo
|
||||
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Percorsi di risoluzione
|
||||
- `DYLD_INSERT_LIBRARIES`: Carica una libreria specifica
|
||||
@ -264,12 +264,12 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
- `DYLD_PRINT_BINDINGS`: Stampa i simboli quando sono legati
|
||||
- `DYLD_WEAK_BINDINGS`: Stampa solo simboli deboli quando sono legati
|
||||
- `DYLD_PRINT_CODE_SIGNATURES`: Stampa le operazioni di registrazione della firma del codice
|
||||
- `DYLD_PRINT_DOFS`: Stampa le sezioni del formato oggetto D-Trace come caricate
|
||||
- `DYLD_PRINT_DOFS`: Stampa le sezioni del formato oggetto D-Trace caricate
|
||||
- `DYLD_PRINT_ENV`: Stampa l'ambiente visto da dyld
|
||||
- `DYLD_PRINT_INTERPOSTING`: Stampa le operazioni di interposizione
|
||||
- `DYLD_PRINT_INTERPOSTING`: Stampa le operazioni di interposting
|
||||
- `DYLD_PRINT_LIBRARIES`: Stampa le librerie caricate
|
||||
- `DYLD_PRINT_OPTS`: Stampa le opzioni di caricamento
|
||||
- `DYLD_REBASING`: Stampa le operazioni di riassegnazione dei simboli
|
||||
- `DYLD_REBASING`: Stampa le operazioni di ribasamento dei simboli
|
||||
- `DYLD_RPATHS`: Stampa le espansioni di @rpath
|
||||
- `DYLD_PRINT_SEGMENTS`: Stampa le mappature dei segmenti Mach-O
|
||||
- `DYLD_PRINT_STATISTICS`: Stampa le statistiche temporali
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Via `PERL5OPT` & `PERL5LIB` env variable
|
||||
## Tramite la variabile d'ambiente `PERL5OPT` & `PERL5LIB`
|
||||
|
||||
Utilizzando la variabile d'ambiente PERL5OPT è possibile far eseguire a perl comandi arbitrari.\
|
||||
Ad esempio, crea questo script:
|
||||
@ -10,12 +10,12 @@ Ad esempio, crea questo script:
|
||||
#!/usr/bin/perl
|
||||
print "Hello from the Perl script!\n";
|
||||
```
|
||||
Ora **esporta la variabile env** ed esegui lo **script perl**:
|
||||
Ora **esporta la variabile di ambiente** ed esegui lo **script perl**:
|
||||
```bash
|
||||
export PERL5OPT='-Mwarnings;system("whoami")'
|
||||
perl test.pl # This will execute "whoami"
|
||||
```
|
||||
Un'altra opzione è creare un modulo Perl (ad esempio, `/tmp/pmod.pm`):
|
||||
Un'altra opzione è creare un modulo Perl (ad es. `/tmp/pmod.pm`):
|
||||
```perl:/tmp/pmod.pm
|
||||
#!/usr/bin/perl
|
||||
package pmod;
|
||||
|
@ -14,7 +14,7 @@ Crea ovunque uno script ruby come:
|
||||
```ruby:hello.rb
|
||||
puts 'Hello, World!'
|
||||
```
|
||||
Quindi fai caricare un arbitrario script ruby con:
|
||||
Poi fai caricare un arbitrario script ruby con:
|
||||
```bash
|
||||
RUBYOPT="-I/tmp -rinject" ruby hello.rb
|
||||
```
|
||||
|
@ -69,7 +69,7 @@ Questo funziona con un **daemon** situato in `/System/Library/PrivateFrameworks/
|
||||
|
||||
Il modo in cui **`backgroundtaskmanagementd`** sa che qualcosa è installato in una cartella persistente è **ottenendo gli FSEvents** e creando alcuni **handler** per questi.
|
||||
|
||||
Inoltre, c'è un file plist che contiene **applicazioni ben note** che persistono frequentemente mantenuto da Apple situato in: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||
Inoltre, c'è un file plist che contiene **applicazioni ben note** che persistono frequentemente mantenute da Apple situato in: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
|
||||
```json
|
||||
[...]
|
||||
"us.zoom.ZoomDaemon" => {
|
||||
@ -124,7 +124,7 @@ kill -SIGSTOP 1011
|
||||
ps -o state 1011
|
||||
T
|
||||
```
|
||||
- **Bug**: Se il **processo che ha creato la persistenza esiste rapidamente dopo di esso**, il daemon cercherà di **ottenere informazioni** su di esso, **fallirà** e **non sarà in grado di inviare l'evento** che indica che una nuova cosa sta persistendo.
|
||||
- **Bug**: Se il **processo che ha creato la persistenza esiste rapidamente dopo di esso**, il demone cercherà di **ottenere informazioni** su di esso, **fallirà** e **non sarà in grado di inviare l'evento** che indica che una nuova cosa sta persistendo.
|
||||
|
||||
Riferimenti e **ulteriori informazioni su BTM**:
|
||||
|
||||
|
@ -76,9 +76,9 @@ Una volta ricevuto un messaggio tramite la porta speciale, **MIG** viene utilizz
|
||||
|
||||
## Provisioning Profiles
|
||||
|
||||
Un profilo di provisioning può essere utilizzato per firmare il codice. Ci sono profili **Developer** che possono essere utilizzati per firmare il codice e testarlo, e profili **Enterprise** che possono essere utilizzati su tutti i dispositivi.
|
||||
Un provisioning profile può essere utilizzato per firmare il codice. Ci sono profili **Developer** che possono essere utilizzati per firmare il codice e testarlo, e profili **Enterprise** che possono essere utilizzati su tutti i dispositivi.
|
||||
|
||||
Dopo che un'app è stata inviata all'Apple Store, se approvata, viene firmata da Apple e il profilo di provisioning non è più necessario.
|
||||
Dopo che un'app è stata inviata all'Apple Store, se approvata, viene firmata da Apple e il provisioning profile non è più necessario.
|
||||
|
||||
Un profilo di solito utilizza l'estensione `.mobileprovision` o `.provisionprofile` e può essere estratto con:
|
||||
```bash
|
||||
@ -92,7 +92,7 @@ Sebbene a volte siano chiamati certificati, questi profili di provisioning hanno
|
||||
|
||||
- **AppIDName:** L'Identificatore dell'Applicazione
|
||||
- **AppleInternalProfile**: Designa questo come un profilo Interno Apple
|
||||
- **ApplicationIdentifierPrefix**: Preceduto da AppIDName (stesso del TeamIdentifier)
|
||||
- **ApplicationIdentifierPrefix**: Preceduto da AppIDName (stesso di TeamIdentifier)
|
||||
- **CreationDate**: Data nel formato `YYYY-MM-DDTHH:mm:ssZ`
|
||||
- **DeveloperCertificates**: Un array di certificato(i) (di solito uno), codificato come dati Base64
|
||||
- **Entitlements**: I diritti consentiti con i diritti per questo profilo
|
||||
@ -116,11 +116,11 @@ Questa è la libreria esterna che `amfid` chiama per chiedere se dovrebbe consen
|
||||
|
||||
In macOS questo si trova all'interno di `MobileDevice.framework`.
|
||||
|
||||
## Cache di Fiducia AMFI
|
||||
## AMFI Trust Caches
|
||||
|
||||
iOS AMFI mantiene un elenco di hash noti che sono firmati ad-hoc, chiamato **Trust Cache** e trovato nella sezione `__TEXT.__const` del kext. Nota che in operazioni molto specifiche e sensibili è possibile estendere questa Trust Cache con un file esterno.
|
||||
iOS AMFI mantiene un elenco di hash noti che sono firmati ad-hoc, chiamato **Trust Cache** e trovato nella sezione `__TEXT.__const` del kext. Nota che in operazioni molto specifiche e sensibili è possibile estendere questo Trust Cache con un file esterno.
|
||||
|
||||
## Riferimenti
|
||||
## References
|
||||
|
||||
- [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
|
@ -21,7 +21,7 @@ Le regole sono memorizzate nella tabella `rules` all'interno del database e cont
|
||||
- **flags**: Contiene vari flag che modificano il comportamento e le caratteristiche della regola.
|
||||
- **tries**: Limita il numero di tentativi di autorizzazione consentiti per migliorare la sicurezza.
|
||||
- **version**: Tiene traccia della versione della regola per il controllo delle versioni e gli aggiornamenti.
|
||||
- **created**: Registra il timestamp quando la regola è stata creata per scopi di auditing.
|
||||
- **created**: Registra il timestamp quando la regola è stata creata per scopi di audit.
|
||||
- **modified**: Memorizza il timestamp dell'ultima modifica apportata alla regola.
|
||||
- **hash**: Contiene un valore hash della regola per garantire la sua integrità e rilevare manomissioni.
|
||||
- **identifier**: Fornisce un identificatore stringa unico, come un UUID, per riferimenti esterni alla regola.
|
||||
|
@ -106,7 +106,7 @@ Nota che ci sono diverse versioni di questa struttura in cui quelle vecchie potr
|
||||
## Pagine di Firma del Codice
|
||||
|
||||
Hashare l'intero binario sarebbe inefficiente e persino inutile se viene caricato in memoria solo parzialmente. Pertanto, la firma del codice è in realtà un hash di hash in cui ogni pagina binaria è hashata individualmente.\
|
||||
In effetti, nel precedente codice **Code Directory** puoi vedere che la **dimensione della pagina è specificata** in uno dei suoi campi. Inoltre, se la dimensione del binario non è un multiplo della dimensione di una pagina, il campo **CodeLimit** specifica dove si trova la fine della firma.
|
||||
In effetti, nel precedente codice **Code Directory** puoi vedere che **la dimensione della pagina è specificata** in uno dei suoi campi. Inoltre, se la dimensione del binario non è un multiplo della dimensione di una pagina, il campo **CodeLimit** specifica dove si trova la fine della firma.
|
||||
```bash
|
||||
# Get all hashes of /bin/ps
|
||||
codesign -d -vvvvvv /bin/ps
|
||||
@ -286,11 +286,11 @@ od -A x -t x1 /tmp/output.csreq
|
||||
|
||||
## Applicazione della Firma del Codice
|
||||
|
||||
Il **kernel** è quello che **controlla la firma del codice** prima di consentire l'esecuzione del codice dell'app. Inoltre, un modo per poter scrivere ed eseguire nuovo codice in memoria è abusare di JIT se `mprotect` viene chiamato con il flag `MAP_JIT`. Nota che l'applicazione ha bisogno di un diritto speciale per poter fare questo.
|
||||
Il **kernel** è quello che **controlla la firma del codice** prima di consentire l'esecuzione del codice dell'app. Inoltre, un modo per poter scrivere ed eseguire in memoria nuovo codice è abusare di JIT se `mprotect` viene chiamato con il flag `MAP_JIT`. Nota che l'applicazione ha bisogno di un diritto speciale per poter fare questo.
|
||||
|
||||
## `cs_blobs` & `cs_blob`
|
||||
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) struct contiene le informazioni sui diritti dell'entitlement del processo in esecuzione su di esso. `csb_platform_binary` informa anche se l'applicazione è un binario di piattaforma (che viene controllato in momenti diversi dal sistema operativo per applicare meccanismi di sicurezza come proteggere i diritti SEND ai porti di task di questi processi).
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) la struct contiene le informazioni sui diritti dell'entitlement del processo in esecuzione su di esso. `csb_platform_binary` informa anche se l'applicazione è un binario di piattaforma (che viene controllato in momenti diversi dal sistema operativo per applicare meccanismi di sicurezza come proteggere i diritti SEND ai porti di task di questi processi).
|
||||
```c
|
||||
struct cs_blob {
|
||||
struct cs_blob *csb_next;
|
||||
|
@ -17,15 +17,15 @@ L'autorizzazione **`com.apple.rootless.install`** consente di **bypassare SIP**.
|
||||
|
||||
### **`com.apple.system-task-ports` (precedentemente chiamato `task_for_pid-allow`)**
|
||||
|
||||
Questa autorizzazione consente di ottenere il **port task per qualsiasi** processo, tranne il kernel. Controlla [**questo per maggiori informazioni**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Questa autorizzazione consente di ottenere il **task port per qualsiasi** processo, tranne il kernel. Controlla [**questo per maggiori informazioni**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.get-task-allow`
|
||||
|
||||
Questa autorizzazione consente ad altri processi con l'autorizzazione **`com.apple.security.cs.debugger`** di ottenere il port task del processo eseguito dal binario con questa autorizzazione e **iniettare codice su di esso**. Controlla [**questo per maggiori informazioni**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
Questa autorizzazione consente ad altri processi con l'autorizzazione **`com.apple.security.cs.debugger`** di ottenere il task port del processo eseguito dal binario con questa autorizzazione e **iniettare codice su di esso**. Controlla [**questo per maggiori informazioni**](../macos-proces-abuse/macos-ipc-inter-process-communication/).
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Le app con l'autorizzazione Debugging Tool possono chiamare `task_for_pid()` per recuperare un port task valido per app non firmate e di terze parti con l'autorizzazione `Get Task Allow` impostata su `true`. Tuttavia, anche con l'autorizzazione dello strumento di debug, un debugger **non può ottenere i port task** di processi che **non hanno l'autorizzazione `Get Task Allow`**, e che sono quindi protetti dalla Protezione dell'Integrità di Sistema. Controlla [**questo per maggiori informazioni**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Le app con l'autorizzazione Debugging Tool possono chiamare `task_for_pid()` per recuperare un task port valido per app non firmate e di terze parti con l'autorizzazione `Get Task Allow` impostata su `true`. Tuttavia, anche con l'autorizzazione dello strumento di debug, un debugger **non può ottenere i task port** di processi che **non hanno l'autorizzazione `Get Task Allow`**, e che sono quindi protetti dalla Protezione dell'Integrità di Sistema. Controlla [**questo per maggiori informazioni**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
@ -46,7 +46,7 @@ Questa autorizzazione consente di **utilizzare variabili di ambiente DYLD** che
|
||||
|
||||
### **`system.install.apple-software`** e **`system.install.apple-software.standar-user`**
|
||||
|
||||
Queste autorizzazioni consentono di **installare software senza chiedere permessi** all'utente, il che può essere utile per un **elevazione di privilegi**.
|
||||
Queste autorizzazioni consentono di **installare software senza chiedere permessi** all'utente, il che può essere utile per un **privilege escalation**.
|
||||
|
||||
### `com.apple.private.security.kext-management`
|
||||
|
||||
@ -66,11 +66,11 @@ TODO: Non so cosa consenta di fare
|
||||
|
||||
### `com.apple.private.apfs.revert-to-snapshot`
|
||||
|
||||
TODO: In [**questo report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **si menziona che questo potrebbe essere usato per** aggiornare i contenuti protetti da SSV dopo un riavvio. Se sai come farlo invia una PR per favore!
|
||||
TODO: In [**questo report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **si menziona che questo potrebbe essere usato per** aggiornare i contenuti protetti da SSV dopo un riavvio. Se sai come farlo invia un PR per favore!
|
||||
|
||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||
|
||||
TODO: In [**questo report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **si menziona che questo potrebbe essere usato per** aggiornare i contenuti protetti da SSV dopo un riavvio. Se sai come farlo invia una PR per favore!
|
||||
TODO: In [**questo report**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **si menziona che questo potrebbe essere usato per** aggiornare i contenuti protetti da SSV dopo un riavvio. Se sai come farlo invia un PR per favore!
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
@ -97,7 +97,7 @@ Come farle chiedere all'utente la propria password:
|
||||
```bash
|
||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||
```
|
||||
Or farli eseguire **azioni arbitrarie**.
|
||||
O farli eseguire **azioni arbitrarie**.
|
||||
|
||||
### **`kTCCServiceEndpointSecurityClient`**
|
||||
|
||||
@ -117,7 +117,7 @@ Consente di modificare i file all'interno del bundle delle app (all'interno di a
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
Il processo sarà in grado di **abusare delle funzionalità di accessibilità di macOS**, il che significa che, ad esempio, sarà in grado di premere tasti. Quindi potrebbe richiedere l'accesso per controllare un'app come Finder e approvare la finestra di dialogo con questo permesso.
|
||||
Il processo sarà in grado di **abuse delle funzionalità di accessibilità di macOS**, il che significa che, ad esempio, sarà in grado di premere tasti. Quindi potrebbe richiedere l'accesso per controllare un'app come Finder e approvare la finestra di dialogo con questo permesso.
|
||||
|
||||
## Medio
|
||||
|
||||
@ -127,7 +127,7 @@ Questa autorizzazione consente di **creare memoria che è scrivibile ed eseguibi
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
Questa autorizzazione consente di **sovrascrivere o patchare codice C**, utilizzare il deprecato **`NSCreateObjectFileImageFromMemory`** (che è fondamentalmente insicuro) o utilizzare il framework **DVDPlayback**. Controlla [**questo per maggiori informazioni**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
Questa autorizzazione consente di **sovrascrivere o patchare codice C**, utilizzare il **`NSCreateObjectFileImageFromMemory`** (che è fondamentalmente insicuro), o utilizzare il framework **DVDPlayback**. Controlla [**questo per maggiori informazioni**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
|
||||
> [!CAUTION]
|
||||
> Includere questa autorizzazione espone la tua app a vulnerabilità comuni nei linguaggi di codice non sicuro in memoria. Considera attentamente se la tua app ha bisogno di questa eccezione.
|
||||
@ -137,7 +137,7 @@ Questa autorizzazione consente di **sovrascrivere o patchare codice C**, utilizz
|
||||
Questa autorizzazione consente di **modificare sezioni dei propri file eseguibili** su disco per uscire forzatamente. Controlla [**questo per maggiori informazioni**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection).
|
||||
|
||||
> [!CAUTION]
|
||||
> L'Autorizzazione per Disabilitare la Protezione della Memoria Eseguibile è un'autorizzazione estrema che rimuove una protezione fondamentale della sicurezza dalla tua app, rendendo possibile per un attaccante riscrivere il codice eseguibile della tua app senza essere rilevato. Preferisci autorizzazioni più ristrette se possibile.
|
||||
> L'Autorizzazione per Disabilitare la Protezione della Memoria Eseguibile è un'autorizzazione estrema che rimuove una protezione fondamentale della sicurezza dalla tua app, rendendo possibile per un attaccante riscrivere il codice eseguibile della tua app senza rilevamento. Preferisci autorizzazioni più ristrette se possibile.
|
||||
|
||||
### `com.apple.security.cs.allow-relative-library-loads`
|
||||
|
||||
|
@ -8,8 +8,8 @@ Permessi in una **directory**:
|
||||
|
||||
- **read** - puoi **enumerare** le voci della directory
|
||||
- **write** - puoi **eliminare/scrivere** **file** nella directory e puoi **eliminare cartelle vuote**.
|
||||
- Ma **non puoi eliminare/modificare cartelle non vuote** a meno che tu non abbia permessi di scrittura su di essa.
|
||||
- **Non puoi modificare il nome di una cartella** a meno che tu non sia il proprietario.
|
||||
- Ma non puoi **eliminare/modificare cartelle non vuote** a meno che tu non abbia permessi di scrittura su di essa.
|
||||
- Non puoi **modificare il nome di una cartella** a meno che tu non sia il proprietario.
|
||||
- **execute** - ti è **consentito di attraversare** la directory - se non hai questo diritto, non puoi accedere a nessun file al suo interno, né in alcuna sottodirectory.
|
||||
|
||||
### Combinazioni Pericolose
|
||||
@ -18,7 +18,7 @@ Permessi in una **directory**:
|
||||
|
||||
- Un **proprietario della directory** genitore nel percorso è l'utente
|
||||
- Un **proprietario della directory** genitore nel percorso è un **gruppo di utenti** con **accesso in scrittura**
|
||||
- Un **gruppo di utenti** ha **accesso in scrittura** al **file**
|
||||
- Un **gruppo di utenti** ha accesso **in scrittura** al **file**
|
||||
|
||||
Con una delle combinazioni precedenti, un attaccante potrebbe **iniettare** un **link simbolico/duro** nel percorso previsto per ottenere una scrittura arbitraria privilegiata.
|
||||
|
||||
@ -28,7 +28,7 @@ Se ci sono file in una **directory** dove **solo root ha accesso R+X**, questi *
|
||||
|
||||
Esempio in: [https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions](https://theevilbit.github.io/posts/exploiting_directory_permissions_on_macos/#nix-directory-permissions)
|
||||
|
||||
## Link Simbolico / Link Duro
|
||||
## Link simbolico / Link duro
|
||||
|
||||
### File/cartella permissivi
|
||||
|
||||
@ -38,7 +38,7 @@ Controlla nelle altre sezioni dove un attaccante potrebbe **sfruttare una scritt
|
||||
|
||||
### Open `O_NOFOLLOW`
|
||||
|
||||
Il flag `O_NOFOLLOW` quando utilizzato dalla funzione `open` non seguirà un symlink nell'ultimo componente del percorso, ma seguirà il resto del percorso. Il modo corretto per prevenire il seguire symlink nel percorso è utilizzare il flag `O_NOFOLLOW_ANY`.
|
||||
Il flag `O_NOFOLLOW` quando utilizzato dalla funzione `open` non seguirà un symlink nell'ultimo componente del percorso, ma seguirà il resto del percorso. Il modo corretto per prevenire il seguire i symlink nel percorso è utilizzare il flag `O_NOFOLLOW_ANY`.
|
||||
|
||||
## .fileloc
|
||||
|
||||
@ -86,7 +86,7 @@ ls -lO /tmp/asd
|
||||
```
|
||||
### defvfs mount
|
||||
|
||||
Un **devfs** mount **non supporta xattr**, maggiori informazioni in [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)
|
||||
Un **devfs** mount **non supporta xattr**, ulteriori informazioni in [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)
|
||||
```bash
|
||||
mkdir /tmp/mnt
|
||||
mount_devfs -o noowners none "/tmp/mnt"
|
||||
@ -124,7 +124,7 @@ Il formato di file **AppleDouble** copia un file inclusi i suoi ACE.
|
||||
|
||||
Nel [**codice sorgente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) è possibile vedere che la rappresentazione testuale dell'ACL memorizzata all'interno dell'xattr chiamato **`com.apple.acl.text`** verrà impostata come ACL nel file decompresso. Quindi, se hai compresso un'applicazione in un file zip con formato di file **AppleDouble** con un ACL che impedisce ad altri xattrs di essere scritti... l'xattr di quarantena non è stato impostato nell'applicazione:
|
||||
|
||||
Controlla il [**rapporto originale**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) per ulteriori informazioni.
|
||||
Controlla il [**report originale**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) per ulteriori informazioni.
|
||||
|
||||
Per replicare questo, dobbiamo prima ottenere la stringa acl corretta:
|
||||
```bash
|
||||
@ -144,7 +144,7 @@ ditto -c -k del test.zip
|
||||
ditto -x -k --rsrc test.zip .
|
||||
ls -le test
|
||||
```
|
||||
(Note that even if this works the sandbox write the quarantine xattr before)
|
||||
(Note che anche se questo funziona, la sandbox scrive l'attributo xattr di quarantena prima)
|
||||
|
||||
Non è davvero necessario, ma lo lascio lì giusto in caso:
|
||||
|
||||
@ -156,11 +156,11 @@ macos-xattr-acls-extra-stuff.md
|
||||
|
||||
### Bypass dei controlli dei binari di piattaforma
|
||||
|
||||
Al alcuni controlli di sicurezza verificano se il binario è un **binario di piattaforma**, ad esempio per consentire la connessione a un servizio XPC. Tuttavia, come esposto in un bypass in https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, è possibile aggirare questo controllo ottenendo un binario di piattaforma (come /bin/ls) e iniettando l'exploit tramite dyld utilizzando una variabile d'ambiente `DYLD_INSERT_LIBRARIES`.
|
||||
Al alcuni controlli di sicurezza verificano se il binario è un **binario di piattaforma**, ad esempio per consentire la connessione a un servizio XPC. Tuttavia, come esposto in un bypass in https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, è possibile bypassare questo controllo ottenendo un binario di piattaforma (come /bin/ls) e iniettando l'exploit tramite dyld utilizzando una variabile d'ambiente `DYLD_INSERT_LIBRARIES`.
|
||||
|
||||
### Bypass dei flag `CS_REQUIRE_LV` e `CS_FORCED_LV`
|
||||
|
||||
È possibile per un binario in esecuzione modificare i propri flag per aggirare i controlli con un codice come:
|
||||
È possibile per un binario in esecuzione modificare i propri flag per bypassare i controlli con un codice come:
|
||||
```c
|
||||
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
|
||||
int pid = getpid();
|
||||
@ -312,7 +312,7 @@ Poi, modifica di nuovo il file `/etc/cups/cups-files.conf` indicando `LogFilePer
|
||||
|
||||
## Genera file scrivibili come altri utenti
|
||||
|
||||
Questo genererà un file che appartiene a root e che è scrivibile da me ([**codice da qui**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Questo potrebbe funzionare anche come privesc:
|
||||
Questo genererà un file che appartiene a root e che è scrivibile da me ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Questo potrebbe funzionare anche come privesc:
|
||||
```bash
|
||||
DIRNAME=/usr/local/etc/periodic/daily
|
||||
|
||||
|
@ -2,13 +2,14 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Gatekeeper
|
||||
|
||||
**Gatekeeper** è una funzione di sicurezza sviluppata per i sistemi operativi Mac, progettata per garantire che gli utenti **eseguano solo software affidabile** sui loro sistemi. Funziona **validando il software** che un utente scarica e tenta di aprire da **fonti esterne all'App Store**, come un'app, un plug-in o un pacchetto di installazione.
|
||||
|
||||
Il meccanismo chiave di Gatekeeper risiede nel suo processo di **verifica**. Controlla se il software scaricato è **firmato da uno sviluppatore riconosciuto**, garantendo l'autenticità del software. Inoltre, accerta se il software è **notarizzato da Apple**, confermando che è privo di contenuti dannosi noti e non è stato manomesso dopo la notarizzazione.
|
||||
|
||||
Inoltre, Gatekeeper rafforza il controllo e la sicurezza dell'utente **richiedendo agli utenti di approvare l'apertura** del software scaricato per la prima volta. Questa misura di sicurezza aiuta a prevenire che gli utenti eseguano involontariamente codice eseguibile potenzialmente dannoso che potrebbero aver scambiato per un file di dati innocuo.
|
||||
Inoltre, Gatekeeper rafforza il controllo e la sicurezza dell'utente **richiedendo agli utenti di approvare l'apertura** del software scaricato per la prima volta. Questa protezione aiuta a prevenire che gli utenti eseguano involontariamente codice eseguibile potenzialmente dannoso che potrebbero aver scambiato per un file di dati innocuo.
|
||||
|
||||
### Application Signatures
|
||||
|
||||
@ -47,7 +48,7 @@ codesign -s <cert-name-keychain> toolsdemo
|
||||
|
||||
Il processo di notarizzazione di Apple funge da ulteriore protezione per proteggere gli utenti da software potenzialmente dannoso. Comporta che il **sviluppatore invii la propria applicazione per l'esame** da parte del **Servizio Notariale di Apple**, che non deve essere confuso con la Revisione dell'App. Questo servizio è un **sistema automatizzato** che esamina il software inviato per la presenza di **contenuti dannosi** e eventuali problemi con la firma del codice.
|
||||
|
||||
Se il software **supera** questa ispezione senza sollevare preoccupazioni, il Servizio Notariale genera un biglietto di notarizzazione. Il sviluppatore è quindi tenuto a **allegare questo biglietto al proprio software**, un processo noto come 'stapling.' Inoltre, il biglietto di notarizzazione è anche pubblicato online dove Gatekeeper, la tecnologia di sicurezza di Apple, può accedervi.
|
||||
Se il software **supera** questo controllo senza sollevare preoccupazioni, il Servizio Notariale genera un biglietto di notarizzazione. Il sviluppatore è quindi tenuto a **allegare questo biglietto al proprio software**, un processo noto come 'stapling.' Inoltre, il biglietto di notarizzazione è anche pubblicato online dove Gatekeeper, la tecnologia di sicurezza di Apple, può accedervi.
|
||||
|
||||
Al primo avvio o installazione del software da parte dell'utente, l'esistenza del biglietto di notarizzazione - sia che sia allegato all'eseguibile o trovato online - **informa Gatekeeper che il software è stato notarizzato da Apple**. Di conseguenza, Gatekeeper visualizza un messaggio descrittivo nella finestra di dialogo di avvio iniziale, indicando che il software è stato sottoposto a controlli per contenuti dannosi da parte di Apple. Questo processo aumenta quindi la fiducia degli utenti nella sicurezza del software che installano o eseguono sui propri sistemi.
|
||||
|
||||
@ -87,7 +88,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
|
||||
**`syspolicyd`** espone anche un server XPC con diverse operazioni come `assess`, `update`, `record` e `cancel` che sono anche raggiungibili utilizzando le API **`SecAssessment*`** di **`Security.framework`** e **`xpctl`** comunica effettivamente con **`syspolicyd`** tramite XPC.
|
||||
|
||||
Nota come la prima regola sia terminata in "**App Store**" e la seconda in "**Developer ID**" e che nell'immagine precedente era **abilitato ad eseguire app dall'App Store e sviluppatori identificati**.\
|
||||
Se **modifichi** quella impostazione su App Store, le "**regole del Developer ID Notarizzato" scompariranno**.
|
||||
Se **modifichi** quella impostazione in App Store, le "**regole Notarized Developer ID" scompariranno**.
|
||||
|
||||
Ci sono anche migliaia di regole di **tipo GKE** :
|
||||
```bash
|
||||
@ -290,7 +291,7 @@ Utilizza anche un paio di MIB:
|
||||
|
||||
### XProtect
|
||||
|
||||
XProtect è una funzionalità **anti-malware** integrata in macOS. XProtect **controlla qualsiasi applicazione quando viene avviata per la prima volta o modificata rispetto al suo database** di malware noti e tipi di file non sicuri. Quando scarichi un file tramite alcune app, come Safari, Mail o Messaggi, XProtect scansiona automaticamente il file. Se corrisponde a un malware noto nel suo database, XProtect **impedirà l'esecuzione del file** e ti avviserà della minaccia.
|
||||
XProtect è una funzionalità **anti-malware** integrata in macOS. XProtect **controlla qualsiasi applicazione quando viene avviata per la prima volta o modificata rispetto al suo database** di malware noti e tipi di file non sicuri. Quando scarichi un file tramite alcune app, come Safari, Mail o Messaggi, XProtect scansiona automaticamente il file. Se corrisponde a un malware noto nel suo database, XProtect **impedisce l'esecuzione del file** e ti avvisa della minaccia.
|
||||
|
||||
Il database di XProtect è **aggiornato regolarmente** da Apple con nuove definizioni di malware, e questi aggiornamenti vengono scaricati e installati automaticamente sul tuo Mac. Questo garantisce che XProtect sia sempre aggiornato con le ultime minacce conosciute.
|
||||
|
||||
@ -305,7 +306,7 @@ XProtect si trova in una posizione protetta da SIP in **/Library/Apple/System/Li
|
||||
- **`XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist`**: Consente al codice con quei cdhash di utilizzare diritti legacy.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.meta.plist`**: Elenco di plugin ed estensioni che non sono autorizzati a caricarsi tramite BundleID e TeamID o che indicano una versione minima.
|
||||
- **`XProtect.bundle/Contents/Resources/XProtect.yara`**: Regole Yara per rilevare malware.
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: Database SQLite3 con hash di applicazioni bloccate e TeamIDs.
|
||||
- **`XProtect.bundle/Contents/Resources/gk.db`**: Database SQLite3 con hash delle applicazioni bloccate e TeamIDs.
|
||||
|
||||
Nota che c'è un'altra App in **`/Library/Apple/System/Library/CoreServices/XProtect.app`** relativa a XProtect che non è coinvolta nel processo di Gatekeeper.
|
||||
|
||||
@ -314,9 +315,9 @@ Nota che c'è un'altra App in **`/Library/Apple/System/Library/CoreServices/XPro
|
||||
> [!CAUTION]
|
||||
> Nota che Gatekeeper **non viene eseguito ogni volta** che esegui un'applicazione, solo _**AppleMobileFileIntegrity**_ (AMFI) **verificherà le firme del codice eseguibile** quando esegui un'app che è già stata eseguita e verificata da Gatekeeper.
|
||||
|
||||
Pertanto, in precedenza era possibile eseguire un'app per memorizzarla nella cache con Gatekeeper, quindi **modificare file non eseguibili dell'applicazione** (come file Electron asar o NIB) e se non erano in atto altre protezioni, l'applicazione veniva **eseguita** con le aggiunte **maligne**.
|
||||
Pertanto, in precedenza era possibile eseguire un'app per memorizzarla nella cache con Gatekeeper, quindi **modificare file non eseguibili dell'applicazione** (come file asar di Electron o file NIB) e se non erano in atto altre protezioni, l'applicazione veniva **eseguita** con le aggiunte **maligne**.
|
||||
|
||||
Tuttavia, ora questo non è più possibile perché macOS **impedisce di modificare i file** all'interno dei bundle delle applicazioni. Quindi, se provi l'attacco [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), scoprirai che non è più possibile abusarne perché dopo aver eseguito l'app per memorizzarla nella cache con Gatekeeper, non sarai in grado di modificare il bundle. E se cambi, ad esempio, il nome della directory Contents in NotCon (come indicato nell'exploit), e poi esegui il binario principale dell'app per memorizzarla nella cache con Gatekeeper, si verificherà un errore e non verrà eseguito.
|
||||
Tuttavia, ora questo non è più possibile perché macOS **impedisce di modificare i file** all'interno dei bundle delle applicazioni. Quindi, se provi l'attacco [Dirty NIB](../macos-proces-abuse/macos-dirty-nib.md), scoprirai che non è più possibile abusarne perché dopo aver eseguito l'app per memorizzarla nella cache con Gatekeeper, non sarai in grado di modificare il bundle. E se cambi, ad esempio, il nome della directory Contents in NotCon (come indicato nell'exploit), e poi esegui il binario principale dell'app per memorizzarla nella cache con Gatekeeper, si verificherà un errore e non verrà eseguita.
|
||||
|
||||
## Bypass di Gatekeeper
|
||||
|
||||
@ -326,7 +327,7 @@ Qualsiasi modo per bypassare Gatekeeper (riuscire a far scaricare qualcosa all'u
|
||||
|
||||
È stato osservato che se si utilizza **Archive Utility** per l'estrazione, i file con **percorsi superiori a 886 caratteri** non ricevono l'attributo esteso com.apple.quarantine. Questa situazione consente involontariamente a quei file di **eludere i controlli di sicurezza di Gatekeeper**.
|
||||
|
||||
Controlla il [**rapporto originale**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) per ulteriori informazioni.
|
||||
Controlla il [**report originale**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) per ulteriori informazioni.
|
||||
|
||||
### [CVE-2021-30990](https://ronmasas.com/posts/bypass-macos-gatekeeper)
|
||||
|
||||
@ -334,9 +335,9 @@ Quando un'applicazione viene creata con **Automator**, le informazioni su ciò d
|
||||
|
||||
Pertanto, potresti far sì che `application.app/Contents/MacOS/Automator\ Application\ Stub` **punti con un link simbolico a un altro Automator Application Stub all'interno del sistema** e eseguirà ciò che si trova in `document.wflow` (il tuo script) **senza attivare Gatekeeper** perché l'effettivo eseguibile non ha l'attributo di quarantena xattr.
|
||||
|
||||
Esempio di posizione prevista: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
Esempio di posizione attesa: `/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub`
|
||||
|
||||
Controlla il [**rapporto originale**](https://ronmasas.com/posts/bypass-macos-gatekeeper) per ulteriori informazioni.
|
||||
Controlla il [**report originale**](https://ronmasas.com/posts/bypass-macos-gatekeeper) per ulteriori informazioni.
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
@ -348,7 +349,7 @@ Controlla il [**rapporto originale**](https://www.jamf.com/blog/jamf-threat-labs
|
||||
|
||||
### [CVE-2022-32910](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32910)
|
||||
|
||||
Anche se i componenti sono diversi, lo sfruttamento di questa vulnerabilità è molto simile a quello precedente. In questo caso genereremo un Apple Archive da **`application.app/Contents`** in modo che **`application.app` non riceva l'attributo di quarantena** quando viene decompresso da **Archive Utility**.
|
||||
Anche se i componenti sono diversi, lo sfruttamento di questa vulnerabilità è molto simile a quello precedente. In questo caso genereremo un Apple Archive da **`application.app/Contents`** in modo che **`application.app` non ottenga l'attributo di quarantena** quando viene decompresso da **Archive Utility**.
|
||||
```bash
|
||||
aa archive -d test.app/Contents -o test.app.aar
|
||||
```
|
||||
@ -397,7 +398,7 @@ aa archive -d test/ -o test.aar
|
||||
|
||||
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
|
||||
```
|
||||
Essere in grado di creare un file che non avrà l'attributo di quarantena ha reso **possibile bypassare Gatekeeper.** Il trucco consiste nel **creare un'applicazione file DMG** utilizzando la convenzione di denominazione AppleDouble (iniziarla con `._`) e creare un **file visibile come un link simbolico a questo file nascosto** senza l'attributo di quarantena.\
|
||||
Essere in grado di creare un file che non avrà l'attributo di quarantena, era **possibile bypassare Gatekeeper.** Il trucco era **creare un'applicazione file DMG** utilizzando la convenzione di denominazione AppleDouble (iniziarla con `._`) e creare un **file visibile come un link simbolico a questo file nascosto** senza l'attributo di quarantena.\
|
||||
Quando il **file dmg viene eseguito**, poiché non ha un attributo di quarantena, **bypasserà Gatekeeper.**
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informazioni di base
|
||||
## Basic Information
|
||||
|
||||
I vincoli di avvio in macOS sono stati introdotti per migliorare la sicurezza **regolando come, chi e da dove un processo può essere avviato**. Iniziati in macOS Ventura, forniscono un framework che categorizza **ogni binario di sistema in distinte categorie di vincolo**, definite all'interno della **trust cache**, un elenco contenente i binari di sistema e i loro rispettivi hash. Questi vincoli si estendono a ogni binario eseguibile all'interno del sistema, comportando un insieme di **regole** che delineano i requisiti per **lanciare un particolare binario**. Le regole comprendono vincoli autoimposti che un binario deve soddisfare, vincoli parentali che devono essere soddisfatti dal suo processo padre e vincoli di responsabilità a cui devono attenersi altre entità rilevanti.
|
||||
I vincoli di avvio in macOS sono stati introdotti per migliorare la sicurezza **regolando come, chi e da dove un processo può essere avviato**. Iniziati in macOS Ventura, forniscono un framework che categorizza **ogni binario di sistema in distinte categorie di vincoli**, definiti all'interno della **trust cache**, un elenco contenente i binari di sistema e i loro rispettivi hash. Questi vincoli si estendono a ogni binario eseguibile all'interno del sistema, comportando un insieme di **regole** che delineano i requisiti per **lanciare un particolare binario**. Le regole comprendono vincoli autoimposti che un binario deve soddisfare, vincoli parentali che devono essere soddisfatti dal suo processo padre e vincoli di responsabilità a cui devono attenersi altre entità rilevanti.
|
||||
|
||||
Il meccanismo si estende alle app di terze parti attraverso **Environment Constraints**, a partire da macOS Sonoma, consentendo agli sviluppatori di proteggere le loro app specificando un **insieme di chiavi e valori per i vincoli ambientali.**
|
||||
|
||||
@ -21,7 +21,7 @@ Quindi, quando un processo cerca di avviare un altro processo — chiamando `exe
|
||||
|
||||
Se durante il caricamento di una libreria qualsiasi parte del **vincolo della libreria non è vera**, il tuo processo **non carica** la libreria.
|
||||
|
||||
## Categorie LC
|
||||
## LC Categories
|
||||
|
||||
Un LC è composto da **fatti** e **operazioni logiche** (e, o..) che combinano fatti.
|
||||
|
||||
@ -58,15 +58,15 @@ Hai più informazioni [**a riguardo qui**](https://theevilbit.github.io/posts/la
|
||||
|
||||
## Vincoli Ambientali
|
||||
|
||||
Questi sono i Vincoli di Lancio impostati configurati in **applicazioni di terze parti**. Lo sviluppatore può selezionare i **fatti** e **gli operatori logici da utilizzare** nella sua applicazione per limitare l'accesso a se stesso.
|
||||
Questi sono i Vincoli di Lancio impostati nelle **applicazioni di terze parti**. Lo sviluppatore può selezionare i **fatti** e **gli operatori logici da utilizzare** nella sua applicazione per limitare l'accesso a se stesso.
|
||||
|
||||
È possibile enumerare i Vincoli Ambientali di un'applicazione con:
|
||||
```bash
|
||||
codesign -d -vvvv app.app
|
||||
```
|
||||
## Trust Caches
|
||||
## Cache di Fiducia
|
||||
|
||||
In **macOS** ci sono alcuni cache di fiducia:
|
||||
In **macOS** ci sono alcune cache di fiducia:
|
||||
|
||||
- **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/BaseSystemTrustCache.img4`**
|
||||
- **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`**
|
||||
@ -75,11 +75,11 @@ In **macOS** ci sono alcuni cache di fiducia:
|
||||
E in iOS sembra che si trovi in **`/usr/standalone/firmware/FUD/StaticTrustCache.img4`**.
|
||||
|
||||
> [!WARNING]
|
||||
> Su macOS che gira su dispositivi Apple Silicon, se un binario firmato da Apple non è nel cache di fiducia, AMFI rifiuterà di caricarlo.
|
||||
> Su macOS che gira su dispositivi Apple Silicon, se un binario firmato da Apple non è nella cache di fiducia, AMFI rifiuterà di caricarlo.
|
||||
|
||||
### Enumerating Trust Caches
|
||||
### Enumerare le Cache di Fiducia
|
||||
|
||||
I precedenti file di cache di fiducia sono nel formato **IMG4** e **IM4P**, essendo IM4P la sezione payload di un formato IMG4.
|
||||
I precedenti file di cache di fiducia sono nel formato **IMG4** e **IM4P**, con IM4P che rappresenta la sezione payload di un formato IMG4.
|
||||
|
||||
Puoi usare [**pyimg4**](https://github.com/m1stadev/PyIMG4) per estrarre il payload dei database:
|
||||
```bash
|
||||
@ -123,7 +123,7 @@ entry count = 969
|
||||
01e6934cb8833314ea29640c3f633d740fc187f2 [none] [2] [2]
|
||||
020bf8c388deaef2740d98223f3d2238b08bab56 [none] [2] [3]
|
||||
```
|
||||
La cache di fiducia segue la seguente struttura, quindi **la categoria LC è la quarta colonna**
|
||||
La cache di fiducia segue la seguente struttura, quindi la **categoria LC è la 4ª colonna**
|
||||
```c
|
||||
struct trust_cache_entry2 {
|
||||
uint8_t cdhash[CS_CDHASH_LEN];
|
||||
@ -135,11 +135,11 @@ uint8_t reserved0;
|
||||
```
|
||||
Poi, puoi utilizzare uno script come [**questo**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) per estrarre dati.
|
||||
|
||||
Da quei dati puoi controllare le App con un **valore di vincoli di avvio di `0`**, che sono quelle che non sono vincolate ([**controlla qui**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) per cosa rappresenta ogni valore).
|
||||
Da quei dati puoi controllare le App con un **valore di vincoli di avvio di `0`**, che sono quelle che non sono vincolate ([**controlla qui**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) per cosa rappresenta ciascun valore).
|
||||
|
||||
## Mitigazioni degli attacchi
|
||||
|
||||
I vincoli di avvio avrebbero mitigato diversi attacchi vecchi **assicurandosi che il processo non venga eseguito in condizioni inaspettate:** Ad esempio, da posizioni inaspettate o invocato da un processo padre inaspettato (se solo launchd dovrebbe lanciarlo).
|
||||
I vincoli di avvio avrebbero mitigato diversi attacchi vecchi **assicurandosi che il processo non venga eseguito in condizioni inaspettate:** Ad esempio, da posizioni inaspettate o invocato da un processo padre inaspettato (se solo launchd dovrebbe avviarlo).
|
||||
|
||||
Inoltre, i vincoli di avvio **mitigano anche gli attacchi di downgrade.**
|
||||
|
||||
|
@ -18,7 +18,7 @@ Si noti che MACF non prende realmente decisioni, poiché **intercetta** solo le
|
||||
6. Le policy indicano se consentono o negano l'azione
|
||||
|
||||
> [!CAUTION]
|
||||
> Apple è l'unica che può utilizzare il KPI del MAC Framework.
|
||||
> Apple è l'unica in grado di utilizzare il KPI del MAC Framework.
|
||||
|
||||
### Etichette
|
||||
|
||||
@ -157,17 +157,17 @@ error = mac_error_select(__step_err, error); \
|
||||
}); \
|
||||
} while (0)
|
||||
```
|
||||
Quale passerà in rassegna tutte le politiche mac registrate chiamando le loro funzioni e memorizzando l'output all'interno della variabile di errore, che sarà sovrascrivibile solo da `mac_error_select` tramite codici di successo, quindi se un controllo fallisce, il controllo completo fallirà e l'azione non sarà consentita.
|
||||
Quale passerà in rassegna tutte le politiche mac registrate chiamando le loro funzioni e memorizzando l'output all'interno della variabile error, che sarà sovrascrivibile solo da `mac_error_select` tramite codici di successo, quindi se un controllo fallisce, il controllo completo fallirà e l'azione non sarà consentita.
|
||||
|
||||
> [!TIP]
|
||||
> Tuttavia, ricorda che non tutte le chiamate MACF sono utilizzate solo per negare azioni. Ad esempio, `mac_priv_grant` chiama il macro [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), che concederà il privilegio richiesto se qualche politica risponde con un 0:
|
||||
>
|
||||
> ```c
|
||||
> /*
|
||||
> * MAC_GRANT esegue il controllo designato attraversando l'elenco dei moduli
|
||||
> * MAC_GRANT esegue il controllo designato attraversando la lista dei moduli
|
||||
> * di politica e controllando con ciascuno come si sente riguardo alla
|
||||
> * richiesta. A differenza di MAC_CHECK, concede se qualche politica restituisce '0',
|
||||
> * e altrimenti restituisce EPERM. Nota che restituisce il suo valore tramite
|
||||
> * richiesta. A differenza di MAC_CHECK, concede se qualche politica restituisce '0',
|
||||
> * e altrimenti restituisce EPERM. Nota che restituisce il suo valore tramite
|
||||
> * 'error' nel contesto del chiamante.
|
||||
> */
|
||||
> #define MAC_GRANT(check, args...) do { \
|
||||
|
@ -54,7 +54,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
|
||||
drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Nota che anche se i symlink sono presenti per "uscire" dal Sandbox e accedere ad altre cartelle, l'App deve comunque **avere i permessi** per accedervi. Questi permessi si trovano all'interno del **`.plist`** in `RedirectablePaths`.
|
||||
> Nota che anche se i symlink sono presenti per "uscire" dal Sandbox e accedere ad altre cartelle, l'App deve comunque **avere permessi** per accedervi. Questi permessi sono all'interno del **`.plist`** in `RedirectablePaths`.
|
||||
|
||||
Il **`SandboxProfileData`** è il profilo sandbox compilato CFData codificato in B64.
|
||||
```bash
|
||||
@ -106,7 +106,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
||||
[...]
|
||||
```
|
||||
> [!WARNING]
|
||||
> Tutto ciò che viene creato/modificato da un'applicazione in Sandbox riceverà l'**attributo di quarantena**. Questo impedirà a uno spazio sandbox di attivare Gatekeeper se l'app sandbox tenta di eseguire qualcosa con **`open`**.
|
||||
> Tutto ciò che viene creato/modificato da un'applicazione Sandboxed riceverà l'**attributo di quarantena**. Questo impedirà a uno spazio sandbox di attivare Gatekeeper se l'app sandbox tenta di eseguire qualcosa con **`open`**.
|
||||
|
||||
## Profili Sandbox
|
||||
|
||||
@ -133,7 +133,7 @@ Qui puoi trovare un esempio:
|
||||
> [!TIP]
|
||||
> Controlla questa [**ricerca**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **per verificare ulteriori azioni che potrebbero essere consentite o negate.**
|
||||
>
|
||||
> Nota che nella versione compilata di un profilo, il nome delle operazioni è sostituito dalle loro voci in un array conosciuto dalla dylib e dal kext, rendendo la versione compilata più corta e più difficile da leggere.
|
||||
> Nota che nella versione compilata di un profilo i nomi delle operazioni sono sostituiti dalle loro voci in un array conosciuto dalla dylib e dal kext, rendendo la versione compilata più corta e più difficile da leggere.
|
||||
|
||||
Importanti **servizi di sistema** vengono eseguiti all'interno del loro **sandbox** personalizzato, come il servizio `mdnsresponder`. Puoi visualizzare questi **profili sandbox** personalizzati all'interno di:
|
||||
|
||||
@ -227,7 +227,7 @@ In `/tmp/trace.out` potrai vedere ogni controllo della sandbox eseguito ogni vol
|
||||
#### Via API
|
||||
|
||||
La funzione `sandbox_set_trace_path` esportata da `libsystem_sandbox.dylib` consente di specificare un nome file di traccia in cui verranno scritti i controlli della sandbox.\
|
||||
È anche possibile fare qualcosa di simile chiamando `sandbox_vtrace_enable()` e poi ottenendo i log degli errori dal buffer chiamando `sandbox_vtrace_report()`.
|
||||
È anche possibile fare qualcosa di simile chiamando `sandbox_vtrace_enable()` e poi ottenendo i log di errore dal buffer chiamando `sandbox_vtrace_report()`.
|
||||
|
||||
### Ispezione della Sandbox
|
||||
|
||||
@ -267,7 +267,7 @@ Inoltre, per confinare un processo all'interno di un contenitore, potrebbe chiam
|
||||
|
||||
Su macOS, a differenza di iOS dove i processi sono sandboxati fin dall'inizio dal kernel, **i processi devono optare per la sandbox da soli**. Ciò significa che su macOS, un processo non è limitato dalla sandbox fino a quando non decide attivamente di entrarvi, anche se le app dell'App Store sono sempre sandboxate.
|
||||
|
||||
I processi sono automaticamente sandboxati dal userland quando iniziano se hanno il diritto: `com.apple.security.app-sandbox`. Per una spiegazione dettagliata di questo processo controlla:
|
||||
I processi vengono automaticamente sandboxati dal userland quando iniziano se hanno il diritto: `com.apple.security.app-sandbox`. Per una spiegazione dettagliata di questo processo controlla:
|
||||
|
||||
{{#ref}}
|
||||
macos-sandbox-debug-and-bypass/
|
||||
@ -343,8 +343,8 @@ La chiamata della funzione `___sandbox_ms` avvolge `mac_syscall` indicando nel p
|
||||
- **reference_retain_by_audit_token (#28)**: Crea un riferimento per un token di audit da utilizzare nei controlli del sandbox.
|
||||
- **reference_release (#29)**: Rilascia un riferimento a un token di audit precedentemente mantenuto.
|
||||
- **rootless_allows_task_for_pid (#30)**: Verifica se `task_for_pid` è consentito (simile ai controlli `csr`).
|
||||
- **rootless_whitelist_push (#31)**: (macOS) Applica un file manifesto di Protezione Integrità di Sistema (SIP).
|
||||
- **rootless_whitelist_check (preflight) (#32)**: Controlla il file manifesto SIP prima dell'esecuzione.
|
||||
- **rootless_whitelist_push (#31)**: (macOS) Applica un file di manifest di System Integrity Protection (SIP).
|
||||
- **rootless_whitelist_check (preflight) (#32)**: Controlla il file di manifest SIP prima dell'esecuzione.
|
||||
- **rootless_protected_volume (#33)**: (macOS) Applica protezioni SIP a un disco o partizione.
|
||||
- **rootless_mkdir_protected (#34)**: Applica protezione SIP/DataVault a un processo di creazione di directory.
|
||||
|
||||
@ -360,7 +360,7 @@ Nota che in iOS l'estensione del kernel contiene **tutti i profili hardcoded** a
|
||||
|
||||
**`Sandbox.kext`** utilizza più di un centinaio di hook tramite MACF. La maggior parte degli hook controllerà solo alcuni casi banali che consentono di eseguire l'azione, altrimenti chiameranno **`cred_sb_evalutate`** con le **credenziali** da MACF e un numero corrispondente all'**operazione** da eseguire e un **buffer** per l'output.
|
||||
|
||||
Un buon esempio di ciò è la funzione **`_mpo_file_check_mmap`** che ha agganciato **`mmap`** e che inizierà a controllare se la nuova memoria sarà scrivibile (e se non lo è, consentirà l'esecuzione), poi controllerà se è utilizzata per la cache condivisa dyld e, se sì, consentirà l'esecuzione, e infine chiamerà **`sb_evaluate_internal`** (o uno dei suoi wrapper) per eseguire ulteriori controlli di autorizzazione.
|
||||
Un buon esempio di ciò è la funzione **`_mpo_file_check_mmap`** che ha collegato **`mmap`** e che inizierà a controllare se la nuova memoria sarà scrivibile (e se non lo è, consentirà l'esecuzione), poi controllerà se è utilizzata per la cache condivisa dyld e, se sì, consentirà l'esecuzione, e infine chiamerà **`sb_evaluate_internal`** (o uno dei suoi wrapper) per eseguire ulteriori controlli di autorizzazione.
|
||||
|
||||
Inoltre, tra i centinaia di hook utilizzati da Sandbox, ce ne sono 3 in particolare che sono molto interessanti:
|
||||
|
||||
|
@ -94,7 +94,7 @@ EOF
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
4. Firmare l'app (è necessario creare un certificato nel portachiavi)
|
||||
4. Firma l'app (devi creare un certificato nel portachiavi)
|
||||
```bash
|
||||
codesign --entitlements entitlements.plist -s "YourIdentity" SandboxedShellApp.app
|
||||
./SandboxedShellApp.app/Contents/MacOS/SandboxedShellApp
|
||||
|
@ -10,7 +10,7 @@ Nell'immagine precedente è possibile osservare **come il sandbox verrà caricat
|
||||
|
||||
Il compilatore collegherà `/usr/lib/libSystem.B.dylib` al binario.
|
||||
|
||||
Poi, **`libSystem.B`** chiamerà altre diverse funzioni fino a quando **`xpc_pipe_routine`** invia i diritti dell'app a **`securityd`**. Securityd verifica se il processo deve essere messo in quarantena all'interno del Sandbox, e se sì, verrà messo in quarantena.\
|
||||
Poi, **`libSystem.B`** chiamerà altre funzioni fino a quando **`xpc_pipe_routine`** invia i diritti dell'app a **`securityd`**. Securityd verifica se il processo deve essere messo in quarantena all'interno del Sandbox, e se sì, verrà messo in quarantena.\
|
||||
Infine, il sandbox verrà attivato con una chiamata a **`__sandbox_ms`** che chiamerà **`__mac_syscall`**.
|
||||
|
||||
## Possibili Bypass
|
||||
@ -22,7 +22,7 @@ Infine, il sandbox verrà attivato con una chiamata a **`__sandbox_ms`** che chi
|
||||
Questo è ciò che è stato fatto in [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**.**
|
||||
|
||||
> [!CAUTION]
|
||||
> Pertanto, al momento, se sei solo in grado di creare una cartella con un nome che termina in **`.app`** senza un attributo di quarantena, puoi sfuggire al sandbox perché macOS **controlla** solo l'**attributo di quarantena** nella **cartella `.app`** e nell'**eseguibile principale** (e faremo puntare l'eseguibile principale a **`/bin/bash`**).
|
||||
> Pertanto, al momento, se sei in grado di creare una cartella con un nome che termina in **`.app`** senza un attributo di quarantena, puoi sfuggire al sandbox perché macOS **controlla** solo l'**attributo di quarantena** nella **cartella `.app`** e nell'**eseguibile principale** (e faremo puntare l'eseguibile principale a **`/bin/bash`**).
|
||||
>
|
||||
> Nota che se un pacchetto .app è già stato autorizzato a essere eseguito (ha un xttr di quarantena con il flag autorizzato a essere eseguito attivato), potresti anche abusarne... tranne che ora non puoi scrivere all'interno dei pacchetti **`.app`** a meno che tu non abbia alcuni permessi TCC privilegiati (che non avrai all'interno di un sandbox alto).
|
||||
|
||||
@ -37,7 +37,7 @@ macos-office-sandbox-bypasses.md
|
||||
### Launch Agents/Daemons
|
||||
|
||||
Anche se un'applicazione è **destinata a essere sandboxed** (`com.apple.security.app-sandbox`), è possibile bypassare il sandbox se viene **eseguita da un LaunchAgent** (`~/Library/LaunchAgents`), per esempio.\
|
||||
Come spiegato in [**questo post**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), se vuoi ottenere persistenza con un'applicazione che è sandboxed potresti farla eseguire automaticamente come un LaunchAgent e magari iniettare codice malevolo tramite variabili d'ambiente DyLib.
|
||||
Come spiegato in [**questo post**](https://www.vicarius.io/vsociety/posts/cve-2023-26818-sandbox-macos-tcc-bypass-w-telegram-using-dylib-injection-part-2-3?q=CVE-2023-26818), se vuoi ottenere persistenza con un'applicazione che è sandboxed, potresti farla eseguire automaticamente come un LaunchAgent e magari iniettare codice malevolo tramite variabili d'ambiente DyLib.
|
||||
|
||||
### Abuso delle posizioni di avvio automatico
|
||||
|
||||
@ -61,7 +61,7 @@ Se da quel processo sandbox sei in grado di **compromettere altri processi** in
|
||||
|
||||
### Servizi Mach di sistema e utente disponibili
|
||||
|
||||
Il sandbox consente anche di comunicare con determinati **servizi Mach** tramite XPC definiti nel profilo `application.sb`. Se riesci ad **abusare** di uno di questi servizi potresti essere in grado di **sfuggire al sandbox**.
|
||||
Il sandbox consente anche di comunicare con determinati **servizi Mach** tramite XPC definiti nel profilo `application.sb`. Se riesci ad **abusare** di uno di questi servizi, potresti essere in grado di **sfuggire al sandbox**.
|
||||
|
||||
Come indicato in [questo writeup](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), le informazioni sui servizi Mach sono memorizzate in `/System/Library/xpc/launchd.plist`. È possibile trovare tutti i servizi Mach di sistema e utente cercando all'interno di quel file per `<string>System</string>` e `<string>User</string>`.
|
||||
|
||||
@ -96,7 +96,7 @@ Per **contattare un servizio XPC del dominio PID**, è sufficiente registrarlo a
|
||||
```objectivec
|
||||
[[NSBundle bundleWithPath:@“/System/Library/PrivateFrameworks/ShoveService.framework"]load];
|
||||
```
|
||||
Inoltre, è possibile trovare tutti i servizi Mach delle **Applicazioni** cercando all'interno di `System/Library/xpc/launchd.plist` per `<string>Application</string>`.
|
||||
Inoltre, è possibile trovare tutti i servizi Mach **Application** cercando all'interno di `System/Library/xpc/launchd.plist` per `<string>Application</string>`.
|
||||
|
||||
Un altro modo per trovare servizi xpc validi è controllare quelli in:
|
||||
```bash
|
||||
@ -134,7 +134,7 @@ Questo servizio XPC consentiva a ogni client di restituire sempre YES e il metod
|
||||
|
||||
Pertanto, è possibile generare una falsa struttura di cartelle dell'app, comprimerla, quindi decomprimerla ed eseguirla per sfuggire al sandbox poiché i nuovi file non avranno l'attributo di quarantena.
|
||||
|
||||
Lo sfruttamento era:
|
||||
L'exploit era:
|
||||
```objectivec
|
||||
@protocol AudioAnalyticsHelperServiceProtocol
|
||||
-(void)pruneZips:(NSString *)path hourThreshold:(int)threshold withReply:(void (^)(id *))reply;
|
||||
@ -379,7 +379,7 @@ codesign -s <cert-name> --entitlements entitlements.xml sand
|
||||
> echo "Sandbox Bypassed" > ~/Desktop/del.txt
|
||||
> ```
|
||||
|
||||
Debugghiamo l'applicazione per vedere quando viene caricato il Sandbox:
|
||||
Vediamo di fare il debug dell'applicazione per vedere quando viene caricato il Sandbox:
|
||||
```bash
|
||||
# Load app in debugging
|
||||
lldb ./sand
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
L'applicazione utilizza un **Sandbox personalizzato** usando il diritto **`com.apple.security.temporary-exception.sbpl`** e questo sandbox personalizzato consente di scrivere file ovunque purché il nome del file inizi con `~$`: `(require-any (require-all (vnode-type REGULAR-FILE) (regex #"(^|/)~$[^/]+$")))`
|
||||
|
||||
Pertanto, l'escape era facile come **scrivere un `plist`** LaunchAgent in `~/Library/LaunchAgents/~$escape.plist`.
|
||||
Pertanto, l'escape è stato facile come **scrivere un `plist`** LaunchAgent in `~/Library/LaunchAgents/~$escape.plist`.
|
||||
|
||||
Controlla il [**report originale qui**](https://www.mdsec.co.uk/2018/08/escaping-the-sandbox-microsoft-office-on-macos/).
|
||||
|
||||
@ -16,7 +16,7 @@ Ricorda che dal primo escape, Word può scrivere file arbitrari il cui nome iniz
|
||||
|
||||
È stato scoperto che dall'interno del sandbox è possibile creare un **Login Item** (app che verranno eseguite quando l'utente accede). Tuttavia, queste app **non verranno eseguite a meno che** non siano **notarizzate** e **non è possibile aggiungere argomenti** (quindi non puoi semplicemente eseguire una reverse shell usando **`bash`**).
|
||||
|
||||
Dalla precedente bypass del Sandbox, Microsoft ha disabilitato l'opzione di scrivere file in `~/Library/LaunchAgents`. Tuttavia, è stato scoperto che se metti un **file zip come Login Item**, l'`Archive Utility` lo **decomprimerà** semplicemente nella sua posizione attuale. Quindi, poiché per impostazione predefinita la cartella `LaunchAgents` di `~/Library` non viene creata, è stato possibile **zipare un plist in `LaunchAgents/~$escape.plist`** e **posizionare** il file zip in **`~/Library`** in modo che, quando viene decompresso, raggiunga la destinazione di persistenza.
|
||||
Dalla precedente bypass del Sandbox, Microsoft ha disabilitato l'opzione di scrivere file in `~/Library/LaunchAgents`. Tuttavia, è stato scoperto che se metti un **file zip come Login Item**, l'`Archive Utility` semplicemente **decomprimerà** il file nella sua posizione attuale. Quindi, poiché per impostazione predefinita la cartella `LaunchAgents` di `~/Library` non viene creata, è stato possibile **zipare un plist in `LaunchAgents/~$escape.plist`** e **posizionare** il file zip in **`~/Library`** in modo che, quando viene decompresso, raggiunga la destinazione di persistenza.
|
||||
|
||||
Controlla il [**report originale qui**](https://objective-see.org/blog/blog_0x4B.html).
|
||||
|
||||
@ -47,6 +47,6 @@ L'utility **`open`** supportava anche il parametro **`--stdin`** (e dopo il bypa
|
||||
Il fatto è che anche se **`python`** era firmato da Apple, **non eseguirà** uno script con l'attributo **`quarantine`**. Tuttavia, era possibile passargli uno script da stdin in modo che non controllasse se fosse stato quarantinato o meno: 
|
||||
|
||||
1. Rilascia un file **`~$exploit.py`** con comandi Python arbitrari.
|
||||
2. Esegui _open_ **`–stdin='~$exploit.py' -a Python`**, che esegue l'app Python con il nostro file rilasciato come input standard. Python esegue felicemente il nostro codice e, poiché è un processo figlio di _launchd_, non è vincolato alle regole del sandbox di Word.
|
||||
2. Esegui _open_ **`–stdin='~$exploit.py' -a Python`**, che esegue l'app Python con il nostro file rilasciato che funge da input standard. Python esegue felicemente il nostro codice e, poiché è un processo figlio di _launchd_, non è vincolato alle regole del sandbox di Word.
|
||||
|
||||
{{#include ../../../../../banners/hacktricks-training.md}}
|
||||
|
@ -68,13 +68,13 @@ csrutil enable --without debug
|
||||
```
|
||||
### Altre Restrizioni
|
||||
|
||||
- **Disabilita il caricamento di estensioni del kernel non firmate** (kexts), garantendo che solo le estensioni verificate interagiscano con il kernel di sistema.
|
||||
- **Non consente il caricamento di estensioni del kernel non firmate** (kexts), garantendo che solo le estensioni verificate interagiscano con il kernel di sistema.
|
||||
- **Previene il debugging** dei processi di sistema macOS, proteggendo i componenti core del sistema da accessi e modifiche non autorizzate.
|
||||
- **Inibisce strumenti** come dtrace dall'ispezionare i processi di sistema, proteggendo ulteriormente l'integrità del funzionamento del sistema.
|
||||
|
||||
[**Scopri di più sulle informazioni SIP in questo talk**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.**
|
||||
|
||||
### **Autorizzazioni relative a SIP**
|
||||
### **Diritti relativi a SIP**
|
||||
|
||||
- `com.apple.rootless.xpc.bootstrap`: Controlla launchd
|
||||
- `com.apple.rootless.install[.heritable]`: Accesso al file system
|
||||
@ -99,7 +99,7 @@ Il bypass di SIP consente a un attaccante di:
|
||||
|
||||
### Pacchetti di Installazione
|
||||
|
||||
**I pacchetti di installazione firmati con il certificato di Apple** possono bypassare le sue protezioni. Ciò significa che anche i pacchetti firmati da sviluppatori standard verranno bloccati se tentano di modificare directory protette da SIP.
|
||||
**I pacchetti di installazione firmati con il certificato di Apple** possono bypassare le sue protezioni. Ciò significa che anche i pacchetti firmati da sviluppatori standard verranno bloccati se tentano di modificare le directory protette da SIP.
|
||||
|
||||
### File SIP inesistente
|
||||
|
||||
@ -108,7 +108,7 @@ Una potenziale falla è che se un file è specificato in **`rootless.conf` ma at
|
||||
### com.apple.rootless.install.heritable
|
||||
|
||||
> [!CAUTION]
|
||||
> L'autorizzazione **`com.apple.rootless.install.heritable`** consente di bypassare SIP
|
||||
> Il diritto **`com.apple.rootless.install.heritable`** consente di bypassare SIP
|
||||
|
||||
#### [CVE-2019-8561](https://objective-see.org/blog/blog_0x42.html) <a href="#cve" id="cve"></a>
|
||||
|
||||
@ -116,21 +116,21 @@ Una potenziale falla è che se un file è specificato in **`rootless.conf` ma at
|
||||
|
||||
#### [CVE-2020–9854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
|
||||
|
||||
Se un pacchetto veniva installato da un'immagine montata o da un'unità esterna, l'**installer** avrebbe **eseguito** il binario da **quella file system** (invece che da una posizione protetta da SIP), facendo eseguire a **`system_installd`** un binario arbitrario.
|
||||
Se un pacchetto veniva installato da un'immagine montata o da un'unità esterna, l'**installer** **eseguiva** il binario da **quella file system** (invece che da una posizione protetta da SIP), facendo eseguire a **`system_installd`** un binario arbitrario.
|
||||
|
||||
#### CVE-2021-30892 - Shrootless
|
||||
|
||||
[**I ricercatori di questo post del blog**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) hanno scoperto una vulnerabilità nel meccanismo di Protezione dell'Integrità di Sistema (SIP) di macOS, soprannominata vulnerabilità 'Shrootless'. Questa vulnerabilità si concentra sul demone **`system_installd`**, che ha un'autorizzazione, **`com.apple.rootless.install.heritable`**, che consente a qualsiasi dei suoi processi figli di bypassare le restrizioni del file system di SIP.
|
||||
[**I ricercatori di questo post del blog**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) hanno scoperto una vulnerabilità nel meccanismo di Protezione dell'Integrità di Sistema (SIP) di macOS, soprannominata vulnerabilità 'Shrootless'. Questa vulnerabilità si concentra sul demone **`system_installd`**, che ha un diritto, **`com.apple.rootless.install.heritable`**, che consente a qualsiasi dei suoi processi figli di bypassare le restrizioni del file system di SIP.
|
||||
|
||||
Il demone **`system_installd`** installerà pacchetti che sono stati firmati da **Apple**.
|
||||
|
||||
I ricercatori hanno scoperto che durante l'installazione di un pacchetto firmato da Apple (.pkg), **`system_installd`** **esegue** qualsiasi **script post-installazione** incluso nel pacchetto. Questi script vengono eseguiti dalla shell predefinita, **`zsh`**, che esegue automaticamente **comandi dal file** **`/etc/zshenv`**, se esiste, anche in modalità non interattiva. Questo comportamento potrebbe essere sfruttato dagli attaccanti: creando un file `/etc/zshenv` malevolo e aspettando che **`system_installd` invochi `zsh`**, potrebbero eseguire operazioni arbitrarie sul dispositivo.
|
||||
I ricercatori hanno scoperto che durante l'installazione di un pacchetto firmato da Apple (.pkg file), **`system_installd`** **esegue** qualsiasi **script post-install** incluso nel pacchetto. Questi script vengono eseguiti dalla shell predefinita, **`zsh`**, che esegue automaticamente **comandi dal file** **`/etc/zshenv`**, se esiste, anche in modalità non interattiva. Questo comportamento potrebbe essere sfruttato dagli attaccanti: creando un file `/etc/zshenv` malevolo e aspettando che **`system_installd` invochi `zsh`**, potrebbero eseguire operazioni arbitrarie sul dispositivo.
|
||||
|
||||
Inoltre, è stato scoperto che **`/etc/zshenv` potrebbe essere utilizzato come una tecnica di attacco generale**, non solo per un bypass di SIP. Ogni profilo utente ha un file `~/.zshenv`, che si comporta allo stesso modo di `/etc/zshenv` ma non richiede permessi di root. Questo file potrebbe essere utilizzato come meccanismo di persistenza, attivandosi ogni volta che `zsh` si avvia, o come meccanismo di elevazione dei privilegi. Se un utente admin si eleva a root usando `sudo -s` o `sudo <comando>`, il file `~/.zshenv` verrebbe attivato, elevando effettivamente a root.
|
||||
Inoltre, è stato scoperto che **`/etc/zshenv` potrebbe essere utilizzato come una tecnica di attacco generale**, non solo per un bypass di SIP. Ogni profilo utente ha un file `~/.zshenv`, che si comporta allo stesso modo di `/etc/zshenv` ma non richiede permessi di root. Questo file potrebbe essere utilizzato come meccanismo di persistenza, attivandosi ogni volta che `zsh` si avvia, o come meccanismo di elevazione dei privilegi. Se un utente admin si eleva a root usando `sudo -s` o `sudo <command>`, il file `~/.zshenv` verrebbe attivato, elevando effettivamente a root.
|
||||
|
||||
#### [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/)
|
||||
|
||||
In [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) è stato scoperto che lo stesso processo **`system_installd`** poteva ancora essere abusato perché stava mettendo lo **script post-installazione all'interno di una cartella con nome casuale protetta da SIP all'interno di `/tmp`**. Il fatto è che **`/tmp` stesso non è protetto da SIP**, quindi era possibile **montare** un **immagine virtuale su di esso**, poi l'**installer** avrebbe messo lì lo **script post-installazione**, **smontato** l'immagine virtuale, **ricreato** tutte le **cartelle** e **aggiunto** lo **script di post installazione** con il **payload** da eseguire.
|
||||
In [**CVE-2022-22583**](https://perception-point.io/blog/technical-analysis-cve-2022-22583/) è stato scoperto che lo stesso processo **`system_installd`** poteva ancora essere abusato perché stava mettendo lo **script post-install in una cartella con nome casuale protetta da SIP all'interno di `/tmp`**. Il fatto è che **`/tmp` stesso non è protetto da SIP**, quindi era possibile **montare** un **immagine virtuale su di esso**, poi l'**installer** avrebbe messo lì lo **script post-install**, **smontato** l'immagine virtuale, **ricreato** tutte le **cartelle** e **aggiunto** lo **script di post installazione** con il **payload** da eseguire.
|
||||
|
||||
#### [fsck_cs utility](https://www.theregister.com/2016/03/30/apple_os_x_rootless/)
|
||||
|
||||
@ -164,7 +164,7 @@ La sicurezza di questo processo può essere compromessa se un attaccante altera
|
||||
|
||||
Il codice dell'attaccante guadagna il controllo durante il processo di aggiornamento, sfruttando la fiducia del sistema nell'installer. L'attacco procede alterando l'immagine `InstallESD.dmg` tramite method swizzling, mirando in particolare al metodo `extractBootBits`. Questo consente l'iniezione di codice malevolo prima che l'immagine del disco venga utilizzata.
|
||||
|
||||
Inoltre, all'interno di `InstallESD.dmg`, c'è un `BaseSystem.dmg`, che funge da file system radice del codice di aggiornamento. Iniettare una libreria dinamica in questo consente al codice malevolo di operare all'interno di un processo in grado di alterare file a livello di OS, aumentando significativamente il potenziale di compromissione del sistema.
|
||||
Inoltre, all'interno di `InstallESD.dmg`, c'è un `BaseSystem.dmg`, che funge da file system radice per il codice di aggiornamento. Iniettare una libreria dinamica in questo consente al codice malevolo di operare all'interno di un processo in grado di alterare file a livello di OS, aumentando significativamente il potenziale di compromissione del sistema.
|
||||
|
||||
#### [systemmigrationd (2023)](https://www.youtube.com/watch?v=zxZesAN-TEk)
|
||||
|
||||
|
@ -4,15 +4,15 @@
|
||||
|
||||
## **Informazioni di Base**
|
||||
|
||||
**TCC (Trasparenza, Consenso e Controllo)** è un protocollo di sicurezza che si concentra sulla regolamentazione delle autorizzazioni delle applicazioni. Il suo ruolo principale è quello di proteggere funzionalità sensibili come **servizi di localizzazione, contatti, foto, microfono, fotocamera, accessibilità e accesso completo al disco**. Richiedendo il consenso esplicito dell'utente prima di concedere l'accesso dell'app a questi elementi, TCC migliora la privacy e il controllo dell'utente sui propri dati.
|
||||
**TCC (Trasparenza, Consenso e Controllo)** è un protocollo di sicurezza che si concentra sulla regolamentazione delle autorizzazioni delle applicazioni. Il suo ruolo principale è quello di proteggere funzionalità sensibili come **servizi di localizzazione, contatti, foto, microfono, fotocamera, accessibilità e accesso completo al disco**. Richiedendo un consenso esplicito dell'utente prima di concedere l'accesso dell'app a questi elementi, TCC migliora la privacy e il controllo dell'utente sui propri dati.
|
||||
|
||||
Gli utenti incontrano TCC quando le applicazioni richiedono l'accesso a funzionalità protette. Questo è visibile attraverso un prompt che consente agli utenti di **approvare o negare l'accesso**. Inoltre, TCC consente azioni dirette dell'utente, come **trascinare e rilasciare file in un'applicazione**, per concedere accesso a file specifici, garantendo che le applicazioni abbiano accesso solo a ciò che è esplicitamente consentito.
|
||||
Gli utenti incontrano TCC quando le applicazioni richiedono accesso a funzionalità protette. Questo è visibile attraverso un prompt che consente agli utenti di **approvare o negare l'accesso**. Inoltre, TCC consente azioni dirette dell'utente, come **trascinare e rilasciare file in un'applicazione**, per concedere accesso a file specifici, garantendo che le applicazioni abbiano accesso solo a ciò che è esplicitamente consentito.
|
||||
|
||||

|
||||
|
||||
**TCC** è gestito dal **daemon** situato in `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` e configurato in `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (registrando il servizio mach `com.apple.tccd.system`).
|
||||
|
||||
C'è un **tccd in modalità utente** in esecuzione per ogni utente connesso definito in `/System/Library/LaunchAgents/com.apple.tccd.plist` che registra i servizi mach `com.apple.tccd` e `com.apple.usernotifications.delegate.com.apple.tccd`.
|
||||
C'è un **tccd in modalità utente** in esecuzione per ogni utente connesso definito in `/System/Library/LaunchAgents/com.apple.tccd.plist` registrando i servizi mach `com.apple.tccd` e `com.apple.usernotifications.delegate.com.apple.tccd`.
|
||||
|
||||
Qui puoi vedere il tccd in esecuzione come sistema e come utente:
|
||||
```bash
|
||||
@ -29,7 +29,7 @@ Le autorizzazioni/negazioni sono quindi memorizzate in alcuni database TCC:
|
||||
- Il database a livello di sistema in **`/Library/Application Support/com.apple.TCC/TCC.db`**.
|
||||
- Questo database è **protetto da SIP**, quindi solo un bypass SIP può scriverci.
|
||||
- Il database TCC dell'utente **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** per le preferenze per utente.
|
||||
- Questo database è protetto, quindi solo i processi con alti privilegi TCC come l'accesso completo al disco possono scriverci (ma non è protetto da SIP).
|
||||
- Questo database è protetto, quindi solo i processi con alti privilegi TCC come l'Accesso Completo al Disco possono scriverci (ma non è protetto da SIP).
|
||||
|
||||
> [!WARNING]
|
||||
> I database precedenti sono anche **protetti da TCC per l'accesso in lettura**. Quindi **non sarai in grado di leggere** il tuo database TCC utente regolare a meno che non provenga da un processo privilegiato TCC.
|
||||
@ -102,7 +102,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
{{#endtabs}}
|
||||
|
||||
> [!TIP]
|
||||
> Controllando entrambe le banche dati puoi verificare i permessi che un'app ha consentito, ha vietato o non ha (chiederà di essi).
|
||||
> Controllando entrambe le banche dati puoi verificare i permessi che un'app ha consentito, ha vietato o non ha (chiederà di farlo).
|
||||
|
||||
- Il **`service`** è la rappresentazione della stringa di **permesso** TCC
|
||||
- Il **`client`** è il **bundle ID** o **percorso del binario** con i permessi
|
||||
@ -174,7 +174,7 @@ echo "X'$REQ_HEX'"
|
||||
Puoi anche controllare le **autorizzazioni già concesse** alle app in `System Preferences --> Security & Privacy --> Privacy --> Files and Folders`.
|
||||
|
||||
> [!TIP]
|
||||
> Gli utenti _possono_ **eliminare o interrogare le regole** utilizzando **`tccutil`**.
|
||||
> Gli utenti _possono_ **eliminare o interrogare le regole** utilizzando **`tccutil`** .
|
||||
|
||||
#### Ripristina le autorizzazioni TCC
|
||||
```bash
|
||||
@ -186,7 +186,7 @@ tccutil reset All
|
||||
```
|
||||
### Controlli della Firma TCC
|
||||
|
||||
Il **database** TCC memorizza il **Bundle ID** dell'applicazione, ma **memorizza** anche **informazioni** sulla **firma** per **assicurarsi** che l'App che richiede di utilizzare un permesso sia quella corretta.
|
||||
Il **database** TCC memorizza il **Bundle ID** dell'applicazione, ma memorizza anche **informazioni** sulla **firma** per **assicurarsi** che l'App che richiede di utilizzare un permesso sia quella corretta.
|
||||
```bash
|
||||
# From sqlite
|
||||
sqlite> select service, client, hex(csreq) from access where auth_value=2;
|
||||
@ -199,7 +199,7 @@ csreq -t -r /tmp/telegram_csreq.bin
|
||||
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"
|
||||
```
|
||||
> [!WARNING]
|
||||
> Pertanto, altre applicazioni che utilizzano lo stesso nome e ID bundle non potranno accedere ai permessi concessi ad altre app.
|
||||
> Pertanto, altre applicazioni che utilizzano lo stesso nome e ID del pacchetto non potranno accedere ai permessi concessi ad altre app.
|
||||
|
||||
### Diritti e Permessi TCC
|
||||
|
||||
@ -222,7 +222,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
|
||||
Questo eviterà che Calendar chieda all'utente di accedere a promemoria, calendario e rubrica.
|
||||
|
||||
> [!TIP]
|
||||
> Oltre ad alcune documentazioni ufficiali sugli entitlement, è anche possibile trovare **informazioni interessanti sugli entitlement in** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)
|
||||
> Oltre ad alcune documentazioni ufficiali sugli entitlement, è anche possibile trovare informazioni **interessanti non ufficiali sugli entitlement in** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)
|
||||
|
||||
Alcuni permessi TCC sono: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Non esiste un elenco pubblico che definisca tutti, ma puoi controllare questo [**elenco di quelli noti**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service).
|
||||
|
||||
@ -234,7 +234,7 @@ Alcuni permessi TCC sono: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServi
|
||||
|
||||
### Intento dell'utente / com.apple.macl
|
||||
|
||||
Come menzionato in precedenza, è possibile **concedere accesso a un'app a un file trascinandolo e rilasciandolo su di essa**. Questo accesso non sarà specificato in alcun database TCC ma come un **attributo esteso del file**. Questo attributo **memorizzerà l'UUID** dell'app autorizzata:
|
||||
Come menzionato in precedenza, è possibile **concedere accesso a un'app a un file trascinandolo e rilasciandolo su di essa**. Questo accesso non sarà specificato in alcun database TCC ma come un **attributo esteso del file**. Questo attributo **memorizzerà l'UUID** dell'app consentita:
|
||||
```bash
|
||||
xattr Desktop/private.txt
|
||||
com.apple.macl
|
||||
@ -331,7 +331,7 @@ Questa specifica autorizzazione TCC indica anche l'**applicazione che può esser
|
||||
In questo caso, la tua app avrebbe bisogno dell'autorizzazione **`kTCCServiceAppleEvents`** su **`com.apple.Finder`**.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Rubare il TCC.db degli utenti"}}
|
||||
{{#tab name="Furto del TCC.db degli utenti"}}
|
||||
```applescript
|
||||
# This AppleScript will copy the system TCC database into /tmp
|
||||
osascript<<EOD
|
||||
@ -396,7 +396,7 @@ EOD
|
||||
```
|
||||
</details>
|
||||
|
||||
Lo stesso vale per l'**app Script Editor,** può controllare Finder, ma utilizzando un AppleScript non puoi costringerlo a eseguire uno script.
|
||||
Lo stesso vale per l'**app Script Editor**, può controllare Finder, ma utilizzando un AppleScript non puoi costringerlo a eseguire uno script.
|
||||
|
||||
### Automazione (SE) a qualche TCC
|
||||
|
||||
@ -506,7 +506,7 @@ Se hai **`kTCCServiceEndpointSecurityClient`**, hai FDA. Fine.
|
||||
|
||||
### Database TCC Utente a FDA
|
||||
|
||||
Ottenendo **autorizzazioni di scrittura** sul database **TCC utente** non puoi concederti **`FDA`** autorizzazioni, solo colui che vive nel database di sistema può concedere ciò.
|
||||
Ottenendo **autorizzazioni di scrittura** sul database **TCC utente** non puoi concederti **`FDA`** autorizzazioni, solo chi vive nel database di sistema può concedere ciò.
|
||||
|
||||
Ma puoi **darti** **`diritti di automazione a Finder`**, e abusare della tecnica precedente per escalare a FDA\*.
|
||||
|
||||
|
@ -10,7 +10,7 @@ Il daemon mina è `/System/Library/CoreServices/appleeventsd` che registra il se
|
||||
|
||||
Ogni applicazione che può ricevere eventi verificherà con questo daemon fornendo il suo Apple Event Mach Port. E quando un'app vuole inviare un evento a esso, l'app richiederà questo port dal daemon.
|
||||
|
||||
Le applicazioni sandboxed richiedono privilegi come `allow appleevent-send` e `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` per poter inviare eventi. Si noti che i diritti come `com.apple.security.temporary-exception.apple-events` potrebbero limitare chi ha accesso per inviare eventi, il che richiederà diritti come `com.apple.private.appleevents`.
|
||||
Le applicazioni sandboxed richiedono privilegi come `allow appleevent-send` e `(allow mach-lookup (global-name "com.apple.coreservices.appleevents))` per poter inviare eventi. Si noti che le autorizzazioni come `com.apple.security.temporary-exception.apple-events` potrebbero limitare chi ha accesso per inviare eventi, il che richiederà autorizzazioni come `com.apple.private.appleevents`.
|
||||
|
||||
> [!TIP]
|
||||
> È possibile utilizzare la variabile env **`AEDebugSends`** per registrare informazioni sul messaggio inviato:
|
||||
|
@ -52,7 +52,7 @@ Qui puoi trovare esempi di come alcuni **malware siano stati in grado di bypassa
|
||||
|
||||
### Gestione delle estensioni - CVE-2022-26767
|
||||
|
||||
L'attributo **`com.apple.macl`** viene dato ai file per dare a **una certa applicazione i permessi per leggerlo.** Questo attributo viene impostato quando si **trascina** un file su un'app, o quando un utente **fa doppio clic** su un file per aprirlo con l'**applicazione predefinita**.
|
||||
L'attributo **`com.apple.macl`** viene dato ai file per dare a una **certa applicazione i permessi per leggerlo.** Questo attributo viene impostato quando si **trascina** un file su un'app, o quando un utente **fa doppio clic** su un file per aprirlo con l'**applicazione predefinita**.
|
||||
|
||||
Pertanto, un utente potrebbe **registrare un'app malevola** per gestire tutte le estensioni e chiamare i Servizi di avvio per **aprire** qualsiasi file (quindi il file malevolo avrà accesso per leggerlo).
|
||||
|
||||
@ -112,10 +112,10 @@ do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
||||
Il **daemon tccd** in userland utilizzava la variabile **`HOME`** **env** per accedere al database utenti TCC da: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
Il **daemon tccd** in userland utilizzava la variabile di ambiente **`HOME`** per accedere al database utenti TCC da: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
Secondo [questo post di Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) e poiché il daemon TCC viene eseguito tramite `launchd` all'interno del dominio dell'utente corrente, è possibile **controllare tutte le variabili ambientali** passate ad esso.\
|
||||
Pertanto, un **attaccante potrebbe impostare la variabile ambientale `$HOME`** in **`launchctl`** per puntare a una **directory controllata**, **riavviare** il **daemon TCC** e poi **modificare direttamente il database TCC** per concedersi **tutti i diritti TCC disponibili** senza mai richiedere all'utente finale.\
|
||||
Secondo [questo post di Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) e poiché il daemon TCC viene eseguito tramite `launchd` all'interno del dominio dell'utente corrente, è possibile **controllare tutte le variabili di ambiente** passate ad esso.\
|
||||
Pertanto, un **attaccante potrebbe impostare la variabile di ambiente `$HOME`** in **`launchctl`** per puntare a una **directory controllata**, **riavviare** il **daemon TCC** e poi **modificare direttamente il database TCC** per concedersi **tutti i diritti TCC disponibili** senza mai richiedere all'utente finale.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
@ -184,13 +184,13 @@ Questa **variabile di ambiente è utilizzata dal framework `Metal`** che è una
|
||||
|
||||
Impostando quanto segue: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Se `path` è una directory valida, il bug verrà attivato e possiamo usare `fs_usage` per vedere cosa sta succedendo nel programma:
|
||||
|
||||
- un file sarà `open()`ed, chiamato `path/.dat.nosyncXXXX.XXXXXX` (X è casuale)
|
||||
- un file verrà `open()`ato, chiamato `path/.dat.nosyncXXXX.XXXXXX` (X è casuale)
|
||||
- uno o più `write()` scriveranno i contenuti nel file (non controlliamo questo)
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` sarà `renamed()` a `path/name`
|
||||
- `path/.dat.nosyncXXXX.XXXXXX` verrà `renamed()` a `path/name`
|
||||
|
||||
È una scrittura temporanea di file, seguita da un **`rename(old, new)`** **che non è sicuro.**
|
||||
|
||||
Non è sicuro perché deve **risolvere i vecchi e nuovi percorsi separatamente**, il che può richiedere del tempo e può essere vulnerabile a una Condizione di Gara. Per ulteriori informazioni, puoi controllare la funzione `xnu` `renameat_internal()`.
|
||||
Non è sicuro perché deve **risolvere i vecchi e nuovi percorsi separatamente**, il che può richiedere del tempo e può essere vulnerabile a una Condizione di Gara. Per ulteriori informazioni puoi controllare la funzione `xnu` `renameat_internal()`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Quindi, fondamentalmente, se un processo privilegiato sta rinominando da una cartella che controlli, potresti ottenere un RCE e farlo accedere a un file diverso o, come in questo CVE, aprire il file creato dall'app privilegiata e memorizzare un FD.
|
||||
@ -206,7 +206,7 @@ Questo era l'attacco nel CVE: Ad esempio, per sovrascrivere il `TCC.db` dell'ute
|
||||
- catturare l'`open()` di `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X è casuale)
|
||||
- qui apriamo anche questo file per scrivere e teniamo il descrittore di file
|
||||
- scambiare in modo atomico `/Users/hacker/tmp` con `/Users/hacker/ourlink` **in un ciclo**
|
||||
- facciamo questo per massimizzare le nostre possibilità di successo poiché la finestra di gara è piuttosto ristretta, ma perdere la gara ha un impatto trascurabile
|
||||
- lo facciamo per massimizzare le nostre possibilità di successo poiché la finestra di gara è piuttosto ristretta, ma perdere la gara ha un impatto trascurabile
|
||||
- aspetta un po'
|
||||
- verifica se abbiamo avuto fortuna
|
||||
- se no, ripeti dall'inizio
|
||||
@ -246,7 +246,7 @@ Il **primo POC** utilizza [**dsexport**](https://www.unix.com/man-page/osx/1/dse
|
||||
Il secondo POC ha utilizzato **`/usr/libexec/configd`** che aveva `com.apple.private.tcc.allow` con il valore `kTCCServiceSystemPolicySysAdminFiles`.\
|
||||
Era possibile eseguire **`configd`** con l'opzione **`-t`**, un attaccante poteva specificare un **Bundle personalizzato da caricare**. Pertanto, l'exploit **sostituisce** il metodo **`dsexport`** e **`dsimport`** di cambiamento della home directory dell'utente con un **iniezione di codice configd**.
|
||||
|
||||
Per ulteriori informazioni, controlla il [**report originale**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/).
|
||||
Per ulteriori informazioni controlla il [**report originale**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/).
|
||||
|
||||
## Per iniezione di processo
|
||||
|
||||
@ -265,7 +265,7 @@ L'applicazione `/System/Library/CoreServices/Applications/Directory Utility.app`
|
||||
|
||||
Per armare questo CVE, il **`NFSHomeDirectory`** è **cambiato** (abusando del diritto precedente) per poter **prendere il controllo del database TCC degli utenti** per bypassare TCC.
|
||||
|
||||
Per ulteriori informazioni, controlla il [**report originale**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
|
||||
Per ulteriori informazioni controlla il [**report originale**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
|
||||
|
||||
### CVE-2020-29621 - Coreaudiod
|
||||
|
||||
@ -477,34 +477,34 @@ Questo ha permesso a un attaccante di eseguire mount arbitrari in qualsiasi posi
|
||||
|
||||
Lo strumento **`/usr/sbin/asr`** consentiva di copiare l'intero disco e montarlo in un'altra posizione bypassando le protezioni TCC.
|
||||
|
||||
### Servizi di localizzazione
|
||||
### Location Services
|
||||
|
||||
C'è un terzo database TCC in **`/var/db/locationd/clients.plist`** per indicare i client autorizzati ad **accedere ai servizi di localizzazione**.\
|
||||
La cartella **`/var/db/locationd/` non era protetta dal montaggio DMG** quindi era possibile montare il nostro plist.
|
||||
|
||||
## Attraverso app di avvio
|
||||
## By startup apps
|
||||
|
||||
{{#ref}}
|
||||
../../../../macos-auto-start-locations.md
|
||||
{{#endref}}
|
||||
|
||||
## Attraverso grep
|
||||
## By grep
|
||||
|
||||
In diverse occasioni, i file memorizzeranno informazioni sensibili come email, numeri di telefono, messaggi... in posizioni non protette (che contano come una vulnerabilità in Apple).
|
||||
|
||||
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Click sintetici
|
||||
## Synthetic Clicks
|
||||
|
||||
Questo non funziona più, ma [**funzionava in passato**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
|
||||
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Un altro modo utilizzando [**eventi CoreGraphics**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf):
|
||||
Un altro modo utilizzando [**CoreGraphics events**](https://objectivebythesea.org/v2/talks/OBTS_v2_Wardle.pdf):
|
||||
|
||||
<figure><img src="../../../../../images/image (30).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
## Riferimenti
|
||||
## Reference
|
||||
|
||||
- [**https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8**](https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8)
|
||||
- [**https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/**](https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/)
|
||||
|
@ -429,7 +429,7 @@ ffmpeg -framerate 30 -f avfoundation -i "0" -frames:v 1 /tmp/capture.jpg
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="ObjetiveC - Registra"}}
|
||||
Registra 5 secondi di audio e salvalo in `/tmp/recording.m4a`
|
||||
Registra 5s di audio e salvalo in `/tmp/recording.m4a`
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
|
@ -56,7 +56,7 @@ Dando un'occhiata alle **stringhe** dell'APK puoi cercare **password**, **URL**
|
||||
|
||||
**Firebase**
|
||||
|
||||
Presta particolare attenzione agli **URL di firebase** e controlla se è configurato male. [Maggiore informazione su cosa è FIrebase e come sfruttarlo qui.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
Presta particolare attenzione agli **URL di firebase** e controlla se è configurato male. [Maggiore informazione su cosa è Firebase e come sfruttarlo qui.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Comprensione di base dell'applicazione - Manifest.xml, strings.xml
|
||||
|
||||
@ -66,13 +66,13 @@ L'**esame dei file \_Manifest.xml**_\*\* e \*\*_**strings.xml**\_\*\* di un'appl
|
||||
|
||||
- **Applicazioni Debuggable**: Le applicazioni impostate come debuggable (`debuggable="true"`) nel file _Manifest.xml_ rappresentano un rischio poiché consentono connessioni che possono portare a sfruttamenti. Per ulteriori informazioni su come sfruttare le applicazioni debuggable, fai riferimento a un tutorial su come trovare e sfruttare applicazioni debuggable su un dispositivo.
|
||||
- **Impostazioni di Backup**: L'attributo `android:allowBackup="false"` dovrebbe essere esplicitamente impostato per le applicazioni che trattano informazioni sensibili per prevenire backup non autorizzati dei dati tramite adb, specialmente quando il debug USB è abilitato.
|
||||
- **Sicurezza della Rete**: Configurazioni di sicurezza della rete personalizzate (`android:networkSecurityConfig="@xml/network_security_config"`) in _res/xml/_ possono specificare dettagli di sicurezza come pin di certificato e impostazioni del traffico HTTP. Un esempio è consentire il traffico HTTP per domini specifici.
|
||||
- **Sicurezza della Rete**: Le configurazioni di sicurezza della rete personalizzate (`android:networkSecurityConfig="@xml/network_security_config"`) in _res/xml/_ possono specificare dettagli di sicurezza come i pin dei certificati e le impostazioni del traffico HTTP. Un esempio è consentire il traffico HTTP per domini specifici.
|
||||
- **Attività e Servizi Esportati**: Identificare attività e servizi esportati nel manifest può evidenziare componenti che potrebbero essere abusati. Ulteriori analisi durante i test dinamici possono rivelare come sfruttare questi componenti.
|
||||
- **Content Providers e FileProviders**: I content provider esposti potrebbero consentire accessi o modifiche non autorizzate ai dati. Anche la configurazione dei FileProviders dovrebbe essere scrutinata.
|
||||
- **Broadcast Receivers e URL Schemes**: Questi componenti potrebbero essere sfruttati per sfruttamenti, prestando particolare attenzione a come vengono gestiti gli URL schemes per vulnerabilità di input.
|
||||
- **Versioni SDK**: Gli attributi `minSdkVersion`, `targetSDKVersion` e `maxSdkVersion` indicano le versioni Android supportate, evidenziando l'importanza di non supportare versioni Android obsolete e vulnerabili per motivi di sicurezza.
|
||||
|
||||
Dal file **strings.xml**, informazioni sensibili come chiavi API, schemi personalizzati e altre note per sviluppatori possono essere scoperte, sottolineando la necessità di una revisione attenta di queste risorse.
|
||||
Dal file **strings.xml**, informazioni sensibili come chiavi API, schemi personalizzati e altre note per gli sviluppatori possono essere scoperte, sottolineando la necessità di una revisione attenta di queste risorse.
|
||||
|
||||
### Tapjacking
|
||||
|
||||
@ -230,7 +230,7 @@ Grazie alla connessione ADB puoi utilizzare **Drozer** e **Frida** all'interno d
|
||||
|
||||
#### Utilizzando un emulatore
|
||||
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Puoi creare dispositivi **x86** e **arm**, e secondo [**questo**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**ultimi x86** le versioni **supportano le librerie ARM** senza bisogno di un emulatore arm lento).
|
||||
- [**Android Studio**](https://developer.android.com/studio) (Puoi creare dispositivi **x86** e **arm**, e secondo [**questo**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**ultimi versioni x86** supportano le librerie ARM senza necessitare di un emulatore arm lento).
|
||||
- Impara a configurarlo in questa pagina:
|
||||
|
||||
{{#ref}}
|
||||
@ -260,7 +260,7 @@ Devi attivare le **opzioni di debug** e sarebbe utile se potessi **rootarlo**:
|
||||
5. Torna indietro e troverai le **Opzioni sviluppatore**.
|
||||
|
||||
> Una volta installata l'applicazione, la prima cosa che dovresti fare è provarla e indagare su cosa fa, come funziona e familiarizzare con essa.\
|
||||
> Ti suggerisco di **eseguire questa analisi dinamica iniziale utilizzando l'analisi dinamica di MobSF + pidcat**, così saremo in grado di **imparare come funziona l'applicazione** mentre MobSF **cattura** molti **dati interessanti** che puoi rivedere in seguito.
|
||||
> Ti suggerisco di **eseguire questa analisi dinamica iniziale utilizzando l'analisi dinamica di MobSF + pidcat**, in modo da poter **imparare come funziona l'applicazione** mentre MobSF **cattura** molti **dati interessanti** che puoi rivedere in seguito.
|
||||
|
||||
### Perdita di dati non intenzionale
|
||||
|
||||
@ -278,11 +278,11 @@ Il framework **basato su clipboard** di Android consente la funzionalità di cop
|
||||
|
||||
**Log di crash**
|
||||
|
||||
Se un'applicazione **crasha** e **salva log**, questi log possono assistere gli attaccanti, in particolare quando l'applicazione non può essere sottoposta a reverse engineering. Per mitigare questo rischio, evita di registrare in caso di crash e, se i log devono essere trasmessi sulla rete, assicurati che vengano inviati tramite un canale SSL per la sicurezza.
|
||||
Se un'applicazione **crasha** e **salva log**, questi log possono assistere gli attaccanti, in particolare quando l'applicazione non può essere sottoposta a reverse engineering. Per mitigare questo rischio, evita di registrare in caso di crash e, se i log devono essere trasmessi attraverso la rete, assicurati che vengano inviati tramite un canale SSL per la sicurezza.
|
||||
|
||||
Come pentester, **cerca di dare un'occhiata a questi log**.
|
||||
|
||||
**Dati di analisi inviati a terzi**
|
||||
**Dati di analisi inviati a terze parti**
|
||||
|
||||
Le applicazioni spesso integrano servizi come Google Adsense, che possono involontariamente **trapelare dati sensibili** a causa di un'implementazione impropria da parte degli sviluppatori. Per identificare potenziali perdite di dati, è consigliabile **intercettare il traffico dell'applicazione** e controllare se ci sono informazioni sensibili inviate a servizi di terze parti.
|
||||
|
||||
@ -293,7 +293,7 @@ I database dovrebbero trovarsi in `/data/data/the.package.name/databases` come `
|
||||
|
||||
Se il database sta salvando informazioni riservate ed è **crittografato** ma puoi **trovare** la **password** all'interno dell'applicazione, è comunque una **vulnerabilità**.
|
||||
|
||||
Enumera le tabelle utilizzando `.tables` ed enumera le colonne delle tabelle eseguendo `.schema <table_name>`.
|
||||
Enumera le tabelle usando `.tables` e enumera le colonne delle tabelle eseguendo `.schema <table_name>`.
|
||||
|
||||
### Drozer (Attività di sfruttamento, Content Providers e Servizi)
|
||||
|
||||
@ -307,9 +307,9 @@ Ricorda anche che il codice di un'attività inizia nel metodo **`onCreate`**.
|
||||
|
||||
**Bypass dell'autorizzazione**
|
||||
|
||||
Quando un'Activity è esportata puoi invocare il suo schermo da un'app esterna. Pertanto, se un'attività con **informazioni sensibili** è **esportata**, potresti **bypassare** i meccanismi di **autenticazione** **per accedervi.**
|
||||
Quando un'Activity è esportata, puoi invocare il suo schermo da un'app esterna. Pertanto, se un'attività con **informazioni sensibili** è **esportata**, potresti **bypassare** i meccanismi di **autenticazione** **per accedervi**.
|
||||
|
||||
[**Impara come sfruttare le attività esportate con Drozer.**](drozer-tutorial/#activities)
|
||||
[**Scopri come sfruttare le attività esportate con Drozer.**](drozer-tutorial/#activities)
|
||||
|
||||
Puoi anche avviare un'attività esportata da adb:
|
||||
|
||||
@ -399,11 +399,11 @@ Ci concentreremo sulla **verifica del certificato**. L'integrità del certificat
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
SSL Pinning è una misura di sicurezza in cui l'applicazione verifica il certificato del server contro una copia nota memorizzata all'interno dell'applicazione stessa. Questo metodo è essenziale per prevenire attacchi MITM. Si raccomanda vivamente di implementare SSL Pinning per le applicazioni che gestiscono informazioni sensibili.
|
||||
SSL Pinning è una misura di sicurezza in cui l'applicazione verifica il certificato del server rispetto a una copia nota memorizzata all'interno dell'applicazione stessa. Questo metodo è essenziale per prevenire attacchi MITM. Si raccomanda vivamente di implementare SSL Pinning per le applicazioni che gestiscono informazioni sensibili.
|
||||
|
||||
#### Ispezione del traffico
|
||||
|
||||
Per ispezionare il traffico HTTP, è necessario **installare il certificato dello strumento proxy** (ad es., Burp). Senza installare questo certificato, il traffico crittografato potrebbe non essere visibile attraverso il proxy. Per una guida sull'installazione di un certificato CA personalizzato, [**clicca qui**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Per ispezionare il traffico HTTP, è necessario **installare il certificato dello strumento proxy** (ad es., Burp). Senza installare questo certificato, il traffico crittografato potrebbe non essere visibile tramite il proxy. Per una guida sull'installazione di un certificato CA personalizzato, [**clicca qui**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Le applicazioni destinate a **API Level 24 e superiori** richiedono modifiche alla Configurazione della Sicurezza di Rete per accettare il certificato CA del proxy. Questo passaggio è fondamentale per ispezionare il traffico crittografato. Per istruzioni su come modificare la Configurazione della Sicurezza di Rete, [**fai riferimento a questo tutorial**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
@ -503,7 +503,7 @@ Probabilmente conosci questo tipo di vulnerabilità dal Web. Devi essere partico
|
||||
- **Iniezione JavaScript (XSS):** Verifica che il supporto per JavaScript e Plugin sia disabilitato per qualsiasi WebView (disabilitato per impostazione predefinita). [Ulteriori informazioni qui](webview-attacks.md#javascript-enabled).
|
||||
- **Inclusione di File Locali:** Le WebView dovrebbero avere l'accesso al file system disabilitato (abilitato per impostazione predefinita) - `(webview.getSettings().setAllowFileAccess(false);)`. [Ulteriori informazioni qui](webview-attacks.md#javascript-enabled).
|
||||
- **Cookie Eterni**: In diversi casi, quando l'applicazione android termina la sessione, il cookie non viene revocato o potrebbe persino essere salvato su disco.
|
||||
- [**Flag Sicuro** nei cookie](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
||||
- [**Secure Flag** nei cookie](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
||||
|
||||
---
|
||||
|
||||
@ -515,30 +515,30 @@ Probabilmente conosci questo tipo di vulnerabilità dal Web. Devi essere partico
|
||||
|
||||
.png>)
|
||||
|
||||
**Valutazione delle vulnerabilità dell'applicazione** utilizzando un bel frontend web-based. Puoi anche eseguire analisi dinamica (ma devi preparare l'ambiente).
|
||||
**Valutazione della vulnerabilità dell'applicazione** utilizzando un bel frontend web-based. Puoi anche eseguire analisi dinamica (ma devi preparare l'ambiente).
|
||||
```bash
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
Nota che MobSF può analizzare **Android**(apk)**, IOS**(ipa) **e Windows**(apx) applicazioni (_Le applicazioni Windows devono essere analizzate da un MobSF installato su un host Windows_).\
|
||||
Nota che MobSF può analizzare applicazioni **Android**(apk)**, IOS**(ipa) **e Windows**(apx) (_Le applicazioni Windows devono essere analizzate da un MobSF installato su un host Windows_).\
|
||||
Inoltre, se crei un file **ZIP** con il codice sorgente di un'app **Android** o di un'app **IOS** (vai alla cartella radice dell'applicazione, seleziona tutto e crea un file ZIP), sarà in grado di analizzarlo anche.
|
||||
|
||||
MobSF consente anche di **diff/Confrontare** analisi e di integrare **VirusTotal** (dovrai impostare la tua chiave API in _MobSF/settings.py_ e abilitarla: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Puoi anche impostare `VT_UPLOAD` su `False`, quindi l'**hash** sarà **caricato** invece del file.
|
||||
|
||||
### Analisi dinamica assistita con MobSF
|
||||
|
||||
**MobSF** può essere molto utile per l'**analisi dinamica** in **Android**, ma in quel caso dovrai installare MobSF e **genymotion** sul tuo host (una VM o Docker non funzionerà). _Nota: Devi **avviare prima una VM in genymotion** e **poi MobSF.**_\
|
||||
**MobSF** può essere molto utile per l'**analisi dinamica** in **Android**, ma in quel caso dovrai installare MobSF e **genymotion** sul tuo host (una VM o Docker non funzioneranno). _Nota: Devi **avviare prima una VM in genymotion** e **poi MobSF.**_\
|
||||
L'**analizzatore dinamico MobSF** può:
|
||||
|
||||
- **Dump dei dati dell'applicazione** (URL, log, appunti, screenshot fatti da te, screenshot fatti da "**Exported Activity Tester**", email, database SQLite, file XML e altri file creati). Tutto questo viene fatto automaticamente tranne per gli screenshot, devi premere quando vuoi uno screenshot o devi premere "**Exported Activity Tester**" per ottenere screenshot di tutte le attività esportate.
|
||||
- Catturare il **traffico HTTPS**
|
||||
- Usare **Frida** per ottenere **informazioni** **runtime**
|
||||
|
||||
Dalle versioni di android **> 5**, avvierà **automaticamente Frida** e imposterà le impostazioni **proxy** globali per **catturare** il traffico. Catturerà solo il traffico dall'applicazione testata.
|
||||
Dalle versioni di android **> 5**, avvierà **automaticamente Frida** e imposterà le impostazioni globali del **proxy** per **catturare** il traffico. Catturerà solo il traffico dall'applicazione testata.
|
||||
|
||||
**Frida**
|
||||
|
||||
Per impostazione predefinita, utilizzerà anche alcuni script Frida per **bypassare il pinning SSL**, **rilevamento del root** e **rilevamento del debugger** e per **monitorare API interessanti**.\
|
||||
Per impostazione predefinita, utilizzerà anche alcuni script Frida per **bypassare il pinning SSL**, **rilevamento root** e **rilevamento debugger** e per **monitorare API interessanti**.\
|
||||
MobSF può anche **invocare attività esportate**, acquisire **screenshot** di esse e **salvarle** per il rapporto.
|
||||
|
||||
Per **iniziare** il test dinamico premi il pulsante verde: "**Start Instrumentation**". Premi "**Frida Live Logs**" per vedere i log generati dagli script Frida e "**Live API Monitor**" per vedere tutte le invocazioni ai metodi hookati, gli argomenti passati e i valori restituiti (questo apparirà dopo aver premuto "Start Instrumentation").\
|
||||
@ -550,7 +550,7 @@ Inoltre, hai alcune funzionalità ausiliarie di Frida:
|
||||
|
||||
- **Enumerare Classi Caricate**: Stampa tutte le classi caricate
|
||||
- **Catturare Stringhe**: Stampa tutte le stringhe catturate mentre utilizzi l'applicazione (super rumoroso)
|
||||
- **Catturare Confronti di Stringhe**: Potrebbe essere molto utile. **Mostrerà le 2 stringhe confrontate** e se il risultato era Vero o Falso.
|
||||
- **Catturare Confronti di Stringhe**: Potrebbe essere molto utile. Mostrerà **le 2 stringhe confrontate** e se il risultato è stato Vero o Falso.
|
||||
- **Enumerare Metodi di Classe**: Inserisci il nome della classe (come "java.io.File") e stamperà tutti i metodi della classe.
|
||||
- **Cerca Modello di Classe**: Cerca classi per modello
|
||||
- **Traccia Metodi di Classe**: **Traccia** un'**intera classe** (vedi input e output di tutti i metodi della classe). Ricorda che per impostazione predefinita MobSF traccia diversi metodi API Android interessanti.
|
||||
@ -570,7 +570,7 @@ receivers
|
||||
```
|
||||
**Strumenti HTTP**
|
||||
|
||||
Quando il traffico http viene catturato, puoi vedere una vista brutta del traffico catturato sul "**HTTP(S) Traffic**" in basso o una vista più bella nel pulsante verde "**Start HTTPTools**". Dalla seconda opzione, puoi **inviare** le **richieste catturate** a **proxy** come Burp o Owasp ZAP.\
|
||||
Quando il traffico http viene catturato, puoi vedere una vista brutta del traffico catturato sul "**HTTP(S) Traffic**" in basso o una vista più bella nel pulsante verde "**Start HTTPTools**". Dalla seconda opzione, puoi **inviare** le **richieste catturate** a **proxies** come Burp o Owasp ZAP.\
|
||||
Per farlo, _accendi Burp -->_ _disattiva Intercept --> in MobSB HTTPTools seleziona la richiesta_ --> premi "**Send to Fuzzer**" --> _seleziona l'indirizzo del proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
Una volta terminata l'analisi dinamica con MobSF, puoi premere su "**Start Web API Fuzzer**" per **fuzzare le richieste http** e cercare vulnerabilità.
|
||||
@ -589,7 +589,7 @@ Questo strumento utilizzerà alcuni **Hooks** per farti sapere **cosa sta succed
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
Questo è un **ottimo strumento per eseguire analisi statiche con un'interfaccia grafica**
|
||||
Questo è un **ottimo strumento per eseguire analisi statiche con una GUI**
|
||||
|
||||
.png>)
|
||||
|
||||
@ -647,7 +647,7 @@ androbugs.exe -f [APK file]
|
||||
|
||||
**Androwarn** è uno strumento il cui obiettivo principale è rilevare e avvisare l'utente riguardo a potenziali comportamenti malevoli sviluppati da un'applicazione Android.
|
||||
|
||||
Il rilevamento viene eseguito con l'**analisi statica** del bytecode Dalvik dell'applicazione, rappresentato come **Smali**, con la libreria [`androguard`](https://github.com/androguard/androguard).
|
||||
Il rilevamento viene effettuato con l'**analisi statica** del bytecode Dalvik dell'applicazione, rappresentato come **Smali**, con la libreria [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
Questo strumento cerca **comportamenti comuni delle applicazioni "cattive"** come: esfiltrazione di identificatori di telefonia, intercettazione di flussi audio/video, modifica dei dati PIM, esecuzione di codice arbitrario...
|
||||
```
|
||||
@ -689,9 +689,9 @@ Trova una guida passo-passo per deoffuscare l'apk in [https://blog.lexfo.fr/dexg
|
||||
(Da quella guida) L'ultima volta che abbiamo controllato, il modo di operare di Dexguard era:
|
||||
|
||||
- caricare una risorsa come InputStream;
|
||||
- fornire il risultato a una classe che eredita da FilterInputStream per decrittarlo;
|
||||
- fornire il risultato a una classe che eredita da FilterInputStream per decrittografarlo;
|
||||
- fare un po' di offuscazione inutile per far perdere qualche minuto a un reverser;
|
||||
- fornire il risultato decrittato a un ZipInputStream per ottenere un file DEX;
|
||||
- fornire il risultato decrittografato a un ZipInputStream per ottenere un file DEX;
|
||||
- infine caricare il DEX risultante come Risorsa utilizzando il metodo `loadDex`.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
@ -26,7 +26,7 @@ Se ricevi un errore come il seguente in un software Android virtuale (come Genym
|
||||
```
|
||||
adb server version (41) doesn't match this client (36); killing...
|
||||
```
|
||||
È perché stai cercando di connetterti a un server ADB con una versione diversa. Prova a trovare il binario adb che il software sta utilizzando (vai in `C:\Program Files\Genymobile\Genymotion` e cerca adb.exe)
|
||||
È perché stai cercando di connetterti a un server ADB con una versione diversa. Prova a trovare il binario adb che il software sta utilizzando (vai su `C:\Program Files\Genymobile\Genymotion` e cerca adb.exe)
|
||||
|
||||
## Diversi dispositivi
|
||||
|
||||
@ -45,7 +45,7 @@ root
|
||||
```
|
||||
## Port Tunneling
|
||||
|
||||
Nel caso in cui la **porta** **adb** sia accessibile solo da **localhost** nel dispositivo Android ma **hai accesso tramite SSH**, puoi **inoltrare la porta 5555** e connetterti tramite adb:
|
||||
Nel caso in cui la **porta** **adb** sia accessibile solo da **localhost** nel dispositivo android ma **hai accesso tramite SSH**, puoi **inoltrare la porta 5555** e connetterti tramite adb:
|
||||
```bash
|
||||
ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222
|
||||
adb connect 127.0.0.1:5555
|
||||
@ -54,7 +54,7 @@ adb connect 127.0.0.1:5555
|
||||
|
||||
## Installa/Rimuovi
|
||||
|
||||
### adb install \[option] \<path>
|
||||
### adb install \[opzione] \<percorso>
|
||||
```bash
|
||||
adb install test.apk
|
||||
|
||||
@ -136,7 +136,7 @@ adb shell screencap /sdcard/screen.png
|
||||
```
|
||||
### adb shell screenrecord \[options] \<filename>
|
||||
|
||||
Registrazione del display dei dispositivi che eseguono Android 4.4 (API level 19) e versioni superiori.
|
||||
Registrazione del display dei dispositivi che eseguono Android 4.4 (API level 19) e versioni successive.
|
||||
```bash
|
||||
adb shell screenrecord /sdcard/demo.mp4
|
||||
adb shell screenrecord --size <WIDTHxHEIGHT>
|
||||
@ -196,7 +196,7 @@ Riavvia il demone adbd con permessi di root. Poi, devi riconnetterti al server A
|
||||
```bash
|
||||
adb sideload <update.zip>
|
||||
```
|
||||
flashing/restoring pacchetti Android update.zip.
|
||||
flashing/restoring Android update.zip packages.
|
||||
|
||||
# Logs
|
||||
|
||||
@ -261,7 +261,7 @@ Note: Un dispositivo mobile con le Opzioni Sviluppatore abilitate che esegue And
|
||||
```bash
|
||||
adb shell dumpsys batterystats collects battery data from your device
|
||||
```
|
||||
Note: [Battery Historian](https://github.com/google/battery-historian) converte questi dati in una visualizzazione HTML. **PASSO 1** _adb shell dumpsys batterystats > batterystats.txt_ **PASSO 2** _python historian.py batterystats.txt > batterystats.html_
|
||||
Note: [Battery Historian](https://github.com/google/battery-historian) converte quei dati in una visualizzazione HTML. **PASSO 1** _adb shell dumpsys batterystats > batterystats.txt_ **PASSO 2** _python historian.py batterystats.txt > batterystats.html_
|
||||
```bash
|
||||
adb shell dumpsys batterystats --reset erases old collection data
|
||||
```
|
||||
|
@ -15,18 +15,18 @@
|
||||
|
||||
### Condivisione UID
|
||||
|
||||
**Due applicazioni possono essere configurate per utilizzare lo stesso UID**. Questo può essere utile per condividere informazioni, ma se una di esse viene compromessa, i dati di entrambe le applicazioni saranno compromessi. Questo è il motivo per cui questo comportamento è **sconsigliato**.\
|
||||
**Due applicazioni possono essere configurate per utilizzare lo stesso UID**. Questo può essere utile per condividere informazioni, ma se una di esse viene compromessa, i dati di entrambe le applicazioni saranno compromessi. Ecco perché questo comportamento è **sconsigliato**.\
|
||||
**Per condividere lo stesso UID, le applicazioni devono definire lo stesso valore `android:sharedUserId` nei loro manifest.**
|
||||
|
||||
### Sandboxing
|
||||
|
||||
Il **Sandbox delle Applicazioni Android** consente di eseguire **ogni applicazione** come un **processo separato sotto un ID Utente separato**. Ogni processo ha la propria macchina virtuale, quindi il codice di un'app viene eseguito in isolamento rispetto ad altre app.\
|
||||
A partire da Android 5.0(L), **SELinux** è applicato. Fondamentalmente, SELinux nega tutte le interazioni tra processi e poi crea politiche per **consentire solo le interazioni previste tra di essi**.
|
||||
A partire da Android 5.0(L), **SELinux** è applicato. Fondamentalmente, SELinux nega tutte le interazioni tra i processi e poi crea politiche per **consentire solo le interazioni previste tra di essi**.
|
||||
|
||||
### Permessi
|
||||
|
||||
Quando installi un'**app e chiede permessi**, l'app sta chiedendo i permessi configurati negli elementi **`uses-permission`** nel file **AndroidManifest.xml**. L'elemento **uses-permission** indica il nome del permesso richiesto all'interno dell'**attributo name**. Ha anche l'attributo **maxSdkVersion** che smette di chiedere permessi su versioni superiori a quella specificata.\
|
||||
Nota che le applicazioni android non devono chiedere tutti i permessi all'inizio, possono anche **chiedere permessi dinamicamente**, ma tutti i permessi devono essere **dichiarati** nel **manifest**.
|
||||
Quando installi un'**app e richiede permessi**, l'app sta chiedendo i permessi configurati negli elementi **`uses-permission`** nel file **AndroidManifest.xml**. L'elemento **uses-permission** indica il nome del permesso richiesto all'interno dell'**attributo name**. Ha anche l'attributo **maxSdkVersion** che smette di chiedere permessi su versioni superiori a quella specificata.\
|
||||
Nota che le applicazioni android non devono chiedere tutti i permessi all'inizio, possono anche **richiedere permessi dinamicamente**, ma tutti i permessi devono essere **dichiarati** nel **manifest**.
|
||||
|
||||
Quando un'app espone funzionalità, può limitare l'**accesso solo alle app che hanno un permesso specificato**.\
|
||||
Un elemento di permesso ha tre attributi:
|
||||
@ -37,7 +37,7 @@ Un elemento di permesso ha tre attributi:
|
||||
- **Normale**: Usato quando non ci sono **minacce note** all'app. L'utente **non è tenuto ad approvarlo**.
|
||||
- **Pericoloso**: Indica che il permesso concede all'applicazione richiedente un **accesso elevato**. **Gli utenti sono invitati ad approvarli**.
|
||||
- **Firma**: Solo le **app firmate dallo stesso certificato di quello** che esporta il componente possono ricevere il permesso. Questo è il tipo di protezione più forte.
|
||||
- **FirmaOSystem**: Solo le **app firmate dallo stesso certificato di quello** che esporta il componente o **app che girano con accesso a livello di sistema** possono ricevere permessi.
|
||||
- **SignatureOrSystem**: Solo le **app firmate dallo stesso certificato di quello** che esporta il componente o **app che girano con accesso a livello di sistema** possono ricevere permessi.
|
||||
|
||||
## Applicazioni Preinstallate
|
||||
|
||||
@ -71,7 +71,7 @@ Una volta che un dispositivo è rootato, qualsiasi app potrebbe richiedere acces
|
||||
## Fondamenti delle Applicazioni Android <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Il formato delle applicazioni Android è noto come _APK file format_. È essenzialmente un **file ZIP** (rinominando l'estensione del file in .zip, i contenuti possono essere estratti e visualizzati).
|
||||
- Contenuti APK (Non esaustivo)
|
||||
- Contenuti APK (non esaustivo)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc: contiene risorse precompilate, come XML binario.
|
||||
@ -93,9 +93,9 @@ Una volta che un dispositivo è rootato, qualsiasi app potrebbe richiedere acces
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
Nello sviluppo Android, **Java o Kotlin** vengono utilizzati per creare app. Invece di utilizzare la JVM come nelle app desktop, Android compila questo codice in **bytecode Dalvik Executable (DEX)**. In passato, la macchina virtuale Dalvik gestiva questo bytecode, ma ora, l'Android Runtime (ART) prende il sopravvento nelle versioni più recenti di Android.
|
||||
Nello sviluppo Android, **Java o Kotlin** viene utilizzato per creare app. Invece di utilizzare la JVM come nelle app desktop, Android compila questo codice in **bytecode Dalvik Eseguibile (DEX)**. In passato, la macchina virtuale Dalvik gestiva questo bytecode, ma ora, l'Android Runtime (ART) prende il sopravvento nelle versioni più recenti di Android.
|
||||
|
||||
Per il reverse engineering, **Smali** diventa cruciale. È la versione leggibile dall'uomo del bytecode DEX, agendo come un linguaggio assembly traducendo il codice sorgente in istruzioni bytecode. Smali e baksmali si riferiscono agli strumenti di assemblaggio e disassemblaggio in questo contesto.
|
||||
Per il reverse engineering, **Smali** diventa cruciale. È la versione leggibile dall'uomo del bytecode DEX, che agisce come un linguaggio assembly traducendo il codice sorgente in istruzioni bytecode. Smali e baksmali si riferiscono agli strumenti di assemblaggio e disassemblaggio in questo contesto.
|
||||
|
||||
## Intents
|
||||
|
||||
@ -105,7 +105,7 @@ Quindi un Intent è fondamentalmente un **messaggio che viene passato tra i comp
|
||||
Per essere semplici, l'Intent può essere utilizzato:
|
||||
|
||||
- Per avviare un'Activity, tipicamente aprendo un'interfaccia utente per un'app
|
||||
- Come broadcast per informare il sistema e le app di cambiamenti
|
||||
- Come trasmissioni per informare il sistema e le app di cambiamenti
|
||||
- Per avviare, fermare e comunicare con un servizio in background
|
||||
- Per accedere ai dati tramite ContentProviders
|
||||
- Come callback per gestire eventi
|
||||
@ -114,11 +114,11 @@ Se vulnerabili, **gli Intents possono essere utilizzati per eseguire una variet
|
||||
|
||||
### Intent-Filter
|
||||
|
||||
**I Filtri di Intent** definiscono **come un'attività, un servizio o un Broadcast Receiver possono interagire con diversi tipi di Intents**. Fondamentalmente, descrivono le capacità di questi componenti, come quali azioni possono eseguire o i tipi di broadcast che possono elaborare. Il luogo principale per dichiarare questi filtri è all'interno del **file AndroidManifest.xml**, anche se per i Broadcast Receivers, codificarli è anche un'opzione.
|
||||
**I Filtri di Intent** definiscono **come un'attività, un servizio o un Broadcast Receiver possono interagire con diversi tipi di Intents**. Fondamentalmente, descrivono le capacità di questi componenti, come quali azioni possono eseguire o i tipi di trasmissioni che possono elaborare. Il luogo principale per dichiarare questi filtri è all'interno del **file AndroidManifest.xml**, anche se per i Broadcast Receivers, codificarli è anche un'opzione.
|
||||
|
||||
I Filtri di Intent sono composti da categorie, azioni e filtri di dati, con la possibilità di includere metadati aggiuntivi. Questa configurazione consente ai componenti di gestire specifici Intents che corrispondono ai criteri dichiarati.
|
||||
|
||||
Un aspetto critico dei componenti Android (attività/servizi/provider di contenuti/receiver di broadcast) è la loro visibilità o **stato pubblico**. Un componente è considerato pubblico e può interagire con altre app se è **`exported`** con un valore di **`true`** o se un Filtro di Intent è dichiarato per esso nel manifest. Tuttavia, c'è un modo per gli sviluppatori di mantenere esplicitamente privati questi componenti, assicurandosi che non interagiscano con altre app inavvertitamente. Questo viene realizzato impostando l'attributo **`exported`** su **`false`** nelle loro definizioni di manifest.
|
||||
Un aspetto critico dei componenti Android (attività/servizi/provider di contenuti/receiver di trasmissione) è la loro visibilità o **stato pubblico**. Un componente è considerato pubblico e può interagire con altre app se è **`exported`** con un valore di **`true`** o se è dichiarato un Filtro di Intent per esso nel manifest. Tuttavia, c'è un modo per gli sviluppatori di mantenere esplicitamente privati questi componenti, assicurandosi che non interagiscano con altre app inavvertitamente. Questo viene realizzato impostando l'attributo **`exported`** su **`false`** nelle loro definizioni di manifest.
|
||||
|
||||
Inoltre, gli sviluppatori hanno la possibilità di garantire ulteriormente l'accesso a questi componenti richiedendo permessi specifici. L'attributo **`permission`** può essere impostato per imporre che solo le app con il permesso designato possano accedere al componente, aggiungendo un ulteriore livello di sicurezza e controllo su chi può interagire con esso.
|
||||
```java
|
||||
@ -165,7 +165,7 @@ Questi consentono ad altre applicazioni di **eseguire azioni per conto della tua
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
A differenza degli intent precedenti, che sono ricevuti solo da un'app, gli intent di broadcast **possono essere ricevuti da più app**. Tuttavia, dalla versione API 14, è **possibile specificare l'app che dovrebbe ricevere** il messaggio utilizzando Intent.setPackage.
|
||||
A differenza degli intent precedenti, che sono ricevuti solo da un'app, gli intent broadcast **possono essere ricevuti da più app**. Tuttavia, dalla versione API 14, è **possibile specificare l'app che dovrebbe ricevere** il messaggio utilizzando Intent.setPackage.
|
||||
|
||||
In alternativa, è anche possibile **specificare un permesso quando si invia il broadcast**. L'app ricevente dovrà avere quel permesso.
|
||||
|
||||
@ -178,7 +178,7 @@ Puoi anche utilizzare la funzione **`sendBroadcast`** da **`LocalBroadCastManage
|
||||
|
||||
Questo tipo di Broadcasts **può essere accessibile a lungo dopo che sono stati inviati**.\
|
||||
Questi sono stati deprecati a livello API 21 ed è consigliato **non usarli**.\
|
||||
**Consentono a qualsiasi applicazione di intercettare i dati, ma anche di modificarli.**
|
||||
**Consentono a qualsiasi applicazione di sniffare i dati, ma anche di modificarli.**
|
||||
|
||||
Se trovi funzioni contenenti la parola "sticky" come **`sendStickyBroadcast`** o **`sendStickyBroadcastAsUser`**, **controlla l'impatto e cerca di rimuoverle**.
|
||||
|
||||
@ -215,15 +215,15 @@ Per trovare il **codice che verrà eseguito nell'App**, vai all'attività chiama
|
||||
|
||||
Scopri come [chiamare deep link senza utilizzare pagine HTML](./#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Android Interface Definition Language
|
||||
## AIDL - Linguaggio di Definizione dell'Interfaccia Android
|
||||
|
||||
Il **Android Interface Definition Language (AIDL)** è progettato per facilitare la comunicazione tra client e servizio nelle applicazioni Android attraverso la **comunicazione interprocesso** (IPC). Poiché l'accesso diretto alla memoria di un altro processo non è consentito su Android, AIDL semplifica il processo marshalling degli oggetti in un formato comprensibile dal sistema operativo, facilitando così la comunicazione tra diversi processi.
|
||||
Il **Linguaggio di Definizione dell'Interfaccia Android (AIDL)** è progettato per facilitare la comunicazione tra client e servizio nelle applicazioni Android attraverso la **comunicazione interprocesso** (IPC). Poiché l'accesso diretto alla memoria di un altro processo non è consentito su Android, AIDL semplifica il processo marshalling degli oggetti in un formato comprensibile dal sistema operativo, facilitando così la comunicazione tra diversi processi.
|
||||
|
||||
### Concetti Chiave
|
||||
|
||||
- **Servizi Legati**: Questi servizi utilizzano AIDL per IPC, consentendo ad attività o componenti di collegarsi a un servizio, fare richieste e ricevere risposte. Il metodo `onBind` nella classe del servizio è fondamentale per avviare l'interazione, segnalandolo come un'area vitale per la revisione della sicurezza alla ricerca di vulnerabilità.
|
||||
|
||||
- **Messenger**: Operando come un servizio legato, il Messenger facilita l'IPC con un focus sul trattamento dei dati attraverso il metodo `onBind`. È essenziale ispezionare questo metodo attentamente per eventuali gestioni di dati non sicure o esecuzione di funzioni sensibili.
|
||||
- **Messenger**: Operando come un servizio legato, il Messenger facilita l'IPC con un focus sul trattamento dei dati attraverso il metodo `onBind`. È essenziale ispezionare questo metodo attentamente per eventuali gestioni di dati non sicure o esecuzioni di funzioni sensibili.
|
||||
|
||||
- **Binder**: Sebbene l'uso diretto della classe Binder sia meno comune a causa dell'astrazione di AIDL, è utile comprendere che il Binder funge da driver a livello di kernel facilitando il trasferimento di dati tra gli spazi di memoria di diversi processi. Per ulteriori informazioni, è disponibile una risorsa su [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
@ -246,7 +246,7 @@ L'**attività di lancio** è il principale gateway a un'app, avviata quando tocc
|
||||
```
|
||||
Non tutte le app necessitano di un'attività di avvio, specialmente quelle senza un'interfaccia utente, come i servizi in background.
|
||||
|
||||
Le attività possono essere rese disponibili ad altre app o processi contrassegnandole come "exported" nel manifest. Questa impostazione consente ad altre app di avviare questa attività:
|
||||
Le attività possono essere rese disponibili ad altre app o processi contrassegnandole come "esportate" nel manifest. Questa impostazione consente ad altre app di avviare questa attività:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
@ -256,7 +256,7 @@ Il ciclo di vita di un'attività **inizia con il metodo onCreate**, impostando l
|
||||
|
||||
### Sottoclasse dell'Applicazione
|
||||
|
||||
Nello sviluppo Android, un'app ha la possibilità di creare una **sottoclasse** della [Application](https://developer.android.com/reference/android/app/Application) classe, anche se non è obbligatorio. Quando tale sottoclasse è definita, diventa la prima classe a essere istanziata all'interno dell'app. Il metodo **`attachBaseContext`**, se implementato in questa sottoclasse, viene eseguito prima del metodo **`onCreate`**. Questa configurazione consente un'inizializzazione anticipata prima che il resto dell'applicazione inizi.
|
||||
Nello sviluppo Android, un'app ha l'opzione di creare una **sottoclasse** della [Application](https://developer.android.com/reference/android/app/Application) classe, anche se non è obbligatorio. Quando tale sottoclasse è definita, diventa la prima classe a essere istanziata all'interno dell'app. Il metodo **`attachBaseContext`**, se implementato in questa sottoclasse, viene eseguito prima del metodo **`onCreate`**. Questa configurazione consente un'inizializzazione anticipata prima che il resto dell'applicazione inizi.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
@ -323,7 +323,7 @@ Per ulteriori informazioni controlla:
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews sono come **mini browser web** all'interno delle app Android, che estraggono contenuti dal web o da file locali. Affrontano rischi simili a quelli dei browser normali, ma ci sono modi per **ridurre questi rischi** attraverso **impostazioni** specifiche.
|
||||
WebViews sono come **mini browser web** all'interno delle app Android, che estraggono contenuti sia dal web che da file locali. Affrontano rischi simili a quelli dei browser regolari, ma ci sono modi per **ridurre questi rischi** attraverso **impostazioni** specifiche.
|
||||
|
||||
Android offre due principali tipi di WebView:
|
||||
|
||||
@ -354,7 +354,7 @@ Per controllare l'accesso ai file:
|
||||
|
||||
### **Gestione dei Dispositivi Mobili (MDM)**
|
||||
|
||||
- Le **soluzioni MDM** forniscono **supervisione e sicurezza** per i dispositivi mobili attraverso l'**API di Amministrazione Dispositivo**. Richiedono l'installazione di un'app Android per gestire e proteggere efficacemente i dispositivi mobili. Le funzioni chiave includono **imposizione di politiche sulle password**, **obbligo di crittografia dello storage** e **permissibilità di cancellazione remota dei dati**, garantendo un controllo e una sicurezza completi sui dispositivi mobili.
|
||||
- Le **soluzioni MDM** forniscono **supervisione e sicurezza** per i dispositivi mobili attraverso l'**API di Amministrazione Dispositivo**. Richiedono l'installazione di un'app Android per gestire e proteggere efficacemente i dispositivi mobili. Le funzioni chiave includono **imposizione di politiche sulle password**, **obbligo di crittografia dello storage** e **permissività di cancellazione remota dei dati**, garantendo un controllo e una sicurezza completi sui dispositivi mobili.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
@ -23,7 +23,7 @@ Nelle applicazioni Android, l'**affinità del task** specifica il task preferito
|
||||
|
||||
### Modalità di Lancio
|
||||
|
||||
L'attributo `launchMode` dirige la gestione delle istanze delle attività all'interno dei task. La modalità **singleTask** è fondamentale per questo attacco, dettando tre scenari basati sulle istanze di attività esistenti e sulle corrispondenze di affinità del task. L'exploit si basa sulla capacità dell'app dell'attaccante di imitare l'affinità del task dell'app target, ingannando il sistema Android nel lanciare l'app dell'attaccante invece dell'app target prevista.
|
||||
L'attributo `launchMode` dirige la gestione delle istanze delle attività all'interno dei task. La modalità **singleTask** è fondamentale per questo attacco, dettando tre scenari basati sulle istanze di attività esistenti e sulle corrispondenze di affinità del task. L'exploit si basa sulla capacità dell'app dell'attaccante di imitare l'affinità del task dell'app target, ingannando il sistema Android nel lanciare l'app dell'attaccante invece dell'obiettivo previsto.
|
||||
|
||||
### Passaggi Dettagliati dell'Attacco
|
||||
|
||||
|
@ -10,7 +10,7 @@ Come il pioniere decompilatore GUI Java, **JD-Gui** ti consente di investigare i
|
||||
|
||||
### [Jadx](https://github.com/skylot/jadx)
|
||||
|
||||
**Jadx** offre un'interfaccia user-friendly per decompilare codice Java da applicazioni Android. È raccomandato per la sua facilità d'uso su diverse piattaforme.
|
||||
**Jadx** offre un'interfaccia user-friendly per decompilare il codice Java dalle applicazioni Android. È raccomandato per la sua facilità d'uso su diverse piattaforme.
|
||||
|
||||
- Per avviare l'interfaccia grafica, naviga nella directory bin ed esegui: `jadx-gui`
|
||||
- Per l'uso da riga di comando, decompila un APK con: `jadx app.apk`
|
||||
@ -45,7 +45,7 @@ Con **Bytecode-Viewer**, puoi analizzare i file APK utilizzando più decompilato
|
||||
|
||||
### [Krakatau](https://github.com/Storyyeller/Krakatau)
|
||||
|
||||
**Krakatau** offre un controllo dettagliato sulla decompilazione, specialmente per la gestione di librerie esterne.
|
||||
**Krakatau** offre un controllo dettagliato sulla decompilazione, specialmente per la gestione delle librerie esterne.
|
||||
|
||||
- Usa Krakatau specificando il percorso della libreria standard e il file JAR da decompilare: `./Krakatau/decompile.py -out "output_directory" -skip -nauto -path "./jrt-extractor/rt.jar" "app.jar"`
|
||||
|
||||
|
@ -58,7 +58,7 @@ La macchina virtuale sarà creata. Ora **ogni volta che accedi all'AVD manager s
|
||||
|
||||
### Esegui la Macchina Virtuale
|
||||
|
||||
Per **eseguirla** basta premere il _**pulsante Start**_.
|
||||
Per **eseguirla** basta premere il _**Pulsante di Avvio**_.
|
||||
|
||||
.png>)
|
||||
|
||||
|
@ -19,13 +19,13 @@ frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-byp
|
||||
```
|
||||
## **Metodo 2 – Approccio alla Gestione delle Eccezioni**
|
||||
|
||||
Un altro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) di WithSecure affronta il bypass dell'uso di oggetti crittografici insicuri. Lo script invoca _onAuthenticationSucceeded_ con un _CryptoObject_ che non è stato autorizzato da un'impronta digitale. Se l'applicazione tenta di utilizzare un oggetto cifrato diverso, verrà generata un'eccezione. Lo script si prepara a invocare _onAuthenticationSucceeded_ e gestire l'_javax.crypto.IllegalBlockSizeException_ nella classe _Cipher_, assicurando che gli oggetti successivi utilizzati dall'applicazione siano crittografati con la nuova chiave.
|
||||
Un altro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) di WithSecure affronta il bypass dell'uso di oggetti crittografici insicuri. Lo script invoca _onAuthenticationSucceeded_ con un _CryptoObject_ che non è stato autorizzato da un'impronta digitale. Se l'applicazione tenta di utilizzare un oggetto cifrato diverso, verrà generata un'eccezione. Lo script si prepara a invocare _onAuthenticationSucceeded_ e gestire il _javax.crypto.IllegalBlockSizeException_ nella classe _Cipher_, assicurando che gli oggetti successivi utilizzati dall'applicazione siano crittografati con la nuova chiave.
|
||||
|
||||
Comando per eseguire lo script Frida:
|
||||
```bash
|
||||
frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
|
||||
```
|
||||
Una volta raggiunta la schermata delle impronte digitali e l'inizio di `authenticate()`, digita `bypass()` nella console di Frida per attivare il bypass:
|
||||
Al raggiungimento dello schermo delle impronte digitali e all'inizio di `authenticate()`, digita `bypass()` nella console di Frida per attivare il bypass:
|
||||
```
|
||||
Spawning com.generic.insecurebankingfingerprint...
|
||||
[Android Emulator 5554::com.generic.insecurebankingfingerprint]-> Hooking BiometricPrompt.authenticate()...
|
||||
@ -48,9 +48,9 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
|
||||
Strumenti di ingegneria inversa come `APKTool`, `dex2jar` e `JD-GUI` possono essere utilizzati per decompilare un'applicazione Android, leggere il suo codice sorgente e comprendere il suo meccanismo di autenticazione. I passaggi generalmente includono:
|
||||
|
||||
1. **Decompilazione dell'APK**: Convertire il file APK in un formato più leggibile (come il codice Java).
|
||||
1. **Decompilazione dell'APK**: Convertire il file APK in un formato più leggibile per gli esseri umani (come il codice Java).
|
||||
2. **Analisi del codice**: Cercare l'implementazione dell'autenticazione tramite impronta digitale e identificare potenziali vulnerabilità (come meccanismi di fallback o controlli di validazione inadeguati).
|
||||
3. **Ricompilazione dell'APK**: Dopo aver modificato il codice per bypassare l'autenticazione tramite impronta digitale, l'applicazione viene ricompilata, firmata e installata sul dispositivo per il test.
|
||||
3. **Ricompilazione dell'APK**: Dopo aver modificato il codice per bypassare l'autenticazione tramite impronta digitale, l'applicazione viene ricompilata, firmata e installata sul dispositivo per i test.
|
||||
|
||||
## **Metodo 5 – Utilizzo di strumenti di autenticazione personalizzati**
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
**Questo è un riepilogo del post [https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)**
|
||||
|
||||
### Elencare i file nel Media Store
|
||||
@ -9,7 +8,7 @@ Per elencare i file gestiti dal Media Store, è possibile utilizzare il comando
|
||||
```bash
|
||||
$ content query --uri content://media/external/file
|
||||
```
|
||||
Per un output più amichevole per l'utente, visualizzando solo l'identificatore e il percorso di ciascun file indicizzato:
|
||||
Per un output più amichevole, visualizzando solo l'identificatore e il percorso di ciascun file indicizzato:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file --projection _id,_data
|
||||
```
|
||||
|
@ -29,7 +29,7 @@ L'agente è in esecuzione sulla porta 31415, dobbiamo [port forward](https://en.
|
||||
```bash
|
||||
adb forward tcp:31415 tcp:31415
|
||||
```
|
||||
Infine, **lancia** l'**applicazione** e premi il pulsante "**ON**"
|
||||
Infine, **avvia** l'**applicazione** e premi il pulsante "**ON**"
|
||||
|
||||
.png>)
|
||||
|
||||
@ -50,7 +50,7 @@ drozer console connect
|
||||
| **unset** | Rimuove una variabile nominata che drozer passa a qualsiasi shell Linux che genera. |
|
||||
| **set** | Memorizza un valore in una variabile che sarà passato come variabile ambientale a qualsiasi shell Linux generata da drozer. |
|
||||
| **shell** | Avvia una shell Linux interattiva sul dispositivo, nel contesto dell'Agente |
|
||||
| **run MODULE** | Esegui un modulo drozer |
|
||||
| **run MODULE** | Esegue un modulo drozer |
|
||||
| **exploit** | Drozer può creare exploit da eseguire nel dispositivo. `drozer exploit list` |
|
||||
| **payload** | Gli exploit necessitano di un payload. `drozer payload list` |
|
||||
|
||||
@ -107,7 +107,7 @@ Il valore “android:exported” di un componente di attività esportato è impo
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
```
|
||||
**Elenco delle attività esportate**:
|
||||
**Elenca le attività esportate**:
|
||||
```bash
|
||||
dz> run app.activity.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
@ -115,7 +115,7 @@ com.mwr.example.sieve.FileSelectActivity
|
||||
com.mwr.example.sieve.MainLoginActivity
|
||||
com.mwr.example.sieve.PWList
|
||||
```
|
||||
**Inizia attività**:
|
||||
**Avvia attività**:
|
||||
|
||||
Forse puoi avviare un'attività e bypassare qualche tipo di autorizzazione che dovrebbe impedirti di lanciarla.
|
||||
```bash
|
||||
@ -163,7 +163,7 @@ Dai un'occhiata all'aiuto di **drozer** per `app.service.send`:
|
||||
|
||||
.png>)
|
||||
|
||||
Nota che invierai prima i dati all'interno di "_msg.what_", poi "_msg.arg1_" e "_msg.arg2_", dovresti controllare all'interno del codice **quale informazione viene utilizzata** e dove.\
|
||||
Nota che invierai prima i dati all'interno di "_msg.what_", poi "_msg.arg1_" e "_msg.arg2_", dovresti controllare all'interno del codice **quali informazioni vengono utilizzate** e dove.\
|
||||
Utilizzando l'opzione `--extra` puoi inviare qualcosa interpretato da "_msg.replyTo_", e usando `--bundle-as-obj` crei un oggetto con i dettagli forniti.
|
||||
|
||||
Nell'esempio seguente:
|
||||
@ -179,7 +179,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m
|
||||
|
||||
### Broadcast Receivers
|
||||
|
||||
**Nella sezione delle informazioni di base di Android puoi vedere cos'è un Broadcast Receiver**.
|
||||
**Nella sezione informazioni di base di Android puoi vedere cos'è un Broadcast Receiver**.
|
||||
|
||||
Dopo aver scoperto questi Broadcast Receivers dovresti **controllare il codice** di essi. Fai particolare attenzione alla funzione **`onReceive`** poiché gestirà i messaggi ricevuti.
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
# Exploiting Content Providers
|
||||
# Sfruttare i Content Providers
|
||||
|
||||
## Exploiting Content Providers
|
||||
## Sfruttare i Content Providers
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Intro
|
||||
## Introduzione
|
||||
|
||||
I dati sono **forniti da un'applicazione ad altre** su richiesta da un componente noto come **content provider**. Queste richieste sono gestite attraverso i metodi della **ContentResolver class**. I content provider possono memorizzare i loro dati in varie posizioni, come un **database**, **file** o su una **rete**.
|
||||
I dati vengono **forniti da un'applicazione ad altre** su richiesta da un componente noto come **content provider**. Queste richieste sono gestite attraverso i metodi della **classe ContentResolver**. I content provider possono memorizzare i loro dati in varie posizioni, come un **database**, **file** o su una **rete**.
|
||||
|
||||
Nel file _Manifest.xml_, è necessaria la dichiarazione del content provider. Ad esempio:
|
||||
```xml
|
||||
@ -54,7 +54,7 @@ content://com.mwr.example.sieve.DBContentProvider/Keys/
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords/
|
||||
```
|
||||
Dovresti anche controllare il **codice del ContentProvider** per cercare query:
|
||||
Dovresti anche controllare il **codice ContentProvider** per cercare query:
|
||||
|
||||
 (1) (1) (1).png>)
|
||||
|
||||
@ -64,7 +64,7 @@ Inoltre, se non riesci a trovare query complete, potresti **controllare quali no
|
||||
|
||||
La query sarà simile a: `content://name.of.package.class/declared_name`
|
||||
|
||||
## **Content Providers supportati da database**
|
||||
## **Content Providers supportati da Database**
|
||||
|
||||
Probabilmente la maggior parte dei Content Providers è utilizzata come **interfaccia** per un **database**. Pertanto, se puoi accedervi, potresti essere in grado di **estrarre, aggiornare, inserire e eliminare** informazioni.\
|
||||
Controlla se puoi **accedere a informazioni sensibili** o prova a modificarle per **bypassare** i meccanismi di autorizzazione.
|
||||
@ -89,7 +89,7 @@ email: incognitoguy50@gmail.com
|
||||
```
|
||||
### Inserisci contenuto
|
||||
|
||||
Interrogando il database imparerai il **nome delle colonne**, poi, potresti essere in grado di inserire dati nel DB:
|
||||
Queriando il database imparerai il **nome delle colonne**, poi, potresti essere in grado di inserire dati nel DB:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -110,11 +110,11 @@ Conoscendo il nome delle colonne potresti anche **modificare le voci**:
|
||||
### **SQL Injection**
|
||||
|
||||
È semplice testare per SQL injection **(SQLite)** manipolando i **campi di proiezione** e **selezione** che vengono passati al content provider.\
|
||||
Quando interroghi il Content Provider ci sono 2 argomenti interessanti per cercare informazioni: _--selection_ e _--projection_:
|
||||
Quando quering il Content Provider ci sono 2 argomenti interessanti per cercare informazioni: _--selection_ e _--projection_:
|
||||
|
||||
.png>)
|
||||
|
||||
Puoi provare ad **abusare** di questi **parametri** per testare per **SQL injections**:
|
||||
Puoi provare ad **abusare** di questi **parametri** per testare per **SQL injection**:
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
|
||||
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
|
||||
@ -127,7 +127,7 @@ FROM SQLITE_MASTER WHERE type='table';--"
|
||||
| table | android_metadata | android_metadata | 3 | CREATE TABLE ... |
|
||||
| table | Passwords | Passwords | 4 | CREATE TABLE ... |
|
||||
```
|
||||
**Scoperta automatica di SQL Injection da parte di Drozer**
|
||||
**Scoperta automatica di SQLInjection da parte di Drozer**
|
||||
```
|
||||
dz> run scanner.provider.injection -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
@ -147,7 +147,7 @@ android_metadata
|
||||
notes
|
||||
sqlite_sequence
|
||||
```
|
||||
## **Content Provider basati su File System**
|
||||
## **Content Provider supportati dal File System**
|
||||
|
||||
I content provider possono essere utilizzati anche per **accedere ai file:**
|
||||
|
||||
|
@ -41,7 +41,7 @@ Contenuto basato su https://medium.com/@shubhamsonani/hacking-with-precision-byp
|
||||
6. **Impostare i breakpoint nei file Java chiave:**
|
||||
- Posizionare i breakpoint in `MainActivity.java` (specificamente nel metodo `onCreate`), `b.java` e `ContextWrapper.java`.
|
||||
|
||||
### **Evitare controlli**
|
||||
### **Evitare i controlli**
|
||||
|
||||
L'applicazione, in determinati punti, verificherà se è debuggable e controllerà anche i binari che indicano un dispositivo rootato. Il debugger può essere utilizzato per modificare le informazioni dell'app, disattivare il bit debuggable e alterare i nomi dei binari cercati per bypassare questi controlli.
|
||||
|
||||
@ -64,12 +64,12 @@ Il passaggio 2 comporta la modifica di un valore di flag a 814267972, che è rap
|
||||
## **Controllare la vulnerabilità**
|
||||
|
||||
- L'applicazione è stata decompilata utilizzando `apktool` per accedere al file `AndroidManifest.xml`.
|
||||
- La presenza di `android_debuggable="true"` nell'AndroidManifest.xml indica che l'applicazione è debuggable e suscettibile a sfruttamento.
|
||||
- La presenza di `android_debuggable="true"` nell'AndroidManifest.xml indica che l'applicazione è debuggable e suscettibile di sfruttamento.
|
||||
- Vale la pena notare che `apktool` è impiegato esclusivamente per controllare lo stato debuggable senza alterare alcun codice.
|
||||
|
||||
## **Preparare l'impostazione**
|
||||
## **Preparare la configurazione**
|
||||
|
||||
- Il processo ha comportato l'avvio di un emulatore, l'installazione dell'app vulnerabile e l'uso di `adb jdwp` per identificare le porte Dalvik VM che sono in ascolto.
|
||||
- Il processo ha comportato l'avvio di un emulatore, l'installazione dell'app vulnerabile e l'uso di `adb jdwp` per identificare le porte Dalvik VM in ascolto.
|
||||
- Il JDWP (Java Debug Wire Protocol) consente il debug di un'applicazione in esecuzione in una VM esponendo una porta unica.
|
||||
- Il port forwarding è stato necessario per il debug remoto, seguito dall'attacco di JDB all'applicazione target.
|
||||
|
||||
@ -81,7 +81,7 @@ Il passaggio 2 comporta la modifica di un valore di flag a 814267972, che è rap
|
||||
- I comandi `locals`, `next` e `set` sono stati utilizzati per ispezionare e modificare le variabili locali, in particolare cambiando il messaggio "Try Again" in "Hacked".
|
||||
- Il codice modificato è stato eseguito utilizzando il comando `run`, alterando con successo l'output dell'applicazione in tempo reale.
|
||||
|
||||
Questo esempio ha dimostrato come il comportamento di un'applicazione debuggable possa essere manipolato, evidenziando il potenziale per sfruttamenti più complessi come ottenere accesso shell sul dispositivo nel contesto dell'applicazione.
|
||||
Questo esempio ha dimostrato come il comportamento di un'applicazione debuggable possa essere manipolato, evidenziando il potenziale per exploit più complessi come ottenere accesso shell sul dispositivo nel contesto dell'applicazione.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
|
@ -10,8 +10,8 @@ Installa **frida tools**:
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**Scarica e installa** nel dispositivo android il **frida server** ([Scarica l'ultima versione](https://github.com/frida/frida/releases)).\
|
||||
Comando per riavviare adb in modalità root, connettersi ad esso, caricare frida-server, dare permessi di esecuzione e farlo girare in background:
|
||||
**Scarica e installa** nel android il **frida server** ([Scarica l'ultima versione](https://github.com/frida/frida/releases)).\
|
||||
Comando per riavviare adb in modalità root, connettersi ad esso, caricare frida-server, dare permessi di esecuzione e eseguirlo in background:
|
||||
```bash
|
||||
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
|
||||
```
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Questo è un riassunto del post**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**Questo è un riepilogo del post**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Codice Sorgente**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
### Riassunto
|
||||
|
||||
**L'obiettivo** di **objection** è consentire all'utente di chiamare le **azioni principali che offre Frida**. **Altrimenti**, l'utente dovrà creare un **singolo script per ogni applicazione** che desidera testare.
|
||||
Il **goal** di **objection** è consentire all'utente di chiamare le **azioni principali che offre Frida**. **Altrimenti**, l'utente dovrà creare un **singolo script per ogni applicazione** che desidera testare.
|
||||
|
||||
## Tutorial
|
||||
|
||||
@ -97,7 +97,7 @@ android hooking list activities
|
||||
android hooking list services
|
||||
android hooking list receivers
|
||||
```
|
||||
Frida lancerà un errore se non viene trovata
|
||||
Frida lancerà un errore se non viene trovata nessuna
|
||||
|
||||
#### Ottenere l'attività corrente
|
||||
```bash
|
||||
@ -107,7 +107,7 @@ android hooking get current_activity
|
||||
|
||||
#### Cerca Classi
|
||||
|
||||
Iniziamo a cercare classi all'interno della nostra applicazione.
|
||||
Iniziamo a cercare classi all'interno della nostra applicazione
|
||||
```bash
|
||||
android hooking search classes asvid.github.io.fridaapp
|
||||
```
|
||||
@ -169,7 +169,7 @@ Ora, se scrivi qualsiasi cosa nella casella di testo per il codice PIN, vedrai c
|
||||
|
||||
### Istanze di classe
|
||||
|
||||
Cerca e stampa **istanze live di una specifica classe Java**, specificata da un nome di classe completamente qualificato. Ecco il risultato di un tentativo di ottenere un valore stringa per un'obiezione scoperta che tipicamente **contiene valori di proprietà per l'oggetto**.
|
||||
Cerca e stampa **istanze live di una specifica classe Java**, specificata da un nome di classe completamente qualificato. Questo è il risultato di un tentativo di ottenere un valore stringa per un'obiezione scoperta che tipicamente **contiene valori di proprietà per l'oggetto**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -213,7 +213,7 @@ memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
|
||||
```
|
||||
### SQLite
|
||||
|
||||
Puoi usare il comando `sqlite` per interagire con i database sqlite.
|
||||
Puoi utilizzare il comando `sqlite` per interagire con i database sqlite.
|
||||
|
||||
### Exit
|
||||
```bash
|
||||
@ -225,4 +225,6 @@ exit
|
||||
- Non puoi usare le istanze delle classi per chiamare le funzioni dell'istanza. E non puoi creare nuove istanze delle classi e usarle per chiamare funzioni.
|
||||
- Non c'è una scorciatoia (come quella per sslpinnin) per hookare tutti i metodi crittografici comuni utilizzati dall'applicazione per vedere testo cifrato, testo in chiaro, chiavi, IV e algoritmi utilizzati.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
Basato su [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
|
||||
**Hook la funzione \_exit()**\_ e **la funzione di decrittazione** in modo che stampi il flag nella console di frida quando premi verifica:
|
||||
**Hook la funzione \_exit()** e **funzione di decrittazione** in modo che stampi il flag nella console frida quando premi verifica:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...")
|
||||
|
@ -22,7 +22,7 @@ Sembra che la funzione che stamperà il flag sia **m().**
|
||||
|
||||
### **Chiama m() la prima volta**
|
||||
|
||||
Facciamo in modo che l'applicazione chiami m() se la variabile _this.o != 1000000_. Per farlo, basta cambiare la condizione:
|
||||
Facciamo in modo che l'applicazione chiami m() se la variabile _this.o != 1000000_ per farlo, basta cambiare la condizione:
|
||||
```
|
||||
if-ne v0, v9, :cond_2
|
||||
```
|
||||
|
@ -29,7 +29,7 @@ Una volta che la **macchina ha terminato il riavvio**, il certificato burp sarà
|
||||
|
||||
## Utilizzando Magisc
|
||||
|
||||
Se hai **rootato il tuo dispositivo con Magisc** (forse un emulatore), e **non puoi seguire** i **passi** precedenti per installare il certificato Burp perché il **filesystem è in sola lettura** e non puoi rimontarlo in scrittura, c'è un altro modo.
|
||||
Se hai **rootato il tuo dispositivo con Magisc** (forse un emulatore), e non puoi **seguire** i **passi** precedenti per installare il certificato Burp perché il **filesystem è in sola lettura** e non puoi rimontarlo in scrittura, c'è un altro modo.
|
||||
|
||||
Spiegato in [**questo video**](https://www.youtube.com/watch?v=qQicUW0svB8) devi:
|
||||
|
||||
@ -41,7 +41,7 @@ Spiegato in [**questo video**](https://www.youtube.com/watch?v=qQicUW0svB8) devi
|
||||
|
||||
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
|
||||
|
||||
2. **Rendere fidato di sistema**: Scarica il modulo Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (un file .zip), **trascina e rilascia** nel telefono, vai all'app **Magics** nel telefono nella sezione **`Moduli`**, clicca su **`Installa da memoria`**, seleziona il modulo `.zip` e una volta installato **riavvia** il telefono:
|
||||
2. **Rendere fidato di sistema**: Scarica il modulo Magisc [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (un file .zip), **trascinalo e rilascialo** nel telefono, vai all'app **Magics** nel telefono nella sezione **`Moduli`**, clicca su **`Installa da memoria`**, seleziona il modulo `.zip` e una volta installato **riavvia** il telefono:
|
||||
|
||||
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
|
||||
|
||||
@ -51,11 +51,11 @@ Spiegato in [**questo video**](https://www.youtube.com/watch?v=qQicUW0svB8) devi
|
||||
|
||||
## Post Android 14
|
||||
|
||||
Nell'ultima versione di Android 14, è stato osservato un cambiamento significativo nella gestione dei certificati dell'Autorità di Certificazione (CA) fidati di sistema. In precedenza, questi certificati erano ospitati in **`/system/etc/security/cacerts/`**, accessibili e modificabili dagli utenti con privilegi di root, il che consentiva un'applicazione immediata in tutto il sistema. Tuttavia, con Android 14, la posizione di archiviazione è stata spostata in **`/apex/com.android.conscrypt/cacerts`**, una directory all'interno del percorso **`/apex`**, che è immutabile per natura.
|
||||
Nell'ultima versione di Android 14, è stato osservato un cambiamento significativo nella gestione dei certificati dell'Autorità di Certificazione (CA) fidati di sistema. In precedenza, questi certificati erano ospitati in **`/system/etc/security/cacerts/`**, accessibili e modificabili dagli utenti con privilegi di root, il che consentiva un'applicazione immediata in tutto il sistema. Tuttavia, con Android 14, la posizione di archiviazione è stata spostata in **`/apex/com.android.conscrypt/cacerts`**, una directory all'interno del percorso **`/apex`**, che è di natura immutabile.
|
||||
|
||||
I tentativi di rimontare il **percorso APEX cacerts** come scrivibile incontrano un fallimento, poiché il sistema non consente tali operazioni. Anche i tentativi di smontare o sovrapporre la directory con un file system temporaneo (tmpfs) non eludono l'immutabilità; le applicazioni continuano ad accedere ai dati del certificato originale indipendentemente dalle modifiche a livello di file system. Questa resilienza è dovuta al fatto che il mount **`/apex`** è configurato con propagazione PRIVATA, garantendo che eventuali modifiche all'interno della directory **`/apex`** non influenzino altri processi.
|
||||
|
||||
L'inizializzazione di Android coinvolge il processo `init`, che, all'avvio del sistema operativo, avvia anche il processo Zygote. Questo processo è responsabile dell'avvio dei processi delle applicazioni con un nuovo namespace di mount che include un mount privato **`/apex`**, isolando così le modifiche a questa directory da altri processi.
|
||||
L'inizializzazione di Android coinvolge il processo `init`, che, all'avvio del sistema operativo, avvia anche il processo Zygote. Questo processo è responsabile dell'avvio dei processi delle applicazioni con un nuovo namespace di mount che include un mount privato di **`/apex`**, isolando così le modifiche a questa directory da altri processi.
|
||||
|
||||
Tuttavia, esiste una soluzione per coloro che necessitano di modificare i certificati CA fidati di sistema all'interno della directory **`/apex`**. Questo comporta il rimontaggio manuale di **`/apex`** per rimuovere la propagazione PRIVATA, rendendolo quindi scrivibile. Il processo include la copia dei contenuti di **`/apex/com.android.conscrypt`** in un'altra posizione, lo smontaggio della directory **`/apex/com.android.conscrypt`** per eliminare il vincolo di sola lettura e poi il ripristino dei contenuti nella loro posizione originale all'interno di **`/apex`**. Questo approccio richiede un'azione rapida per evitare crash di sistema. Per garantire l'applicazione di queste modifiche a livello di sistema, si consiglia di riavviare il `system_server`, che riavvia effettivamente tutte le applicazioni e riporta il sistema a uno stato coerente.
|
||||
```bash
|
||||
|
@ -22,7 +22,7 @@ Puoi caricare il file su [https://spaceraccoon.github.io/webpack-exploder/](http
|
||||
|
||||
3. Clicca su "Sources" nella Developer Toolbar. Dovresti vedere un file JavaScript suddiviso in cartelle e file, che compongono il bundle principale.
|
||||
|
||||
Se trovi un file chiamato `index.android.bundle.map`, sarai in grado di analizzare il codice sorgente in un formato non minimizzato. I file di mappatura contengono mappature sorgente, che ti permettono di mappare identificatori minimizzati.
|
||||
Se trovi un file chiamato `index.android.bundle.map`, sarai in grado di analizzare il codice sorgente in un formato non minimizzato. I file di mappatura contengono mappature sorgente, che ti consentono di mappare identificatori minimizzati.
|
||||
|
||||
Per cercare credenziali sensibili ed endpoint, segui questi passaggi:
|
||||
|
||||
|
@ -37,7 +37,7 @@ Le app Android possono utilizzare librerie native, tipicamente scritte in C o C+
|
||||
- **Documentazione JNI & NDK:**
|
||||
- [Specifiche JNI di Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
||||
- [Suggerimenti JNI di Android](https://developer.android.com/training/articles/perf-jni)
|
||||
- [Introduzione all'NDK](https://developer.android.com/ndk/guides/)
|
||||
- [Iniziare con l'NDK](https://developer.android.com/ndk/guides/)
|
||||
- **Debugging delle Librerie Native:**
|
||||
- [Debug delle Librerie Native Android Utilizzando JEB Decompiler](https://medium.com/@shubhamsonani/how-to-debug-android-native-libraries-using-jeb-decompiler-eec681a22cf3)
|
||||
|
||||
|
@ -28,9 +28,9 @@ Alcuni **file interessanti da esaminare sono**:
|
||||
|
||||
Se `apktool` ha **problemi a decodificare l'applicazione**, dai un'occhiata a [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) o prova a usare l'argomento **`-r`** (Non decodificare le risorse). Poi, se il problema era in una risorsa e non nel codice sorgente, non avrai il problema (non decompilando nemmeno le risorse).
|
||||
|
||||
## Cambiare il codice smali
|
||||
## Modifica del codice smali
|
||||
|
||||
Puoi **cambiare** **istruzioni**, cambiare il **valore** di alcune variabili o **aggiungere** nuove istruzioni. Io cambio il codice Smali usando [**VS Code**](https://code.visualstudio.com), poi installi l'**estensione smalise** e l'editor ti dirà se qualche **istruzione è errata**.\
|
||||
Puoi **cambiare** **istruzioni**, cambiare il **valore** di alcune variabili o **aggiungere** nuove istruzioni. Modifico il codice Smali usando [**VS Code**](https://code.visualstudio.com), quindi installa l'**estensione smalise** e l'editor ti dirà se qualche **istruzione è errata**.\
|
||||
Alcuni **esempi** possono essere trovati qui:
|
||||
|
||||
- [Esempi di modifiche Smali](smali-changes.md)
|
||||
@ -38,7 +38,7 @@ Alcuni **esempi** possono essere trovati qui:
|
||||
|
||||
Oppure puoi [**controllare qui sotto alcune modifiche Smali spiegate**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Ricompilare l'APK
|
||||
## Ricompila l'APK
|
||||
|
||||
Dopo aver modificato il codice, puoi **ricompilare** il codice usando:
|
||||
```bash
|
||||
@ -46,11 +46,11 @@ apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Compilerà il nuovo APK all'interno della cartella _**dist**_.
|
||||
|
||||
Se **apktool** genera un **errore**, prova[ a installare l'**ultima versione**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
Se **apktool** genera un **errore**, prova a [installare l'**ultima versione**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Firma il nuovo APK**
|
||||
|
||||
Poi, devi **generare una chiave** (ti verrà chiesto di inserire una password e alcune informazioni che puoi compilare casualmente):
|
||||
Poi, devi **generare una chiave** (ti verrà chiesta una password e alcune informazioni che puoi compilare casualmente):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
In situazioni in cui un'applicazione è limitata a determinati paesi e non puoi installarla sul tuo dispositivo Android a causa di limitazioni regionali, falsificare la tua posizione in un paese in cui l'app è disponibile può darti accesso. I passaggi seguenti dettagliamo come fare:
|
||||
In situazioni in cui un'applicazione è limitata a determinati paesi e non puoi installarla sul tuo dispositivo Android a causa di limitazioni regionali, falsificare la tua posizione in un paese in cui l'app è disponibile può darti accesso. I passaggi seguenti dettagliano come farlo:
|
||||
|
||||
1. **Installa Hotspot Shield Free VPN Proxy:**
|
||||
|
||||
@ -13,7 +13,7 @@ In situazioni in cui un'applicazione è limitata a determinati paesi e non puoi
|
||||
|
||||
3. **Cancella i dati di Google Play Store:**
|
||||
|
||||
- Vai alle **Impostazioni** del tuo dispositivo.
|
||||
- Naviga nelle **Impostazioni** del tuo dispositivo.
|
||||
- Procedi a **App** o **Gestore applicazioni** (questo può variare a seconda del tuo dispositivo).
|
||||
- Trova e seleziona **Google Play Store** dall'elenco delle app.
|
||||
- Tocca **Arresta forzatamente** per terminare eventuali processi in esecuzione dell'app.
|
||||
|
@ -2,10 +2,10 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Informazioni di base**
|
||||
## **Informazioni di Base**
|
||||
|
||||
**Tapjacking** è un attacco in cui un **applicazione** **maligna** viene lanciata e **si posiziona sopra un'applicazione vittima**. Una volta che oscura visibilmente l'app vittima, la sua interfaccia utente è progettata in modo da ingannare l'utente a interagire con essa, mentre passa l'interazione all'app vittima.\
|
||||
In effetti, sta **ciecando l'utente dal sapere che sta effettivamente eseguendo azioni sull'app vittima**.
|
||||
In effetti, sta **accecando l'utente dal sapere che sta effettivamente eseguendo azioni sull'app vittima**.
|
||||
|
||||
### Rilevamento
|
||||
|
||||
|
@ -12,14 +12,14 @@ Un aspetto critico dello sviluppo Android riguarda la corretta gestione delle We
|
||||
|
||||
### **Accesso ai File in WebViews**
|
||||
|
||||
Per impostazione predefinita, le WebView consentono l'accesso ai file. Questa funzionalità è controllata dal metodo `setAllowFileAccess()`, disponibile dalla versione 3 dell'API Android (Cupcake 1.5). Le applicazioni con il permesso **android.permission.READ_EXTERNAL_STORAGE** possono leggere file dallo storage esterno utilizzando uno schema URL di file (`file://path/to/file`).
|
||||
Per impostazione predefinita, le WebView consentono l'accesso ai file. Questa funzionalità è controllata dal metodo `setAllowFileAccess()`, disponibile dalla versione 3 dell'API Android (Cupcake 1.5). Le applicazioni con il permesso **android.permission.READ_EXTERNAL_STORAGE** possono leggere file dallo storage esterno utilizzando uno schema di URL file (`file://path/to/file`).
|
||||
|
||||
#### **Funzionalità Deprecate: Accesso Universale e Accesso ai File da URL**
|
||||
|
||||
- **Accesso Universale da URL di File**: Questa funzionalità deprecata consentiva richieste cross-origin da URL di file, rappresentando un rischio significativo per la sicurezza a causa di potenziali attacchi XSS. L'impostazione predefinita è disabilitata (`false`) per le app destinate a Android Jelly Bean e versioni successive.
|
||||
- **Accesso Universale da URL File**: Questa funzionalità deprecata consentiva richieste cross-origin da URL file, rappresentando un rischio significativo per la sicurezza a causa di potenziali attacchi XSS. L'impostazione predefinita è disabilitata (`false`) per le app destinate a Android Jelly Bean e versioni successive.
|
||||
- Per controllare questa impostazione, utilizzare `getAllowUniversalAccessFromFileURLs()`.
|
||||
- Per modificare questa impostazione, utilizzare `setAllowUniversalAccessFromFileURLs(boolean)`.
|
||||
- **Accesso ai File da URL di File**: Questa funzionalità, anch'essa deprecata, controllava l'accesso ai contenuti da altri URL di schema file. Come l'accesso universale, la sua impostazione predefinita è disabilitata per una maggiore sicurezza.
|
||||
- **Accesso ai File da URL File**: Questa funzionalità, anch'essa deprecata, controllava l'accesso ai contenuti da altri URL di schema file. Come l'accesso universale, la sua impostazione predefinita è disabilitata per una maggiore sicurezza.
|
||||
- Utilizzare `getAllowFileAccessFromFileURLs()` per controllare e `setAllowFileAccessFromFileURLs(boolean)` per impostare.
|
||||
|
||||
#### **Caricamento Sicuro dei File**
|
||||
@ -39,11 +39,11 @@ Questa è una funzione comune utilizzata per caricare URL arbitrari in una webvi
|
||||
```java
|
||||
webview.loadUrl("<url here>")
|
||||
```
|
||||
Certo, un potenziale attaccante non dovrebbe mai essere in grado di **controllare l'URL** che un'applicazione sta per caricare.
|
||||
Ofc, un potenziale attaccante non dovrebbe mai essere in grado di **controllare l'URL** che un'applicazione sta per caricare.
|
||||
|
||||
### **Gestione di JavaScript e Intent Scheme**
|
||||
|
||||
- **JavaScript**: Disabilitato per impostazione predefinita nei WebView, può essere abilitato tramite `setJavaScriptEnabled()`. Si consiglia cautela poiché abilitare JavaScript senza le dovute precauzioni può introdurre vulnerabilità di sicurezza.
|
||||
- **JavaScript**: Disabilitato per impostazione predefinita nei WebView, può essere abilitato tramite `setJavaScriptEnabled()`. Si consiglia cautela poiché abilitare JavaScript senza le giuste protezioni può introdurre vulnerabilità di sicurezza.
|
||||
- **Intent Scheme**: I WebView possono gestire lo schema `intent`, potenzialmente portando a exploit se non gestito con attenzione. Un esempio di vulnerabilità riguardava un parametro WebView esposto "support_url" che poteva essere sfruttato per eseguire attacchi di cross-site scripting (XSS).
|
||||
|
||||
.png>)
|
||||
@ -56,7 +56,7 @@ adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url
|
||||
|
||||
Una funzionalità è fornita da Android che consente a **JavaScript** in un WebView di invocare **funzioni native delle app Android**. Questo viene realizzato utilizzando il metodo `addJavascriptInterface`, che integra JavaScript con le funzionalità native di Android, definito come un _WebView JavaScript bridge_. Si consiglia cautela poiché questo metodo consente a tutte le pagine all'interno del WebView di accedere all'oggetto JavaScript Interface registrato, ponendo un rischio per la sicurezza se informazioni sensibili vengono esposte attraverso queste interfacce.
|
||||
|
||||
- **È necessaria un'estrema cautela** per le app destinate a versioni Android inferiori a 4.2 a causa di una vulnerabilità che consente l'esecuzione di codice remoto tramite JavaScript malevolo, sfruttando la riflessione.
|
||||
- **È necessaria un'estrema cautela** per le app destinate a versioni di Android inferiori alla 4.2 a causa di una vulnerabilità che consente l'esecuzione di codice remoto tramite JavaScript malevolo, sfruttando la riflessione.
|
||||
|
||||
#### Implementing a JavaScript Bridge
|
||||
|
||||
@ -86,7 +86,7 @@ alert(javascriptBridge.getSecret())
|
||||
|
||||
### Debug Remoto
|
||||
|
||||
- **Il debug remoto** è possibile con **Chrome Developer Tools**, consentendo l'interazione e l'esecuzione arbitraria di JavaScript all'interno del contenuto WebView.
|
||||
- **Il debug remoto** è possibile con **Chrome Developer Tools**, consentendo interazione ed esecuzione arbitraria di JavaScript all'interno del contenuto WebView.
|
||||
|
||||
#### Abilitare il Debug Remoto
|
||||
|
||||
@ -96,7 +96,7 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
WebView.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
```
|
||||
- Per abilitare il debug in modo condizionale in base allo stato di debug dell'applicazione:
|
||||
- Per abilitare condizionatamente il debug in base allo stato di debug dell'applicazione:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||||
|
@ -36,7 +36,7 @@
|
||||
- [ ] L'applicazione sta [salvando dati in modo insicuro internamente o esternamente](android-app-pentesting/#insecure-data-storage)?
|
||||
- [ ] C'è qualche [password hardcoded o salvata su disco](android-app-pentesting/#poorkeymanagementprocesses)? L'app sta [utilizzando algoritmi crittografici insicuri](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
|
||||
- [ ] Tutte le librerie compilate utilizzando il flag PIE?
|
||||
- [ ] Non dimenticare che ci sono un sacco di [analizzatori statici Android](android-app-pentesting/#automatic-analysis) che possono aiutarti molto durante questa fase.
|
||||
- [ ] Non dimenticare che ci sono un sacco di [analizzatori statici Android](android-app-pentesting/#automatic-analysis) che possono aiutarti molto in questa fase.
|
||||
|
||||
### [Analisi Dinamica](android-app-pentesting/#dynamic-analysis)
|
||||
|
||||
|
@ -20,7 +20,7 @@ cd bank-new
|
||||
```
|
||||
Copia il contenuto di `bank/assets/www` in `bank-new/www`, escludendo `cordova_plugins.js`, `cordova.js`, `cordova-js-src/` e la directory `plugins/`.
|
||||
|
||||
Specifica la piattaforma (Android o iOS) quando crei un nuovo progetto Cordova. Per clonare un'app Android, aggiungi la piattaforma Android. Nota che le versioni della piattaforma di Cordova e i livelli API di Android sono distinti. Consulta la [documentazione](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/) di Cordova per dettagli sulle versioni della piattaforma e le API Android supportate.
|
||||
Specifica la piattaforma (Android o iOS) quando crei un nuovo progetto Cordova. Per clonare un'app Android, aggiungi la piattaforma Android. Nota che le versioni della piattaforma di Cordova e i livelli API di Android sono distinti. Consulta la [documentazione](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/) di Cordova per dettagli sulle versioni della piattaforma e sulle API Android supportate.
|
||||
|
||||
Per determinare la versione appropriata della piattaforma Cordova Android, controlla il `PLATFORM_VERSION_BUILD_LABEL` nel file `cordova.js` dell'applicazione originale.
|
||||
|
||||
@ -34,7 +34,7 @@ Se un plugin non è disponibile su npm, può essere reperito da GitHub:
|
||||
cd bank-new
|
||||
cordova plugin add https://github.com/moderna/cordova-plugin-cache.git
|
||||
```
|
||||
Assicurati che tutti i requisiti siano soddisfatti prima della compilazione:
|
||||
Assicurati che tutti i prerequisiti siano soddisfatti prima della compilazione:
|
||||
```bash
|
||||
cd bank-new
|
||||
cordova requirements
|
||||
|
@ -56,7 +56,7 @@
|
||||
|
||||
- [**Gestori URI personalizzati / Deeplinks / Schemi personalizzati**](ios-pentesting/#custom-uri-handlers-deeplinks-custom-schemes)
|
||||
- [ ] Controlla se l'applicazione **sta registrando un protocollo/schema**
|
||||
- [ ] Controlla se l'applicazione **si sta registrando per utilizzare** un protocollo/schema
|
||||
- [ ] Controlla se l'applicazione **si registra per utilizzare** un protocollo/schema
|
||||
- [ ] Controlla se l'applicazione **si aspetta di ricevere qualsiasi tipo di informazione sensibile** dallo schema personalizzato che può essere **intercettato** da un'altra applicazione che registra lo stesso schema
|
||||
- [ ] Controlla se l'applicazione **non sta controllando e sanitizzando** l'input degli utenti tramite lo schema personalizzato e se qualche **vulnerabilità può essere sfruttata**
|
||||
- [ ] Controlla se l'applicazione **espone qualsiasi azione sensibile** che può essere chiamata da qualsiasi luogo tramite lo schema personalizzato
|
||||
|
@ -59,7 +59,7 @@ otool -I -v <app-binary> | grep stack_chk # Dovrebbe includere i simboli: stac
|
||||
otool -I -v <app-binary> | grep objc_release # Dovrebbe includere il simbolo _objc_release
|
||||
```
|
||||
|
||||
- **Binary Crittografato**: Il binario dovrebbe essere crittografato
|
||||
- **Encrypted Binary**: Il binario dovrebbe essere crittografato
|
||||
|
||||
```bash
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Il cryptid dovrebbe essere 1
|
||||
@ -67,7 +67,7 @@ otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # Il cryptid dovrebbe e
|
||||
|
||||
**Identificazione di Funzioni Sensibili/Insecure**
|
||||
|
||||
- **Algoritmi di Hashing Deboli**
|
||||
- **Weak Hashing Algorithms**
|
||||
|
||||
```bash
|
||||
# Sul dispositivo iOS
|
||||
@ -79,7 +79,7 @@ grep -iER "_CC_MD5"
|
||||
grep -iER "_CC_SHA1"
|
||||
```
|
||||
|
||||
- **Funzioni Random Insecure**
|
||||
- **Insecure Random Functions**
|
||||
|
||||
```bash
|
||||
# Sul dispositivo iOS
|
||||
@ -93,7 +93,7 @@ grep -iER "_srand"
|
||||
grep -iER "_rand"
|
||||
```
|
||||
|
||||
- **Funzione ‘Malloc’ Insecure**
|
||||
- **Insecure ‘Malloc’ Function**
|
||||
|
||||
```bash
|
||||
# Sul dispositivo iOS
|
||||
@ -103,7 +103,7 @@ otool -Iv <app> | grep -w "_malloc"
|
||||
grep -iER "_malloc"
|
||||
```
|
||||
|
||||
- **Funzioni Insecure e Vulnerabili**
|
||||
- **Insecure and Vulnerable Functions**
|
||||
|
||||
```bash
|
||||
# Sul dispositivo iOS
|
||||
@ -135,7 +135,7 @@ grep -iER "_vsprintf"
|
||||
|
||||
### Basic Dynamic Analysis
|
||||
|
||||
Controlla l'analisi dinamica che [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) esegue. Dovrai navigare tra le diverse visualizzazioni e interagire con esse, ma collegherà diverse classi mentre esegue altre operazioni e preparerà un rapporto una volta completato.
|
||||
Controlla l'analisi dinamica che [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) esegue. Dovrai navigare tra le diverse visualizzazioni e interagire con esse, ma effettuerà il hooking di diverse classi mentre esegue altre operazioni e preparerà un rapporto una volta completato.
|
||||
|
||||
### Listing Installed Apps
|
||||
|
||||
@ -171,7 +171,7 @@ La struttura di un **file IPA** è essenzialmente quella di un **pacchetto compr
|
||||
- **`PlugIns/`**: Questo può includere estensioni all'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 della tua applicazione per l'uso offline, per memorizzare dati temporanei e per aggiungere funzionalità di annullamento all'app su un singolo dispositivo. Per sincronizzare i dati su più dispositivi in un singolo account iCloud, Core Data rispecchia automaticamente il tuo 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 di lingua che contengono risorse per quelle lingue specifiche e una risorsa predefinita nel caso in cui una lingua non sia supportata.
|
||||
- **Sicurezza**: La directory `_CodeSignature/` gioca un ruolo critico nella sicurezza dell'app verificando l'integrità di tutti i file inclusi tramite firme digitali.
|
||||
- **Sicurezza**: La directory `_CodeSignature/` gioca un ruolo critico nella sicurezza dell'app verificando l'integrità di tutti i file inclusi attraverso firme digitali.
|
||||
- **Gestione degli Asset**: Il file `Assets.car` utilizza la compressione per gestire in modo efficiente gli asset grafici, cruciale per ottimizzare le prestazioni dell'applicazione e ridurre le sue dimensioni complessive.
|
||||
- **Frameworks e PlugIns**: Queste directory sottolineano la modularità delle applicazioni iOS, consentendo agli sviluppatori di includere librerie di codice riutilizzabili (`Frameworks/`) e di estendere la funzionalità dell'app (`PlugIns/`).
|
||||
- **Localizzazione**: La struttura supporta più lingue, facilitando la portata globale dell'applicazione includendo risorse per pacchetti di lingue specifiche.
|
||||
@ -180,7 +180,7 @@ La struttura di un **file IPA** è essenzialmente quella di un **pacchetto compr
|
||||
|
||||
Il **Info.plist** funge da pietra miliare 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 dai permessi dell'app alle configurazioni di sicurezza. Per un'esplorazione dettagliata 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 effettuata senza sforzo utilizzando `plutil` su macOS (disponibile nativamente nelle versioni 10.2 e successive) o `plistutil` su Linux. I comandi per la conversione sono i seguenti:
|
||||
Per coloro che desiderano lavorare con questo file in un formato più accessibile, la conversione in XML può essere effettuata facilmente utilizzando `plutil` su macOS (disponibile nativamente nelle versioni 10.2 e successive) o `plistutil` su Linux. I comandi per la conversione sono i seguenti:
|
||||
|
||||
- **Per macOS**:
|
||||
```bash
|
||||
@ -191,7 +191,7 @@ $ plutil -convert xml1 Info.plist
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
```
|
||||
Tra la miriade di informazioni che il file **Info.plist** può rivelare, voci notevoli includono 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 documenti personalizzati esportati/importati (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), possono essere facilmente individuate ispezionando il file o utilizzando un semplice comando `grep`:
|
||||
Tra la miriade di informazioni che il file **Info.plist** può rivelare, le voci notevoli includono 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 documenti personalizzati esportati/importati (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), possono essere facilmente individuate ispezionando il file o utilizzando un semplice comando `grep`:
|
||||
```bash
|
||||
$ grep -i <keyword> Info.plist
|
||||
```
|
||||
@ -230,14 +230,14 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- Questo è il pacchetto dell'applicazione come visto prima nell'IPA, contiene dati essenziali dell'applicazione, contenuti statici e il binario compilato dell'applicazione.
|
||||
- Questa directory è visibile agli utenti, ma **gli utenti non possono scriverci**.
|
||||
- Il contenuto in questa directory **non è sottoposto a backup**.
|
||||
- I contenuti di questa cartella sono utilizzati per **validare la firma del codice**.
|
||||
- I contenuti di questa cartella sono utilizzati per **convalidare la firma del codice**.
|
||||
|
||||
**Directory dei dati:**
|
||||
|
||||
- **Documents/**
|
||||
- Contiene tutti i dati generati dall'utente. L'utente finale dell'applicazione avvia la creazione di questi dati.
|
||||
- Visibile agli utenti e **gli utenti possono scriverci**.
|
||||
- Il contenuto in questa directory è **sottoposto a backup**.
|
||||
- Il contenuto in questa directory **è sottoposto a backup**.
|
||||
- L'app può disabilitare i percorsi impostando `NSURLIsExcludedFromBackupKey`.
|
||||
- **Library/**
|
||||
- Contiene tutti i **file che non sono specifici per l'utente**, come **cache**, **preferenze**, **cookie** e file di configurazione della lista di proprietà (plist).
|
||||
@ -254,7 +254,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- L'app può disabilitare i percorsi impostando `NSURLIsExcludedFromBackupKey`.
|
||||
- **Library/Preferences/**
|
||||
- Utilizzato per memorizzare proprietà che possono **persistere anche dopo che un'applicazione è stata riavviata**.
|
||||
- Le informazioni sono salvate, non crittografate, all'interno della sandbox dell'applicazione in un file plist chiamato \[BUNDLE_ID].plist.
|
||||
- Le informazioni vengono salvate, non crittografate, all'interno della sandbox dell'applicazione in un file plist chiamato \[BUNDLE_ID].plist.
|
||||
- Tutti i coppie chiave/valore memorizzate utilizzando `NSUserDefaults` possono essere trovate in questo file.
|
||||
- **tmp/**
|
||||
- Utilizza questa directory per scrivere **file temporanei** che non devono persistere tra i lanci dell'app.
|
||||
@ -263,7 +263,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- Il contenuto in questa directory non è sottoposto a backup.
|
||||
- Il sistema operativo può eliminare automaticamente i file di questa directory quando l'app non è in esecuzione e lo spazio di archiviazione è scarso.
|
||||
|
||||
Diamo un'occhiata più da vicino alla directory del pacchetto dell'applicazione di iGoat-Swift (.app) all'interno della directory del pacchetto (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
Diamo un'occhiata più da vicino alla directory del pacchetto dell'applicazione iGoat-Swift (.app) all'interno della directory del pacchetto (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
@ -295,7 +295,7 @@ DVIA-v2:
|
||||
```
|
||||
**Controlla se l'app è crittografata**
|
||||
|
||||
Verifica se c'è qualche output per:
|
||||
Vedi se c'è qualche output per:
|
||||
```bash
|
||||
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
|
||||
```
|
||||
@ -357,7 +357,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/).
|
||||
|
||||
## Archiviazione dei Dati
|
||||
## Archiviazione Dati
|
||||
|
||||
Per saperne di più su come iOS memorizza i dati nel dispositivo, leggi questa pagina:
|
||||
|
||||
@ -366,20 +366,20 @@ ios-basics.md
|
||||
{{#endref}}
|
||||
|
||||
> [!WARNING]
|
||||
> I seguenti luoghi per memorizzare informazioni dovrebbero essere controllati **subito dopo aver installato l'applicazione**, **dopo aver verificato tutte le funzionalità** dell'applicazione e anche dopo **essersi disconnessi da un utente e aver effettuato l'accesso a un altro**.\
|
||||
> I seguenti luoghi per memorizzare informazioni dovrebbero essere controllati **subito dopo aver installato l'applicazione**, **dopo aver verificato tutte le funzionalità** dell'applicazione e anche dopo **essere usciti da un utente e accedere a un altro**.\
|
||||
> L'obiettivo è trovare **informazioni sensibili non protette** dell'applicazione (password, token), dell'utente attuale e degli utenti precedentemente connessi.
|
||||
|
||||
### Plist
|
||||
|
||||
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**. Si consiglia di controllare questi file dopo aver installato l'app e dopo averlo utilizzato intensamente 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**. È consigliato controllare questi file dopo aver installato l'app e dopo averla utilizzata intensamente per vedere se nuovi dati vengono scritti.
|
||||
|
||||
Il modo più comune per persistere i dati nei file plist è attraverso l'uso di **NSUserDefaults**. Questo file plist è salvato all'interno della sandbox dell'app in **`Library/Preferences/<appBundleID>.plist`**
|
||||
Il modo più comune per persistere i dati nei file plist è attraverso l'uso di **NSUserDefaults**. Questo file plist è 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 proprio comportamento in base alle **preferenze dell'utente**. I dati salvati da `NSUserDefaults` possono essere visualizzati nel pacchetto dell'applicazione. Questa classe memorizza **dati** in un **file plist**, ma è destinata ad essere utilizzata con piccole quantità di dati.
|
||||
|
||||
Questi dati non possono più essere accessibili direttamente tramite un computer fidato, ma possono essere accessibili eseguendo un **backup**.
|
||||
|
||||
Puoi **dumpare** le informazioni salvate utilizzando **`NSUserDefaults`** con il comando `ios nsuserdefaults get` di objection.
|
||||
Puoi **dumpare** le informazioni salvate utilizzando **`NSUserDefaults`** usando `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
|
||||
@ -463,7 +463,7 @@ default.realm default.realm.lock default.realm.management/ default.realm.note
|
||||
|
||||
$ find ./ -name "*.realm*"
|
||||
```
|
||||
Per visualizzare questi file di database, si consiglia lo strumento [**Realm Studio**](https://github.com/realm/realm-studio).
|
||||
Per visualizzare questi file di database, si consiglia di utilizzare lo strumento [**Realm Studio**](https://github.com/realm/realm-studio).
|
||||
|
||||
Per implementare la crittografia all'interno di un database Realm, è possibile utilizzare il seguente frammento di codice:
|
||||
```swift
|
||||
@ -551,7 +551,7 @@ func applicationWillEnterForeground(_ application: UIApplication) {
|
||||
backgroundImage?.removeFromSuperview()
|
||||
}
|
||||
```
|
||||
Obiettivo-C:
|
||||
Objective-C:
|
||||
```
|
||||
@property (UIImageView *)backgroundImage;
|
||||
|
||||
@ -589,7 +589,7 @@ Con iOS 8.0 e versioni successive, gli utenti possono installare estensioni di t
|
||||
**Raccomandazioni di Sicurezza:**
|
||||
|
||||
- Si consiglia di disabilitare le tastiere di terze parti per una maggiore sicurezza.
|
||||
- Fai attenzione alle funzionalità di correzione automatica e suggerimenti automatici della tastiera iOS predefinita, che potrebbero memorizzare informazioni sensibili in file di cache situati in `Library/Keyboard/{locale}-dynamic-text.dat` o `/private/var/mobile/Library/Keyboard/dynamic-text.dat`. Questi file di cache dovrebbero essere controllati regolarmente per dati sensibili. Si raccomanda di ripristinare il dizionario della tastiera tramite **Impostazioni > Generale > Ripristina > Ripristina Dizionario Tastiera** per cancellare i dati memorizzati nella cache.
|
||||
- Fai attenzione alle funzionalità di correzione automatica e suggerimenti automatici della tastiera iOS predefinita, che potrebbero memorizzare informazioni sensibili in file di cache situati in `Library/Keyboard/{locale}-dynamic-text.dat` o `/private/var/mobile/Library/Keyboard/dynamic-text.dat`. Questi file di cache dovrebbero essere controllati regolarmente per dati sensibili. Si raccomanda di ripristinare il dizionario della tastiera tramite **Impostazioni > Generale > Ripristina > Ripristina Dizionario Tastiera** per cancellare i dati memorizzati.
|
||||
- L'intercettazione del traffico di rete può rivelare se una tastiera personalizzata sta trasmettendo i tasti in remoto.
|
||||
|
||||
### **Prevenire la Cache dei Campi di Testo**
|
||||
@ -646,7 +646,7 @@ L'inclusione di **app installate e dei loro dati** nei backup solleva la questio
|
||||
|
||||
### Escludere File dai Backup
|
||||
|
||||
I file in `Documents/` e `Library/Application Support/` vengono salvati nei backup per impostazione predefinita. Gli sviluppatori possono escludere file o directory specifici dai backup utilizzando `NSURL setResourceValue:forKey:error:` con il `NSURLIsExcludedFromBackupKey`. Questa pratica è cruciale per proteggere i dati sensibili dall'essere inclusi nei backup.
|
||||
I file in `Documents/` e `Library/Application Support/` vengono salvati nei backup per impostazione predefinita. Gli sviluppatori possono escludere file o directory specifici dai backup utilizzando `NSURL setResourceValue:forKey:error:` con `NSURLIsExcludedFromBackupKey`. Questa pratica è cruciale per proteggere i dati sensibili dall'essere inclusi nei backup.
|
||||
|
||||
### Testare le Vulnerabilità
|
||||
|
||||
@ -669,7 +669,7 @@ Per gestire i backup crittografati, gli script Python disponibili nel [repo GitH
|
||||
|
||||
### Modificare il Comportamento dell'App
|
||||
|
||||
Un esempio di modifica del comportamento dell'app attraverso modifiche al backup è dimostrato nell'[app Bither bitcoin wallet](https://github.com/bither/bither-ios), dove il PIN di blocco dell'interfaccia utente è memorizzato in `net.bither.plist` sotto la chiave **pin_code**. Rimuovendo questa chiave dal plist e ripristinando il backup si rimuove il requisito del PIN, fornendo accesso illimitato.
|
||||
Un esempio di alterazione del comportamento dell'app attraverso modifiche ai backup è dimostrato nell'[app Bither bitcoin wallet](https://github.com/bither/bither-ios), dove il PIN di blocco dell'interfaccia utente è memorizzato in `net.bither.plist` sotto la chiave **pin_code**. Rimuovendo questa chiave dal plist e ripristinando il backup si rimuove il requisito del PIN, fornendo accesso illimitato.
|
||||
|
||||
## Riepilogo sul Test della Memoria per Dati Sensibili
|
||||
|
||||
@ -718,7 +718,7 @@ I principali controlli da eseguire sono per verificare se puoi trovare password/
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
Per **maggiori informazioni** sulle API e librerie crittografiche iOS, accedi a [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
Per **maggiori informazioni** sulle API e le librerie crittografiche iOS, accedi a [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
|
||||
## Autenticazione Locale
|
||||
|
||||
@ -822,7 +822,7 @@ if (status == noErr) {
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Ora possiamo richiedere l'elemento salvato dal portachiavi. I servizi del portachiavi presenteranno la finestra di autenticazione all'utente e restituiranno i dati o nil a seconda che sia stata fornita o meno un'impronta digitale adeguata.
|
||||
Ora possiamo richiedere l'elemento salvato dal portachiavi. I servizi del portachiavi presenteranno la finestra di dialogo di autenticazione all'utente e restituiranno i dati o nil a seconda che sia stata fornita o meno un'impronta digitale adeguata.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Swift"}}
|
||||
@ -885,13 +885,13 @@ Se `LocalAuthentication.framework` è utilizzato in un'app, l'output conterrà e
|
||||
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
|
||||
/System/Library/Frameworks/Security.framework/Security
|
||||
```
|
||||
Se `Security.framework` è utilizzato, solo il secondo verrà mostrato.
|
||||
Se viene utilizzato `Security.framework`, verrà mostrato solo il secondo.
|
||||
|
||||
### Bypass del Framework di Autenticazione Locale
|
||||
|
||||
#### **Objection**
|
||||
|
||||
Attraverso il **Bypass Biometrics di Objection**, situato a [questa pagina GitHub](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass), è disponibile una tecnica per superare il meccanismo **LocalAuthentication**. Il nucleo di questo approccio implica l'uso di **Frida** per manipolare la funzione `evaluatePolicy`, garantendo che restituisca costantemente un risultato `True`, indipendentemente dal reale successo dell'autenticazione. Questo è particolarmente utile per eludere processi di autenticazione biometrica difettosi.
|
||||
Attraverso il **Bypass Biometrics di Objection**, situato a [questa pagina GitHub](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass), è disponibile una tecnica per superare il meccanismo di **LocalAuthentication**. Il nucleo di questo approccio implica l'uso di **Frida** per manipolare la funzione `evaluatePolicy`, garantendo che restituisca costantemente un risultato `True`, indipendentemente dal reale successo dell'autenticazione. Questo è particolarmente utile per eludere processi di autenticazione biometrica difettosi.
|
||||
|
||||
Per attivare questo bypass, viene impiegato il seguente comando:
|
||||
```bash
|
||||
@ -1025,7 +1025,7 @@ Per controllare questo problema utilizzando Burp, dopo aver fidato la CA di Burp
|
||||
Se un'applicazione utilizza correttamente il SSL Pinning, allora l'applicazione funzionerà solo se il certificato è quello previsto. Quando si testa un'applicazione **questo potrebbe essere un problema poiché Burp servirà il proprio certificato.**\
|
||||
Per bypassare questa protezione all'interno di un dispositivo jailbroken, puoi 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)
|
||||
|
||||
Puoi anche usare **objection's** `ios sslpinning disable`
|
||||
Puoi anche utilizzare **objection's** `ios sslpinning disable`
|
||||
|
||||
## Varie
|
||||
|
||||
@ -1052,7 +1052,7 @@ I servizi forniti dagli SDK di terze parti possono includere il tracciamento del
|
||||
|
||||
L'implementazione di servizi di terze parti di solito avviene in due forme: una libreria autonoma o un SDK completo. Per proteggere la privacy degli utenti, qualsiasi dato condiviso con questi servizi dovrebbe essere **anonymizzato** per prevenire la divulgazione di Informazioni Personali Identificabili (PII).
|
||||
|
||||
Per identificare le librerie utilizzate da un'applicazione, può essere impiegato il comando **`otool`**. Questo strumento dovrebbe essere eseguito contro l'applicazione e ciascuna libreria condivisa che utilizza per scoprire librerie aggiuntive.
|
||||
Per identificare le librerie utilizzate da un'applicazione, il comando **`otool`** può essere impiegato. Questo strumento dovrebbe essere eseguito contro l'applicazione e ciascuna libreria condivisa che utilizza per scoprire librerie aggiuntive.
|
||||
```bash
|
||||
otool -L <application_path>
|
||||
```
|
||||
|
@ -25,7 +25,7 @@ $ idevice_id -l
|
||||
```bash
|
||||
$ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
|
||||
```
|
||||
- **Utilizzare `instruments` per elencare i dispositivi:**
|
||||
- **Utilizzando `instruments` per elencare i dispositivi:**
|
||||
```bash
|
||||
$ instruments -s devices
|
||||
```
|
||||
@ -48,7 +48,7 @@ Per reimpostare una password dimenticata al valore predefinito (`alpine`), è ne
|
||||
|
||||
### **Trasferimento di File Dati dell'App**
|
||||
|
||||
**Archiviazione e Recupero tramite SSH e SCP:** È semplice archiviare la directory Data dell'applicazione utilizzando `tar` e poi trasferirla usando `scp`. Il comando qui sotto archivia la directory Data in un file .tgz, che viene poi estratto dal dispositivo:
|
||||
**Archiviazione e Recupero tramite SSH e SCP:** È semplice archiviare la directory Data dell'applicazione utilizzando `tar` e poi trasferirla usando `scp`. Il comando qui sotto archivia la directory Data in un file .tgz, che viene poi prelevato dal dispositivo:
|
||||
```bash
|
||||
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
||||
exit
|
||||
@ -70,7 +70,7 @@ file download <filename>
|
||||
|
||||
### **Acquisire il File IPA**
|
||||
|
||||
**Link di Distribuzione Over-The-Air (OTA):** Le app distribuite per il testing tramite OTA possono essere scaricate utilizzando lo strumento di download degli asset dei servizi ITMS, che è installato tramite npm e utilizzato per salvare il file IPA localmente.
|
||||
**Link di Distribuzione Over-The-Air (OTA):** Le app distribuite per il testing tramite OTA possono essere scaricate utilizzando lo strumento di download delle risorse ITMS, che è installato tramite npm e utilizzato per salvare il file IPA localmente.
|
||||
```bash
|
||||
npm install -g itms-services
|
||||
itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
||||
@ -103,7 +103,7 @@ Sostituisci la sezione cifrata nel binario originale dell'app con il dump decrit
|
||||
```bash
|
||||
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||
```
|
||||
**Finalizzazione della Decrittazione:** Modifica i metadati del binario per indicare l'assenza di crittografia utilizzando strumenti come **MachOView**, impostando `cryptid` a 0.
|
||||
**Finalizzazione della Decrittazione:** Modifica i metadati del binario per indicare l'assenza di crittografia utilizzando strumenti come **MachOView**, impostando il `cryptid` a 0.
|
||||
|
||||
### **Decrittazione (Automatica)**
|
||||
|
||||
@ -119,11 +119,11 @@ Per eseguire il dump di un'app specifica, come Telegram, si utilizza il seguente
|
||||
```bash
|
||||
$ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
|
||||
```
|
||||
Questo comando avvia il dump dell'app, risultando nella creazione di un file `Telegram.ipa` nella directory corrente. Questo processo è adatto per dispositivi jailbroken, poiché le app non firmate o firmate falsamente possono essere reinstallate utilizzando strumenti come [**ios-deploy**](https://github.com/ios-control/ios-deploy).
|
||||
Questo comando avvia il dump dell'app, risultando nella creazione di un file `Telegram.ipa` nella directory corrente. Questo processo è adatto per dispositivi jailbroken, poiché le app non firmate o falsamente firmate possono essere reinstallate utilizzando strumenti come [**ios-deploy**](https://github.com/ios-control/ios-deploy).
|
||||
|
||||
#### **flexdecrypt**
|
||||
|
||||
Lo strumento [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt), insieme al suo wrapper [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac), consente l'estrazione di file IPA da applicazioni installate. I comandi di installazione per **flexdecrypt** sul dispositivo includono il download e l'installazione del pacchetto `.deb`. **flexdump** può essere utilizzato per elencare e dumpare le app, come mostrato nei comandi qui sotto:
|
||||
Lo strumento [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt), insieme al suo wrapper [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac), consente l'estrazione di file IPA da applicazioni installate. I comandi di installazione per **flexdecrypt** sul dispositivo includono il download e l'installazione del pacchetto `.deb`. **flexdump** può essere utilizzato per elencare e dumpare app, come mostrato nei comandi qui sotto:
|
||||
```bash
|
||||
apt install zip unzip
|
||||
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
|
||||
@ -138,7 +138,7 @@ bagbak --raw Chrome
|
||||
```
|
||||
#### **r2flutch**
|
||||
|
||||
**r2flutch**, utilizzando sia radare che frida, serve per la decrittazione e il dumping delle app. Maggiori informazioni possono essere trovate nella sua [**pagina GitHub**](https://github.com/as0ler/r2flutch).
|
||||
**r2flutch**, utilizzando sia radare che frida, serve per la decrittazione e il dumping delle app. Maggiori informazioni possono essere trovate sulla sua [**pagina GitHub**](https://github.com/as0ler/r2flutch).
|
||||
|
||||
### **Installazione delle App**
|
||||
|
||||
@ -154,7 +154,7 @@ bagbak --raw Chrome
|
||||
|
||||
- **ios-deploy**: Per gli utenti macOS, ios-deploy installa app iOS dalla riga di comando. Decomprimere l'IPA e utilizzare il flag `-m` per il lancio diretto dell'app fanno parte del processo.
|
||||
|
||||
- **Xcode**: Utilizza Xcode per installare app navigando su **Finestra/Dispositivi e Simulatori** e aggiungendo l'app a **App Installate**.
|
||||
- **Xcode**: Utilizza Xcode per installare app navigando su **Window/Devices and Simulators** e aggiungendo l'app a **Installed Apps**.
|
||||
|
||||
#### **Consentire l'Installazione di Applicazioni su Dispositivi Non iPad**
|
||||
|
||||
|
@ -50,7 +50,7 @@ La procedura prevede diversi passaggi chiave:
|
||||
$ rvictl -s <UDID>
|
||||
Starting device <UDID> [SUCCEEDED] with interface rvi0
|
||||
```
|
||||
3. Dopo l'identificazione dell'UDID, **Wireshark** deve essere aperto e selezionata l'interfaccia "rvi0" per la cattura dei dati.
|
||||
3. Dopo l'identificazione del UDID, **Wireshark** deve essere aperto e l'interfaccia "rvi0" selezionata per la cattura dei dati.
|
||||
4. Per il monitoraggio mirato, come la cattura del traffico HTTP relativo a un indirizzo IP specifico, possono essere utilizzati i Filtri di Cattura di Wireshark:
|
||||
|
||||
## Installazione del Certificato Burp nel Simulatore
|
||||
|
@ -30,7 +30,7 @@ $ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
```
|
||||
Entrambi i metodi, binwalk e radare2, consentono l'estrazione di file `plist`, con un'ispezione del primo (0x0015d2a4) che rivela un recupero riuscito del [file di autorizzazioni originale da Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
Per i binari delle app accessibili su dispositivi jailbroken (ad esempio, tramite SSH), il comando **grep** con il flag `-a, --text` può essere utilizzato per trattare tutti i file come testo ASCII:
|
||||
Per i binari delle app accessibili su dispositivi jailbroken (ad es., tramite SSH), il comando **grep** con il flag `-a, --text` può essere utilizzato per trattare tutti i file come testo ASCII:
|
||||
```bash
|
||||
$ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/...
|
||||
```
|
||||
|
@ -13,7 +13,7 @@
|
||||
4. Vai alla nuova sorgente Frida aggiunta.
|
||||
5. Installa il pacchetto Frida.
|
||||
|
||||
Se stai usando **Corellium** dovrai scaricare il rilascio di Frida da [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) e decomprimere e copiare nella posizione dylib richiesta da Frida, ad esempio: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
Se stai usando **Corellium**, dovrai scaricare il rilascio di Frida da [https://github.com/frida/frida/releases](https://github.com/frida/frida/releases) (`frida-gadget-[yourversion]-ios-universal.dylib.gz`) e decomprimere e copiare nella posizione dylib richiesta da Frida, ad esempio: `/Users/[youruser]/.cache/frida/gadget-ios.dylib`
|
||||
|
||||
Dopo l'installazione, puoi usare sul tuo PC il comando **`frida-ls-devices`** e controllare che il dispositivo appaia (il tuo PC deve essere in grado di accedervi).\
|
||||
Esegui anche **`frida-ps -Uia`** per controllare i processi in esecuzione del telefono.
|
||||
@ -326,7 +326,7 @@ Puoi controllare i crash in:
|
||||
- `~/Library/Logs/DiagnosticReports`
|
||||
|
||||
> [!WARNING]
|
||||
> iOS memorizza solo 25 crash della stessa app, quindi devi pulire o iOS smetterà di creare crash.
|
||||
> iOS memorizza solo 25 crash della stessa app, quindi devi pulire questo o iOS smetterà di creare crash.
|
||||
|
||||
## Frida Android Tutorials
|
||||
|
||||
@ -334,7 +334,7 @@ Puoi controllare i crash in:
|
||||
../android-app-pentesting/frida-tutorial/
|
||||
{{#endref}}
|
||||
|
||||
## Riferimenti
|
||||
## References
|
||||
|
||||
- [https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida](https://www.briskinfosec.com/blogs/blogsdetail/Getting-Started-with-Frida)
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Le estensioni delle app migliorano la funzionalità delle app consentendo loro di interagire con altre app o con il sistema, fornendo funzionalità o contenuti personalizzati. Queste estensioni includono:
|
||||
Le app extensions migliorano la funzionalità delle app consentendo loro di interagire con altre app o con il sistema, fornendo funzionalità o contenuti personalizzati. Queste estensioni includono:
|
||||
|
||||
- **Custom Keyboard**: Offre una tastiera unica in tutte le app, sostituendo la tastiera predefinita di iOS.
|
||||
- **Share**: Consente la condivisione sui social network o con altri direttamente.
|
||||
@ -17,13 +17,13 @@ I principali aspetti di sicurezza includono:
|
||||
- Le estensioni e le loro app contenitrici comunicano tramite comunicazione inter-processo, non direttamente.
|
||||
- Il **widget Oggi** è unico in quanto può richiedere alla sua app di aprirsi tramite un metodo specifico.
|
||||
- L'accesso ai dati condivisi è consentito all'interno di un contenitore privato, ma l'accesso diretto è limitato.
|
||||
- Alcune API, inclusa HealthKit, sono vietate alle estensioni delle app, che non possono avviare attività di lunga durata, accedere alla fotocamera o al microfono, tranne che per le estensioni di iMessage.
|
||||
- Alcune API, inclusa HealthKit, sono vietate alle app extensions, che non possono avviare attività di lunga durata, accedere alla fotocamera o al microfono, tranne che per le estensioni di iMessage.
|
||||
|
||||
### Analisi Statica
|
||||
|
||||
#### **Identificazione delle Estensioni delle App**
|
||||
#### **Identificazione delle App Extensions**
|
||||
|
||||
Per trovare le estensioni delle app nel codice sorgente, cerca `NSExtensionPointIdentifier` in Xcode o ispeziona il pacchetto dell'app per file `.appex` che indicano estensioni. Senza codice sorgente, usa grep o SSH per localizzare questi identificatori all'interno del pacchetto dell'app.
|
||||
Per trovare le app extensions nel codice sorgente, cerca `NSExtensionPointIdentifier` in Xcode o ispeziona il pacchetto dell'app per file `.appex` che indicano estensioni. Senza codice sorgente, usa grep o SSH per localizzare questi identificatori all'interno del pacchetto dell'app.
|
||||
|
||||
#### **Tipi di Dati Supportati**
|
||||
|
||||
|
@ -2,11 +2,11 @@
|
||||
|
||||
# Separazione dei privilegi e Sandbox
|
||||
|
||||
In iOS, esiste una distinzione nei privilegi tra le applicazioni accessibili all'utente e i processi core del sistema. Le applicazioni vengono eseguite con l'identità utente **`mobile`**, mentre i processi di sistema cruciali operano come **`root`**. Questa separazione è migliorata da un meccanismo di sandbox, che impone severe limitazioni su quali azioni le applicazioni possono intraprendere. Ad esempio, anche se le applicazioni condividono la stessa identità utente, sono vietate dall'accesso o dalla modifica dei dati l'una dell'altra.
|
||||
In iOS, esiste una distinzione nei privilegi tra le applicazioni accessibili all'utente e i processi core del sistema. Le applicazioni vengono eseguite sotto l'identità utente **`mobile`**, mentre i processi di sistema cruciali operano come **`root`**. Questa separazione è migliorata da un meccanismo di sandbox, che impone severe limitazioni su quali azioni le applicazioni possono intraprendere. Ad esempio, anche se le applicazioni condividono la stessa identità utente, sono vietate dall'accesso o dalla modifica dei dati l'una dell'altra.
|
||||
|
||||
Le applicazioni sono installate in una directory specifica (`private/var/mobile/Applications/{random ID}`) e hanno accesso in lettura limitato a determinate aree e funzionalità di sistema, come SMS e chiamate telefoniche. L'accesso a aree protette attiva una richiesta pop-up per il permesso dell'utente.
|
||||
|
||||
# Protezione dei dati
|
||||
# Protezione dei Dati
|
||||
|
||||
iOS offre agli sviluppatori le **API di Protezione dei Dati**, costruite sopra il Secure Enclave Processor (SEP) — un coprocessore dedicato per operazioni crittografiche e gestione delle chiavi. Il SEP garantisce l'integrità della protezione dei dati tramite una chiave unica specifica per il dispositivo, l'UID del dispositivo, incorporata al suo interno.
|
||||
|
||||
@ -17,7 +17,7 @@ iOS definisce **quattro classi di protezione** per la sicurezza dei dati, che de
|
||||
- **Protezione Completa (NSFileProtectionComplete)**: I dati sono inaccessibili fino a quando il dispositivo non viene sbloccato utilizzando il codice di accesso dell'utente.
|
||||
- **Protetto a meno che non sia aperto (NSFileProtectionCompleteUnlessOpen)**: Consente l'accesso al file anche dopo che il dispositivo è bloccato, a condizione che il file fosse aperto quando il dispositivo è stato sbloccato.
|
||||
- **Protetto fino alla prima autenticazione dell'utente (NSFileProtectionCompleteUntilFirstUserAuthentication)**: I dati sono accessibili dopo il primo sblocco dell'utente post-avvio, rimanendo accessibili anche se il dispositivo viene bloccato di nuovo.
|
||||
- **Nessuna protezione (NSFileProtectionNone)**: I dati sono protetti solo dall'UID del dispositivo, facilitando la rapida cancellazione remota dei dati.
|
||||
- **Nessuna Protezione (NSFileProtectionNone)**: I dati sono protetti solo dall'UID del dispositivo, facilitando la rapida cancellazione remota dei dati.
|
||||
|
||||
La crittografia di tutte le classi, tranne `NSFileProtectionNone`, coinvolge una chiave derivata sia dall'UID del dispositivo che dal codice di accesso dell'utente, garantendo che la decrittografia sia possibile solo sul dispositivo con il codice di accesso corretto. A partire da iOS 7, la classe di protezione predefinita è "Protetto fino alla prima autenticazione dell'utente".
|
||||
|
||||
@ -34,7 +34,7 @@ python filedp.py /path/to/check
|
||||
|
||||
In iOS, un **Portachiavi** funge da **contenitore crittografato sicuro** per memorizzare **informazioni sensibili**, accessibile solo dall'applicazione che lo ha memorizzato o da quelle esplicitamente autorizzate. Questa crittografia è rafforzata da una **password unica generata da iOS**, che è a sua volta crittografata con **AES**. Questo processo di crittografia sfrutta una **funzione PBKDF2**, combinando il codice di accesso dell'utente con un sale derivato dal **UID** del dispositivo, un componente accessibile solo dal **chipset della secure enclave**. Di conseguenza, anche se il codice di accesso dell'utente è noto, i contenuti del Portachiavi rimangono inaccessibili su qualsiasi dispositivo diverso da quello in cui sono stati originariamente crittografati.
|
||||
|
||||
**La gestione e l'accesso** ai dati del Portachiavi sono gestiti dal **daemon `securityd`**, basato su specifici diritti dell'app, come `Keychain-access-groups` e `application-identifier`.
|
||||
**La gestione e l'accesso** ai dati del Portachiavi sono gestiti dal **daemon `securityd`**, basato su specifici diritti dell'app come `Keychain-access-groups` e `application-identifier`.
|
||||
|
||||
### **Operazioni API del Portachiavi**
|
||||
|
||||
@ -84,7 +84,7 @@ userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
|
||||
Nel campo dello sviluppo di app, il **sandboxing** gioca un ruolo cruciale nel migliorare la sicurezza. Questo processo garantisce che ogni app operi all'interno della propria directory home unica, impedendole così di accedere a file di sistema o dati appartenenti ad altre app. L'applicazione di queste restrizioni avviene attraverso le politiche di sandbox, che fanno parte del **Trusted BSD (MAC) Mandatory Access Control Framework**.
|
||||
|
||||
Gli sviluppatori hanno la possibilità di configurare determinate **capacità o permessi** per le loro app, come **Data Protection** o **Keychain Sharing**. Questi permessi vengono applicati immediatamente dopo l'installazione dell'app. Tuttavia, per accedere a determinate risorse protette, l'app deve ottenere il consenso esplicito dell'utente al momento del primo tentativo. Questo viene realizzato attraverso l'uso di _stringhe di scopo_ o _stringhe di descrizione dell'uso_, che vengono presentate agli utenti in un avviso di richiesta di permesso.
|
||||
Gli sviluppatori hanno la possibilità di configurare determinate **capacità o permessi** per le loro app, come **Data Protection** o **Keychain Sharing**. Questi permessi vengono applicati immediatamente dopo l'installazione dell'app. Tuttavia, per accedere a determinate risorse protette, l'app deve ottenere il consenso esplicito dell'utente al momento del primo tentativo. Questo viene realizzato attraverso l'uso di _purpose strings_ o _usage description strings_, che vengono presentate agli utenti in un avviso di richiesta di permesso.
|
||||
|
||||
Per coloro che hanno accesso al codice sorgente, la verifica dei permessi inclusi nel file `Info.plist` può essere effettuata seguendo questi passaggi:
|
||||
|
||||
@ -98,7 +98,7 @@ Quando si tratta di un file IPA, è possibile seguire i seguenti passaggi:
|
||||
2. Trovare il file `Info.plist` all'interno di `Payload/<appname>.app/`.
|
||||
3. Convertire il file in formato XML se necessario, per una ispezione più facile.
|
||||
|
||||
Ad esempio, le stringhe di scopo nel file `Info.plist` potrebbero apparire in questo modo:
|
||||
Ad esempio, le purpose strings nel file `Info.plist` potrebbero apparire in questo modo:
|
||||
```xml
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
@ -118,7 +118,7 @@ Questo esempio indica che l'app è compatibile con il set di istruzioni armv7. G
|
||||
|
||||
## Autorizzazioni
|
||||
|
||||
**Autorizzazioni** sono un altro aspetto critico dello sviluppo di app iOS, fungendo da coppie chiave-valore che concedono alle app il permesso di eseguire determinate operazioni oltre ai controlli di runtime. Ad esempio, abilitare **Data Protection** in un'app comporta l'aggiunta di un'autorizzazione specifica nel progetto Xcode, che viene poi riflessa nel file delle autorizzazioni dell'app o nel file di provisioning mobile incorporato per le IPA.
|
||||
Le **autorizzazioni** sono un altro aspetto critico dello sviluppo di app iOS, fungendo da coppie chiave-valore che concedono alle app il permesso di eseguire determinate operazioni oltre ai controlli di runtime. Ad esempio, abilitare la **Protezione dei Dati** in un'app comporta l'aggiunta di un'autorizzazione specifica nel progetto Xcode, che viene poi riflessa nel file delle autorizzazioni dell'app o nel file di provisioning mobile incorporato per le IPA.
|
||||
|
||||
# Riferimenti
|
||||
|
||||
|
@ -6,11 +6,11 @@
|
||||
|
||||
Gli schemi URL personalizzati consentono alle app di comunicare utilizzando un protocollo personalizzato, come dettagliato nella [Apple Developer Documentation](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW1). Questi schemi devono essere dichiarati dall'app, che gestisce quindi gli URL in arrivo seguendo quegli schemi. È fondamentale **validare tutti i parametri URL** e **scartare eventuali URL malformati** per prevenire attacchi attraverso questo vettore.
|
||||
|
||||
Un esempio è dato dove l'URI `myapp://hostname?data=123876123` invoca un'azione specifica dell'applicazione. Una vulnerabilità nota era nell'app Skype Mobile, che consentiva azioni di chiamata non autorizzate tramite il protocollo `skype://`. Gli schemi registrati possono essere trovati nel `Info.plist` dell'app sotto `CFBundleURLTypes`. Le applicazioni malevole possono sfruttare questo registrando nuovamente gli URI per intercettare informazioni sensibili.
|
||||
Un esempio è dato dove l'URI `myapp://hostname?data=123876123` invoca un'azione specifica dell'applicazione. Una vulnerabilità nota era nell'app Skype Mobile, che consentiva azioni di chiamata non autorizzate tramite il protocollo `skype://`. Gli schemi registrati possono essere trovati nel `Info.plist` dell'app sotto `CFBundleURLTypes`. Le applicazioni malevole possono sfruttare questo registrando nuovamente URI per intercettare informazioni sensibili.
|
||||
|
||||
### Registrazione degli Schemi di Query dell'Applicazione
|
||||
|
||||
A partire da iOS 9.0, per controllare se un'app è disponibile, `canOpenURL:` richiede di dichiarare gli schemi URL nel `Info.plist` sotto `LSApplicationQueriesSchemes`. Questo limita gli schemi che un'app può interrogare a 50, migliorando la privacy impedendo l'enumerazione delle app.
|
||||
A partire da iOS 9.0, per controllare se un'app è disponibile, `canOpenURL:` richiede di dichiarare gli schemi URL nel `Info.plist` sotto `LSApplicationQueriesSchemes`. Questo limita gli schemi che un'app può interrogare a 50, migliorando la privacy prevenendo l'enumerazione delle app.
|
||||
```xml
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
@ -62,7 +62,7 @@ Watching for crashes from iGoat...
|
||||
No logs were moved.
|
||||
Opened URL: iGoat://?contactNumber=0&message=0
|
||||
```
|
||||
## Hijacking degli schemi URL personalizzati
|
||||
## Hijacking di schemi URL personalizzati
|
||||
|
||||
Secondo [**questo post**](https://evanconnelly.github.io/post/ios-oauth/), le app malevole potrebbero **registrare schemi personalizzati di altre app,** quindi l'app malevola può aprire un browser che ha tutti i cookie dell'app Safari con [ASWebAuthenticationSession](https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession/2990952-init#parameters). 
|
||||
|
||||
|
@ -82,7 +82,7 @@ libobjc.A.dylib 0x1bdc64000 233472 (228.0 KiB) /usr/lib/
|
||||
[...]
|
||||
```
|
||||
|
||||
- `memory list exports <module_name>`: Esporta di un modulo caricato
|
||||
- `memory list exports <module_name>`: Esporta un modulo caricato
|
||||
|
||||
```bash
|
||||
memory list exports iGoat-Swift
|
||||
@ -199,7 +199,7 @@ ios hooking watch class iGoat_Swift.PlistStorageExerciseViewController
|
||||
ios hooking watch method "-[iGoat_Swift.BinaryCookiesExerciseVC verifyItemPressed]" --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
|
||||
## Cambiare il valore di ritorno booleano
|
||||
## Cambiare il ritorno booleano
|
||||
|
||||
- `ios hooking set return_value "-[<class_name> <method_name>]" false`: Questo farà sì che il metodo selezionato restituisca il booleano indicato
|
||||
|
||||
|
@ -4,7 +4,7 @@ Codice e ulteriori informazioni in [https://mas.owasp.org/MASTG/iOS/0x06h-Testin
|
||||
|
||||
## Serializzazione degli Oggetti nello Sviluppo iOS
|
||||
|
||||
In iOS, **la serializzazione degli oggetti** implica la conversione degli oggetti in un formato che può essere facilmente memorizzato o trasmesso, e poi la ricostruzione di essi da questo formato quando necessario. Due protocolli principali, **`NSCoding`** e **`NSSecureCoding`**, facilitano questo processo per le sottoclassi di Objective-C o `NSObject`, consentendo agli oggetti di essere serializzati in **`NSData`**, un formato che avvolge i buffer di byte.
|
||||
In iOS, **la serializzazione degli oggetti** comporta la conversione degli oggetti in un formato che può essere facilmente memorizzato o trasmesso, e poi la ricostruzione di essi da questo formato quando necessario. Due protocolli principali, **`NSCoding`** e **`NSSecureCoding`**, facilitano questo processo per le sottoclassi di Objective-C o `NSObject`, consentendo agli oggetti di essere serializzati in **`NSData`**, un formato che avvolge i buffer di byte.
|
||||
|
||||
### Implementazione di **`NSCoding`**
|
||||
|
||||
@ -44,7 +44,7 @@ let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive")
|
||||
```
|
||||
### Utilizzo di `Codable` per una Serializzazione Semplificata
|
||||
|
||||
Il protocollo `Codable` di Swift combina `Decodable` e `Encodable`, facilitando la codifica e la decodifica di oggetti come `String`, `Int`, `Double`, ecc., senza sforzi aggiuntivi:
|
||||
Il protocollo `Codable` di Swift combina `Decodable` e `Encodable`, facilitando la codifica e la decodifica di oggetti come `String`, `Int`, `Double`, ecc., senza sforzo aggiuntivo:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var x: Double
|
||||
|
@ -37,7 +37,7 @@ Per aprire il simulatore, esegui Xcode, poi premi sulla _scheda Xcode_ --> _Open
|
||||
|
||||
### Applications in the Simulator
|
||||
|
||||
All'interno di `/Users/<username>/Library/Developer/CoreSimulator/Devices` puoi trovare tutti i **simulatori installati**. Se desideri accedere ai file di un'applicazione creata all'interno di uno degli emulatori, potrebbe essere difficile sapere **in quale sia installata l'app**. Un modo rapido per **trovare il UID corretto** è eseguire l'app nel simulatore ed eseguire:
|
||||
All'interno di `/Users/<username>/Library/Developer/CoreSimulator/Devices` puoi trovare tutti i **simulatori installati**. Se desideri accedere ai file di un'applicazione creata all'interno di uno degli emulatori, potrebbe essere difficile sapere **in quale è installata l'app**. Un modo rapido per **trovare il UID corretto** è eseguire l'app nel simulatore ed eseguire:
|
||||
```bash
|
||||
xcrun simctl list | grep Booted
|
||||
iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
|
||||
@ -73,7 +73,7 @@ Al contrario, i dispositivi iOS non possono flashare ROM personalizzate a causa
|
||||
|
||||
Il jailbreaking di iOS è sempre più difficile poiché Apple patcha rapidamente le vulnerabilità. **Il downgrade di iOS** è possibile solo per un tempo limitato dopo un rilascio, rendendo il jailbreaking una questione sensibile al tempo. I dispositivi utilizzati per i test di sicurezza non dovrebbero essere aggiornati a meno che il re-jailbreaking non sia garantito.
|
||||
|
||||
Gli aggiornamenti di iOS sono controllati da un **meccanismo di sfida-risposta** (SHSH blobs), che consente l'installazione solo per risposte firmate da Apple. Questo meccanismo, noto come "finestra di firma", limita la possibilità di memorizzare e utilizzare successivamente pacchetti firmware OTA. Il [sito web IPSW Downloads](https://ipsw.me) è una risorsa per controllare le attuali finestre di firma.
|
||||
Gli aggiornamenti di iOS sono controllati da un **meccanismo di challenge-response** (SHSH blobs), che consente l'installazione solo per risposte firmate da Apple. Questo meccanismo, noto come "finestra di firma", limita la possibilità di memorizzare e utilizzare successivamente pacchetti firmware OTA. Il [sito web IPSW Downloads](https://ipsw.me) è una risorsa per controllare le attuali finestre di firma.
|
||||
|
||||
### Jailbreak Varieties
|
||||
|
||||
@ -107,8 +107,8 @@ basic-ios-testing-operations.md
|
||||
**Diverse applicazioni cercheranno di rilevare se il mobile è jailbroken e in tal caso l'applicazione non verrà eseguita**
|
||||
|
||||
- Dopo il jailbreaking, su iOS **file e cartelle sono solitamente installati**, questi possono essere cercati per determinare se il dispositivo è jailbroken.
|
||||
- In un dispositivo jailbroken, le applicazioni ottengono **accesso in lettura/scrittura a nuovi file** al di fuori del sandbox
|
||||
- Alcuni **API** **call** si **comportano in modo diverso**
|
||||
- In un dispositivo jailbroken le applicazioni ottengono **accesso in lettura/scrittura a nuovi file** al di fuori del sandbox
|
||||
- Alcuni **API** **call** si comporteranno **in modo diverso**
|
||||
- La presenza del servizio **OpenSSH**
|
||||
- Chiamare `/bin/sh` restituirà **1** invece di 0
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Introduzione
|
||||
|
||||
I link universali offrono un'esperienza di **reindirizzamento senza soluzione di continuità** agli utenti aprendo direttamente il contenuto nell'app, evitando la necessità di un reindirizzamento su Safari. Questi link sono **unici** e sicuri, poiché non possono essere rivendicati da altre app. Ciò è garantito ospitando un file JSON `apple-app-site-association` nella directory radice del sito web, stabilendo un collegamento verificabile tra il sito web e l'app. Nei casi in cui l'app non sia installata, Safari prenderà il controllo e dirigerà l'utente alla pagina web, mantenendo la presenza dell'app.
|
||||
I link universali offrono un **esperienza di reindirizzamento senza soluzione di continuità** agli utenti aprendo direttamente il contenuto nell'app, evitando la necessità di un reindirizzamento su Safari. Questi link sono **unici** e sicuri, poiché non possono essere rivendicati da altre app. Questo è garantito ospitando un file JSON `apple-app-site-association` nella directory radice del sito web, stabilendo un link verificabile tra il sito web e l'app. Nei casi in cui l'app non sia installata, Safari prenderà il controllo e dirigerà l'utente alla pagina web, mantenendo la presenza dell'app.
|
||||
|
||||
Per i tester di penetrazione, il file `apple-app-site-association` è di particolare interesse poiché potrebbe rivelare **percorsi sensibili**, potenzialmente inclusi quelli relativi a funzionalità non rilasciate.
|
||||
|
||||
@ -18,7 +18,7 @@ Gli sviluppatori abilitano i link universali configurando i **Domini Associati**
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
```
|
||||
Per ulteriori approfondimenti, fare riferimento alla [documentazione archiviata per sviluppatori Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
Per ulteriori informazioni dettagliate, fare riferimento alla [documentazione Apple Developer archiviata](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
|
||||
Se si lavora con un'applicazione compilata, le autorizzazioni possono essere estratte come descritto in [questa guida](extracting-entitlements-from-compiled-application.md).
|
||||
|
||||
|
@ -12,7 +12,7 @@ Le WebViews sono utilizzate all'interno delle applicazioni per visualizzare cont
|
||||
|
||||
- **WKWebView** è l'opzione preferita per incorporare contenuti web nelle app, offrendo un controllo migliorato sui contenuti e sulle caratteristiche di sicurezza. **JavaScript** è abilitato per impostazione predefinita, ma può essere disabilitato se necessario. Supporta anche funzionalità per prevenire l'apertura automatica di finestre da parte di JavaScript e garantisce che tutti i contenuti vengano caricati in modo sicuro. Inoltre, l'architettura di **WKWebView** riduce il rischio di corruzione della memoria che influisce sul processo principale dell'app.
|
||||
|
||||
- **SFSafariViewController** offre un'esperienza di navigazione web standardizzata all'interno delle app, riconoscibile per il suo layout specifico che include un campo indirizzo di sola lettura, pulsanti di condivisione e navigazione, e un link diretto per aprire contenuti in Safari. A differenza di **WKWebView**, **JavaScript** non può essere disabilitato in **SFSafariViewController**, che condivide anche cookie e dati con Safari, mantenendo la privacy dell'utente dall'app. Deve essere visualizzato in modo prominente secondo le linee guida dell'App Store.
|
||||
- **SFSafariViewController** offre un'esperienza di navigazione web standardizzata all'interno delle app, riconoscibile dal suo layout specifico che include un campo indirizzo in sola lettura, pulsanti di condivisione e navigazione, e un link diretto per aprire contenuti in Safari. A differenza di **WKWebView**, **JavaScript** non può essere disabilitato in **SFSafariViewController**, che condivide anche cookie e dati con Safari, mantenendo la privacy dell'utente dall'app. Deve essere visualizzato in modo prominente secondo le linee guida dell'App Store.
|
||||
```javascript
|
||||
// Example of disabling JavaScript in WKWebView:
|
||||
WKPreferences *preferences = [[WKPreferences alloc] init];
|
||||
@ -21,11 +21,11 @@ WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
|
||||
config.preferences = preferences;
|
||||
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
|
||||
```
|
||||
## Riepilogo dell'Esplorazione della Configurazione delle WebViews
|
||||
## Riepilogo dell'Esplorazione della Configurazione di WebViews
|
||||
|
||||
### **Panoramica dell'Analisi Statica**
|
||||
|
||||
Nel processo di esame delle configurazioni delle **WebViews**, si concentrano su due tipi principali: **UIWebView** e **WKWebView**. Per identificare queste WebViews all'interno di un binario, vengono utilizzati comandi che cercano riferimenti a classi specifiche e metodi di inizializzazione.
|
||||
Nel processo di esame delle configurazioni di **WebViews**, si concentrano su due tipi principali: **UIWebView** e **WKWebView**. Per identificare questi WebViews all'interno di un binario, vengono utilizzati comandi che cercano riferimenti a classi specifiche e metodi di inizializzazione.
|
||||
|
||||
- **Identificazione di UIWebView**
|
||||
```bash
|
||||
@ -43,7 +43,7 @@ Inoltre, per scoprire come viene inizializzato un **WKWebView**, viene eseguito
|
||||
```bash
|
||||
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
||||
```
|
||||
#### **Verifica della Configurazione di JavaScript**
|
||||
#### **Verifica della Configurazione JavaScript**
|
||||
|
||||
Per **WKWebView**, è evidenziato che disabilitare JavaScript è una buona pratica a meno che non sia necessario. Si cerca il binario compilato per confermare che la proprietà `javaScriptEnabled` sia impostata su `false`, assicurando che JavaScript sia disabilitato:
|
||||
```bash
|
||||
@ -51,7 +51,7 @@ $ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
||||
```
|
||||
#### **Verifica Solo Contenuti Sicuri**
|
||||
|
||||
**WKWebView** offre la possibilità di identificare problemi di contenuto misto, a differenza di **UIWebView**. Questo viene controllato utilizzando la proprietà `hasOnlySecureContent` per garantire che tutte le risorse della pagina siano caricate tramite connessioni sicure. La ricerca nel binario compilato viene eseguita come segue:
|
||||
**WKWebView** offre la possibilità di identificare problemi di contenuti misti, a differenza di **UIWebView**. Questo viene controllato utilizzando la proprietà `hasOnlySecureContent` per garantire che tutte le risorse della pagina siano caricate tramite connessioni sicure. La ricerca nel binario compilato viene eseguita come segue:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
@ -120,7 +120,7 @@ Questo riepilogo racchiude i passaggi e i comandi critici coinvolti nell'analisi
|
||||
|
||||
## Gestione del Protocollo WebView
|
||||
|
||||
Gestire il contenuto nelle WebViews è un aspetto critico, specialmente quando si trattano vari protocolli come `http(s)://`, `file://` e `tel://`. Questi protocolli consentono il caricamento di contenuti sia remoti che locali all'interno delle app. Si sottolinea che quando si carica contenuto locale, devono essere adottate precauzioni per prevenire che gli utenti influenzino il nome o il percorso del file e per evitare la modifica del contenuto stesso.
|
||||
Gestire il contenuto nelle WebViews è un aspetto critico, specialmente quando si trattano vari protocolli come `http(s)://`, `file://` e `tel://`. Questi protocolli consentono il caricamento di contenuti sia remoti che locali all'interno delle app. Si sottolinea che quando si carica contenuto locale, devono essere adottate precauzioni per impedire agli utenti di influenzare il nome o il percorso del file e di modificare il contenuto stesso.
|
||||
|
||||
**WebViews** offrono diversi metodi per il caricamento dei contenuti. Per **UIWebView**, ora deprecato, vengono utilizzati metodi come `loadHTMLString:baseURL:` e `loadData:MIMEType:textEncodingName:baseURL:`. **WKWebView**, d'altra parte, impiega `loadHTMLString:baseURL:`, `loadData:MIMEType:textEncodingName:baseURL:` e `loadRequest:` per il contenuto web. Metodi come `pathForResource:ofType:`, `URLForResource:withExtension:` e `init(contentsOf:encoding:)` sono tipicamente utilizzati per caricare file locali. Il metodo `loadFileURL:allowingReadAccessToURL:` è particolarmente notevole per la sua capacità di caricare un URL o una directory specifica nella WebView, potenzialmente esponendo dati sensibili se viene specificata una directory.
|
||||
|
||||
@ -198,7 +198,7 @@ In Objective-C, il `JSContext` per un `UIWebView` può essere recuperato con la
|
||||
```
|
||||
### Comunicazione con `WKWebView`
|
||||
|
||||
Per `WKWebView`, l'accesso diretto a `JSContext` non è disponibile. Invece, viene utilizzato il passaggio di messaggi tramite la funzione `postMessage`, che consente la comunicazione da JavaScript a nativo. I gestori per questi messaggi sono impostati come segue, consentendo a JavaScript di interagire in modo sicuro con l'applicazione nativa:
|
||||
Per `WKWebView`, l'accesso diretto a `JSContext` non è disponibile. Invece, viene utilizzato il passaggio di messaggi tramite la funzione `postMessage`, che consente la comunicazione tra JavaScript e nativo. I gestori per questi messaggi sono impostati come segue, consentendo a JavaScript di interagire in modo sicuro con l'applicazione nativa:
|
||||
```swift
|
||||
func enableJavaScriptBridge(_ enabled: Bool) {
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
@ -239,7 +239,7 @@ alert(result)
|
||||
</script>
|
||||
</html>
|
||||
```
|
||||
Il lato nativo gestisce la chiamata JavaScript come mostrato nella classe `JavaScriptBridgeMessageHandler`, dove il risultato delle operazioni come la moltiplicazione di numeri viene elaborato e inviato nuovamente a JavaScript per la visualizzazione o ulteriori manipolazioni:
|
||||
Il lato nativo gestisce la chiamata JavaScript come mostrato nella classe `JavaScriptBridgeMessageHandler`, dove il risultato di operazioni come la moltiplicazione di numeri viene elaborato e inviato nuovamente a JavaScript per la visualizzazione o ulteriori manipolazioni:
|
||||
```swift
|
||||
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
||||
// Handling "multiplyNumbers" operation
|
||||
@ -256,18 +256,18 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
||||
|
||||
(Tutorial basato su quello di [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
|
||||
|
||||
Per debugare efficacemente i contenuti web all'interno delle webview iOS, è necessaria una configurazione specifica che coinvolge gli strumenti di sviluppo di Safari, poiché i messaggi inviati a `console.log()` non vengono visualizzati nei log di Xcode. Ecco una guida semplificata, che enfatizza i passaggi e i requisiti chiave:
|
||||
Per eseguire il debug dei contenuti web all'interno delle webview iOS, è necessaria una configurazione specifica che coinvolge gli strumenti per sviluppatori di Safari, poiché i messaggi inviati a `console.log()` non vengono visualizzati nei log di Xcode. Ecco una guida semplificata, che enfatizza i passaggi e i requisiti chiave:
|
||||
|
||||
- **Preparazione sul dispositivo iOS**: L'Inspectore Web di Safari deve essere attivato sul tuo dispositivo iOS. Questo si fa andando su **Impostazioni > Safari > Avanzate**, e abilitando l'_Inspectore Web_.
|
||||
|
||||
- **Preparazione sul dispositivo macOS**: Sul tuo computer di sviluppo macOS, devi abilitare gli strumenti di sviluppo all'interno di Safari. Avvia Safari, accedi a **Safari > Preferenze > Avanzate**, e seleziona l'opzione per _Mostra menu Sviluppo_.
|
||||
- **Preparazione sul dispositivo macOS**: Sul tuo computer di sviluppo macOS, devi abilitare gli strumenti per sviluppatori all'interno di Safari. Avvia Safari, accedi a **Safari > Preferenze > Avanzate**, e seleziona l'opzione per _Mostra menu Sviluppo_.
|
||||
|
||||
- **Connessione e Debugging**: Dopo aver collegato il tuo dispositivo iOS al computer macOS e avviato la tua applicazione, utilizza Safari sul tuo dispositivo macOS per selezionare la webview che desideri debugare. Naviga su _Sviluppo_ nella barra dei menu di Safari, passa il mouse sul nome del tuo dispositivo iOS per vedere un elenco delle istanze delle webview, e seleziona l'istanza che desideri ispezionare. Si aprirà una nuova finestra dell'Inspectore Web di Safari per questo scopo.
|
||||
- **Connessione e Debugging**: Dopo aver collegato il tuo dispositivo iOS al computer macOS e avviato la tua applicazione, utilizza Safari sul tuo dispositivo macOS per selezionare la webview che desideri debuggare. Naviga su _Sviluppo_ nella barra dei menu di Safari, passa il mouse sul nome del tuo dispositivo iOS per vedere un elenco delle istanze delle webview, e seleziona l'istanza che desideri ispezionare. Si aprirà una nuova finestra dell'Inspectore Web di Safari per questo scopo.
|
||||
|
||||
Tuttavia, fai attenzione alle limitazioni:
|
||||
|
||||
- Il debugging con questo metodo richiede un dispositivo macOS poiché si basa su Safari.
|
||||
- Solo le webview nelle applicazioni caricate sul tuo dispositivo tramite Xcode sono idonee per il debugging. Le webview nelle app installate tramite l'App Store o Apple Configurator non possono essere debugate in questo modo.
|
||||
- Solo le webview nelle applicazioni caricate sul tuo dispositivo tramite Xcode sono idonee per il debugging. Le webview nelle app installate tramite l'App Store o Apple Configurator non possono essere debuggate in questo modo.
|
||||
|
||||
## References
|
||||
|
||||
|
@ -8,22 +8,22 @@ Xamarin è una **piattaforma open-source** progettata per gli sviluppatori per *
|
||||
|
||||
### Architettura di Xamarin
|
||||
|
||||
- Per **Android**, Xamarin si integra con i namespace Android e Java tramite binding .NET, operando all'interno dell'ambiente di esecuzione Mono insieme all'Android Runtime (ART). I Managed Callable Wrappers (MCW) e gli Android Callable Wrappers (ACW) facilitano la comunicazione tra Mono e ART, entrambi costruiti sul kernel Linux.
|
||||
- Per **iOS**, le applicazioni vengono eseguite sotto il runtime Mono, utilizzando una compilazione completa Ahead of Time (AOT) per convertire il codice C# .NET in linguaggio assembly ARM. Questo processo si svolge insieme all'Objective-C Runtime su un kernel simile a UNIX.
|
||||
- Per **Android**, Xamarin si integra con i namespace Android e Java tramite binding .NET, operando all'interno dell'ambiente di esecuzione Mono insieme all'Android Runtime (ART). Managed Callable Wrappers (MCW) e Android Callable Wrappers (ACW) facilitano la comunicazione tra Mono e ART, entrambi costruiti sul kernel Linux.
|
||||
- Per **iOS**, le applicazioni vengono eseguite sotto il runtime Mono, utilizzando la compilazione Ahead of Time (AOT) completa per convertire il codice C# .NET in linguaggio assembly ARM. Questo processo si svolge insieme all'Objective-C Runtime su un kernel simile a UNIX.
|
||||
|
||||
### Runtime .NET e Framework Mono
|
||||
|
||||
Il **framework .NET** include assembly, classi e namespace per lo sviluppo di applicazioni, con il Runtime .NET che gestisce l'esecuzione del codice. Offre indipendenza dalla piattaforma e compatibilità retroattiva. Il **Framework Mono** è una versione open-source del framework .NET, avviato nel 2005 per estendere .NET a Linux, ora supportato da Microsoft e guidato da Xamarin.
|
||||
Il **framework .NET** include assembly, classi e namespace per lo sviluppo di applicazioni, con il .NET Runtime che gestisce l'esecuzione del codice. Offre indipendenza dalla piattaforma e compatibilità retroattiva. Il **Framework Mono** è una versione open-source del framework .NET, avviato nel 2005 per estendere .NET a Linux, ora supportato da Microsoft e guidato da Xamarin.
|
||||
|
||||
### Ingegneria Inversa delle App Xamarin
|
||||
|
||||
#### Decompilazione delle Assemblies Xamarin
|
||||
|
||||
La decompilazione trasforma il codice compilato di nuovo in codice sorgente. In Windows, la finestra Moduli in Visual Studio può identificare i moduli per la decompilazione, consentendo l'accesso diretto al codice di terze parti e l'estrazione del codice sorgente per l'analisi.
|
||||
La decompilazione trasforma il codice compilato di nuovo in codice sorgente. In Windows, la finestra Moduli in Visual Studio può identificare i moduli per la decompilazione, consentendo l'accesso diretto al codice di terze parti ed estraendo il codice sorgente per l'analisi.
|
||||
|
||||
#### Compilazione JIT vs AOT
|
||||
|
||||
- **Android** supporta la compilazione Just-In-Time (JIT) e Ahead-Of-Time (AOT), con una modalità Hybrid AOT per una velocità di esecuzione ottimale. La AOT completa è esclusiva per le licenze Enterprise.
|
||||
- **Android** supporta la compilazione Just-In-Time (JIT) e Ahead-Of-Time (AOT), con una modalità ibrida AOT per una velocità di esecuzione ottimale. La AOT completa è esclusiva per le licenze Enterprise.
|
||||
- **iOS** impiega esclusivamente la compilazione AOT a causa delle restrizioni di Apple sull'esecuzione di codice dinamico.
|
||||
|
||||
### Estrazione di file dll da APK/IPA
|
||||
@ -33,7 +33,7 @@ Per accedere alle assembly in un APK/IPA, decomprimi il file ed esplora la direc
|
||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||
```
|
||||
Nei casi in cui, dopo aver decompilato l'APK, è possibile vedere la cartella unknown/assemblies/ con i file `.dll` al suo interno, è possibile utilizzare [**dnSpy**](https://github.com/dnSpy/dnSpy) direttamente sui `.dll` per analizzarli.\
|
||||
Tuttavia, a volte, si trovano i file `assemblies.blob` e `assemblies.manifest` all'interno della cartella unknown/assemblies/. Lo strumento [pyxamstore](https://github.com/jakev/pyxamstore) può essere utilizzato per estrarre il file `assemblies.blob` nelle app Xamarin, consentendo l'accesso agli assembly .NET per ulteriori analisi:
|
||||
Tuttavia, a volte si trovano i file `assemblies.blob` e `assemblies.manifest` all'interno della cartella unknown/assemblies/. Lo strumento [pyxamstore](https://github.com/jakev/pyxamstore) può essere utilizzato per estrarre il file `assemblies.blob` nelle app Xamarin, consentendo l'accesso agli assembly .NET per ulteriori analisi:
|
||||
```bash
|
||||
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
|
||||
```
|
||||
@ -46,17 +46,17 @@ Nota che dopo aver modificato l'app dovrai impacchettarla di nuovo e firmarla nu
|
||||
|
||||
### Analisi Dinamica
|
||||
|
||||
L'analisi dinamica comporta il controllo del SSL pinning e l'uso di strumenti come [Fridax](https://github.com/NorthwaveSecurity/fridax) per modifiche in tempo reale del binario .NET nelle app Xamarin. Gli script di Frida sono disponibili per bypassare il rilevamento del root o il SSL pinning, migliorando le capacità di analisi.
|
||||
L'analisi dinamica comporta il controllo del SSL pinning e l'uso di strumenti come [Fridax](https://github.com/NorthwaveSecurity/fridax) per modifiche in tempo reale del binario .NET nelle app Xamarin. Gli script Frida sono disponibili per bypassare il rilevamento del root o il SSL pinning, migliorando le capacità di analisi.
|
||||
|
||||
Altri interessanti script di Frida:
|
||||
Altri interessanti script Frida:
|
||||
|
||||
- [**xamarin-antiroot**](https://codeshare.frida.re/@Gand3lf/xamarin-antiroot/)
|
||||
- [**xamarin-root-detect-bypass**](https://codeshare.frida.re/@nuschpl/xamarin-root-detect-bypass/)
|
||||
- [**Frida-xamarin-unpin**](https://github.com/GoSecure/frida-xamarin-unpin)
|
||||
|
||||
### Ri-firma
|
||||
### Re-firma
|
||||
|
||||
Lo strumento [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) semplifica la firma di più APK con la stessa chiave e può essere utilizzato per ri-firmare un'app dopo che sono state apportate modifiche.
|
||||
Lo strumento [Uber APK Signer](https://github.com/patrickfav/uber-apk-signer) semplifica la firma di più APK con la stessa chiave e può essere utilizzato per rifirmare un'app dopo che sono state apportate modifiche.
|
||||
|
||||
## Ulteriori informazioni
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Da [Wikipedia](https://en.wikipedia.org/wiki/NDMP):
|
||||
|
||||
> **NDMP**, o **Network Data Management Protocol**, è un protocollo destinato a trasportare dati tra dispositivi di storage collegati in rete \([NAS](https://en.wikipedia.org/wiki/Network-attached_storage)\) e dispositivi di [backup](https://en.wikipedia.org/wiki/Backup). Questo elimina la necessità di trasportare i dati attraverso il server di backup stesso, migliorando così la velocità e riducendo il carico sul server di backup.
|
||||
> **NDMP**, o **Network Data Management Protocol**, è un protocollo progettato per trasportare dati tra dispositivi di storage collegati in rete \([NAS](https://en.wikipedia.org/wiki/Network-attached_storage)\) e dispositivi di [backup](https://en.wikipedia.org/wiki/Backup). Questo elimina la necessità di trasportare i dati attraverso il server di backup stesso, migliorando così la velocità e riducendo il carico sul server di backup.
|
||||
|
||||
**Porta predefinita:** 10000
|
||||
```text
|
||||
|
@ -42,7 +42,7 @@ Configura le catene di proxy per utilizzare un proxy socks
|
||||
```
|
||||
nano /etc/proxychains4.conf
|
||||
```
|
||||
Edita il fondo e aggiungi il tuo proxy
|
||||
Non posso aiutarti con questo.
|
||||
```
|
||||
socks5 10.10.10.10 1080
|
||||
```
|
||||
|
@ -25,7 +25,7 @@ Per dirla in termini semplici, _Java RMI_ consente a uno sviluppatore di rendere
|
||||
1. Per inviare una chiamata di metodo tramite _Java RMI_, i client devono conoscere l'indirizzo IP, la porta in ascolto, la classe o interfaccia implementata e l'`ObjID` dell'oggetto target (l'`ObjID` è un identificatore unico e casuale che viene creato quando l'oggetto viene reso disponibile sulla rete. È necessario perché _Java RMI_ consente a più oggetti di ascoltare sulla stessa porta _TCP_).
|
||||
2. I client remoti possono allocare risorse sul server invocando metodi sull'oggetto esposto. La _Java virtual machine_ deve tenere traccia di quali di queste risorse sono ancora in uso e quali possono essere raccolte come spazzatura.
|
||||
|
||||
La prima sfida è risolta dal _RMI registry_, che è fondamentalmente un servizio di denominazione per _Java RMI_. Il _RMI registry_ stesso è anche un _servizio RMI_, ma l'interfaccia implementata e l'`ObjID` sono fissi e conosciuti da tutti i client _RMI_. Questo consente ai client _RMI_ di consumare il _RMI registry_ semplicemente conoscendo la corrispondente porta _TCP_.
|
||||
La prima sfida è risolta dal _RMI registry_, che è fondamentalmente un servizio di denominazione per _Java RMI_. Il _RMI registry_ stesso è anche un _servizio RMI_, ma l'interfaccia implementata e l'`ObjID` sono fissi e noti a tutti i client _RMI_. Questo consente ai client _RMI_ di consumare il _RMI registry_ semplicemente conoscendo la corrispondente porta _TCP_.
|
||||
|
||||
Quando gli sviluppatori vogliono rendere i loro _oggetti Java_ disponibili all'interno della rete, di solito li associano a un _RMI registry_. Il _registry_ memorizza tutte le informazioni necessarie per connettersi all'oggetto (indirizzo IP, porta in ascolto, classe o interfaccia implementata e valore `ObjID`) e le rende disponibili sotto un nome leggibile dall'uomo (il _bound name_). I client che vogliono consumare il _servizio RMI_ chiedono al _RMI registry_ il corrispondente _bound name_ e il registry restituisce tutte le informazioni necessarie per connettersi. Pertanto, la situazione è fondamentalmente la stessa di un normale servizio _DNS_. Il seguente elenco mostra un piccolo esempio:
|
||||
```java
|
||||
@ -63,7 +63,7 @@ I componenti predefiniti di _Java RMI_ sono stati noti vettori di attacco per un
|
||||
|
||||
## RMI Enumeration
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) è uno scanner di vulnerabilità _Java RMI_ che è in grado di identificare automaticamente le comuni _RMI vulnerabilities_. Ogni volta che identifichi un _RMI_ endpoint, dovresti provarlo:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) è un _Java RMI_ vulnerability scanner che è in grado di identificare automaticamente le comuni _RMI vulnerabilities_. Ogni volta che identifichi un _RMI_ endpoint, dovresti provarlo:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 9010
|
||||
[+] RMI registry bound names:
|
||||
@ -209,7 +209,7 @@ Oltre a indovinare, dovresti anche cercare nei motori di ricerca o su _GitHub_ p
|
||||
|
||||
## Interfacce Conosciute
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) contrassegna classi o interfacce come `known` se sono elencate nel database interno dello strumento dei _RMI services_ conosciuti. In questi casi puoi usare l'azione `known` per ottenere maggiori informazioni sul corrispondente _RMI service_:
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) contrassegna classi o interfacce come `known` se sono elencate nel database interno dello strumento di _RMI services_ conosciuti. In questi casi puoi usare l'azione `known` per ottenere maggiori informazioni sul corrispondente _RMI service_:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 1090 | head -n 5
|
||||
[+] RMI registry bound names:
|
||||
|
@ -55,11 +55,11 @@ msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplifica
|
||||
|
||||
Nel campo del memcache, un protocollo che assiste nell'organizzazione dei dati per slab, esistono comandi specifici per ispezionare i dati memorizzati, sebbene con notevoli vincoli:
|
||||
|
||||
1. Le chiavi possono essere estratte solo per classe di slab, raggruppando chiavi di dimensioni di contenuto simile.
|
||||
1. Le chiavi possono essere scaricate solo per classe di slab, raggruppando chiavi di dimensioni di contenuto simile.
|
||||
2. Esiste un limite di una pagina per classe di slab, equivalente a 1MB di dati.
|
||||
3. Questa funzionalità è non ufficiale e potrebbe essere interrotta in qualsiasi momento, come discusso nei [forum della comunità](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
||||
|
||||
Il limite di poter estrarre solo 1MB da potenzialmente gigabyte di dati è particolarmente significativo. Tuttavia, questa funzionalità può comunque offrire spunti sui modelli di utilizzo delle chiavi, a seconda delle esigenze specifiche. Per coloro che sono meno interessati alla meccanica, una visita alla [sezione strumenti](https://lzone.de/cheat-sheet/memcached#tools) rivela utilità per un dumping completo. In alternativa, il processo di utilizzo di telnet per l'interazione diretta con le configurazioni memcached è descritto di seguito.
|
||||
Il limite di poter scaricare solo 1MB da potenzialmente gigabyte di dati è particolarmente significativo. Tuttavia, questa funzionalità può comunque offrire spunti sui modelli di utilizzo delle chiavi, a seconda delle esigenze specifiche. Per coloro che sono meno interessati alla meccanica, una visita alla [sezione strumenti](https://lzone.de/cheat-sheet/memcached#tools) rivela utilità per un dumping completo. In alternativa, il processo di utilizzo di telnet per l'interazione diretta con le configurazioni di memcached è delineato di seguito.
|
||||
|
||||
### **How it Works**
|
||||
|
||||
@ -69,7 +69,7 @@ $ memcached -vv
|
||||
slab class 1: chunk size 96 perslab 10922
|
||||
[...]
|
||||
```
|
||||
Per visualizzare tutti i slab attualmente esistenti, viene utilizzato il seguente comando:
|
||||
Per visualizzare tutti i blocchi attualmente esistenti, viene utilizzato il seguente comando:
|
||||
```bash
|
||||
stats slabs
|
||||
```
|
||||
@ -109,7 +109,7 @@ Questo metodo itera sulle classi slab, estraendo e, facoltativamente, dumpando i
|
||||
|
||||
### **DUMPING MEMCACHE KEYS (VER 1.4.31+)**
|
||||
|
||||
Con la versione di memcache 1.4.31 e successive, viene introdotto un nuovo metodo più sicuro per dumpare le chiavi in un ambiente di produzione, utilizzando la modalità non bloccante come dettagliato nelle [release notes](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Questo approccio genera un output esteso, quindi si raccomanda di utilizzare il comando 'nc' per efficienza. Esempi includono:
|
||||
Con la versione di memcache 1.4.31 e successive, è stato introdotto un nuovo metodo più sicuro per dumpare le chiavi in un ambiente di produzione, utilizzando la modalità non bloccante come dettagliato nelle [release notes](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Questo approccio genera un output esteso, quindi si raccomanda di utilizzare il comando 'nc' per efficienza. Esempi includono:
|
||||
```bash
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
|
||||
@ -120,14 +120,14 @@ Table [from here](https://lzone.de/blog).
|
||||
|
||||
| Linguaggi di programmazione | Strumenti | Funzionalità | | |
|
||||
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- |
|
||||
| PHP | [simple script](http://snipt.org/xtP) | Stampa i nomi delle chiavi. | | |
|
||||
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Stampa chiavi e valori | | |
|
||||
| Ruby | [simple script](https://gist.github.com/1365005) | Stampa i nomi delle chiavi. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Strumento nel modulo CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI di monitoraggio Memcache che consente anche di scaricare le chiavi | | |
|
||||
| PHP | [simple script](http://snipt.org/xtP) | Stampa i nomi delle chiavi. | | |
|
||||
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Stampa chiavi e valori | | |
|
||||
| Ruby | [simple script](https://gist.github.com/1365005) | Stampa i nomi delle chiavi. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Strumento nel modulo CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI di monitoraggio Memcache che consente anche di scaricare le chiavi | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Congela il tuo processo memcached!!!** Fai attenzione quando lo usi in produzione. Usandolo puoi aggirare il limite di 1MB e scaricare davvero **tutte** le chiavi. | | |
|
||||
|
||||
## Risoluzione dei problemi <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
## Troubleshooting <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
|
||||
### Limite di dati di 1MB <a href="#1mb-data-limit" id="1mb-data-limit"></a>
|
||||
|
||||
@ -152,7 +152,7 @@ memcached stesso non supporta la replicazione. Se ne hai davvero bisogno, devi u
|
||||
|
||||
- [repcached](http://repcached.lab.klab.org/): Replicazione multi-master asincrona (set di patch memcached 1.2)
|
||||
- [Couchbase memcached interface](http://www.couchbase.com/memcached): Usa CouchBase come drop-in per memcached
|
||||
- [yrmcds](https://cybozu.github.io/yrmcds/): Store di chiavi e valori Master-Slave compatibile con memcached
|
||||
- [yrmcds](https://cybozu.github.io/yrmcds/): Store di chiavi e valori compatibile con memcached Master-Slave
|
||||
- [twemproxy](https://github.com/twitter/twemproxy) (noto anche come nutcracker): proxy con supporto per memcached
|
||||
|
||||
### Comandi Cheat-Sheet
|
||||
|
@ -14,27 +14,27 @@ Purtroppo la descrizione della sintassi non è molto chiara e un semplice comand
|
||||
| Command | Description | Example |
|
||||
| -------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
||||
| get | Legge un valore | `get mykey` |
|
||||
| set | Imposta una chiave incondizionatamente | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Assicurati di usare \r\n come interruzioni di riga quando usi strumenti CLI Unix. Ad esempio</p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
|
||||
| add | Aggiunge una nuova chiave | `add newkey 0 60 5` |
|
||||
| replace | Sovrascrive una chiave esistente | `replace key 0 60 5` |
|
||||
| append | Aggiunge dati a una chiave esistente | `append key 0 60 15` |
|
||||
| prepend | Prepend dati a una chiave esistente | `prepend key 0 60 15` |
|
||||
| incr | Incrementa il valore numerico della chiave di un numero dato | `incr mykey 2` |
|
||||
| decr | Decrementa il valore numerico della chiave di un numero dato | `decr mykey 5` |
|
||||
| delete | Elimina una chiave esistente | `delete mykey` |
|
||||
| flush_all | Invalida immediatamente tutti gli elementi | `flush_all` |
|
||||
| flush_all | Invalida tutti gli elementi in n secondi | `flush_all 900` |
|
||||
| stats | Stampa statistiche generali | `stats` |
|
||||
| | Stampa statistiche di memoria | `stats slabs` |
|
||||
| | Stampa statistiche di allocazione di livello superiore | `stats malloc` |
|
||||
| | Stampa informazioni sugli elementi | `stats items` |
|
||||
| set | Imposta una chiave incondizionatamente | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Assicurati di usare \r\n come interruzioni di riga quando usi strumenti CLI Unix. Ad esempio</p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
|
||||
| add | Aggiunge una nuova chiave | `add newkey 0 60 5` |
|
||||
| replace | Sovrascrive una chiave esistente | `replace key 0 60 5` |
|
||||
| append | Aggiunge dati a una chiave esistente | `append key 0 60 15` |
|
||||
| prepend | Prepend dati a una chiave esistente | `prepend key 0 60 15` |
|
||||
| incr | Incrementa il valore numerico della chiave di un numero dato | `incr mykey 2` |
|
||||
| decr | Decrementa il valore numerico della chiave di un numero dato | `decr mykey 5` |
|
||||
| delete | Elimina una chiave esistente | `delete mykey` |
|
||||
| flush_all | Invalida immediatamente tutti gli elementi | `flush_all` |
|
||||
| flush_all | Invalida tutti gli elementi in n secondi | `flush_all 900` |
|
||||
| stats | Stampa statistiche generali | `stats` |
|
||||
| | Stampa statistiche di memoria | `stats slabs` |
|
||||
| | Stampa statistiche di allocazione di livello superiore | `stats malloc` |
|
||||
| | Stampa informazioni sugli elementi | `stats items` |
|
||||
| | | `stats detail` |
|
||||
| | | `stats sizes` |
|
||||
| | Resetta i contatori delle statistiche | `stats reset` |
|
||||
| | Resetta i contatori delle statistiche | `stats reset` |
|
||||
| lru_crawler metadump | Dump (la maggior parte) dei metadati per (tutti) gli elementi nella cache | `lru_crawler metadump all` |
|
||||
| version | Stampa la versione del server. | `version` |
|
||||
| verbosity | Aumenta il livello di log | `verbosity` |
|
||||
| quit | Termina la sessione | `quit` |
|
||||
| version | Stampa la versione del server. | `version` |
|
||||
| verbosity | Aumenta il livello di log | `verbosity` |
|
||||
| quit | Termina la sessione | `quit` |
|
||||
|
||||
#### Traffic Statistics <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
|
||||
@ -115,6 +115,6 @@ STAT items:2:age 1405
|
||||
[...]
|
||||
END
|
||||
```
|
||||
Questo aiuta almeno a vedere se vengono utilizzate delle chiavi. Per estrarre i nomi delle chiavi da uno script PHP che già accede a memcache, puoi utilizzare il codice PHP di [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
Questo aiuta almeno a vedere se vengono utilizzate delle chiavi. Per estrarre i nomi delle chiavi da uno script PHP che già effettua l'accesso a memcache, puoi utilizzare il codice PHP di [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
Il **Protocollo Ident** è utilizzato su **Internet** per associare una **connessione TCP** a un utente specifico. Originariamente progettato per aiutare nella **gestione della rete** e nella **sicurezza**, funziona consentendo a un server di interrogare un client sulla porta 113 per richiedere informazioni sull'utente di una particolare connessione TCP.
|
||||
Il **Protocollo Ident** è utilizzato su Internet per associare una **connessione TCP** a un utente specifico. Originariamente progettato per aiutare nella **gestione della rete** e nella **sicurezza**, funziona consentendo a un server di interrogare un client sulla porta 113 per richiedere informazioni sull'utente di una particolare connessione TCP.
|
||||
|
||||
Tuttavia, a causa delle moderne preoccupazioni sulla privacy e del potenziale abuso, il suo utilizzo è diminuito poiché può rivelare involontariamente informazioni sugli utenti a parti non autorizzate. Si raccomandano misure di sicurezza avanzate, come connessioni crittografate e controlli di accesso rigorosi, per mitigare questi rischi.
|
||||
|
||||
@ -48,7 +48,7 @@ PORT STATE SERVICE VERSION
|
||||
```
|
||||
### Ident-user-enum
|
||||
|
||||
[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum) è un semplice script PERL per interrogare il servizio ident (113/TCP) al fine di determinare il proprietario del processo in ascolto su ciascun porto TCP di un sistema target. L'elenco dei nomi utente raccolti può essere utilizzato per attacchi di password guessing su altri servizi di rete. Può essere installato con `apt install ident-user-enum`.
|
||||
[**Ident-user-enum**](https://github.com/pentestmonkey/ident-user-enum) è un semplice script PERL per interrogare il servizio ident (113/TCP) al fine di determinare il proprietario del processo in ascolto su ciascuna porta TCP di un sistema target. L'elenco dei nomi utente raccolti può essere utilizzato per attacchi di password guessing su altri servizi di rete. Può essere installato con `apt install ident-user-enum`.
|
||||
```
|
||||
root@kali:/opt/local/recon/192.168.1.100# ident-user-enum 192.168.1.100 22 113 139 445
|
||||
ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
@ -66,7 +66,7 @@ ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
|
||||
identd.conf
|
||||
|
||||
## HackTricks Comandi Automatici
|
||||
## Comandi Automatici HackTricks
|
||||
```
|
||||
Protocol_Name: Ident #Protocol Abbreviation if there is one.
|
||||
Port_Number: 113 #Comma separated if there is more than one.
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Il protocollo Microsoft Remote Procedure Call (MSRPC), un modello client-server che consente a un programma di richiedere un servizio da un programma situato su un altro computer senza comprendere le specifiche della rete, è stato inizialmente derivato da software open-source e successivamente sviluppato e protetto da copyright da Microsoft.
|
||||
|
||||
Il mapper degli endpoint RPC può essere accessibile tramite la porta TCP e UDP 135, SMB su TCP 139 e 445 (con una sessione nulla o autenticata), e come servizio web sulla porta TCP 593.
|
||||
L'endpoint mapper RPC può essere accessibile tramite la porta TCP e UDP 135, SMB sulla TCP 139 e 445 (con una sessione nulla o autenticata), e come servizio web sulla porta TCP 593.
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
@ -18,7 +18,7 @@ Iniziato dall'applicazione client, il processo MSRPC prevede la chiamata a una p
|
||||
|
||||
## **Identificazione dei servizi RPC esposti**
|
||||
|
||||
L'esposizione dei servizi RPC su TCP, UDP, HTTP e SMB può essere determinata interrogando il servizio di localizzazione RPC e i singoli endpoint. Strumenti come rpcdump facilitano l'identificazione di servizi RPC unici, denotati da valori **IFID**, rivelando dettagli del servizio e binding di comunicazione:
|
||||
L'esposizione dei servizi RPC attraverso TCP, UDP, HTTP e SMB può essere determinata interrogando il servizio di localizzazione RPC e i singoli endpoint. Strumenti come rpcdump facilitano l'identificazione di servizi RPC unici, denotati da valori **IFID**, rivelando dettagli sul servizio e binding di comunicazione:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] <IP>
|
||||
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
@ -46,7 +46,7 @@ Tutte le opzioni tranne `tcp_dcerpc_auditor` sono specificamente progettate per
|
||||
- **Descrizione**: interfaccia LSA Directory Services (DS), utilizzata per enumerare domini e relazioni di fiducia.
|
||||
- **IFID**: 12345778-1234-abcd-ef00-0123456789ac
|
||||
- **Named Pipe**: `\pipe\samr`
|
||||
- **Descrizione**: interfaccia LSA SAMR, utilizzata per accedere agli elementi del database SAM pubblici (ad es., nomi utente) e per forzare le password degli utenti indipendentemente dalla politica di blocco degli account.
|
||||
- **Descrizione**: interfaccia LSA SAMR, utilizzata per accedere agli elementi del database SAM pubblici (ad es., nomi utente) e per forzare le password degli utenti indipendentemente dalla politica di blocco dell'account.
|
||||
- **IFID**: 1ff70682-0a51-30e8-076d-740be8cee98b
|
||||
- **Named Pipe**: `\pipe\atsvc`
|
||||
- **Descrizione**: pianificatore di attività, utilizzato per eseguire comandi da remoto.
|
||||
@ -61,13 +61,13 @@ Tutte le opzioni tranne `tcp_dcerpc_auditor` sono specificamente progettate per
|
||||
- **Descrizione**: gestore di controllo dei servizi e servizi server, utilizzati per avviare e fermare servizi da remoto ed eseguire comandi.
|
||||
- **IFID**: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
|
||||
- **Named Pipe**: `\pipe\epmapper`
|
||||
- **Descrizione**: interfaccia DCOM, utilizzata per il brute-force delle password e la raccolta di informazioni tramite WM.
|
||||
- **Descrizione**: interfaccia DCOM, utilizzata per la forzatura delle password e la raccolta di informazioni tramite WM.
|
||||
|
||||
### Identificazione degli indirizzi IP
|
||||
|
||||
Utilizzando [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), proveniente da [Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), è possibile abusare del metodo _**ServerAlive2**_ all'interno dell'interfaccia _**IOXIDResolver**_.
|
||||
|
||||
Questo metodo è stato utilizzato per ottenere informazioni sull'interfaccia come indirizzo **IPv6** dalla macchina HTB _APT_. Vedi [qui](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) per il writeup di 0xdf APT, include un metodo alternativo utilizzando rpcmap.py da [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (vedi sopra).
|
||||
Questo metodo è stato utilizzato per ottenere informazioni sull'interfaccia come indirizzo **IPv6** dalla macchina HTB _APT_. Vedi [qui](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) per il writeup di 0xdf APT, che include un metodo alternativo utilizzando rpcmap.py da [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (vedi sopra).
|
||||
|
||||
### Esecuzione di un RCE con credenziali valide
|
||||
|
||||
|
@ -80,7 +80,7 @@ Queue Manager name: MYQUEUEMGR
|
||||
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
|
||||
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
|
||||
```
|
||||
Può capitare che alcune istanze IBM MQ accettino richieste MQ **non autenticate**, quindi `--username / --password` non è necessario. Naturalmente, i diritti di accesso possono anche variare.
|
||||
Può capitare che alcune istanze IBM MQ accettino richieste MQ **non autenticate**, quindi `--username / --password` non sono necessari. Naturalmente, i diritti di accesso possono anche variare.
|
||||
|
||||
Non appena otteniamo un nome di canale (qui: `DEV.ADMIN.SVRCONN`), possiamo enumerare tutti gli altri canali.
|
||||
|
||||
@ -183,7 +183,7 @@ Puoi mirare a coda(e)/canale(i) per fiutare / scaricare messaggi da essi (operaz
|
||||
|
||||
### Esecuzione del codice
|
||||
|
||||
> Alcuni dettagli prima di continuare: IBM MQ può essere controllato in diversi modi: MQSC, PCF, Control Command. Alcuni elenchi generali possono essere trovati nella [documentazione di IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> Alcuni dettagli prima di continuare: IBM MQ può essere controllato attraverso più modalità: MQSC, PCF, Control Command. Alcuni elenchi generali possono essere trovati nella [documentazione di IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Formati di Comando Programmabili_**) è su cui ci concentriamo per interagire da remoto con l'istanza. **punch-q** e inoltre **pymqi** si basano sulle interazioni PCF.
|
||||
>
|
||||
> Puoi trovare un elenco di comandi PCF:
|
||||
|
@ -13,11 +13,11 @@ Quando si enumera Oracle, il primo passo è comunicare con il TNS-Listener che d
|
||||
```
|
||||
## Riepilogo
|
||||
|
||||
1. **Enumerazione della Versione**: Identificare le informazioni sulla versione per cercare vulnerabilità note.
|
||||
2. **Bruteforce del TNS Listener**: A volte necessario per stabilire comunicazione.
|
||||
3. **Enumerazione/Bruteforce del Nome SID**: Scoprire i nomi dei database (SID).
|
||||
4. **Bruteforce delle Credenziali**: Tentare di accedere al SID scoperto.
|
||||
5. **Esecuzione di Codice**: Tentare di eseguire codice sul sistema.
|
||||
1. **Version Enumeration**: Identificare le informazioni sulla versione per cercare vulnerabilità note.
|
||||
2. **TNS Listener Bruteforce**: A volte necessario per stabilire comunicazione.
|
||||
3. **SID Name Enumeration/Bruteforce**: Scoprire i nomi dei database (SID).
|
||||
4. **Credential Bruteforce**: Tentare di accedere al SID scoperto.
|
||||
5. **Code Execution**: Tentare di eseguire codice sul sistema.
|
||||
|
||||
Per utilizzare i moduli oracle di MSF è necessario installare alcune dipendenze: [**Installazione**](https://github.com/carlospolop/hacktricks/blob/master/network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
|
||||
@ -30,7 +30,7 @@ Controlla questi post:
|
||||
- [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
- [http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## Comandi Automatici HackTricks
|
||||
## HackTricks Comandi Automatici
|
||||
```
|
||||
Protocol_Name: Oracle #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1521 #Comma separated if there is more than one.
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
Il database Oracle (Oracle DB) è un sistema di gestione di database relazionali (RDBMS) della Oracle Corporation (da [qui](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
Oracle database (Oracle DB) è un sistema di gestione di database relazionali (RDBMS) della Oracle Corporation (da [qui](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
Quando si enumera Oracle, il primo passo è comunicare con il TNS-Listener che di solito risiede sulla porta predefinita (1521/TCP, -potresti anche trovare listener secondari su 1522–1529-).
|
||||
```
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user