Sniffare il traffico di Rete con Python



Documenti analoghi
Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Assegnamento di un indirizzo IP temporaneo a dispositivi Barix

Sicurezza nelle reti

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Analizzatore lessicale o scanner

Introduzione alla programmazione in C

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Firewall e NAT A.A. 2005/2006. Walter Cerroni. Protezione di host: personal firewall

Algoritmi di Ricerca. Esempi di programmi Java

Sono casi particolari di MCF : SPT (cammini minimi) non vi sono vincoli di capacità superiore (solo x ij > 0) (i, j) A : c ij, costo di percorrenza

Università degli Studi di Pisa Dipartimento di Informatica. NAT & Firewalls

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Sicurezza nelle applicazioni multimediali: lezione 9, firewall. I firewall

Introduzione allo sniffing

Corso di Reti di Calcolatori T

PHP e MySQL. Guida scaricata da

esercizi su sicurezza delle reti maurizio pizzonia sicurezza dei sistemi informatici e delle reti

Cognome Nome Matricola Tempo a disposizione per lo svolgimento: 1 ora e 20 min Avvertenza: Si usi lo spazio dopo ogni quesito per lo svolgimento.

Introduzione alle applicazioni di rete

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools

Do-Dots Protocollo di comunicazione

Le stringhe. Le stringhe

Arduino Quick Ethernet library Reference

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Database e reti. Piero Gallo Pasquale Sirsi

Analisi dei rischi della system call chroot e un valido sostituto: le jail. Marco Trentini mt@datasked.com

La struttura dati ad albero binario

Introduzione al Python

Il Web Server e il protocollo HTTP

maurizio pizzonia sicurezza dei sistemi informatici e delle reti. esercizi su vulnerabilità del software e delle reti

Transmission Control Protocol

Introduzione al MATLAB c Parte 2

AA LA RICORSIONE

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 7 Febbraio 2005, ore 15.00

Allocazione dinamica della memoria - riepilogo

Rete Internet Prova in Itinere Mercoledì 23 Aprile 2008

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

La sicurezza nel Web

Packet Filter in LINUX (iptables)

MANUALE CONFIGURAZIONE ED UTILIZZO GATEWAY MBUS-MODBUS (RTU/TCP) MODELLO PiiGAB M900

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

19. LA PROGRAMMAZIONE LATO SERVER

Esercitazione sulle libpq - libreria C per PostgreSQL

LINGUAGGI DI PROGRAMMAZIONE

Lezione 1 Introduzione

Traccia di soluzione dell esercizio del 25/1/2005

Algoritmi e strutture dati. Codici di Huffman

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

Parte II: Reti di calcolatori Lezione 10

Registratori di Cassa

Object Oriented Programming

Esercizio su MT. Svolgimento

Esercizi Capitolo 6 - Alberi binari di ricerca

Progettare un Firewall

Reti di Telecomunicazione Lezione 8

Raw socket. L intercettazione di un pacchetto IP

Rapporto sul tirocinio del 01/04 al 30/06. Al Università di Udine DUT. Dall IUT A di Lille 1

Manuale di realizzazione dei modelli di documento

Riccardo Paterna

Indirizzi Internet e. I livelli di trasporto delle informazioni. Comunicazione e naming in Internet

PROVA FINALE V. AULETTA G. PERSIANO ALGORITMI II - -MAGIS INFO

Indice generale. OOA Analisi Orientata agli Oggetti. Introduzione. Analisi

Prof. Mario Cannataro Ing. Giuseppe Pirrò

Data mining. Vincenzo D Elia. vincenzo.delia@polito.it. DBDMG - Politecnico di Torino

Sicurezza delle reti. Monga. Il livello di trasporto. Problemi di sicurezza intrinseci. Riassunto. Porte. Sicurezza delle reti.

Laboratorio di Sistemi Distribuiti Leonardo Mariani

URI. Introduzione. Pag. 1

Introduzione al Linguaggio C

Approccio stratificato

