2014-10-09 12 views
6

È possibile utilizzare la funzione srp() per un pacchetto ICMP di livello 3? Vedo che quando realizziamo un pacchetto di richiesta echo ICMP e usiamo sr() per inviare/ricevere, NON lo vediamo inviato dall'interfaccia, quindi nessuna risposta dalla destinazione. Ma lo stesso pacchetto se usiamo la funzione srp() vediamo la risposta. Quando dovremmo usare sr() e quando srp()? Nella documentazione si afferma che sr() deve essere usato per il pacchetto L3 e srp() da utilizzare per L2? Ma nel mio caso non sono sicuro del motivo per cui sr() non funzioni per un pacchetto ICMP? Alcuni esperti possono aiutarmi a capire?invio di pacchetti ICMP in scapy e scelta dell'interfaccia corretta

Inoltre, qualcuno può farmi sapere se l'argomento "iface" è sempre necessario. Senza questo, come farà lo scapy a sapere attraverso quale interfaccia si suppone che mandi il pacchetto?

Caso 1: la funzione sr() con iface come argomento:

sr(icmp,iface="eth0") 

Begin emissione:

WARNING: Mac address to reach destination not found. Using broadcast. 
Finished to send 1 packets. 
^C 
Received 0 packets, got 0 answers, remaining 1 packets 
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>) 

Soprattutto non vedo alcuna risposta ICMP dal IP 192.168.25.1

Caso 2: funzione sr() senza iface:

sr(icmp) 
.Begin emission: 
......WARNING: Mac address to reach destination not found. Using broadcast. 
.Finished to send 1 packets. 
...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C 
Received 887 packets, got 0 answers, remaining 1 packets 
(<Results: TCP:0 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:1 Other:0>) 

Se si vede sopra i pacchetti ricevuti è più, ma non vedo alcuna risposta ICMP.

Caso 3: invio del pacchetto ICMP con SRP() invece di sr():

srp(icmp,iface="eth0") 
Begin emission: 
Finished to send 1 packets. 
* 
Received 1 packets, got 1 answers, remaining 0 packets 
(<Results: TCP:0 UDP:0 ICMP:1 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>) 

Qui ho usato la funzione invece della funzione sr() SRP() e ora vedo che la richiesta echo ICMP è stata inviata correttamente e ho ricevuto anche la risposta.

>>> icmp.show2() 
###[ Ethernet ]### 
    dst: 02:00:00:11:01:03 
    src: 02:00:20:ee:64:01 
    type: 0x800 
###[ IP ]### 
    version: 4L 
    ihl: 5L 
    tos: 0x0 
    len: 28 
    id: 1 
    flags: 
    frag: 0L 
    ttl: 64 
    proto: icmp 
    chksum: 0xc78c 
    src: 192.168.25.2 
    dst: 192.168.25.1 
    \options\ 
###[ ICMP ]### 
     type: echo-request 
     code: 0 
     chksum: 0xf7ff 
     id: 0x0 
     seq: 0x0 
>>>     

risposta

3

La funzione sr per la official API documentation:

sr(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0)

inviare e ricevere pacchetti al livello 3 utilizzando il conf.L3socket SuperSocket.

La funzione srp:

srp(pkts, filter=None, iface=None, timeout=2, inter=0, verbose=None, chainCC=0, retry=0, multi=0, iface hint=None)

Come srp ma per lavorare a livello 2 con conf.L2socket SuperSocket.

Dal momento che il pacchetto deve ICMP suo strato 2 campi riempiti così, come dimostra l'uscita di ICMP.show2(), si dovrebbe utilizzare la funzione srp.Se li avessi lasciati intatti, come fatto in this tutorial, avresti potuto usare la funzione sr.


