Guida Cosa sono le porte e come funziona il Port Scanning?

Max Fridman

Community Manager
Amministratore
8 Agosto 2010
6,892
647
6,540
3,171
undraw_safe_bnk7.png

Ad ogni indirizzo IP sono assegnate diverse porte (per la precisione 2^16 = 65536 porte) al fine di smistare i dati in ingresso verso i processi che li stanno aspettando. Le porte si dividono in porte conosciute che vanno dalla 0 alla 1023, porte registrate che vanno dalla 1024 alla 49151 e le porte dinamiche che vanno dalla 49152 alla 65535. Le porte appartenenti alle prime due categorie sono riservate, e la loro regolamentazione è gestita dall’ente IANA (QUI puoi trovare l’elenco).

Ogni porta può esistere in stati diversi che possiamo riassumere nei tre principali, gli altri sono ottenuti da loro combinazioni:
  • Open: un’applicazione in questo stato è in grado di accettare connessioni TCP e/o datagrammi UDP e trovare queste porte è l'obbiettivo principale del port scanning;
  • Closed: una porta in questo stato è accessibile, non ci sono programmi in ascolto su essa ma può comunque esserci utile per fare OS detection o per vedere quali hosts sono attivi all’interno della rete;
  • Filtered: le porte in questo stato serve solitamente vengono filtrate da firewall che seguendo delle regole di filtraggio scartano i pacchetti senza rispondere per evitare che programmi “sonda” come Nmap possano raggiungerle. Queste sono le porte che ci danno più fastidio perché rallentano il processo di scansione.
Possiamo quindi dire che il port scanning consiste nell’inviare un messaggio ad ogni singola porta e la risposta ricevuta ci permette di stabilire lo stato di una porta e quindi se può esserci utile per cercare qualche debolezza da sfruttare o, al contrario, per rilevare qualche vulnerabilità.

Nel descrivere brevemente gli approcci al port scanning più utilizzati incontreremo tre flag usate nel segmento TCP, queste sono:
  • SYNchronisation, questa flag viene utilizzata nella primissima fase di una connessione (chiamata three way handshake) e viene impostata ad 1 solo nel primo pacchetto inviato sia dal mittente che dal destinatario e serve a sincronizzare i messaggi scambiati
  • ACKnowledgement, questa flag serve a contrassegnare il pacchetto come valido, qualora non lo fosse viene rispedito
  • FINish, questa flag è usata per terminare una connessione, viene settata ad uno nell’ultimo pacchetto inviato dal mittente.
[SOTTOTITOLO3]La scansione TCP SYN conosciuta anche come half open ci permette di rilevare le porte aperte tentando una connessione che non viene però completata. [/SOTTOTITOLO3]

Il meccanismo è piuttosto semplice: il tutto comincia con una richiesta di connessione TCP e quindi con un three-way handshake. Alla porta viene inviato un pacchetto con SYN impostato ad 1 come se stessimo tentando di aprire una vera connessione, da qui in poi possiamo incorrere in diversi scenari: se la porta è aperta riceviamo come risposta un SYN-ACK, e ottenuta l’informazione che ci serviva terminiamo il tentativo di connessione rispondendo con un RST.

image1.png

Se invece la porta non è aperta o è filtrata riceviamo come risposta un SYN-RST o in diversi casi anche un Bad Checksum.

image4.png

Uno dei vantaggi di questa tecnica è legato proprio al fatto che non viene completata la connessione e per questo molti bersagli non loggano i nostri tentativi.

[SOTTOTITOLO3]Restando nel campo TCP, se la nostra scansione TCP SYN fallisce a causa di firewalls e filtri che osservano il traffico SYN verso le porte non autorizzate, possiamo tentare la via del TCP FIN scan che è un po’ l’opposto della tecnica precedente. [/SOTTOTITOLO3]

Se prima cercavamo le porte aperte inviando una richiesta di connessione impostando nel segmento TCP la flag SYN ad 1, questa volta chiediamo invece di terminare la connessione impostando ad 1 la flag FIN. Quello che ci dobbiamo aspettare è che le porte chiuse risponderanno con un RST
image3.png


Mentre quelle aperte, visto che stiamo cercando di chiudere una connessione che non abbiamo mai stabilito, tenderanno ad ignorare completamente questi pacchetti.

image5.png

Sebbene questo approccio possa rivelarsi utile quando il metodo SYN fallisce, dobbiamo tenere in conto che sfrutta un bug nell’implementazione del protocollo TCP e potrebbe non funzionare su diversi sistemi che hanno provveduto a fixarlo.

[SOTTOTITOLO3]Qualora questi due metodi basati sul protocollo TCP non dovessero funzionare, possiamo provare un approccio basato su UDP. [/SOTTOTITOLO3]

Questo sistema non fa uso di SYN e FIN e i pacchetti vengono scambiati liberamente senza quindi aspettarsi notifiche di alcun tipo. Qui il meccanismo alla base è piuttosto semplice, ma nonostante ciò può essere molto più difficile ottenere buoni risultati dalle scansioni, questo perché essendo UDP connectionless, le porte aperte non devono rispondere con alcun messaggio di conferma e le porte chiuse non sono obbligate a restituire un messaggio di errore. Tuttavia però alcuni host inviano un messaggio del tipo ICMP: Port Unreachble quando inviamo un messaggio ad una porta chiusa e quindi possiamo vedere quali porte sono chiuse per determinare ad esclusione, quelle che sono aperte.

image2.png

A mio parere però, vista la lentezza di questo meccanismo dovuta ad uno standard che regola il rate limit di pacchetti ICMP è bene usarlo qualora altri metodi non abbiano funzionato, giusto per non lasciar nulla di intentato.
 

Allegati

  • undraw_safe_bnk7.png
    undraw_safe_bnk7.png
    26.1 KB · Visualizzazioni: 443
  • Mi piace
Reazioni: Ex0dIa_ e Ducknaro