Introduzione ai tipi di dato astratti: applicazione alle liste

Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)

Reti di Telecomunicazione Lezione 6

Il Software. Il software del PC. Il BIOS

Funzioni in C. Violetta Lonati

Socket & RMI Ingegneria del Software - San Pietro

Fondamenti di Programmazione

Problema del naming. Modello di Naming

Come funziona il WWW. Architettura client-server. Web: client-server. Il protocollo

Sicurezza delle reti 1

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

Laboratorio di architettura degli elaboratori Progetto finale AA 2005/2006

La sicurezza delle reti

Parte II: Reti di calcolatori Lezione 12

Presentazione Data Base

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

HTTP adaptation layer per generico protocollo di scambio dati

INFOCOM Dept. Antonio Cianfrani. Virtual LAN (VLAN)

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Topologia delle reti. Rete Multipoint: ogni nodo è connesso agli altri tramite nodi intermedi (rete gerarchica).

Protocolli applicativi: FTP

Progetto di Reti di Telecomunicazione Modelli in Programmazione Lineare Problemi di flusso

NAS 224 Accesso remoto Configurazione manuale

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

Verifica parte IIA. Test (o analisi dinamica) Mancanza di continuità. Esempio

Corso di Informatica di base per le discipline umanistiche - XPATH

10 - Programmare con gli Array

Protocolli di Comunicazione

Transcript:

Sniffare il traffico di Rete con Python Un Caso di Studio Giorgio Zoppi <zoppi@atsystem.org>

Note su Python Linguaggio interpretato a macchina virtuale Scoping statico Passaggio di parametri per valore Macchina Virtuale implementata in : C, C#, Java Ottimo per le ricerche su stringhe Metafora: Sviluppo rapido, sviluppo meglio. http://www.python.it/

Python e lo Sniffing Esistono i wrapper python per le comuni librerie C pcap, dnet, nids Compromesso: performance / tempo / costi Moduli, alcuni sono incompleti pypcap/pcappy pcap per python dpkt libreria di ricostruzione pacchetti pynids wrapper per le libnids

Cosa faremo :) Esempio di sniffing con le pcap: contare i pacchetti IP Un esempio di ngrep sul payload dei pacchetti Un esempio con le libnids usando il pattern matching multiplo nel traffico smtp segnando le mail come spam

Exact set matching problem Localizzare occorrenze di più pattern appartenenti ad un insieme P ={P 1,,P k } in un testo T[1,...,m] Sia n = Exact set matching può essere risolto con un tempo O( P 1 + m + + P k + m) = O(n + km) per applicare ogni exact matching di tipo lineare k volte Algoritmo Aho-Corasick (AC) Classica soluzione di exact set matching Lavora in O(n + m + z), dove z è il numero di pattern occorrenze in T

Keyword Trees Un keyword tree(o trie) per un insieme di pattern P è un albero K con le seguenti caratteristiche: ogni arco è etichettato con un carattere due archi uscenti di un nodo hanno etichette differenti Si definisce l'etichetta di un nodo v come la concatenazione delle etichette sugli archi che compongono il cammino dal nodo radice a v, e si indica con L(v). per ogni P Є P c'è un nodo v con L(v)= P e l'etichetta L(v) di ogni foglia v equivale a qualche P Є P

Keyword Tree: Costruzione Costruire un keyword tree per P = {P 1,,P k } Iniziare dal nodo radice Inserire ogni pattern P i, uno dopo l'altro nel seguente modo: Partire dal nodo radice, seguendo i percorsi etichettati con i caratteri di P i. Se il percorso finisce prima di P i, continuarlo aggiungendo un nuovo arco e nodo per i rimanenti caratteri di P i. Salvare l'identificatore i di P i nell'ultimo nodo del percorso. Complessità: O( P 1 + + P k ) = O(n)

Esempio di un Keyword Tree Il keyword tree per P = {he1,she2,his3,hers4} h e r s 1 4 s i s 3 h e 2

