2016-03-28 18 views
5

Ich verwende die Big-IP-Produkte von F5 Networks, die einen benutzerdefinierten Ethernet II-Trailer-Rahmen für Debugging-Zwecke hinzufügen. Ich versuche mit Scapy eine neue Ebene für diesen Trailer zu binden, aber ich kann das nicht.Scapy - Dissect eines Ethernet-Trailer-Felds

kann ich die Nutzlast von Interesse in dem Auffüll-Feld sehen, aber bind_layers mit Abschnitt nicht durchführt richtige Präparation des erforderlichen Padding.

class MyEthTrailer(Packet): 
    name = "Ethernet Trailer" 
    fields_desc = [ ####Fields Mapping Section ] 
    def dissect(self, s): 
     self.payl,self.pad = self.extract_padding(s) 
     s = self.do_dissect(self.pad) 

Eine Lösung, die ich dachte, war eine neue Ethernet-Ersatz-Klasse (oder überlastet) zu schaffen, die dann kann ich auf die typische Ethernet-Nutzlast und meine neue Trailer bezieht. Aber ich bin kein super Python/Scapy-Programmierer, und ich bin mir nicht sicher, ob dies die beste Option ist. Diese

ist, wie scapy zur Zeit mein Paket abbildet, nachdem ich bind_layers (TCP, MyEthTrailer) gelten. Die Informationen, die ich Parse haben sollte, ist in der Padding-Klasse

<Ether dst=00:00:00:00:00:00 src=00:00:00:00:00:01 type=0x8100 |<Dot1Q prio=0L id=0L vlan=01L type=0x800 |<IP version=4L ihl=5L tos=0x0 len=67 id=1 flags=DF frag=0L ttl=255 proto=tcp chksum=0x01 src=10.0.0.1 dst=10.0.1.1 options=[] |<TCP sport=1111 dport=https seq=1 ack=1 dataofs=5L reserved=0L flags=PA window=4380 chksum=0xb718 urgptr=0 options=[] |<MyEthTrailer |<Padding load='\xPayload of MyEtherTrailer' |>>>>>> 

[UPDATE-1]

Ich kann ein TCP-SYN-Paket-Kraft Decodierung durch den Aufruf:

packet[TCP].decode_payload_as(MyEthTrailer) 

jedoch die bind_layers Verfahren , scheint nicht automatisch zu funktionieren, und dies funktioniert nicht mit komplexeren Paketen, da es TCP-Padding mit MyEthTrailer-Nutzdaten vermischt.

[UPDATE-2]

Ich habe es zum Teil zu arbeiten, aber jedes Paket richtig gegossen werden muss, dann kann ich die Anhänger Nutzlast lesen und dekodieren. Zum Beispiel, wenn ein Paket TCP/DNS/MyEthTrailer ist, wird dies funktionieren. Wenn ich nicht weiß, dass es DNS ist, und es ist nicht richtig eingerichtet, ist es immer noch in TCP-Payload und Padding gemischt.

Ihre Hilfe wird geschätzt.

+0

Die F5-Plugin-Quelle ist hier: https://devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ashx. Hoffentlich hilft dir das bei der Isolierung. –

Antwort

0

Ich konnte dies tun, indem ich die pre_dissect-Funktion meiner neuen benutzerdefinierten Klasse MyEthTrailer überladen. Ich versuche, die Nutzlast der letzten Schicht mit Padding zu analysieren und zu überprüfen, ob sie die richtige Länge hat.

Dies ist mit 2 Dinge handhaben:

TEIL 1 sezieren Abschnitt
class MyEthTrailer(Packet): 
    def pre_dissect(self,s): 
     verify_if_payload_is_mine_and_assign_fields() 
TEIL 2 Handkraft Nutzlast dekodieren
_debug=True 

if re.match(r'F5\-Pseudo-\pkt.+tcpdump',str(packets[0][Raw])): 
     if re.match(r'.+CMD\:.+\-s0.+VER\:.+',str(packets[0][Raw])): has_F5_trailer=True 
     if re.match(r'.+CMD\:.+\:nnn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=3 
     elif re.match(r'.+CMD\:.+\:nn.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=2 
     elif re.match(r'.+CMD\:.+\:n.+VER\:.+',str(packets[0][Raw])): F5_trailer_noise_level=1 
     else: 
      if _debug: print "No F5 EthTrailer F5_Noise_level visible from packets[0]" 
    if has_F5_trailer: 
     #Skip the F5 first packet, which only contains the info. 
     for pk in packets[1:]: 
      try: 
       if isinstance(pk.lastlayer(),Padding): 
        pk.lastlayer().underlayer.decode_payload_as(MyEthTrailer) 
      except: 
       #Errorhandling 

Ich werde die ganze Lösung auf Github posten und hier aktualisieren, wenn jemand interessiert ist .

+0

Ich wäre daran interessiert, einen GitHub-Link zu sehen, da ich ein Problem habe, das die Dekodierung eines benutzerdefinierten Layers erzwingt. Ich versuche gerade die Implementierung von packet [TCP] .decode_payload_as (MyEthTrailer). –