La vulnerabilità Shellshock è stata rilevata alla fine del 2014 (per la precisione, l'impatto è stato pubblicato su CVE-2014-6271 il 24 settembre 2014). Successivamente è stato rilasciato un aggiornamento nella versione bash 4.1.2-15 con una correzione per la vulnerabilità Shellshock. Bene, il mondo intero ha continuato ad aggiornare bash e ha protetto la propria shell da Shellshock, ma sorprendentemente molte macchine nel mio ufficio non sono state aggiornate per qualsiasi motivo. La parte spaventosa è che poche di quelle macchine con una shell vulnerabile ospitavano molti servizi in Internet. Secondo vari blog su Internet, l'exploit Shellshock consente a un utente malintenzionato di eseguire in remoto un comando dannoso in bash tramite script CGI.
(I know this tutorial is pretty late, but there are many who are not aware of it and still using vulnerable bash on their public servers)
La prima cosa è controllare se il tuo BASH è vulnerabile a Shellshock o meno . Quindi qualsiasi versione bash precedente alla 4.1.2 avrà sicuramente questa vulnerabilità.
$ bash --version GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
(o)
$ rpm -qa|grep bash bash-completion-1.3-7.el5 bash-3.2-32.el5_9.1
Ora conosci la versione, quindi esegui i comandi seguenti per confermare che è vulnerabile a Shellshock.
$ env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock" vulnerable If you see the word vulnerable above, you are vulnerable to shellshock
Soluzione:
Vai in fondo a questo post. Nel caso, se desideri sapere come funziona Shellshock, leggi tutto.
Comprendere le variabili di esportazione in SHELL :
Come dice l'output sopra, il tuo SHELL è vulnerabile, ma vediamo come funziona.
Normalmente, puoi impostare una variabile di ambiente e usarla in una shell. Ad esempio, come di seguito:
$ test=1 $ echo $test 1
Ma non puoi usare direttamente la variabile env 'test' in una nuova shell bash . Dai un'occhiata:
$ test=1 $ echo $test 1 $ bash $ echo $test
L'output è vuoto. Il motivo è che una variabile di ambiente è disponibile per l'accesso solo nella stessa shell. Ma se esporti una variabile di ambiente, è disponibile anche per una nuova shell bash. Ecco un esempio:
$ var="testing" $ export var $ bash $ echo $var testing
Ora puoi vedere che la variabile '$var' è stata impostata ed esportata in una shell e accessibile da un'altra shell. Ovviamente puoi interrompere l'esportazione in qualsiasi momento utilizzando il comando seguente.
$ export -n var $ bash $ echo $var
Allo stesso modo, puoi creare funzioni ed esportarle in una shell e accedere alla funzione esportata da un'altra shell. Vediamo anche questo esempio.
$ fnc() { echo "testing"; } $ fnc testing $ bash $ fnc bash: fnc: command not found
Nell'output sopra vedi "bash:fnc:comando non trovato ' perché, il fnc non è una funzione esportata. Quindi non puoi chiamarlo da un'altra shell.
Esportiamo "fnc ' pure.
$ export -f fnc $ fnc testing $ bash $ fnc testing
Funziona come previsto (poiché 'fnc ' è stato esportato ed è disponibile in un'altra shell).
L'esportazione di una variabile o di una funzione imposterà una variabile di ambiente
$ env | grep -A1 fnc fnc=() { echo "testing" }
Ora exploit Shellshock
Sulla base degli esempi precedenti, abbiamo appreso che una nuova shell bash acquisisce la definizione di una variabile di ambiente che inizia con () e la interpreta come una funzione . Ma ecco la vulnerabilità, la nuova shell eseguirà qualsiasi cosa presente nella citazione.
Ad esempio:
Esegui il comando seguente:
$ export sse_fnc='() { echo "function shellshock exploit" ; }; echo "Not good"; '
Controlla la variabile env per 'sse_fnc':
$ env | grep -A1 sse_fnc sse_fnc=() { echo "function shellshock exploit" ; }; echo "Not good";
Vai alla nuova shell bash:
$ bash Not good
Nota: Abbiamo appena digitato "bash ' e vedi il testo 'Non buono ' stampato. Significa che la nuova shell inizia a eseguire la funzione dopo aver letto la variabile d'ambiente ed esegue anche i comandi finali (anche se la parentesi della funzione si è chiusa dopo l'"eco "exploit di shellshock";').
In altre parole “La variabile esportata sse_fnc
è stato passato alla subshell che è stata interpretata come una funzione sse_fnc
ma i comandi finali sono stati eseguiti (this is bad
) quando è stata generata la subshell."
tramite Fixee@StackExchange
come può essere sfruttata questa vulnerabilità?
Penso che nessuno possa spiegare meglio di questo ragazzo (shellshocker.net). Grazie amico!
Come risolvere Shellshock?
Semplice, aggiorna la tua bash e prova l'exploit per verificare se la vulnerabilità è scomparsa.
$curl https://shellshocker.net/fixbash | sh
Il comando sopra scaricherà automaticamente circa 30+ patch e compilerà bash dal sorgente. Puoi eseguire regolarmente questo script per mantenere il tuo bash aggiornato con le ultime patch.
Una volta completata l'installazione. Controlla la versione bash come di seguito:
$bash --version GNU bash, version 4.3.42(1)-release (x86_64-unknown-linux-gnu)
Verifica la vulnerabilità di Shellshock:
$env x='() { :;}; echo vulnerable' bash -c "echo If you see the word vulnerable above, you are vulnerable to shellshock If you see the word vulnerable above, you are vulnerable to shellshock
Dall'output sopra, non ha stampato la parola "vulnerabile". Quindi la mia festa è al sicuro!
(o)
$env X='() { (shellshocker.net)=>\' bash -c "echo date"; cat echo; rm ./echo
Se BASH è vulnerabile, il comando precedente visualizzerà la data. Altrimenti, BASH è sicuro.