Come Utilizzare Netcat e Migliorare le Tue Competenze di Rete!

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.
netcat options host startport-endport

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.
netcat -z -n -v 149.28.86.131 1-100

Qui sotto puoi vedere che la connessione alla porta 22 (SSH) è riuscita, ma tutte le altre porte sono fallite.

How to Use Netcat : Scanning for Open Ports

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.

netcat -z -n -v 149.28.86.131 1-100 2>&1 | grep succeeded

Qui sotto puoi vedere che la porta 22 è aperta per la connessione SSH come previsto.

Filtering the Successful Port Connection

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:

netcat options host port filename

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 a netcat 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).
netcat -l 4444 > 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.

Getting “Permission denied” Error When Using Port Lower Than 1000

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.

echo "Hello from ATA" > ata_file

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.

netcat 149.28.86.131 4444 < ata_file

4. Infine, passa all’host ricevente (ubuntu1) ed esegui il comando cat qui sotto per controllare il contenuto del file ata_file.

cat ata_file

Puoi vedere il messaggio “Ciao da ATA” qui sotto che indica che il trasferimento è avvenuto con successo.

Verifying the Transfer Worked

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.

mkdir apache_backup && cd apache_backup
Creating the apache_backup 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.

netcat -l 4444 | tar xf -

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.

# Crea una directory apache_backup e alcuni file di testo al suo interno
mkdir apache_backup && cd apache_backup && touch ata{1..5}.txt
# Comprime la directory di lavoro e la invia all'host ricevente
tar cf - . | netcat 149.28.86.131 4444

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.

ls

Come puoi vedere di seguito, i file della directory apache_backup sono stati trasferiti con successo nella directory apache_backup sull’host ricevente.

Verifying Transferred Files on the Receiving Host

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.

netcat -l 4444 | bzip2 -d | dd of=/dev/sdb

2. Sull’host mittente (ubuntu2), esegui il comando fdisk sottostante per trovare tutti i dischi e le partizioni sulla tua macchina.

 fdisk -l

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.

Finding All Disks and Partitions

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.

bzip2 -c /dev/vda1 | netcat 149.28.86.131 4444

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.

Viewing the Sending Disk/Partition Process

5. Infine, esegui i comandi sull’host ricevente (ubuntu1) per montare la partizione /dev/vda1 e elencare tutti i file nella partizione.

# Monta la partizione /dev/vda1
mount /dev/vda1 /media 
# Elenca tutti i file nella partizione
ls media

Come puoi vedere di seguito, tutti i file e le directory da /dev/vda1 sono stati trasferiti con successo su /dev/sdb.

Verifying Data Integrity of the File Transfer

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.

mkdir -pv /root/nc-webserver-docroot/
Creating a Webserver Root Directory

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à.

<!doctype html>

<html lang="en">

<head>
	<title>NETCAT Testing network connectivity </title>
</head>

<body>
	<h1>NETCAT Test</h1>
	<p>Connection Successful! Your networking skills are awesome!</p>
</body>

</html>

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.

#!/bin/bash
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat /root/nc-webserver-docroot/index.html)"

4. Ora, esegui il comando chmod di seguito, che non produce output ma rende il file httpresponse.sh eseguibile (+x).

chmod +x /root/nc-webserver-docroot/httpresponse.sh

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.
ncat -lv 7777 -c /root/nc-webserver-docroot/httpresponse.sh --keep-open

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.

Starting the Ncat Server

6. Ora, apri un’altra finestra di terminale e esegui il seguente comando per testare il tuo server web Netcat (http://localhost:7777).

curl -vvv 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.

Testing your Ncat server

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!

Verifying the HTTP Request from the curl Client

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?

Source:
https://adamtheautomator.com/how-to-use-netcat/