Ora, per quanto riguarda le tue domande su classificazione ICMP s' come un protocollo di livello 2 o un protocollo di livello 3. Molti pensano che sia un protocollo di livello 3, come here, poiché utilizza l'intestazione IP e "si siede" sopra di esso. Tuttavia, altri ritengono che si tratti di un protocollo di livello 2 come here. This is a question con alcune buone risposte su questo problema, ma si noti che si riferiscono al modello OSI, quindi la numerazione dello schema di stratificazione è leggermente diversa. Questa è la migliore che sono riuscito a trovare, da here:

IP stesso non ha alcun meccanismo per stabilire e mantenere una connessione, o addirittura che contiene i dati come un payload diretta. Internet Control Messaging Protocol è semplicemente un'aggiunta all'IP per trasportare messaggi e dati di errore, di routing e di controllo ed è spesso considerata come un protocollo del livello di rete.

EDIT - Ho appena incontrato this link, e ho pensato che vale la pena una menzione:

ICMP è un protocollo all'interno dello stack TCP/IP che esistono fondamentalmente per fornire messaggi di controllo, la risoluzione dei problemi, e di errore . Funziona su IP, come TCP e UDP, ma è un protocollo di livello di rete, come IP, piuttosto che un protocollo di livello di trasporto come TCP e UDP. (Sì, questo è un po 'strano, che ICMP è incapsulato all'interno di IP pur essendo sullo stesso livello come IP Ma poi di nuovo, si può incapsulare IP all'interno IP pure..)

RFC 792 è anche abbastanza esplicito:

ICMP, utilizza il supporto di base di IP come se fosse un protocollo di livello superiore, tuttavia, ICMP è in realtà una parte integrante di IP.

E così è RFC 1122:

ICMP è un protocollo di controllo che è considerato essere parte integrante di IP, sebbene sia architettonico stratificata su IP, cioè, utilizza IP per trasportare i suoi dati end-to-end proprio come un protocollo di trasporto come TCP o UDP.
...
Sebbene i messaggi ICMP siano incapsulati all'interno di datagrammi IP, l'elaborazione ICMP viene considerata (ed è in genere implementata come) parte del livello IP.


quanto riguarda la tua ultima domanda su come specificare esplicitamente l'interfaccia, vedere scapy's tutorial:

La funzione send() invierà pacchetti a livello 3. Vale a dire che si occuperà di routing e livello 2 per tu. La funzione sendp() funzionerà al livello 2. Sta a te scegliere l'interfaccia giusta e il protocollo del livello di collegamento corretto.

La documentazione ufficiale API è un po 'più dettagliato:

Quando Scapy viene lanciato, le sue tabelle di routing sono sincronizzati con la tabella di routing del padrone di casa. Per un pacchetto inviato a livello 3, l'IP di destinazione determina l'interfaccia di uscita, l'indirizzo di origine e il gateway da utilizzare. Per un pacchetto di livello 2, è possibile definire l'interfaccia di output o fornire un suggerimento sotto forma di IP per determinare l'interfaccia di output. Se non viene fornita un'interfaccia di output o un suggerimento, viene utilizzato conf.iface.

particolare, il parametro iface viene usato per impostare l'interfaccia di ingresso (ma imposta anche l'interfaccia di uscita, se iface_hint non viene utilizzato):

iface: ascolta risposte solo sull'interfaccia disponibile

per accennando sull'interfaccia output, utilizzare iface_hint per lo strato 2 funzioni:

C'è anche un parametro aggiuntivo, iface_hint, che fornisce un suggerimento che può aiutare a scegliere l'interfaccia di uscita corretta. Per impostazione predefinita, se non specificato da iface, viene selezionato conf.iface. Il suggerimento assume la forma di un IP a cui il pacchetto del livello 2 potrebbe essere destinato. La tabella di routing Scapy (conf.route) viene utilizzata per determinare quale interfaccia utilizzare per raggiungere questo IP.

+1

Great Yoel. Ho creato un pacchetto ICMP senza dare l'Ether() e ho notato che sr() funziona come menzionato. Ho anche notato che la tabella di routing in Scapy era fuori sincrono. L'ho risincronizzato e ora stava prendendo l'uscita corretta iface per sr(). Grazie per la risposta immediata. – Pradeep