2014-10-09 5 views
6

Können wir die srp() -Funktion für ein Layer-3-ICMP-Paket verwenden? Ich sehe, dass wenn wir ein ICMP-Echo-Request-Paket erstellen und sr() zum Senden/Empfangen verwenden, wir es NICHT sehen, dass es aus der Schnittstelle gesendet wird, daher keine Antwort vom Ziel. Aber das gleiche Paket, wenn wir die srp() Funktion verwenden, sehen wir die Antwort. Wann sollten wir sr() und wann srp() verwenden? In der Dokumentation heißt es, sr() soll für L3-Paket und srp() für L2 verwendet werden? Aber in meinem Fall bin ich nicht sicher, warum sr() nicht für ein ICMP-Paket arbeitet? Können mir einige Experten helfen, das zu verstehen?Senden von ICMP-Paketen in scapy und Auswählen der richtigen Schnittstelle

Auch kann jemand mich wissen, ob "Iface" Argument immer benötigt wird. Ohne dass, wie wird scapy wissen durch welche Schnittstelle soll das Paket gesendet werden?

Fall 1: sr() Funktion mit iface als Argument:

sr(icmp,iface="eth0") 

Begin Emission:

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>) 

Above ich sehe keine ICMP-Antwort von der IP 192.168.25.1

Fall 2: sr() Funktion ohne 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>) 

Wenn Sie oben sehen, ist die empfangenen Pakete mehr, aber ich sehe keine ICMP-Antwort.

Fall 3: Senden der ICMP-Paket mit SRP() anstelle von 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>) 

Hier verwendete ich die SRP() Funktion anstelle von Sr() Funktion und jetzt sehe ich, dass Die ICMP-Echo-Anfrage wurde korrekt gesendet und ich erhielt auch die Antwort.

>>> 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 
>>>     

Antwort

3

sr Die Funktion der pro official API documentation:

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

Senden und Empfangen von Paketen auf Schicht 3, um die conf.L3socket Supersocket verwenden.

Die srp Funktion:

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

Selber wie srp aber auf Schicht 2 mit conf.L2socket Supersocket arbeiten.

Da Ihr ICMP Paket seine Schicht 2 Felder wie gut gefüllt hat, wie durch die Ausgabe von ICMP.show2() gezeigt, sollten Sie die srp-Funktion verwenden.Hätten Sie sie unberührt gelassen, wie in this tutorial getan, könnten Sie die sr Funktion verwendet haben.


nun in Bezug auf Ihre Frage zu ICMP ‚s Einstufung als Schicht-2-Protokoll oder ein Schicht-3-Protokoll. Viele denken, dass es ein Layer-3-Protokoll ist, wie here, da es den IP Header verwendet und "sitzt" darüber. Andere betrachten es jedoch als ein Schicht-2-Protokoll wie here. This is a question mit einigen guten Antworten zu diesem Thema, aber beachten Sie, dass sie sich auf das Modell OSI beziehen, so dass die Layering-Schema-Nummerierung ein bisschen anders ist. Dies ist das beste, das ich habe es geschafft, ausfindig zu machen, von here:

IP selbst hat keinen Mechanismus für den Aufbau und die Aufrechterhaltung der Verbindung, oder auch Daten als direkte Nutzlast enthält. Internet Control Messaging Protocol ist lediglich eine Ergänzung zu IP, um Fehler, Routing und Steuern von Nachrichten und Daten zu übertragen, und wird oft als Protokoll der Netzwerkschicht betrachtet.

EDIT - ich habe this link gerade begegnet, und dachte, es ist eine Erwähnung wert:

ICMP ist ein Protokoll, in dem TCP/IP-Stack, der im Grunde existiert Kontrolle, Fehlersuche zur Verfügung zu stellen, und Fehlermeldungen . Es läuft über IP, wie TCP und UDP, ist aber ein Netzwerk-Layer-Protokoll, wie IP, anstatt ein Transport-Layer-Protokoll wie TCP und UDP sind. (Ja, das ist irgendwie seltsam, dass ICMP in IP gekapselt ist auf der gleichen Ebene wie IP, während sie aber dann wieder, Sie IP in IP als auch einkapseln können..)

RFC 792 auch ziemlich explizit:

ICMP, verwendet die grundlegende Unterstützung von IP, als ob es ein höheres Protokoll wäre, jedoch ist ICMP tatsächlich ein integraler Bestandteil von IP.

Und so ist RFC 1122:

ICMP ist ein Steuerprotokoll, das betrachtet wird, ein integraler Bestandteil des IP zu sein, obwohl es architektonisch Schicht auf IP ist, das heißt, es nutzt IP, seine Daten zu tragen Ende-zu-Ende genauso wie ein Transportprotokoll wie TCP oder UDP.
...
Obwohl ICMP-Nachrichten in IP-Datagrammen gekapselt sind, wird die ICMP-Verarbeitung als Teil der IP-Schicht betrachtet (und wird in der Regel als solche implementiert).


In Bezug auf Ihre letzte Frage Angabe über explizit die Schnittstelle finden scapy's tutorial:

Die send() Funktion Pakete auf Schicht sendet 3. Das heißt, es sagen Routing und Layer behandelt 2 für Sie. Die sendp()-Funktion wird auf Schicht 2 funktionieren. Es liegt an Ihnen, die richtige Schnittstelle und das richtige Link-Layer-Protokoll zu wählen.

Die offizielle API-Dokumentation ist ein wenig ausführlicher:

Wenn scapy gestartet wird, werden die Routing-Tabellen synchronisiert mit der Routing-Tabelle des Hosts. Für ein Paket, das auf Schicht 3 gesendet wird, bestimmt die Ziel-IP die Ausgangsschnittstelle, die Quelladresse und das zu verwendende Gateway. Für ein Schicht-2-Paket kann die Ausgabeschnittstelle präzisiert werden, oder ein Hinweis kann in Form einer IP gegeben werden, um die Ausgabeschnittstelle zu bestimmen. Wenn keine Ausgabeschnittstelle oder kein Hinweis angegeben wird, wird conf.iface verwendet.

Insbesondere wird die iface Parameter für die Einstellung der Eingangsschnittstelle (sondern setzen auch die Ausgangsschnittstelle, wenn iface_hint nicht verwendet wird) verwendet:

iface: hören Antworten nur an der vorgesehenen Schnittstelle

für Hinting auf der output Schnittstelle verwenden iface_hint für die Schicht-2-Funktionen:

Es gibt auch einen zusätzlichen Parameter, iface_hint, der einen Hinweis gibt, der bei der Auswahl der richtigen Ausgabeschnittstelle helfen kann. Wenn nicht durch iface angegeben, wird conf.iface standardmäßig ausgewählt. Der Hinweis nimmt die Form einer IP an, zu der das Schicht-2-Paket bestimmt sein könnte. Die Scapy-Routing-Tabelle (conf.route) wird verwendet, um zu bestimmen, welche Schnittstelle verwendet werden soll, um diese IP zu erreichen.

+1

Große Yoel. Ich habe ein ICMP-Paket erstellt, ohne den Ether() zu geben, und mir ist aufgefallen, dass sr() wie erwähnt funktioniert. Ich bemerkte auch, dass die Routing-Tabelle in Scapy nicht synchron war. Ich habe es wiedereingestellt und nun nahm es den richtigen Ausgang für sr(). Danke für Ihre schnelle Antwort. – Pradeep

Verwandte Themen