3.28. Come posso sapere quali porte sono aperte nel mio sistema?

Sapere quali porte di rete siano aperte sul nostro sistema è fondamentale per la sicurezza del sistema stesso. Vi sono diversi modi per identrificare le porte aperte e le eventuali connessioni ad esse ed il primo e più conosciuto di questi è:

# netstat -an -f inet
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  12.123.45.67.50033    195.22.198.15.80       ESTABLISHED
tcp4       0      0  12.123.45.67.50018    195.22.198.15.80       ESTABLISHED
tcp4       0      0  192.168.0.1.65232      217.220.29.16.6667     ESTABLISHED
tcp4       0      0  192.168.0.1.65231      213.92.8.4.6667        ESTABLISHED
tcp4       0      0  192.168.0.1.139        *.*                    LISTEN
tcp4       0      0  127.0.0.1.3493         127.0.0.1.49154        ESTABLISHED
tcp4       0      0  127.0.0.1.49154        127.0.0.1.3493         ESTABLISHED
tcp4       0      0  127.0.0.1.3493         127.0.0.1.49153        ESTABLISHED
tcp4       0      0  127.0.0.1.49153        127.0.0.1.3493         ESTABLISHED
tcp4       0      0  *.3493                 *.*                    LISTEN
tcp46      0      0  *.80                   *.*                    LISTEN
tcp4       0      0  *.25                   *.*                    LISTEN
tcp4       0      0  *.22                   *.*                    LISTEN
tcp6       0      0  *.22                   *.*                    LISTEN
tcp4       0      0  *.515                  *.*                    LISTEN
tcp6       0      0  *.515                  *.*                    LISTEN
tcp4       0      0  127.0.0.1.53           *.*                    LISTEN
tcp4       0      0  192.168.0.1.53         *.*                    LISTEN
udp4       0      0  192.168.0.1.138        *.*                    
udp4       0      0  192.168.0.1.137        *.*                    
udp4       0      0  *.138                  *.*                    
udp4       0      0  *.137                  *.*                    
udp4       0      0  *.3493                 *.*                    
udp4       0      0  127.0.0.1.123          *.*                    
udp4       0      0  192.168.0.1.123        *.*                    
udp4       0      0  *.123                  *.*                    
udp4       0      0  *.49152                *.*                    
udp4       0      0  127.0.0.1.53           *.*                    
udp4       0      0  192.168.0.1.53         *.*                    
udp4       0      0  *.514                  *.*
    
L'output di netstat può sembrare un po' oscuro a prima vista: dopo l'identificazione del protocollo si trovano il numero dei pacchetti nelle code di ricezione e di invio, quindi l'indirizzo locale, composto da 4 campi per l'indirizzo IP e un quinto per la porta utlizzata. Un eventuale * (asterisco) in sostituzione dell'indirizzo IP evidenzia che la porta è attiva in ogni indirizzo locale. La quinta colonna indica l'host remoto e la porta dell'host remoto qualora ci sia una connessione, oppure *.* in caso la porta sia in ascolto e in attesa di una connessione. L'ultima colonna mostra lo stato della connessione: ESTABLISHED se è attiva e pronta a trasmettere e/o ricevere, LISTEN se il sistema è in attesa di una connessione su quella porta. Ci sono altri stati possibili e la consultazione della man page di netstat(1) può chiarire tutti i dubbi. L'output di netstat è utile per sapere le connessioni attive, tuttavia se vogliamo chiuderne una e impedire che vengano effettuate altre connessione da/a quella porta occorre sapere almeno quali applicazioni e/o servizi utilizzano quella porta e il modo più veloce per venirne a conoscenza è l'analisi del file /etc/services:
# cat /etc/services | grep 3493
nut             3493/tcp   #Network UPS Tools
nut             3493/udp   #Network UPS Tools
    
