Visualizzazione post con etichetta Netcat. Mostra tutti i post
Visualizzazione post con etichetta Netcat. Mostra tutti i post

venerdì 1 novembre 2019

Introduzione a Netcat

Netcat è un programma open source a riga di comando in grado di inviare/ricevere dati su connessioni di rete utilizzando i protocolli TCP e UDP. Tale tool è molto versatile e consente di essere utilizzato in svariati contesti come port scanner, backdoor, port redirector/listener, trasferimento file, gestione remota di un sistema, debugging e controllo delle connessioni, ecc. Non è sempre la scelta migliore per tutte le occasioni ma per gli amministratori di rete o sicurezza è importante conoscere le potenzialità di tale strumento, utile soprattutto in caso di investigazione.

Il tool è incluso nella distribuzione Kali Linux molto utilizzata nell'ambito del penetration testing mentre in ambiente Windows va scaricato/installato a parte. Per visualizzare tutte le opzioni messe a disposizione da Netcat basta digitare il seguente comando da una finestra terminale
nc -help


NetCat, Sintassi e opzioni
FIG 1 - Netcat, Sintassi e opzioni

La sintassi del comando per la Connection mode è
nc [-options] hostname port[s] [ports]
mentre per la Listen mode la sintassi sarà simile a
nc -l -p port [-options] [hostname] [port]

Opzioni:
-c shell         simile all'opzione -e permette di specificare una shell da eseguire (ad es. /bin/sh)
-e nomeFile permette di specificare il programma da eseguire dopo la connessione (ad es. cmd.exe)
-b permette il broadcast
-g gateway source-routing hop point[s], fino a 8
-G num source-routing pointer: 4, 8, 12, ...
-h visualizza help
-i secs permette di specificare il delay prima della scansione delle porte
-k                imposta l'opzione keepalive sul socket
-l imposta modalità ascolto (listen mode)
-n forza Netcat a considerare solo l'indirizzo IP e a non interrogare server DNS
-o file dump esadecimale del traffico
-p port specifica la porta locale
-r imposta in modo casuale le porte locali e remote
-q secs esce dopo end of file (EOF) su stdin e attende i secondi specificati
-s addr indirizzo risorsa locale
-T tos imposta il tipo di servizio (Type Of Service)
-t Risponde alle negoziazioni TELNET
-u UDP mode
-v verbose [-vv imposta un livello verboso più elevato]
-w secs specifica il timeout per connessioni e ricezione
-C invia CRLF come line-ending
-z zero-I/O mode [modalità utilizzata per lo scanning]



Come intuibile da quanto visualizzato dal help, Netcat può essere avviato in 2 modalità: Connection mode e Listen mode.

