1 INTRODUZIONE


Oggi giorno c’è una continua espansione della rete, a cui corrisponde un aumento dei tentativi d’intrusione, di conseguenza è sempre più essenziale la sicurezza di una rete.
Supponiamo che un intruso tenti di penetrare in una rete, per far ciò cerca di ottenere più informazioni possibili su di essa. Per ricevere tali informazioni esegue due passi essenziali, che precedono l’attacco:

L'Imprinting sistematico di un’organizzazione permette al possibile intruso di crearsi un profilo completo dello stato di sicurezza della data organizzazione. Principalmente l'intruso tenta di accedere alla rete ottenendo dapprima più informazioni possibili relative a:

  1. Amministratori di rete e utenti della rete
  2. Posizione del server
  3. Presenza o meno di Intranet
  4. Sistemi di rilevamento delle intrusioni
  5. Server DNS e sua configurazione
  6. Indirizzi IP assegnati
  7. Eventuale Accesso Telefonico

La maggior parte delle informazioni suddette sono liberamente disponibili su Internet.

Lo Scanning permette di avere informazioni più precise sulla rete che si vuole penetrare, ossia sapere quali sistemi operativi e servizi vi sono. Più precisacmente lo Scanning è l’arte di rilevare quali macchine siano attive e raggiungibili via Internet e quali servizi siano disponibili, usando tecniche come:

esempio

Identificare quale Sistema Operativo, è presente sul dato sistema.


Identificare applicazioni specifiche o versioni di un dato servizio sul sistema.


 

1.1 Modello TCP/IP


Prima di andare oltre, è necessario dare un accenno sul modello TCP/IP e sui suoi protocolli più utilizzati (TCP e UDP). Molte reti e siti Internet utilizzano per la comunicazione l'Internet Protocol, comunemente noto come protocollo IP. Per favorire la comunicazione tra applicazioni su host differenti, ad ogni host presente sulla rete è assegnato un indirizzo IP, cioè un valore di 32 bit che lo identifica univocamente.

I servizi sono realizzati sopra l'IP attraverso il protocollo di trasporto. Tra i protocolli più utilizzati vi sono UDP (User Datagram Protocol) e TCP (Transmission Control Protocol).

Entrambi si poggiano sul protocollo IP. Una prima differenza tra TCP e UDP consiste nel fatto che il primo è un protocollo orientato alla connessione, mentre il secondo è un protocollo senza connessione. Inoltre TCP trasporta in modo affidabile un flusso di informazioni tra due processi, mentre UDP è un protocollo di trasporto inaffidabile e orientato al datagram.

Sullo stessa macchina si possono usare, indifferentemente, applicazioni che utilizzano TCP o UDP. Per identificare le applicazioni sorgente e destinazione di un pacchetto viene utilizzato in entrambi i protocolli il concetto di porta. In pratica il numero di porta non è niente altro che un valore a 16 bit che identifica un'applicazione su di un host.

 

1.2 THREE-WAY HANDSHAKE


Descriviamo brevemente come funziona una connessione TCP (per un riferimento completo si suggerisce un rapida lettura alla RFC 793, utile anche successivamente quando parleremo dei vari tipi di scan). Quando un sistema (client) prova a stabilire una connessione TCP in un sistema che fornisce un servizio (server), il client e il server scambiano una successione di messaggi, nel seguente modo:

 

1.3 SOCKET

Alla base della programmazione di rete (e quindi anche di molti port scanner e scan detector) vi sono i socket. I socket sono un API (Application Programm Interface) utilizzata per permettere la comunicazione tra programmi in rete. Solitamente le applicazioni di rete sono divise in due parti: un client ed un server, che comunicano tra di loro attraverso un canale di comunicazione. Un modo per permettere a client e server di comunicare tra loro è quello di utilizzare i socket. I socket possono essere utilizzati con più protocolli di trasporto.

Di seguito presentiamo alcune funzioni, in linguaggio C, relative ai socket:


Creare un endpoint

int socket(int family, int type, int protocol)

