Wie ein IP-Paket mit bestimmten Hex-Nutzlast in Python schicken?
Frage
Ich habe ein IGMP-Paket schnupperte und jetzt würde Ich mag es, mit Hilfe von Python zu senden. Gibt es eine Möglichkeit, nur Sendepaket wie
0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 81 00 00 DE ..^.Cg..іИD?..Ю
0x0010 08 00 46 00 00 20 00 01-00 00 01 02 36 4C C0 A8 ..F.. ......6LАЁ
0x0020 00 7B EA 00 43 67 94 04-00 00 16 00 BC 97 EA 00 .{к.Cg”.....ј—к.
0x0030 43 67 Cg
ohne Paket-Generatoren wie impacket?
UPD Ok, habe ich versucht, Raw Sockets zu verwenden, wie folgt aus:
dst = '234.0.67.103'
# Open a raw socket.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW,2)
res=''
temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67'
for i in temp.split(' '):
res+=chr(int(i, 16))
print res
s.sendto(res, (dst, 0))
Alles ist in Ordnung bis auf eine Kleinigkeit ... Wenn ich dieses Paket schnüffeln, sieht es wie folgt aus:
0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 08 00 45 00 ..^.Cg..іИD..E.
0x0010 00 46 07 06 00 00 01 02-C4 25 C0 A8 00 7B EA 00 .F......Д%АЁ.{к.
0x0020 43 67 01 00 5E 00 43 67-00 02 B3 C8 7F 44 81 00 Cg..^.Cg..іИDЃ.
0x0030 00 DE 08 00 46 00 00 20-00 01 00 00 01 02 36 4C .Ю..F.. ......6L
0x0040 C0 A8 00 7B EA 00 43 67-94 04 00 00 16 00 BC 97 АЁ.{к.Cg”.....ј—
0x0050 EA 00 43 67 к.Cg
Wie Sie sehen können, aus irgendeinem Grund ignoriert Python meine Header und erstellt seine eigene. Wie kann ich das Problem beheben?
Lösung 2
Nun, wie ich sie verstehe, ist der einzige Weg, dies zu tun, ist scapy wie das in einer Art und Weise zu verwenden:
from scapy.all import *
a=Ether(import_hexcap())
<some dumped hex>
sendp(a)
Andere Tipps
Durch Unix Network Programming (3. ed):
sockfd = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# inform os about that program are compose ip header
sockfd.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, True)
Im Folgendes ist die Modifikation des Codes, den das rohe Paket senden wird:
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x8100)
s.bind(('eth0', 0x8100))
res=''
temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67'
for i in temp.split(' '):
res+=chr(int(i, 16))
s.send(res)