Guida Creare uno Sniffer in python (pt.1)

Stato
Discussione chiusa ad ulteriori risposte.

Takara

Utente Electrum
5 Ottobre 2012
209
18
12
104
Ultima modifica:
Sniffare pacchetti su Windos e Linux

Accedere ai socket raw in Windows è leggermente diverso che su Linux, ma vogliamo avere la flessibilità di fare il deploy dello stesso sniffer su diverse piattaforme. Creeremo il nostro socket object e poi stabilizzeremo su quale piattaforma lo eseguiremo. Windows ci richiede di impostare alcuni flag addizionali attraverso un controllo di input/output (IOCTL) del socket , il quale abilità una modalità promiscua sull'interfaccia di rete. Nel nostro primo esempio , imposteremo semplicemente il nostro raw socket sniffer, leggeremo un singolo pacchetto e poi usciremo dal programma.
Python:
import socket
import os

#host sul quale ascoltare
host="192.168.1.27"

#crea un socket raw e assegnalo all'interfaccia pubblica
if os.name == "nt" :  #(1)
    socket_protocol = socket.IPPROTO_IP
else:
    socket_protocol = socket.IPPROTO_ICMP

sniffer = socket.socket (socket.AF_INET, socket.SOCK_RAW , socket_protocol)

sniffer.bind((host,0))

#vogliamo l'header IP incluso nella cattura
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) #(2)

#se siamo su Windows dobbiamo spedire un IOCTL
#per impostare la modalita' promiscua
if os.name == "nt" : #(3)
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

#leggi un singolo pacchetto
print sniffer.recvfrom(65565) #(4)

#se siamo su Windows , disabilitiamo la modalita' promiscua
if os.name =="nt" : #(5)
    sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

Iniziamo costruendo il nostro oggetto socket con i parametri necessari per sniffare i pacchetti sulla nostra interfaccia di rete (1). Ladifferenza tra Windows e Linux è che Windows ci consentirà di sniffare tutti i pacchetti in arrivo , indipendentemente dal protocollo , mentre Linux ci obbliga a indicare che vogliamo sniffare ICMP. Notete che stiamo usando la modalità promiscua , la quale richiede privilegi di amministrazione su Windows o di root su Linux. La modalità promiscua ci consente di sniffare tutti i pacchetti che la scheda di rete vede, anche quelli non destinati al nostro host specifico. Impostiamo poi una opzione del socket (2) che include gli header IP nei pacchetti catturati. Il prossimo step (3) è stabilire se stiamo usando Windows e, in questo caso, eseguiamo lo step addizionale per inviare un IOCTL al driver della scheda di rete in modo da abilitare la modalità promiscua. Se state eseguendo Windows in una macchina virtuale , probabilmente otterrete una notifica che il sistema operativo ospite sta abilitando la modalità promiscua ; facciamo click per accettare. Adesso siamo pronti per fare realmente dello sniffing e, in questo caso, stiamo semplicemente stampando a video l'intero pacchetto raw (4) senza alcuna decodifica. Questo ci serve giusto per verificare che il cuore del codice del nostro sniffer funzioni. Dopo che un singolo pacchetto è stato sniffato, verifichiamo ancora per Windows e disabilitiamo la modalità promiscua (5) prima di uscire dallo script.

Proviamo lo script :

Apriamo un nuovo terminale o una shell cmd.exe sotto Windows ed eseguite il seguente comando :
Codice:
python sniffer.py

In un altro terminale prendete un host da interrogare. Nel mio caso faccio il ping su www.inforge.net
Codice:
ping www.inforge.net

Nella prima finestra , dove avete eseguito il vostro sniffer , dovreste vedere in output il traffico catturato, che somiglia al seguente :
Codice:
('E\xa0\x00T\xc9\xb6\x00\x006\x01?\x08\xc0|\xf9\n\xc0\xa8\x01\x1b\x00\x00\x00\xb7\x0f>\x00\x01\x9d\x7f\x9eZ\x00\x00\x00\x00\xf2\\\x03\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567', ('192.124.249.10', 0))


Potete vedere che abbiamo catturato la richiesta iniziale del ping ICMP destinata a www.inforge.net . Se state eseguendo questo esempio su Linux, allora anche voi dovreste ricevere la risposta da www.inforge.net . Sniffare un pacchetto non è molto utile , per cui nelle prossime guide vedremo come aggiungere alcune funzionalità per processare più pacchetti e decodificare il loro contenuto.

Fonte : BlackHat Python
 
Intanto ho realizzato un packet analyzer in Python che permette di vedere le info del pacchetto (IP destinatario, source, porte, payload, ecc...).

Anche se per il momento il programma è molto scarno.

Appena aggiungo nuove features lo posto qui.
 
Stato
Discussione chiusa ad ulteriori risposte.