Netcat

Questo esercizio è dedicato a conoscere il comando netcat, che può essere un utile strumento per interagire con servizi in rete, e soprattutto per capire meglio come funzionano le comunicazione client / server.

Il comando netcat è l'equivalente "in rete" del comando cat, che è stato usato fino ad ora per stampare il contenuto di file di testo. Prima di procedere, conviene ricordare cosa fa esattamente cat:

Una cosa analoga succede con netcat. La differenza sostanziale è che questo comando si può usare per ascoltare su una porta, oppure per mandare pacchetti ad un server su qualche altro host (e anche in questo caso su una determinata porta). Nel primo caso, il comando stampa a video i dati che riceve, nel secondo invia quelli che vengono inseriti dall'utente (oppure mandanti in input con il simbolo |

Il comando netcat si può lanciare anche con la sua versione abbreviata nc, che d'ora in poi preferiremo.

Vediamo un primo esempio concreto: se lanciamo il comando nc towel.blinkenlights.nl 23 possiamo usare il comando NetCat come una specie di telnet: si collega all'host che abbiamo sperimentato prima nell'esercizio sul telnet, e stampa a video tutto quello che quel server manda come risposta. Nel caso inserissimo dei caratteri, questi verrebbero inviato al server (che in questo specifico caso li ignorerebbe).

Il caso più interessante è quello in cui si usa NetCat per ascoltare su una porta specifica, e dunque per ricevere connessioni. A questo scopo, è necessario lanciare il comando

$ nc -l -p 8080 # Esempio per la porta 8080
È bene ricordare che solo le porte maggiori di 1024 possono essere aperte da utenti normali.
Ci si organizzi con un collega nello stesso gruppo per fare il seguente esperimento: Si provi a comunicare attraverso questo canale.

Ora che si è visto un primo esempio, è il momento di provare a fare un esercizio più avanzato. Ricapitoliamo il funzionamento del comando tar:

Si può usare il comando tar combinato con nc per spedire file fra calcolatori.
Anche questo esercizio deve essere fatto in coppia; un utente dovrà spedire dei file ad un altro, utilizzando tar e nc. In particolare:

Il comando ssh è un esempio di client che si collega al server SSH, e ci comunica utilizzando una porta prefissata. Vediamo ora come usare il comando nc per effettuare un esperimento inverso rispetto al precedente: fingere di essere il server SSH, e vedere cosa invia il comando ssh quando si connette.

Anche questo esercizio viene più facilmente se fatto in coppia. Questo esperimento mostra l'esempio simmetrico rispetto a quello predente, in cui ci siamo collegati ad SSH con telnet. Usando la risposta del server vista in precedenza potremmo provare ad avviare una connessione; anche in questo caso, fatto il primo passo non sapremmo però come procedere oltre, senza studiare il protocollo SSH. In ogni caso, con un po' di impegno, potreste essere in grado di farvi listare i protocolli crittografici disponibili sul server.

Simulare un server web

Quando si visita una pagina web (ad esempio www.google.com), il browser contatta il server corrispondente al nome di dominio sulla porta 80, e richiede la pagina desiderata utilizzando un protocollo di nome HTTP.

In questo esercizio si proverà a simulare un server web su una delle macchina lab, a cui si collegherà dal browser (dal proprio PC a casa). Per fare questo si utilizzerà netcat su una porta con un numero alto (non avremmo i permessi di aprire un server sulla porta 80) e poi si potrà visitare la pagina http://labN.cs.dm.unipi.it:NNNNN; al solito, labN indica la macchina scelta, e NNNNNN sarà la porta scelta.

In condizioni normali, non è possibile accettare connessioni sulle macchine del laboratorio dall'esterno, perché il firewall le blocca. Per questo laboratorio, e solo per le ore di laboratorio, sono state temporaneamente sbloccate le porta da 16000 a 16010. In particolare, non sarà possibile replicare questo esercizio fuori dalle ore di laboratorio.

Si utilizzi netcat per aprire un server sulla porta scelta, supponiamo ad esempio sia la 16000. A quel punto, ci si colleghi da casa all'indirizzo menzionato sopra con un browser. Si vedrà il browser segnalare che sta caricando la pagina, e vedremo la richiesta arrivare sul terminale. Si ignori la richiesta, e si digiti la seguente risposta in linguaggio HTTP:
HTTP/1.1 200 OK

Messaggio di prova
Finita di scrivere la risposta, si termini netcat premendo CTRL+C. Si vedrà il messaggio apparire nel browser. Occorre essere sufficientemente rapidi a digitare, per evitare che il browser si stufi di aspettare una risposta e segnali un timeout.

Nel caso si volese preparare il messaggio in precedenza, è possibile salvarlo in un file di testo e usare l'operatore < per usarlo come input per nc. In ogni caso, sarà necessario terminare la connessione con CTRL+C per comunicare al browser che non ci sono altri dati appena si vedono arrivare i dati.