Analisi cattura pacchetti

Da Tesine Linguaggi e Traduttori.

Jump to: navigation, search


Contents

Introduzione

Il progetto consiste nella rappresentazione grafica e statistica di un file di cattura generato mediante l’analizzatore di rete "Analyzer" (http://analyzer.polito.it/), un tool realizzato dal gruppo reti del Politecnico di Torino.

I file di cattura contengono una serie di informazioni per ogni singolo pacchetto (indirizzo MAC sorgente e destinazione, eventuale indirizzo IP sorgente e destinazione, tipo di pacchetto, ecc.); tali informazioni sono codificate in modalità RAW binaria.

Il software è programmato interamente in Java, con l'ausilio dei tools JFlex (http://jflex.de/) e Cup (http://www.cs.princeton.edu/~appel/modern/java/CUP/), e l'interfaccia con l'utente è di tipo grafico. Il file di cattura è liberamente selezionabile dall'utente all'atto dell'esecuzione; il programma si occupa quindi di sviluppare grafo e statistiche di rete per tutti i pacchetti presenti nel file. L'utente potrà filtrare una parte delle informazioni gestite per mezzo di un sistema di query il cui funzionamento è indicato nella sezione dedicata.

Filelist

JFlex sources (*.jflex)

  • scanner1.jflex
    • Estrae i campi d'interesse dalla cattura e li passa al parser1
  • scanner2.jflex
    • Fornisce al parser2 i token relativi alle query

Cup sources (*.cup)

  • parser1.cup
    • Organizza le informazioni da immagazzinare nel database
  • parser2.cup
    • Analizza lessicalmente, sintatticamente e semanticamente le query fornite in input

Java sources (*.java)

  • CsvEvaluator.java
    • Valuta le espressioni presenti nelle query
  • EventWindow.java
    • Gestisce le finestre che riportano il risultato del parsing sulle query
  • Graph.java
    • Gestisce le finestre delle statistiche e disegna il grafo che rappresenta la rete
  • GraphDataBase.java
    • Gestisce e popola il database
  • GUI.java
    • Converte la cattura da formato .acp in metacodifica usata dallo scanner e dal parser di primo livello
  • Host.java
    • Classe che identifica un'interfaccia di rete
  • IpandMacConversions.java
    • Converte gli indirizzi MAC e IPv4 da notazione standard in notazione decimale
  • Link.java
    • Classe che identifica un link nella rete
  • Main.java
    • Avvia la finestra principale
  • Packet.java
    • Classe che contiene le informazioni relative ad un singolo pacchetto della cattura

Icons (*.png)

  • error.png
    • Icona che segnala un errore nel parsing delle query
  • good.png
    • Icona che segnala la correttezza della query dopo un parsing andato a buon fine

Executable files (*.exe)

  • WinDump.exe
    • Porting per tcpdump su sistemi MS-Windows™
    • Richiede l'installazione delle librerie WinPcap (http://www.winpcap.org)
    • Allo sviluppo di WinPcap e WinDump contribuiscono alcuni membri del Politecnico di Torino.

Conversione in formato testuale

Il primo passo del progetto è dedicato alla conversione del file dal formato nativo (.acp) ad un formato “human readable” tale da consentire la costruzione del grafo rappresentante lo scambio di pacchetti e l’elaborazione delle varie statistiche in modo testuale. Un’interfaccia grafica realizzata in linguaggio Java permette di selezionare il sistema operativo su cui si sta svolgendo l’operazione ed il file di cattura da convertire, mentre l’operazione di conversione vera e propria viene eseguita utilizzando il tool WinDump nel caso venga selezionato il sistema operativo Windows, oppure il tool tcpdump nel caso venga selezionato la modalità per Linux; nel passaggio dalla codifica RAW a quella testuale vengono filtrate alcune informazioni superflue ai fini dell’elaborazione successiva.


Esempio di codifica testuale intermedia

00:13:8f:8f:0a:f9 > ff:ff:ff:ff:ff:ff, ARP, length 42: arp who-has 130.192.27.56 tell 130.192.27.55

00:13:8f:8f:0b:10 > 00:13:8f:8f:0a:f9, ARP, length 60: arp reply 130.192.27.56 is-at 00:13:8f:8f:0b:10

00:13:8f:8f:0a:f9 > 00:13:8f:8f:0b:10, IPv4, length 74: 130.192.27.55 > 130.192.27.56: ICMP echo request, id 768, seq 256, length 40

00:13:8f:8f:0b:10 > 00:13:8f:8f:0a:f9, IPv4, length 74: 130.192.27.56 > 130.192.27.55: ICMP echo reply, id 768, seq 256, length 40

00:13:8f:8f:0a:f9 > 00:13:8f:8f:0b:10, IPv4, length 74: 130.192.27.55 > 130.192.27.56: ICMP echo request, id 768, seq 512, length 40

00:13:8f:8f:0b:10 > 00:13:8f:8f:0a:f9, IPv4, length 74: 130.192.27.56 > 130.192.27.55: ICMP echo reply, id 768, seq 512, length 40

00:13:8f:8f:0a:f9 > 00:13:8f:8f:0b:10, IPv4, length 74: 130.192.27.55 > 130.192.27.56: ICMP echo request, id 768, seq 768, length 40

00:13:8f:8f:0b:10 > 00:13:8f:8f:0a:f9, IPv4, length 74: 130.192.27.56 > 130.192.27.55: ICMP echo reply, id 768, seq 768, length 40

00:13:8f:8f:0a:f9 > 00:13:8f:8f:0b:10, IPv4, length 74: 130.192.27.55 > 130.192.27.56: ICMP echo request, id 768, seq 1024, length 40

00:13:8f:8f:0b:10 > 00:13:8f:8f:0a:f9, IPv4, length 74: 130.192.27.56 > 130.192.27.55: ICMP echo reply, id 768, seq 1024, length 40

Scanner e parser di primo livello

Il file testuale così ottenuto viene sottoposto ad uno scanner e ad un parser di primo livello, che permettono di estrarre soltanto le informazioni utili alla generazione del grafo, cioè quelle che riguardano gli “attributi” degli host (i quali rappresentano i nodi del grafo); i dati vengono salvati in un file in formato .csv, per consentire in seguito l’elaborazione da parte del codice Java.


Esempio di codifica CSV

ARP,00:13:8f:8f:0a:f9,ff:ff:ff:ff:ff:ff
ARP,00:13:8f:8f:0b:10,00:13:8f:8f:0a:f9
IPv4,00:13:8f:8f:0a:f9,00:13:8f:8f:0b:10,130.192.27.55,130.192.27.56
IPv4,00:13:8f:8f:0b:10,00:13:8f:8f:0a:f9,130.192.27.56,130.192.27.55
IPv4,00:13:8f:8f:0a:f9,00:13:8f:8f:0b:10,130.192.27.55,130.192.27.56
IPv4,00:13:8f:8f:0b:10,00:13:8f:8f:0a:f9,130.192.27.56,130.192.27.55
IPv4,00:13:8f:8f:0a:f9,00:13:8f:8f:0b:10,130.192.27.55,130.192.27.56
IPv4,00:13:8f:8f:0b:10,00:13:8f:8f:0a:f9,130.192.27.56,130.192.27.55
IPv4,00:13:8f:8f:0a:f9,00:13:8f:8f:0b:10,130.192.27.55,130.192.27.56
IPv4,00:13:8f:8f:0b:10,00:13:8f:8f:0a:f9,130.192.27.56,130.192.27.55


Il risultato dell'elaborazione è visualizzato in una finestra, divisa in varie sezioni: il grafo, le statistiche testuali ed un box destinato alle query dell'utente.

Il grafo rappresenta la rete, con i nodi presenti all'interno della cattura e relativi pacchetti scambiati; è possibile visualizzare il numero di pacchetti mettendo un segno di spunta sulla casella “Stress” collocata nella parte inferiore della finestra (nel grafo non sono riportati i pacchetti con indirizzo MAC di destinazione broadcast (ff:ff:ff:ff:ff:ff)). Il grafo è da considerarsi su due livelli logici: sono riportate tutte le interfacce MAC e tutte le interfacce IP presenti nella cattura, ma non sono effettuate correlazioni di alcun tipo tra indirizzi MAC ed indirizzi IP. Pertanto un MAC address ed un IP address potrebbero corrispondere allo stesso host, ma ai fini dell'elaborazione si è scelto di considerare i due livelli a se stanti, valutando come nodi del grafo le singole interfacce. È possibile spostare le interfacce rappresentate sul grafo a piacimento cliccando e trascinandole col mouse.

Le statistiche testuali sono rappresentate mediante un albero; viene riportato il numero totale di pacchetti scambiati da ciascuna interfaccia (associata al corrispondente nodo del grafo), distinguendo tra quelli in cui l'interfaccia è la sorgente e quelli in cui essa è la destinazione. L'informazione riguardante i pacchetti MAC inviati in broadcast, omessa a livello grafico, viene considerata per completezza in questa sezione: il numero di pacchetti scambiati come sorgente da un'interfaccia MAC che ha effettuato ARP Request è incrementato rispetto al valore riportato sul grafo.

A questo punto è possibile eseguire delle query, secondo una grammatica specifica, per selezionare soltanto alcuni pacchetti della cattura, a discrezione dei parametri impostati dall’utente.

Sintassi delle query

Una query è sempre introdotta dalla keyword QUERY; è contenuta in un blocco delimitato da { e } ed in ogni punto di essa sono scartati gli spazi, i caratteri di return, le tabulazioni ed i newline. All'interno del blocco, è possibile richiamare un'operazione con la parola chiave PACKETS. Le possibilità operative che vengono offerte sono il filtraggio di un sottoinsieme dei pacchetti tramite operatori di confronto su indirizzi MAC o IP (comando CFR) oppure il filtraggio di tutte le interfacce il cui indirizzo MAC o IP è raggiungibile in un numero di passi definito dall'utente (comando DISTANCE).

Le condizioni di confronto sono correlabili tramite gli operatori logici AND, OR, e NOT.

Di seguito sono illustrate le parole chiave e la relativa sintassi per richiamare le operazioni fondamentali:


  • CFR <TIPO_INTERFACCIA> <OPERATORE> <VALORE>
    • <TIPO_INTERFACCIA>:
      • può essere un'interfaccia MAC o IP, sorgente o destinazione, pertanto i quattro possibili valori attribuibili a questo campo sono {MAC.SRC, MAC.DST, IP.SRC, IP.DST};
    • <OPERATORE>:
      • gli operatori relazionali contemplati sono {>,>=,<,<=,=,!=};
    • <VALORE>:
      • il campo valore dipende semanticamente dal tipo di interfaccia cui è associato. Nel caso di MAC address sarà un sestetto di coppie composte da cifre esadecimali e separate dai due punti, nel caso di indirizzi IPv4 la notazione utilizzata è il quartetto standard di numeri decimali compresi fra 0 e 255 delimitati dal punto.


  • DISTANCE <TIPO_INTERFACCIA> <OPERATORE> <VALORE>
    • <TIPO_INTERFACCIA>:
      • può essere un'interfaccia MAC o IP sorgente, pertanto i due possibili valori attribuibili a questo campo sono {MAC.SRC, IP.SRC};
    • <OPERATORE>:
      • è ammesso solamente l'operatore relazionale di uguaglianza;
    • <VALORE>:
      • il campo valore indica il numero di hop da considerare nel calcolo della distanza dal nodo sorgente; il valore è volutamente limitato a 5.


Nel caso in cui la query fornisca un risultato vuoto viene visualizzato un opportuno messaggio su riga di comando.

Scanner e parser di secondo livello

Le query devono essere digitate nell'apposito box e vengono eseguite alla pressione del pulsante “Do Query”, posto nella parte inferiore della finestra principale; il testo della query è analizzato da uno scanner e da un parser di secondo livello, i quali individuano eventuali errori lessicali, sintattici e semantici. Nel caso in cui la query introdotta sia corretta, vengono visualizzate due finestre: una riporta il risultato del parsing, l'altra, divisa in due sezioni, comprende il grafo e le statistiche testuali ottenute dall'elaborazione. Nel caso in cui la query introdotta sia errata, viene visualizzata una finestra che riporta tutti gli errori contenuti nel testo, distinguendoli in base alla categoria (lexical error, syntax error oppure semantic error).

Non è possibile effettuare una nuova query prima che siano state chiuse le finestre relative alla query precedente.

A parte i metodi per la gestione degli errori, di cui si parla nell’apposita sezione, il parser di secondo livello presenta i seguenti metodi:

  • protected ImageIcon createImageIcon(String path, String description)
    • Gestisce le icone che segnalano la corretta oppure l’errata terminazione del processo di parsing delle query
  • public void show_error_window(int level)
    • Genera la finestra che riporta il risultato del parsing delle query, utilizzando le variabili EventWindow window, Vector<String> v e JList errlist definite nel parser

Gestione degli errori

Il parser di secondo livello riceve in input un linguaggio generato direttamente dall'utente, per questo motivo è possibile e probabile la presenza di comandi contenenti errori. La gestione di questi riveste quindi una parte consistente nel lavoro del parser.

Si distinguono errori di vari tipi secondo la seguente classificazione:

  • Errori semantici
  • Errori sintattici
  • Errori lessicali

Il metodo con cui il parser richiede i token allo scanner è stato modificato (direttiva "scan with") al fine di individuare nel testo delle query gli errori lessicali; viene visualizzato un messaggio di errore per ogni carattere errato e nella finestra che riporta il risultato finale della query viene visualizzato un messaggio che indica la presenza di errori lessicali nella query.

Il parser gestisce gli errori sintattici tramite l'utilizzo del simbolo predefinito error, il quale, attraverso la ridefinizione del metodo syntax_error(Symbol), permette di riprendere il parsing e di portarlo a termine segnalando tutti gli errori; nel report del risultato del parsing vengono riportati riga e colonna in cui è stato rilevato un errore di sintassi.

Alcune limitazioni impediscono combinazioni di comandi sintatticamente leciti; le violazioni sono segnalate come errore semantico, e riportate come tali nella finestra del report del risultato del parsing utilizzando il metodo report_error(String, Object):

  • Una richiesta di tipo DISTANCE deve sempre correlata ad una di tipo CFR, più precisamente DISTANCE deve sempre seguire CFR;
  • Il parametro utilizzato per le operazioni DISTANCE deve sempre un campo sorgente (MAC.SRC oppure IP.SRC) e deve essere lo stesso parametro del comando CFR correlato (la query richiede l’utilizzo di attributi ereditati);
  • Non sono ammessi operatori diversi da quello di uguaglianza nelle richieste di tipo DISTANCE;
  • Il massimo numero di passi impostabile per le richieste di tipo DISTANCE è pari a 5 (il vincolo è impostato intenzionalmente per limitare il tempo di esecuzione; è possibile modificare manualmente questo limite sostituendo nel codice sorgente il valore desiderato e ricompilando il parser).


Le condizioni di errore rilevate settano le variabili found_errors e found_lexical_errors.

Esempi di query corrette

Query con comando CFR ed operatore logico OR

query {
packets
cfr ip.src = 130.192.27.55 or cfr mac.dst = 00:13:8f:8f:0a:f9
}


Query con comando DISTANCE correlato a comando CFR

query {
packets
cfr ip.src = 130.192.27.55 distance ip.src = 2
}


Esempi di query errate

Query senza parola chiave PACKETS

query {
cfr ip.src = 130.192.27.55 or cfr mac.dst = 00:13:8f:8f:0a:f9
}


Query con errori lessicali

query {
lexical error
}


Query con IP semanticamente non corretto

query {
packets
cfr ip.src = 130.1921.27.55
}


Query con parametri differenti tra comandi CFR e DISTANCE correlati

query {
packets
cfr ip.src = 130.192.27.55 distance mac.src = 2
}


Query con comando DISTANCE senza comando CFR correlato

query {
packets
distance ip.src = 130.192.27.55
}


Query con parametri ed operandi semanticamente errati

query {
packets
cfr ip.dst > 130.192.27.55 distance ip.dst = 2
}

Il calcolo della distanza ha senso soltanto se l'operatore associato ai comandi CFR e DISTANCE è di uguaglianza; inoltre il parametro che identifica il nodo sorgente non può essere "ip.dst".

Download ed istruzioni per la compilazione

Download link

Contenuto dell'archivio .zip

  • La cartella CaptureAnalysis contiene il progetto funzionante, con i sorgenti già compilati;
  • La cartella src contiene i file sorgenti, pronti per la compilazione;
  • La cartella relazione contiene la relazione in formato .doc e .pdf.


--- COMPILAZIONE SCANNER E PARSER DI PRIMO LIVELLO ---

jflex scanner1.jflex;
java java_cup.Main -parser parser1 -symbols sym1 parser1.cup;

--- COMPILAZIONE SCANNER E PARSER DI SECONDO LIVELLO ---

jflex scanner2.jflex;
java java_cup.Main -parser parser2 -symbols sym2 parser2.cup;

--- COMPILAZIONE SORGENTI JAVA ---

javac *.java

--- ESECUZIONE DEL PROGRAMMA ---

java GUI (conversione del file di cattura desiderato)
java Main "nome_file" (visualizzazione statistiche)

Requisiti di sistema: Java RE versione 6 o superiore

Personal tools