La funzione restituisce il socket descriptor

I parametri di input sono :

  1. family che identifica il tipo di indirizzo AF_INET per TCP/IP
  2. type è il tipo di servizio di trasporto richiesto:
    - SOCK_STREAM per TCP
    - SOCK_DGRAM per UDP
  3. protocol specifica il protocollo da usare

Legare un socket descriptor ad una porta

int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)

la funzione restituisce 0 per OK, -1 per errore

I parametri di input sono :

  1. sockfd è il socket descriptor
  2. addr è l’indirizzo dell’endpoint
  3. addrlen è la lunghezza in byte dell’oggetto addr


Crea una connessione

int connect(int sockfd, const struct sockaddr* saddr, socklen_t addrlen)

I parametri di input sono :

  1. sockfd è il socket descriptor
  2. saddr è l’indirizzo dell’endpoint a cui ci si vuole collegare
  3. addrlen è la lunghezza in byte dell’oggetto saddr


Mette il server in ascolto su un socket

int listen(int sockfd, int backlog)

I parametri di input sono :

  1. sockfd è il socket descriptor
  2. backlog specifica la dimensione della memoria assegnata all’endpoint

Accettare una richiesta di connessione da parte di un client

int accept(int sockfd, const struct sockaddr* saddr, socklen_t addrlen)

Restituisce il socket descriptor della nuova connessione

I parametri di input sono :

  1. sockfd è il socket descriptor
  2. saddr è l’indirizzo dell’endpoint a cui ci si vuole collegare
  3. addrlen è la lunghezza in byte dell’oggetto saddr

 

1.4 RILEVAZIONE DELLO SCANNING

La rivelazione dello Scanning è una tecnica per difendersi la propria rete da eventuali scansioni di sistema. Sono disponibili freeware su Internet dei software che implementano tale tecnica (per esempio i programmi Klaxon e PortSentry descritti nelle sezioni successive). Tali programmi, istallati in un sistema, rilevano i tentativi di connessione e li trascrivono in un file di log, consentono di bloccare le scansioni al sistema e, infine, alcuni di essi, sono in grado di reagire in modo appropriato. Solitamente, una volta rilevato un port scan, uno scan-detector (software per rilevare il portscanning) va ad eseguirne il log sul sistema, cioè va a registrare delle informazioni relative all’accaduto all’interno di un particolare file, detto file di log. Il nome e il percorso del file di log dipendono dal programma utilizzato e da come è configurato il sistema sul quale esso opera. Per effettuare il log, molti software in ambienti Unix o Linux_like, tra cui Klaxon e Portsentry, utilizzano il comando syslog. Questo comando permette di generare un messaggio di log che è distribuito al system logger syslogd. In particolare syslogd è un demone di sistema che si occupa di trascrivere gli eventi che accadono nel sistema. I messaggi saranno trascritti in un determinato file in dipendenza dal valore dei parametri ad essi associati e dal contenuto del suo file di configurazione /etc/syslog.conf.

I parametri associati ad un messaggio di log sono due:

Parametro

Valori Consentiti

Descrizione
level EMERGENCY condizione di panico di cui normalmente viene eseguito il broadcast a tutti gli utenti
ALERT condizione che deve essere corretta immediatamente, come uno stato di inconsistenza di database
CRITICAL condizioni critiche come errori dei dispositivi
ERROR or WARNING errore generico
NOTICE condizioni che non sono di errore, ma che richiedono un trattamento speciale.
INFO messaggi informativi

 

Parametro

Valori Consentiti

Descrizione
facility LOG_DAEMON indica messaggi prodotti da altri demoni di sistema
LOG_KERN indica messaggi prodotti dal kernel
LOG_MAIL indica messaggi prodotti dal sottosistema di posta
LOG_SYSLOG è associata a messaggi generati internamente da syslog
LOG_USER è il valore di default e indica messaggi generici a livello utente
LOG_LOCAL0, …, LOG_LOCAL7 sono valori riservati ad uso locale.