In questo articolo andremo a parlare di Netcat: un programma che, come vedremo, non a caso viene chiamato Il coltellino svizzero delle reti TCP/IP.

Netcat nasce come una utility per permettere di inviare e ricevere dati utilizzando sia TCP che UDP a livello di trasporto.

Fra i vari servizi che permette di offrire (alcuni dei quali andremo a vedere), c’è la possibilità di utilizzarlo come chat, come proxy, webbrowser, mail reader, network debugging, port scanner, inviare file e molto altro.

Netcat (o nc) viene come software preinstallato nei sistemi unix-based mentre potrebbe essere richiesto il download per i sistemi Windows.

Sostanzialmente, quello che fà è prendere in input un dato ed inviarlo utilizzando o TCP o UDP. Netcat stesso non aggiunge nessuna intestazione: per questo motivo potremmo utilizzarlo per connetterci (in alcuni casi con molta fatica) a qualsiasi applicazione.

Modello Client/Server

D’altro canto, non solo possiamo connetterci a server (ed agire quindi da client), ma possiamo anche utilizzare netcat per creare un processo server.

Brevemente: un processo server è un processo che è in attesa perenne che un client gli si connetta. Il server offre un servizio che il client, dopo esservi connesso, può richiedere.

client-server-illustration

Un esempio del paradigma client/server è quello del web: c’è un server (es: informaticalab.com) che è in attesa che i client (gli utenti) vi si connettano e richiedano dei file (tipo le pagine, le immagini, i css).

Creare una chat con netcat

social media background with icons and laptop” width=”300″ height=”243″ />

Farlo è davvero semplice. Utilizziamo l’opzione -l per dire a netcat di ascoltare, e aggiungiamo una porta.
Il comando risultante:

netcat -l 50000

A questo punto, noteremo che il cursore và a capo e non succede nulla. Vuol dire che il comando è andato a buon fine, e aspetta che si connetta qualcuno all’ “altro lato”.

Per connetterci, apriamo una seconda finestra di terminale dove avvieremo il client: un’altra istanza di netcat che dovrà connettersi al processo server creato poco fà:

netcat localhost 500000

Con localhost intendiamo il computer da cui siamo connessi (anche 0.0.0.0 o 127.0.0.1 indicano sempre il computer locale). Una volta lanciato il comando, possiamo iniziare a scrivere. Lo stesso testo scritto da una finestra della shell, apparirà all’altra.

A causa del nat questo tipo di chat funziona solo su due host connessi alla stessa sottorete (oppure su due host che non sono “coperti” dal nat – in quel caso localhost và sostituito con l’ indirizzo ip del server), ma è comunque figo.

Un modo per abbellirlo ulteriormente, è quello di installare pv:

sudo apt-get install pv

e affianco ai comandi, aggiungere:

| pv -qL 10

Il primo simbolo, chiamato Pipe, reindirizza l’output del netcat al programma pv che sostanzialmente stampa a video il testo inserito con un leggero ritardo dando l’effetto che sia scritto in tempo reale.

Inviare un file

E’ possibile fare in modo che chiunque si connetta al nostro processo server, riceva in input un file. Possiamo realizzare ciò perchè come già abbiamo detto, netcat prende tutto quello che viene ricevuto in input e lo manda paro paro al processo con cui è connesso.

Per inviare un file, utilizziamo il comando di reindirizzamento dell’ input della shell:

netcat -l 50000 < miofile.mp3

Dall'altro lato, dovremo utilizzare invece il comando di reindirizzamento dell' output: questo perchè altrimenti netcat non farà altro che stampare a video quello che riceve (quindi un file binario, che per la "vista umana" non ha molto senso).

netcat localhost 50000 > miofile.mp3

Netcat e' un coltellino svizzero...

[/fancy_box]...infatti può connettersi a tutto! Vediamo come è possibile connettersi ad un server netcat utilizzando Telnet.

Prima di tutto come abbiamo visto finora, creiamo il processo server con netcat:

netcat -l 50000

Poi possiamo connettervici utilizzando anche telnet:

telnet localhost 50000

Utilizzarlo come browser

Come detto all' inizio, netcat può essere utilizzato per connettersi praticamente a qualsiasi protocollo di livello applicazione. A patto che si sappia che tipo di formato e di dato si aspetta di ricevere.

Ad esempio, possiamo utilizzarlo come browser per navigare nel world wide web.

L'unica premessa, è conoscere (ed ovviamente fornire) intestazione che si aspetta il webserver da noi. L'intestazione di HTTP (Hyper Text Transfer Protocol):

Se vuoi approfondire, trovi un' ottima spiegazione su HTTP qui.

 Apriamo la nostra fida shell, e da terminale seguiamo la sintassi seguita finora per utilizzare netcat come client:

netcat google.it 80

80, come prima, è la porta del web server. Le pagine di internet solitamente e per convenzione girano sulla porta 80 (google.it non è da meno). Una volta collegato, come al solito ci troviamo il prompt che aspetta che vengano inseriti dei dati.

Inseriamo la richiesta HTTP minima che consiste nella "Request line" dello schema quì in alto.Eseguiamo un GET sul file principale (/) utilizzando HTTP versione 1.1:

GET / HTTP/1.1

Battiamo invio due volte, ed et voilà! Ci viene scaricata e visualizzato:

  • Gli header del pacchetto HTTP di risposta,
  • E il contenuto formattato in HTML della pagina di Google.it.

Html utilizza dei tag per includere in una pagina dei contenuti esterni: immagini, video, audio, fogli di stile ecc. Quando il nostro browser vuole caricare una pagina, segue i collegamenti indicati nei tag e scarica la pagina e la formatta seguendo le regole di markup.

Non essendo netcat un browser, quello che vedremo è HTML puro (che non viene quindi formattato). Conoscendo l' HTML e gli header HTTP, è comunque possibile con molta fatica navigare in internet.

Usare netcat come WebServer

Visto che netcat può essere anche eseguito come processo server, possiamo adattarlo per creare un web server minimo (molto minimo xD). Per fare ciò, dobbiamo innanzitutto creare una pagina html (index.html):

La struttura della pagina è abbastanza evidente, per approfondire sul markup HTML vi rimando a questa guida.

Creiamo il server con netcat sulla porta 80 (essendo riservato avremo bisogno del permesso del superutente) e diamo in pasto a chiunque si connetta il file appena creato:

sudo netcat -l 80 < index.html

Quando il browser si connette ad un server, invia un pacchetto HTTP contenente la risorsa a cui vuole accedere (come abbiamo fatto noi prima scrivendo il GET). Il nostro browser non è da meno: la sua richiesta verrà stampata nella consolle di netcat.

Proviamo subito il nostro server, collegandoci da qualsiasi browser a:

http://localhost

E... ta-dah! Apparirà la pagina HTML appena creata!

C'è da dire due parole prima: netcat abbiamo detto che non aggiunge gli headers. Il nostro browser è abbastanza intelligente però, da capire che è stato scaricato un file html e deve essere mostrato.

Quella di utilizzare netcat come "server principale" però, è una cattiva pratica: questo perchè appunto non vengono gestiti gli opportuni headers HTTP.