Connection mode
Netcat agisce in modalità client connettendosi ad un host remoto e collegando il suo stdin e stdout al flusso di dati inviato/ricevuto. In pratica Netcat si connette ad un server remoto permettendo l'invio/ricezione dei dati al/dal server e visualizzando sia i dati inviati che quelli ricevuti all'interno della stessa shell.
Il comando per avviare Netcat in tale modalità sarà simile a
nc [opzioni] hostname porte
Netcat permette anche di specificare più porte a cui connettersi. La connessione avverrà su una porta alla volta in maniera sequenziale (o in maniera random se specificata l'opzione -r).


Listen mode
Nella modalità Listen, Netcat rimane in ascolto sulla porta specificata dall'opzione -p in attesa della connessione da un client remoto. Dopo la connessione il comportamento di Netcat è analogo a quanto indicato per la Connection mode. Il comando per impostare Netcat in tale modalità avrà il seguente aspetto
nc -l -p porta [host_remoto] [Porte_host_remoto]
-l imposta la modalità in ascolto
-p specifica la porta su cui Netcat rimane in ascolto.
[host_remoto] permette di specificare l'IP o il nome dell'host che può connettersi
[Porte_host_remoto] permette di specificare da quali porte dell'host remoto deve provenire la connessione affinché venga accettata.
Netcat Listen mode
FIG 2 - Netcat Listen mode



Di seguito vengono riportati alcuni esempi di contesti dove può essere utile utilizzare Netcat.


Banner Grabbing
Il Banner Grabbing è una tecnica utilizzata per ottenere informazioni su un sistema informatico, sui servizi in esecuzione e sulle porte aperte.
Per verificare se una porta di un sistema remoto è aperta basta passare a Netcat l'indirizzo IP e la porta che si intende verificare. Ad es.
nc 192.168.1.25 21
il comando utilizzato nell'esempio effettua una verifica sulla porta 21, generalmente utilizzata dal protocollo FTP, della postazione con indirizzo IP 192.168.1.25 e, in alcuni casi, può fornire anche ulteriori informazioni come l'applicazione e relativa versione in ascolto sulla porta.
Per forzare la visualizzazione di maggiori informazioni possiamo utilizzare lo switch -v 
nc -v -n 192.168.1.25 21
-v visualizza un output verboso.
-n forza Netcat a considerare solo l'indirizzo IP indicato e a non interrogare server DNS per la risoluzione di nomi.


Port Scanning
Il Port Scanning consiste nel sondare una macchina remota al fine di individuare quali porte siano in ascolto. Un semplice Port Scanning può essere effettuato tramite il comando
nc -v -w 2 -z target 1-200
-v ci consente di avere un output verboso
-w specifica un timeout, in secondi, per l'attesa della connessione/risposta.
-z imposta I/O mode, modalità utilizzata per il Port Scanning.
target permette di specificare il nome del host remoto seguito dalla porta, o il range di porte, da scansionare. Nell'esempio verranno verificare tutte le porte comprese nell'intervallo specificato (da 1 a 200).

In alcuni casi può essere utile limitare la velocità di scansione delle porte al fine di non essere individuati/bloccati. Ciò è possibile tramite lo switch -i che permette di specificare un ritardo, espresso in secondi, tra una scansione di una porta e l'altra.
Anche se Netcat può essere utilizzato per il Port Scanning, non si tratta della scelta migliore. Un tool più adatto in questo campo è Nmap.


Chat tra 2 PC
Tramite Netcat è possibile stabilire una chat tra 2 host. Supponiamo di avere 2 PC:
PC1 con IP 192.168.1.20
PC2 con IP 192.168.1.21

La prima cosa da fare è mettere in ascolto uno dei 2 PC. Sul PC1 eseguiamo il comando.
nc -lvp 6655
-l imposta la modalità in ascolto.
-v imposta un'output verboso.
-p imposta la porta su cui Netcat rimane in ascolto. Nell'esempio è stata selezionata la porta 6655.

Dal PC2 stabiliamo la connessione con il PC1 tramite il comando
nc 192.168.1.20 6655
A Netcat viene passato l'indirizzo IP del PC remoto e la porta sulla quale questo è in ascolto.

Una volta che la connessione è stabilita, tutto quello che viene digitato nella finestra (sull'uno o sull'altro PC) viene visualizzata anche nella finestra del PC remoto.


Trasferimento file tra 2 PC
Supponiamo di voler trasferire un file di testo dal PC2 al PC1. Il primo passo consiste nel mettere il PC1 in ascolto su una data porta con il comando
nc –l –p 6655 > file_ricevuto.txt
il carattere > trasferisce tutto ciò che viene ricevuto sulla porta all'interno del file file_ricevuto.txt.

Sul PC2 prepariamo un file di testo con il contenuto da trasferire e rinominiamolo file_inviato.txt quindi eseguire il comando
nc 192.168.1.20 6655 <file_inviato.txt
per inviare il file al PC1
Il contenuto del file file_inviato.txt verrà inviato dal PC2 al PC1 e memorizzato da quest'ultimo all'interno del file file_ricevuto.txt.

Un alternativa consiste nell'utilizzare il comando cat e predisporre un file sul server che il client può scaricare.
Sul PC1, che fungerà da server, eseguire il comando
cat backup.iso | nc -l 6655

mentre sul PC2, per scaricare il file, possiamo eseguire il comando
nc 192.168.1.20 6655 > backup.iso

Per visualizzare graficamente il trasferimento del file è possibile aggiungere il comando pv come mostrato di seguito:
cat backup.iso | pv -b | nc -l 6655
nc 192.168.1.20 6655 | pv -b > backup.iso


Tramite il comando dd di Linux possiamo creare un'immagine di una partizione del disco e inviarla ad una macchina remota. Sul server/PC1 eseguiamo il comando
dd if=/dev/sdb | gzip -9 | nc -l 6655
Dal PC2 connettersi al server per il download dell'immagine con il comando
nc 192.168.1.20 6655 | pv -b > partitionImage.img.gz



Controllo remoto
Netcat può essere utilizzato anche per eseguire comandi su una postazione remota. Sul PC che si intende controllare digitare il comando
nc -L -p 6655 -d -e cmd.exe
in caso di PC con sistema operativo Windows oppure
nc -L -p 6655 -d -e  /bin/sh
in caso di postazione con sistema Linux.

-L imposta Netcat in modalità ascolto sulla porta specificata. La lettera maiuscola indica una modalità più avanzata rispetto allo switch -l e nel caso in cui il socket venga chiuso Netcat ripristina l'ascolto. 
-p specifica la porta su cui Netcat resta in ascolto.
-d indica la modalità stealth (la finestra non viene visualizzata).
-e permette di specificare che programma eseguire una volta che la connessione è avvenuta. Per la postazione con sistema operativo Windows verrà avviato il prompt dei comandi mentre in Linux verrà avviato una finestra terminale.

Per connettersi alla postazione in ascolto basta passare a Netcat l'indirizzo IP della workstation remota e relativa porta a cui connettersi
nc 192.168.1.20 6655



Tunnel SSH
Nella connessione tramite Netcat i dati vengono inviati in chiaro all'interno della rete. Per proteggere la comunicazione è opportuno cifrare i dati tramite l'utilizzo di un tunnel SSH in modo da criptare i dati trasmessi.

Usando un tunnel SSH si hanno due vantaggi:
- I dati sono trasferiti dentro un tunnel criptato, in questo modo saranno ben protetti;
- Non si avrà il bisogno di mantenere nessuna porta aperta nel firewall della macchina che agisce da server, dato che tutte le connessioni passeranno nel tunnel SSH.

Nell'esempio mostrato di seguito andremo a trasferire un file attraverso un tunnel SSH. E' scontato dire che sulla macchina che agisce da server deve essere presente un processo server SSH. Sulla macchina server eseguire il comando:
cat backup.iso | nc -l 3333


Sulla macchina client, il comando per connettersi al server attraverso un tunnel SSH e procedere al download del file sarà del tipo 
ssh -f -L <porta_locale>:<IP_locale>:<porta_remota> utente@<IP_remoto> sleep 10; nc <IP_locale> <porta_locale>
ad es.
ssh -f -L 23333:127.0.0.1:3333 utente@192.168.1.20 sleep 10; nc 127.0.0.1 23333 | pv -b > backup.iso

-f una volta stabilita la connessione la mette in background.
-L crea un tunnel connettendo una porta locale con un porta del host remoto.

Il tunnel SSH verrà chiuso automaticamente dopo la fine del trasferimento del file.