La gestione delle reti e il monitoraggio del flusso di dati di traffico tra i sistemi può sembrare intimidatorio. Beh, a meno che tu non sappia come utilizzare Netcat.
Netcat è uno strumento a riga di comando che puoi utilizzare per vari scopi, come la scansione delle porte, il trasferimento di file e la creazione di un server web minimale per testare le attività di connessione. E in questo tutorial, imparerai a sfruttare al meglio Netcat mentre esploreremo alcuni dei casi d’uso più comuni per Netcat.
Pronto? Continua a leggere e porta le tue abilità di networking a un livello superiore!
Prerequisiti
Questo tutorial sarà una dimostrazione pratica. Se desideri seguirla, assicurati di avere quanto segue.
- Due macchine Linux: una (ubuntu1) agisce come host di ricezione e un’altra (ubuntu2) funge da host di invio – questo tutorial utilizza Ubuntu 20.04 per entrambe le macchine.
Scansione delle porte aperte
Le porte sono le porte che consentono al traffico di rete di entrare ed uscire da una macchina. Quando una porta è chiusa, nessun servizio è in ascolto su quella porta e nessun traffico può passare attraverso. Ma se la porta è aperta, la tua rete è soggetta ad attacchi.
Se vuoi controllare se una specifica porta è aperta su una macchina per eventuali vulnerabilità di sicurezza, Netcat è all’altezza del compito. Come pentester, devi sapere quali porte sono aperte per condurre il tuo attacco. Qualunque sia il motivo, la scansione delle porte aperte è una necessità comune.
La sintassi di base per la scansione delle porte utilizzando Netcat è la seguente dove:
host
– è l’indirizzo IP o il nome host della macchina che desideri esaminare.startport
– è il numero di porta di partenza.endport
– è il numero di porta di arrivo.
Il comando netcat ha un alias di nc, che è utile per abbreviare i comandi. Ma questo tutorial utilizza netcat per una documentazione corretta.
Accedi via SSH al tuo host mittente (ubuntu2) ed esegui il seguente comando per scansionare le porte aperte tra le porte 1-100
.
Durante questo tutorial, sostituisci 149.28.86.131 con l’indirizzo IP del tuo host mittente.
Nella maggior parte dei casi, l’intervallo di porte 1-100
è sufficiente. La maggior parte dei servizi utilizza numeri di porta predefiniti che generalmente rientrano in questo intervallo, come 22
per SSH, 80
per HTTP, ecc.
La lista seguente spiega ciascuna delle opzioni che controllano il comportamento della scansione della porta:
-z
(modalità I/O zero) – Netcat non leggerà né scriverà sulla connessione di rete. Questa opzione rende il processo di scansione più veloce.-n
– Indica a Netcat di disabilitare la ricerca DNS per evitare ritardi.-v
– Fa sì che Netcat mostri tutti i processi di scansione delle porte in dettaglio.
Qui sotto puoi vedere che la connessione alla porta 22 (SSH) è riuscita, ma tutte le altre porte sono fallite.

Dato che il comando netcat
elenca tutte le porte scansionate, ottieni molte informazioni e alcune non necessarie. In tal caso, esegui il comando qui sotto, utilizzando il comando grep
. Questo comando filtra solo le porte aperte con il messaggio "succeeded!"
alla fine, come mostrato qui sotto.
Qui sotto puoi vedere che la porta 22 è aperta per la connessione SSH come previsto.

Invio di file in modo sicuro tra host
Oltre alla scansione delle porte, Netcat permette di trasferire file in modo sicuro tra due macchine. Netcat utilizza il protocollo TCP per il trasferimento di file, che è più affidabile rispetto a UDP.
La sintassi di base per inviare un file usando Netcat è la seguente:
Per inviare file dal tuo host a un’altra macchina:
1. Esegui il comando qui sotto per iniziare a mettere in ascolto sulla porta 4444 sull’host ricevente (ubuntu1).
Questo comando non ha un output, ma le opzioni seguenti influenzano come il comando imposta la porta di ascolto:
-l
– indica anetcat
di mettersi in ascolto per una connessione in entrata sulla porta TCP specificata. La porta può essere qualsiasi numero tu voglia, ma assicurati che altri servizi non stiano utilizzando la porta preferita.
> - indica a netcat di reindirizzare tutti i dati in ingresso su un file nel percorso specificato (ata_file).
Solo l’utente root può associarsi alle porte inferiori a 1000, quindi devi selezionare una porta maggiore di 1000 come utente non root. Se provi a utilizzare un numero di porta inferiore a 1000 come utente non root, otterrai il seguente errore.

