ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Address Space Layout Randomization (ASLR) è una tecnica di sicurezza utilizzata nei sistemi operativi per randomizzare gli indirizzi di memoria utilizzati dai processi di sistema e applicazione. In questo modo, rende significativamente più difficile per un attaccante prevedere la posizione di processi e dati specifici, come lo stack, l'heap e le librerie, mitigando così alcuni tipi di exploit, in particolare i buffer overflow.
Per controllare lo stato di ASLR su un sistema Linux, puoi leggere il valore dal file /proc/sys/kernel/randomize_va_space
. Il valore memorizzato in questo file determina il tipo di ASLR applicato:
0: Nessuna randomizzazione. Tutto è statico.
1: Randomizzazione conservativa. Le librerie condivise, lo stack, mmap(), la pagina VDSO sono randomizzate.
2: Randomizzazione completa. Oltre agli elementi randomizzati dalla randomizzazione conservativa, la memoria gestita tramite brk()
è randomizzata.
Puoi controllare lo stato di ASLR con il seguente comando:
Per disabilitare ASLR, imposta il valore di /proc/sys/kernel/randomize_va_space
a 0. Disabilitare ASLR non è generalmente raccomandato al di fuori di scenari di test o debug. Ecco come puoi disabilitarlo:
Puoi anche disabilitare ASLR per un'esecuzione con:
Per abilitare ASLR, puoi scrivere un valore di 2 nel file /proc/sys/kernel/randomize_va_space
. Questo richiede tipicamente privilegi di root. L'abilitazione della randomizzazione completa può essere effettuata con il seguente comando:
Le modifiche apportate con i comandi echo
sono temporanee e verranno ripristinate al riavvio. Per rendere la modifica persistente, è necessario modificare il file /etc/sysctl.conf
e aggiungere o modificare la seguente riga:
Dopo aver modificato /etc/sysctl.conf
, applica le modifiche con:
Questo garantirà che le impostazioni ASLR rimangano attive tra i riavvii.
PaX divide lo spazio degli indirizzi del processo in 3 gruppi:
Codice e dati (inizializzati e non inizializzati): .text
, .data
e .bss
—> 16 bit di entropia nella variabile delta_exec
. Questa variabile è inizializzata casualmente con ogni processo e aggiunta agli indirizzi iniziali.
Memoria allocata da mmap()
e librerie condivise —> 16 bit, chiamata delta_mmap
.
Lo stack —> 24 bit, indicato come delta_stack
. Tuttavia, utilizza effettivamente 11 bit (dal 10° al 20° byte inclusi), allineati a 16 byte —> Questo porta a 524.288 possibili indirizzi reali dello stack.
I dati precedenti sono per sistemi a 32 bit e l'entropia finale ridotta rende possibile bypassare ASLR riprovando l'esecuzione più e più volte fino a quando l'exploit non viene completato con successo.
Se hai un overflow abbastanza grande da ospitare un grande NOP sled prima del shellcode, potresti semplicemente forzare gli indirizzi nello stack fino a quando il flusso salta sopra una parte del NOP sled.
Un'altra opzione per questo, nel caso in cui l'overflow non sia così grande e l'exploit possa essere eseguito localmente, è possibile aggiungere il NOP sled e lo shellcode in una variabile d'ambiente.
Se l'exploit è locale, puoi provare a forzare l'indirizzo base di libc (utile per sistemi a 32 bit):
Se attacchi un server remoto, potresti provare a forzare l'indirizzo della funzione usleep
di libc
, passando come argomento 10 (ad esempio). Se a un certo punto il server impiega 10 secondi in più per rispondere, hai trovato l'indirizzo di questa funzione.
Nei sistemi a 64 bit, l'entropia è molto più alta e questo non dovrebbe essere possibile.
È possibile occupare una grande parte dello stack con variabili d'ambiente e poi provare ad abusare del binario centinaia/migliaia di volte localmente per sfruttarlo. Il seguente codice mostra come sia possibile selezionare semplicemente un indirizzo nello stack e ogni pochi centinaia di esecuzioni quell'indirizzo conterrà l'istruzione NOP:
/proc/[pid]/stat
)Il file /proc/[pid]/stat
di un processo è sempre leggibile da chiunque e contiene informazioni interessanti come:
startcode & endcode: Indirizzi sopra e sotto con il TESTO del binario
startstack: L'indirizzo dell'inizio dello stack
start_data & end_data: Indirizzi sopra e sotto dove si trova il BSS
kstkesp & kstkeip: Indirizzi attuali di ESP e EIP
arg_start & arg_end: Indirizzi sopra e sotto dove si trovano gli argomenti cli.
env_start &env_end: Indirizzi sopra e sotto dove si trovano le variabili d'ambiente.
Pertanto, se l'attaccante si trova sullo stesso computer del binario che viene sfruttato e questo binario non si aspetta il overflow da argomenti raw, ma da un diverso input che può essere creato dopo aver letto questo file. È possibile per un attaccante ottenere alcuni indirizzi da questo file e costruire offset da essi per l'exploit.
Per ulteriori informazioni su questo file controlla https://man7.org/linux/man-pages/man5/proc.5.html cercando /proc/pid/stat
La sfida è fornire una leak
Se ti viene fornita una leak (sfide CTF facili), puoi calcolare offset da essa (supponendo ad esempio che tu conosca la versione esatta di libc utilizzata nel sistema che stai sfruttando). Questo esempio di exploit è estratto da esempio da qui (controlla quella pagina per ulteriori dettagli):
ret2plt
Abusando di un buffer overflow sarebbe possibile sfruttare un ret2plt per esfiltrare un indirizzo di una funzione dalla libc. Controlla:
Ret2pltFormat Strings Arbitrary Read
Proprio come in ret2plt, se hai una lettura arbitraria tramite una vulnerabilità di format strings è possibile esfiltrare l'indirizzo di una funzione libc dal GOT. Il seguente esempio è da qui:
Puoi trovare ulteriori informazioni su Format Strings lettura arbitraria in:
Format StringsProva a bypassare ASLR abusando degli indirizzi all'interno dello stack:
Ret2ret & Reo2popIl meccanismo vsyscall
serve a migliorare le prestazioni consentendo a determinate chiamate di sistema di essere eseguite nello spazio utente, anche se fanno parte fondamentalmente del kernel. Il vantaggio critico delle vsyscalls risiede nei loro indirizzi fissi, che non sono soggetti a ASLR (Randomizzazione del Layout dello Spazio degli Indirizzi). Questa natura fissa significa che gli attaccanti non richiedono una vulnerabilità di leak informativo per determinare i loro indirizzi e usarli in un exploit.
Tuttavia, non si troveranno gadget particolarmente interessanti qui (anche se, ad esempio, è possibile ottenere un equivalente di ret;
)
(L'esempio e il codice seguenti sono da questo writeup)
Ad esempio, un attaccante potrebbe utilizzare l'indirizzo 0xffffffffff600800
all'interno di un exploit. Mentre tentare di saltare direttamente a un'istruzione ret
potrebbe portare a instabilità o crash dopo aver eseguito un paio di gadget, saltare all'inizio di una syscall
fornita dalla sezione vsyscall può rivelarsi un successo. Posizionando con attenzione un gadget ROP che porta l'esecuzione a questo indirizzo vsyscall, un attaccante può ottenere l'esecuzione di codice senza dover bypassare ASLR per questa parte dell'exploit.
Nota quindi come potrebbe essere possibile bypassare ASLR abusando del vdso se il kernel è compilato con CONFIG_COMPAT_VDSO poiché l'indirizzo vdso non verrà randomizzato. Per ulteriori informazioni controlla:
Ret2vDSOImpara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)