GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare se Bash ha una vulnerabilità Shellshock?

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.


Linux
  1. Come scrivere un ciclo in Bash

  2. Come verificare se Bash può stampare i colori?

  3. Come controllare syslog in Bash su Linux?

  4. Come verificare se un file è vuoto in Bash?

  5. Come verificare se sed ha modificato un file

Come verificare se una stringa contiene una sottostringa in Bash

Come controllare la versione di Python

Come controllare la versione Java

Verifica se il tuo sistema Linux è vulnerabile a Shellshock e correggilo

Come verificare se esiste un file o una directory in Bash Shell

Come posso controllare la sintassi di uno script Bash senza eseguirlo?