Introduzione

Netcat (o nc) è un'utilità della riga di comando che legge e scrive i dati attraverso le connessioni di rete, utilizzando i protocolli TCP o UDP. È uno degli strumenti più potenti della rete e dell'arsenale degli amministratori di sistema ed è considerato un coltellino svizzero di strumenti di rete.

Netcat è multipiattaforma ed è disponibile per Linux, macOS, Windows e BSD. È possibile utilizzare Netcat per eseguire il debug e monitorare le connessioni di rete, cercare porte aperte, trasferire dati, come proxy e altro. Il pacchetto Netcat è preinstallato su macOS e distribuzioni Linux popolari come Ubuntu.

Sintassi Netcat

La sintassi più semplice dell'utilità Netcat ha la forma seguente:

nc [options] host port

Su Ubuntu, puoi usare netcat o nc. Sono entrambi collegamenti simbolici alla versione openBSD di Netcat.

Per impostazione predefinita, Netcat tenterà di avviare una connessione TCP all'host e alla porta specificati. Se desideri stabilire una connessione UDP, usa l'opzione -u:

nc -u host port

Scansionare le porte

Scansione delle porte è uno degli usi più comuni per Netcat. È possibile eseguire la scansione di una singola porta o di un intervallo di porte.

Ad esempio, per cercare porte aperte nell'intervallo 20-80 di un dato indirizzo IP, utilizzare il comando seguente:

nc -z -v 10.10.8.8 20-80

L'opzione -z indicherà al comando nc di cercare solo le porte aperte, senza inviare loro alcun dato e l'opzione -v di fornire informazioni più dettagliate.

L'output sarà simile al seguente:

nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
nc: connect to 10.10.8.8 port 23 (tcp) failed: Connection refused
...
nc: connect to 10.10.8.8 port 79 (tcp) failed: Connection refused
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

Se vuoi stampare solo le linee con le porte aperte puoi filtrare i risultati con il comando grep:

nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded

L'output sarà simile al seguente:

Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!

È inoltre possibile utilizzare Netcat per trovare il software del server e la sua versione. Ad esempio, se si invia un comando "EXIT" al server sulla porta SSH predefinita 22:

echo "EXIT" | nc 10.10.8.8 22

L'output sarà simile al seguente:

SSH-2.0-OpenSSH_7.6p1 Ubuntu-4
Protocol mismatch.

Per cercare le porte UDP è sufficiente aggiungere l'opzione -u al comando come mostrato di seguito:

nc -z -v -u 10.10.8.8 20-80

Nella maggior parte dei casi, Nmap è uno strumento migliore di Netcat per la scansione di porte complesse.

Inviare file tramite Netcat

Netcat può essere utilizzato per trasferire dati da un host a un altro creando un modello client/server di base.

Funziona impostando Netcat per l'ascolto su una porta specifica usando l'opzione -l sull'host ricevente e quindi stabilendo una normale connessione TCP dall'altro host e inviando il file su di esso.

Sull'host ricevente eseguire il comando seguente che aprirà la porta 5555 per la connessione in entrata e reindirizzerà l'output al file esempio.txt:

nc -l 5555 > esempio.txt

Sull'host di invio connettersi all'host di ricezione e inviare il file:

nc host_ricevente.com 5555 < esempio.txt

Per trasferire una directory è possibile utilizzare tar per archiviare la directory sull'host di origine ed estrarre l'archivio sull'host di destinazione.

Sull'host ricevente impostare lo strumento Netcat per l'ascolto di una connessione in entrata sulla porta 5555. I dati in arrivo vengono inviati al comando tar che estrarrà l'archivio:

nc -l 5555 | tar xzvf -

Sull'host di invio comprimere la directory e inviare i dati connettendosi al processo nc di ascolto sull'host ricevente:

tar czvf - /path/to/dir | nc receiving.host.com 5555

Puoi vedere l'avanzamento del trasferimento su entrambi gli hosts. Una volta completato, digitare CTRL+C per chiudere la connessione.

Creazione di un server di chat semplice

La procedura per la creazione di una chat online tra due o più host è la stessa del trasferimento di file.

Sul primo host avviare un processo Netcat per l'ascolto sulla porta 5555:

nc -l 5555

Dal secondo host, eseguire il comando seguente per connettersi alla porta di ascolto:

nc first.host.com 5555

Ora se si digita un messaggio e si preme ENTER, verrà mostrato su entrambi gli host.

Per chiudere la connessione, digitare CTRL+C.

Eseguire una richiesta HTTP

Sebbene esistano strumenti molto migliori per le richieste HTTP come l'curl, è anche possibile utilizzare Netcat per inviare varie richieste ai server remoti.

Ad esempio, per recuperare la pagina man Netcat dal sito Web OpenBSD, digitare:

printf "GET /nc.1 HTTP/1.1\r\nHost: man.openbsd.org\r\n\r\n" | nc man.openbsd.org 80

La risposta completa, comprese le intestazioni HTTP e il codice HTML, verrà stampata nel terminale.

Conclusione

In questa esercitazione, è stato appreso come utilizzare l'utilità Netcat per stabilire e testare connessioni TCP e UDP.

Per maggiori informazioni visita la pagina man di Netcat e leggi tutte le altre potenti opzioni del comando Netcat.