Un altro tool molto utile per conoscere le porte che stiamo utilizzando in questo momento è sockstat, che ci fornisce anche utente, comando e processo di ogni connessione e di ogni porta in ascolto:
# sockstat -46
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
bind     named      59998 3  udp4   *:58314               *:*
paperino evolution- 59406 26 tcp4   12.123.45.67:51970    216.136.204.117:80
paperino evolution- 59406 27 tcp4   12.123.45.67:51971    63.236.73.26:80
paperino evolution- 59406 28 tcp4   12.123.45.67:51972    204.152.186.46:80
paperino ssh        56858 3  tcp4   12.123.45.67:50565    212.171.15.152:22
paperino irssi      14717 3  tcp4   192.168.0.1:65232     217.220.29.16:6667
paperino irssi      14717 5  tcp4   192.168.0.1:65231     213.92.8.4:6667
www      httpd      56922 3  tcp46  *:80                  *:*
www      httpd      56921 3  tcp46  *:80                  *:*
www      httpd      56920 3  tcp46  *:80                  *:*
www      httpd      5115  3  tcp46  *:80                  *:*
www      httpd      791   3  tcp46  *:80                  *:*
root     nmbd       639   8  udp4   *:137                 *:*
root     nmbd       639   9  udp4   *:138                 *:*
root     nmbd       639   10 udp4   192.168.0.1:137       *:*
root     nmbd       639   11 udp4   192.168.0.1:138       *:*
root     smbd       637   9  tcp4   192.168.0.1:139       *:*
root     upslog     631   3  tcp4   127.0.0.1:49154       127.0.0.1:3493
uucp     upsmon     630   3  tcp4   127.0.0.1:49153       127.0.0.1:3493
uucp     upsd       626   3  udp4   *:3493                *:*
uucp     upsd       626   4  tcp4   *:3493                *:*
uucp     upsd       626   8  tcp4   127.0.0.1:3493        127.0.0.1:49153
uucp     upsd       626   9  tcp4   127.0.0.1:3493        127.0.0.1:49154
    
I titoli sopra le colonne spiegano chiaramente i dati di ognuna. Tuttavia l'analisi non è ancora completa, in quanto sappiamo che porte sono aperte e quali sono in attesa di una connessione, però alcune potrebbero essere filtrate o chiuse da un firewall e quindi diventa importante sapere quali porte siano effettivamente raggiungibili dall'esterno.Un ottimo tool e probabilmente anche il più diffuso per conoscere eventuali "falle" è security/nmap, uno scanner che interroga tutte le porte dell'IP specificato e informa su quali siano aperte, filtrate o chiuse. Ovviamente è necessario eseguire nmap da una macchina posizionata su una rete esterna rispetto al sistema che vogliamo testare. Ad esempio, per fare una scansione di target da base:
base# nmap -sS -O target
Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-06-17 13:03 CEST
 Insufficient responses for TCP sequencing (3), OS detection may be less accurate
Interesting ports on target (12.34.56.78):
(The 1619 ports scanned but not shown below are in state: closed)
Port       State       Service
22/tcp     open        ssh
25/tcp     open        smtp
53/tcp     open        domain
80/tcp     open        http
Remote OS guesses: Mac OS X 10.1.4 (Darwin Kernel 5.4) on iMac, Mac OS X 10.1.5, FreeBSD 4.3 - 4.4PRERELEASE, FreeBSD 5.0-CURRENT (Jan 2003), FreeBSD 5.0-RELEASE (x86)
Uptime 13.967 days (since Tue Jun  3 13:51:42 2003)

Nmap run completed -- 1 IP address (1 host up) scanned in 16.704 seconds
    
nmap fornisce la porta e il protocollo, lo stato della porta stessa e il servizio che è attivo su quella porta. Inoltre cerca di individuare il sistema operativo che gira su target. Ovviamente l'essere a conoscenza delle porte aperte è solo un primo passo verso la sicurezza di un sistema.