Oggi giorno cè una continua espansione della rete,
a cui corrisponde un aumento dei tentativi dintrusione, 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 lattacco:
L'Imprinting sistematico di unorganizzazione 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:
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 è larte di rilevare quali macchine siano attive e raggiungibili via Internet e quali servizi siano disponibili, usando tecniche come:
esempio
il rilevamento del sistema operativo tramite stack TCP/IP fingerprinting
esempio
Identificare quale Sistema Operativo, è presente sul dato sistema.
Identificare applicazioni specifiche o versioni di un dato servizio sul sistema.
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.
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:
int socket(int family, int type, int protocol)
La funzione restituisce il socket descriptor
I parametri di input sono :
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 :
int connect(int sockfd, const struct sockaddr* saddr, socklen_t addrlen)
I parametri di input sono :
int listen(int sockfd, int backlog)
I parametri di input sono :
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.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 allaccaduto allinterno 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. |