Keyword Tree: Ricerca La ricerca di una stringa P: Partire dal nodo radice e seguire il cammino etichettato da caratteri di P fino a quando è possibile. Se il cammino si ferma in un nodo in cui è presente un identificatore allora P è una chiave del dizionario; Altrimenti se termina prima di P, la stringa non appartiene al dizionario. Complessità: O( P ) Un'applicazione banale al pattern matching dovrebbe portare a Ө (nm). Estenderemo un keyword tree ad un automa per realizzare il matching in tempo lineare

Stati: nodi del keyword tree (trie). Stato iniziale: 0 = la radice. Automa di Aho-Corasick(1) L'automa viene definito mediante tre funzioni: 1. la funzione goto g(q,a) da lo stato successivo partendo dallo stato q facendo il matching del carattere a (funzione di transizione). Se un arco(q,v) è etichettato da a, allora g(q,a) = v; g(0,a) = 0 per ogni a che non etichetta un arco fuori dalla radice. L'automa rimane nello stato iniziale se scandisce caratteri che non corrispondono. Altrimenti g(q,a) = 0

Automa di Aho-Corasick(2) 2. la funzione failure f(q), per q 0 dà lo stato in cui mi trovo quando ho mismatch f(q) è il nodo etichettato dal più lungo suffisso proprio w di L (q) tale che w sia prefisso di qualche pattern => una transizione di fallimento non manca nessuna potenziale occorrenza. Notiamo che f(q) è sempre definita, poichè L(0) = ε è un prefisso di ogni pattern. 3. La funzione output out(q) ci dà l'insieme dei patterm riconosciuti quando entriamo in uno stato q.

Esempio di un Automa AC Le linee tratteggiate sono le transizioni di fallimento

Ricerca AC nel testo T[1..m] # Pseudocodice Python. q = 0 # stato iniziale root # range(m+1) funzione che restituisce # interi da 1 a m. for i in range(1,m+1): while (not Empty(g(q,T[i]))): q =f(q); # segui un fallimento q = g(q,t[i]);# segui un goto if (not Empty(out(q))): print i,out(q)

Primo esempio con le pycap

libnids riassembla gli stream IP NIDS E box (event generation box) Userland TCP/IP stack Rimarca lo stack IP di Linux 2.0.36 IP internamente Si basa su libnet e libpcap IP fragment reassembly

Userland Kernel IP stack

Userland Kernel Libnids IP stack IP stack

Fasi di Libnids Inizializzazione nids_init() Registrazione callback nids_register_tcp() nids_regster_ip() nids_regiser_udp() Esecuzione nids_run() Reazione nids_kill_tcp()

nids_run() TCP callback TCP stream object: - TCP state - client data - server data - source IP, port - dest IP, port - seq, ack, etc UDP callback UDP packet: - source IP, port - dest IP, port - UDP payload IP callback IP packet - struct IP packet

Automa di libnids NIDS_JUST_ESTABLISHED L'handshake TCP ha avuto luogo Devi impostare stream->{client,server}. collect=1 per ottenere i payload raccolti NIDS_DATA Ci sono dati e la connessione è stata stabilita NIDS_RESET, NIDS_CLOSE, NIDS_TIMED_OUT La connessione TCP è stata persa, resettata o si è verificato un timeout l

Introduzione a pynids Interfaccia event driven (nids_run(), nids_next()) TCP stream reassembly espone lo stato TCP Crea un oggetto TCP Mantiene gli indirizzi, i dati, ecc Riassembly TCP

Passi di base per Libnids Inizializzazione nids_init() Stabiliamo un parametro nids.param( attribute, value) Registriamo le callback nids.register_tcp(handletcp) def handletcp(tcp): Esecuzione! nids_run() while 1: nids_next()

TCP Posso creare nuovo stato interno o riusare Append data L'elaborazione secondo lo stato che vede la callback UDP o IP? L'elaborazione (stateless) avviene nella callback Elaborazione locale in Pynids Nota: Ho registrato le callback. Durante il transito dei pacchetti cosa succede?

