next   previous   contents

Implementazione

 In questa sezione della relazione ci si sofferma su una presentazione dettagliata dell'implementazione dei prototipi servknock e module knock.
 Il linguaggio scelto per lo sviluppo e' stato il C, sia per motivi di prestazioni che per l'integrazione che ha con linux e unix in genere, essendo praticamente un linguaggio 'nativo' per queste piattaforme.
 Per l'implementazione e' stato preso fortemente spunto da Knockd di Judd Vinet, anche utilizzando e riadattando parti del suo codice originario, specialmente nel riconoscimento dei differenti stadi della sequenza (si sottolinea pero' come il codice originale lavorasse esclusivamente con sequenze di knock trasmesse “in chiaro”, con il conseguente problema della vulnerabilita' ai replay attacks), e nelle operazioni sulle liste.
 Particolarmente utili si sono dimostrati anche sniffer.c di Paolo Carpo ( snifth@spine-group.org ), e ps.c di Marco Balduzzi (embyte@spine-group.org), presentati durante il workshop “introduzione alla programmazione con libnet e libpcap” del webbit 2004 di Padova.

servknock

 Le parti principali in cui servknock puo' essere diviso sono :

 1. parsing dei parametri con cui e' invocato da linea di comando
 2. parsing del file di configurazione
 3. inizializzazione delle librerie e ciclo di cattura dei pacchetti
 4. analisi dei pacchetti catturati e validazione delle sequenze
 5. esecuzione dei comandi previsti
 6. handling dei segnali

 Una volta eseguito, il programma, viene analizzata la linea di comando con la quale esso e' stato avviato, per rilevare quali opzioni siano state specificate dall'utente.
 Segue il parsing del file di configurazione, nel quale sono definiti tutti i parametri necessari al corretto funzionamento del software, le sequenze di knock che devono essere riconosciute, e le azioni ad esse associate.
 A questo punto a seconda delle opzioni specificate nella linea di comando, il processo puo' proseguire normalmente nella sua esecuzione, oppure eseguire un'operazione di fork per generare un figlio che sara' eseguito in background.
 Superata questa prima fase, una volta inizializzate le librerie necessarie, viene avviato il ciclo di cattura dei pacchetti. Ogni pacchetto catturato viene quindi analizzato, estraendo dai diversi header le informazioni necessarie per procedere al riconoscimento od all'invalidazione delle eventuali sequenze di knock.
 Riconosciuta una specifica sequenza vengono infine eseguiti i comandi previsti, definiti all'interno del file di configurazione.

Un diagramma di flusso estremamente semplificato, che schematizza il funzionamento del sistema e' il seguente:


Module Knock

 Il modulo di portknocking Module Knock e' costituito da due file, posti nella cartella modules presente nella directory di Hogwash: module_knock.c, contenente il codice necessario per il riconoscimento delle sequenze di knock, e l'header file module_knock.h. Il prototipo e' stato sviluppato solamente sulla base di un modulo di esempio e di altri moduli forniti assieme ad Hogwash, in quanto non era disponibile nessun altro tipo di documentazione.

 La struttura di un modulo di Hogwash prevede almeno l'utilizzo di tre funzioni fondamentali:
- una funzione di inizializzazione del modulo
- una funzione utilizzata per il parsing delle opzioni specifiche del modulo, presenti nel file di configurazione di Hogwash.
- una funzione che viene eseguita alla ricezione di ogni pacchetto di rete.


 Nel caso di Module Knock le tre funzioni definite sono rispettivamente:
- int Knock_Init(void)
- int KnockParseArg (char*)
- void KnockProcFunc(int)


 Un' altra funzione di particolare importanza implementata nel modulo si occupa dell'esecuzione dei comandi una volta che una sequenza di knock valida viene riconosciuta.

 Schematicamente, il funzionamento di Hogwash con l'aggiunta di Module Knock risulta leggermente diverso da un normale sistema di portknocking standalone

next   previous   contents