Netcat è uno strumento molto potente che permette di eseguire delle operazioni di I/O con protocolli TCP e UDP.
Riferendomi alla versione per Windows, per ottenere un server in ascolto su una specifica porta basta scrivere
nc -L -p 2000
In questo caso utilizzo Netcat come server, il -l indica “listen” e -p indica la porta da aprire; nel caso specifico ho utilizzato l'opzione -L (specifica della versione per Windows) in quanto Netcat esce al chiusura della connessione. Provate ad esempio
nc -l -p 2000
vedrete che l'esecuzione termina alla prima stringa ricevuta, questo perchè per ogni riga di log eseguiamo ogni volta la connessione al server.
Su Linux questo può essere risolto con un semplice script:
#!/bin/bash
while true;
do nc -l 2000
done
Nel provarlo su Linux ho notato che, con la versione che utilizzavo, il -p non è necessario: nel proseguo specificherò sempre il -p che sarà eventualmente da togliere se non accettato dalla vostra versione.
Connessione client-server
Abbiamo visto come predisporre un semplice server, ma netcat può essere utilizzato anche come client, così come telnet. Lanciate il server
nc -l -p 2000
Quindi eseguite (da un'altra shell o prompt dei comandi):
nc localhost 2000
Otterrete una connessione fra client e server: tutto quello che scriverete sull'uno verrà spedito all'altro.
Se fosse tutto qui ci sarebbe poco di utile, vediamo allora qualche utile funzionalità (sia mai che queste possano trarvi d'impaccio in qualche situazione delicata).
Trasferimento files
Netcat mette in comunicazione lo stdin e stdout di due macchine in rete: il nome stesso fa capire che il funzionamento di base riprende quello del tool cat di Unix (anche se poteva starci bene come “gatto delle reti”).
Lanciate il server
nc -l -p 2000 > ricevuto.txt
(notare che qui ho utilizzato -l, e non -L, in modo che alla fine del trasferimento il programma termini) quindi predisponete un file spedito.txt da inviare ed eseguite:
nc -w1 localhost 2000 < spedito.txt
In ricevuto.txt vi ritroverete il contenuto del file spedito.txt, facile vero? In realtà ho dovuto aggiungere il parametro -w1 che indica che dopo 1 secondo di inattività il socket venga chiuso: omettendo tale parametro, per terminare la connessione non vi è altro modo che dare Control-C.
Consolle remota
Avete necessità di accedere al prompt dei comandi di una macchina remota? Lanciate netcat utilizzando l'opzione -e che permette di specificare un programma da lanciare al ricevimento della connessione:
nc -l -p 2000 -e cmd.exe
(su Linux basta sostituire /bin/bash a cmd.exe)
dalla vostra postazione lanciate
nc nomemacchina 2000
e avrete accesso alla macchina remota; per uscirne è sufficiente digitare exit.
Ho provato questa stessa cosa sotto Linux: per il funzionamento dell'opzione -e è necessario ricompilare attivando l'opzione GAPING_SECURITY_HOLE. Molto probabilmente se utilizzate un netcat precompilato, già presente nelle principali distribuzioni Linux, questa opzione di compilazione non è attiva quindi dovrete procurarvi i sorgenti e ricompilare.
Conclusioni
Quelle elencate qui sopra sono solo alcune delle funzionalità di questo utilissimo programma: quello che vi suggerisco è di scaricare questo tool e lanciare nc -h ed iniziare ad esplorare le opzioni.