Esempio di codice (Python) import nids <handletcpstream> def main(): nids.param("scan_num_hosts", 0) if not nids.init(): print "error -", nids.errbuf() sys.exit(1) nids.register_tcp(handletcpstream) try: nids.run() # loop forever except KeyboardInterrupt: sys.exit(1)

Esempio di codice Python def handletcpstream(tcp): if tcp.nids_state == nids.nids_just_est: if dport in (80, 8000, 8080): tcp.client.collect = 1 tcp.server.collect = 1 elif tcp.nids_state == nids.nids_data: tcp.discard(0) elif tcp.nids_state in end_states: print "addr:", tcp.addr # may be binary print "To server:, tcp.server.data print "To client:, tcp.client.data

Esempio di codice in C int main(int argv, char *argv[]) { if (nids_init() == 0) err(1, error, %s, nids_errbuf); nids_register_tcp(handletcp); nids_run(); exit(0); }

Esempio di codice in C int handletcp(struct tcp_stream *tcp) { switch (tcp->nids_state) { case NIDS_JUST_EST : if ((tcp->addr.dest == 80) (tcp->addr.dest == 8000) (tcp->addr.dest == 8080) { tcp.server.collect = 1; tcp.client.collect = 1; } break; case NIDS_DATA : nids_discard(tcp, 0); break; case NIDS_CLOSE : case NIDS_RESET : case NIDS_TIMED_OUT : printf( ((%s, %d), (%s, %d))\n, inet_ntoa(tcp->saddr), tcp.srce, } } inet_ntoa(tcp->daddr), tcp.dest); printf( %s\n, tcp->server.data); printf( %s\n, tcp->client.data); break; Quasi le stesse LoC prima di manipolare le stringhe

VersionDetect Semplice programma Python scritto da Nazario Rileva la versione di diversi protocolli Supporto per : SSH (client, server), WWW (client, server), e SMTP Motivazione: raccogliere dati per fare stack fingerprinting 63.236.16.161 SymbianOS 6048 (on Nokia 7650?) www 80/tcp 63.236.16.161: 80: Microsoft-IIS/6.0

Output di VersionDetect 192.168.1.7: 22: SSH-2.0-OpenSSH_3.5 192.168.1.101:http: Mozilla/5.0 (X11; U; OpenBSD i386; en- US; rv:1.5a) Gecko/20031030 Mozilla Firebird/0.6.1 168.75.65.85: 80: Microsoft-IIS/5.0 165.1.76.60: 80: Netscape-Enterprise/3.6 SP2 168.75.65.69: 80: Microsoft-IIS/5.0 168.75.65.87: 80: Microsoft-IIS/5.0 69.28.159.7: 80: ZEDO 3G 198.65.148.234: 80: Apache/1.3.29 (Unix) PHP/4.3.3 216.150.209.231: 80: Apache/1.3.31 (Unix) 212.187.153.30: 80: Apache/1.3.31 (Unix) 212.187.153.37: 80: Apache/1.3.31 (Unix) 212.187.153.32: 80: thttpd/2.25b 29dec2003 64.209.232.207: 80: Apache/1.3.27 (Unix) mod_perl/1.27 216.239.39.99: 80: CAFE/1.0

Controllare dati con pynids Nota: tcp.{server, client}.data sono solo stringhe Allora: funzionera ogni manipolazione di stringhe Ricerca if HTTP/1.0 in tcp.client.data: Ricerca mediante espressioni regolari if re.search( HTTP/1.[10], tcp.client.data): Sostituzione di parti di stringhe string.replace(req, GET HTTP/1.0,, 1)

Risorse http://www.tcpdump.org/ http://www.packetfactory.net/projects/libnids/ http://monkey.org/~provos/libevent/ http://monkey.org/~dugsong/{dpkt, pycap} http://oss.coresecurity.com/projects/pcapy.html http://monkey.org/~jose/software/flowgrep/ http://pilcrow.madison.wi.us/pynids/

Thanks Antonio Cisternino <cisterni@di.unipi.it>

Thanks