2016-07-11 4 views
0

Ich habe einen einfachen Paket-Sniffer mit Raw-Socket in Python erstellt.Python TCP Raw-Socket nicht auf Lo (localhost/127.0.0.1)

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 

while True: 
    print s.recvfrom(1600) 

Der Internetverkehr, den es zeigt. Aber wenn ich die primäre Netzwerkschnittstelle abschalten und syn-Pakete mit scapy über die Schnittstelle lo (Quelle und Ziel 127.0.0.1) senden, wird nichts gedruckt.

Grundsätzlich erstelle und sende ich 10 syn-Pakete mit scapy, dessen Quelle und Ziel 127.0.0.1 ist, was in wireshark sichtbar ist. Aber nicht in diesem Sniffer. Ich dachte, es könnte ein Problem mit der Länge geben. Also setze ich die Puffergröße auf die Größe eines syn-Pakets, d. H. 74 (s.recvfrom(74)), aber immer noch nichts. Sobald ich die primäre Netzwerkschnittstelle wieder einschalte, zeigt es den gesamten TCP-Verkehr an.

Ich muss die Netzwerkschnittstelle ausschalten, damit ich keinen anderen Verkehr als meinen eigenen erhalte.

Wo gehe ich falsch damit?

+1

Da Ihr Level '0x000' ist, muss der Socket' 0x003' (ETH_ALL) erstellt werden. Aber eine Frage: "Wie bekomme ich ein Paket ohne Daten?" Und Sie müssen 'Loopback' hören, aber alles Paket gehört Ihnen nicht. Andere Pakete auf der Internetschnittstelle automatisch ignoriert, wenn das eingehende Paket nicht deins ist! – dsgdfg

+0

Mit ETH_ALL nach der Antwort von @dsgdfg, erhält es den Ethernet-Header und es schnüffelt alle UDP-, ICMP-, TCP-Pakete. Was ich im "Loopback" sende, ist nur TCP. Also, wenn ich das hören will, was soll ich tun? – RatDon

Antwort

1

Unter Linux:

soc = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3)) 
soc.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) 
soc.bind(("eth0",0x0003)) 

Need RAW nicht TCP zu öffnen.

Einfüg.Nummer Kommentar:

a = soc.recvform(65565)[0] 
h = binascii.hexlify(a) 
if h[24:30] == "080045" and h[46:48] == "06": 
# h[24:30] == "080045" Means IP (Type field of Ethernet Header 
#    combined with IP Version and IP header length) 
# h[46:48] == "06" Means TCP (Ip Protocol field of IP Header) 

    #do something with TCP packet 

"080045" bedeuten:

0800 = IP
4 = IP-Version (IPv4)
5 = Kopflänge (5 Wörter von je 4 Byte)

+0

Es wird alle UDP, ICMP, TCP-Pakete erfassen. Was ich da nicht will, da muss ich das Paket parsen und einen Filter hinzufügen, um nur TCP zu bekommen. Ist es möglich, nur TCP-Pakete in allen Schnittstellen oder spezifischen Schnittstellen zu hören, was auch immer ich erwähne. – RatDon

+0

@RatDon aktualisierte Antwort! – dsgdfg

+0

Können Sie den Zahlenteil erklären: '08004500'? Im Allgemeinen ist das '24'te Byte das' IP-Protokoll'-Feld und für TCP sollte es '06' sein. Es ist ein einzelnes Byte, daher wird es nicht von der Netzwerk-Byte-Reihenfolge beeinflusst. Kannst du bitte Erklären? – RatDon