2. Sull’host mittente (ubuntu2), esegui il seguente comando echo, che non ha un output ma crea un file chiamato ata_file con “Ciao da ATA” come contenuto.
3. Ora, esegui il comando netcat qui sotto per inviare ata_file all’host ricevente (ubuntu1). Assicurati di utilizzare lo stesso numero di porta sull’host ricevente (4444) come sull’host mittente.
Questo comando non ha un output, ma l’opzione < dice a netcat di prendere l’input dal file specificato.
4. Infine, passa all’host ricevente (ubuntu1) ed esegui il comando cat qui sotto per controllare il contenuto del file ata_file.
Puoi vedere il messaggio “Ciao da ATA” qui sotto che indica che il trasferimento è avvenuto con successo.

Invio di directory a un altro host
Fino ad ora, hai inviato con successo un singolo file da un host a un altro. Ma cosa succede se vuoi inviare un’intera directory con tutte le sue sottodirectory e file invece? Netcat può inviare anche directory!
Supponiamo che tu abbia una directory di backup chiamata apache_backup sull’host mittente (ubuntu2). Dovrai compressare prima la directory, quindi inviare ed estrarre la directory sull’host ricevente (ubuntu1).
1. Sull’host ricevente (ubuntu1), esegui il seguente comando per creare una nuova directory chiamata apache_backup e spostati (cd) in quella directory.

2. Successivamente, esegui il comando sottostante per iniziare ad ascoltare sulla porta 4444 ed estrarre i file compressi che l’host mittente (ubuntu2) invia all’host ricevente (ubuntu1).
Questo comando non ha un output, ma i flag tar xf – prendono l’input da Netcat (standard input) ed estraggono tutti i file nella directory corrente.
3. Sull’host mittente (ubuntu2), esegui i seguenti comandi per creare una directory (apache_backup), alcuni file di testo e inviarli all’host ricevente (ubuntu1).
Questi comandi non hanno un output, ma verificherai se il trasferimento ha funzionato nel passo successivo.
4. Infine, passa all’host ricevente (ubuntu1), premi Ctrl+C per interrompere l’ascolto sulla porta 4444 e esegui il comando ls per elencare i file all’interno della directory apache_backup.
Come puoi vedere di seguito, i file della directory apache_backup sono stati trasferiti con successo nella directory apache_backup sull’host ricevente.

Trasferimento di un intero disco o partizione su un altro host
Invio dell’intero disco o partizione su un altro host può sembrare ambizioso, ma questa operazione è realizzabile, a parte l’invio di file e directory. Questo risultato è utile, specialmente se è necessario eseguire il backup dell’intero disco prima di adottare misure drastiche, come spostare o eliminare tonnellate di file.
1. Esegui il comando sull’host destinatario (ubuntu1) per iniziare l’ascolto sulla porta 4444. Questo comando non ha un output ma decompone tutti i dati in ingresso (bzip2 -d |dd) su /dev/sdb.
/dev/sdb è il tuo secondo hard disk sulla macchina. Ma in questo caso, /dev/sdb è un hard disk vuoto collegato a questa macchina per questo tutorial.
2. Sull’host mittente (ubuntu2), esegui il comando fdisk sottostante per trovare tutti i dischi e le partizioni sulla tua macchina.
Come puoi vedere qui sotto, /dev/vda1/ è la partizione radice per l’host mittente in questo tutorial. La tua uscita potrebbe essere diversa a seconda della configurazione della tua macchina.

