Introduzione

Sia che tu stia risolvendo problemi di connettività di rete o configurando un firewall, una delle prime cose da verificare è quali porte sono effettivamente aperte sul tuo sistema.

Questo articolo descrive come utilizzare Nmap e Bash Pseudo Device per scoprire quali porte sono aperte verso l'esterno sul sistema Linux.

Una listening port è una porta di rete su cui un'applicazione è in ascolto. È possibile ottenere un elenco delle porte di ascolto sul proprio sistema eseguendo una query sullo stack di rete con comandi come ss, netstat o lsof. Ogni porta di ascolto può essere aperta o chiusa (filtrata) utilizzando un firewall.

Una porta aperta è una porta di rete che accetta pacchetti in entrata da posizioni remote.

Ad esempio, se si esegue un server Web in ascolto sulle porte 80 e 443 tali porte sono aperte sul firewall, chiunque (tranne ips bloccati) sarà in grado di accedere ai siti Web ospitati sul server Web tramite il proprio browser. In questo caso, entrambe le porte 80 e 443 sono aperte.

Le porte aperte possono comportare un rischio per la sicurezza in quanto ogni porta aperta può essere utilizzata dagli aggressori per sfruttare una vulnerabilità o eseguire qualsiasi altro tipo di attacco. È necessario esporre solo le porte necessarie per la funzionalità dell'applicazione e chiudere tutte le altre porte.

Controllare le porte aperte con nmap

Nmap è un potente strumento di scansione della rete in grado di scansionare singoli host e reti di grandi dimensioni. Viene utilizzato principalmente per audit di sicurezza e test di penetrazione.

Se disponibile, nmap dovrebbe essere il tuo primo strumento quando si tratta di scansione delle porte. Oltre alla scansione delle porte nmap è anche possibile rilevare l'indirizzo Mac, il tipo di sistema operativo , le versioni del kernel e molto altro.

Dare il seguente comando da console per determinare quali porte sono in ascolto per le connessioni TCP dalla rete:

sudo nmap -sT -p- 10.10.8.8

Il flag -sT con nmap serve per la ricerca di porte TCP e -p- per la ricerca di tutte le 65535 porte. Se -p- non viene utilizzato nmap, scansionerà solo 1000 porte.

Starting Nmap 7.60 ( https://nmap.org ) at 2019-09-09 09:11 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 01:00:21:22:01:88 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds

L'output sopra mostra che solo porte 22, 80 e 8069 sono aperte sul sistema di destinazione.

Per cercare le porte UDP usare -sU invece di -sT:

sudo nmap -sU -p- 10.10.8.8

Per maggiori informazioni visita la pagina man di nmap e leggi tutte le altre potenti opzioni di questo strumento.

Trovare le porte aperte usando Bash Pseudo Device

Un altro modo per verificare se una determinata porta è aperta o chiusa è utilizzando la shell Bash /dev/tcp/.. o /dev/udp/.. pseudo device.

Quando si esegue un comando su uno pseudo-dispositivo /dev/$PROTOCOL/$HOST/$IP, Bash aprirà una connessione TCP o UDP all'host specificato sulla porta specificata.

La seguente dichiarazione serve per verificare se la porta 443 su kernel.org è aperta:

if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
  echo "Porta aperta"
else
  echo "Porta chiusa"
fi
Port aperta

Il timeout predefinito durante la connessione a una porta mediante uno pseudo dispositivo è enorme, quindi stiamo usando il comando timeout per terminare il comando di prova dopo 5 secondi. Se viene stabilita la connessione per kernel.org con porta 443 il comando test restituirà true.

Puoi anche usare il ciclo for per verificare un intervallo di porte:

for PORT in {20..80}; do
  timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" &&  echo "porta $PORT aperta"
done

L'output sarà simile al seguente:

port 22 aperta
port 80 aperta

Conclusione

Ti abbiamo mostrato diversi strumenti che puoi usare per cercare porte aperte. Ci sono anche altri programmi di utilità e metodi per verificare la presenza di porte aperte, per esempio, è possibile utilizzare il Python socket, curl, telneto wget.