3. Esegui il seguente comando sull’host mittente (ubuntu2), che non ha un output, ma invia la partizione /dev/vda1 all’host destinatario (ubuntu1) tramite la porta 4444.
La compressione e l’invio della partizione all’host destinatario richiedono del tempo, a seconda delle dimensioni della partizione.
4. Una volta completato il processo, passa all’host destinatario (ubuntu1) e vedrai l’output qui sotto.
L’errore di spazio esaurito sul dispositivo è atteso poiché /dev/vda1 è probabilmente più grande di /dev/sdb. Ma hai capito! Puoi usare Netcat per inviare l’intero disco rigido o la partizione a un’altra macchina.

5. Infine, esegui i comandi sull’host ricevente (ubuntu1) per montare la partizione /dev/vda1 e elencare tutti i file nella partizione.
Come puoi vedere di seguito, tutti i file e le directory da /dev/vda1 sono stati trasferiti con successo su /dev/sdb.

Creazione di un server web minimo
Configurare un server web completo come Apache o NGINX solo per diagnosticare un problema del server web può essere fastidioso. Invece, crea un server web minimo con Netcat per identificare rapidamente i problemi del server web.
Per creare un server web minimo:
1. Passa all’host ricevuto ed esegui i comandi seguenti per creare una directory principale (nc-webserver-docroot) per il server web e uno script shell (httpresponse.sh) che genera la risposta HTTP.

2. Successivamente, crea un file index.html nella directory /root/nc-webserver-docroot/ con il tuo editor preferito e popola il file con il codice seguente. Questo file HTML contiene i contenuti che il server web Netcat servirà.
3. Crea un file script shell chiamato httpresponse.sh nella /root/nc-webserver-docroot/ directory e popola il codice seguente.
Questo script shell restituisce il contenuto del file /root/nc-webserver-docroot/index.html come risposta HTTP a qualsiasi client che invia una richiesta al tuo server web Netcat.
4. Ora, esegui il comando chmod di seguito, che non produce output ma rende il file httpresponse.sh eseguibile (+x).
5. Esegui il comando ncat qui sotto per avviare il server web Netcat sulla porta 7777.
Assicurati di sostituire la porta 7777 con il numero di porta da te scelto, che non è utilizzato da nessun altro servizio sul tuo sistema.
Le seguenti opzioni influiscono sul comportamento dell’indicazione del server web Netcat:
-l
– indica a Ncat di ascoltare una connessione in ingresso.
-v
– abilita la modalità dettagliata per mostrare tutte le richieste HTTP in ingresso nel tuo terminale.
-c - specifica il percorso dello script httpresponse.sh che genera le risposte HTTP.
- -keep-open – mantiene aperto il listener Ncat anche dopo la chiusura della prima connessione. Questa opzione è utile se testi il tuo server web con client multipli.
Vedrai il seguente output una volta che il server web Netcat sarà in esecuzione e in ascolto sulla porta 7777 su tutte le interfacce di rete disponibili.

6. Ora, apri un’altra finestra di terminale e esegui il seguente comando per testare il tuo server web Netcat (http://localhost:7777).
L’output qui sotto mostra che il server web Netcat sta funzionando come previsto e può restituire i contenuti del file /root/nc-webserver-docroot/index.html come risposta HTTP.

7. Infine, torna alla finestra di terminale dove il server web Netcat è in esecuzione. Vedrai che il server web Netcat ha ricevuto e elaborato la richiesta HTTP dal client curl.
Congratulazioni! Hai creato con successo un server web Netcat minimo per testare la tua connettività di rete!

Conclusione
In questo tutorial, hai imparato ad utilizzare Netcat per migliorare le tue abilità di rete e di debug. Hai eseguito la scansione delle porte aperte, trasferito file e creato un server web minimo. E a questo punto, sei in grado di risolvere molti problemi di rete del mondo reale con questa potente utility di rete!
Con questa nuova conoscenza, perché non migliorare ulteriormente le tue abilità di rete e diventare un utente avanzato in Cybersecurity?