2016-03-28 14 views
5

Używam produktów F5 Networks Big-IP, które dołączają niestandardową ramkę przyczepy Ethernet II do celów debugowania. Próbuję z Scapy związać nową warstwę dla tego zwiastuna, ale nie jestem w stanie tego zrobić.Scapy - jak zinterpretować pole Trailer Ethernetu

Widzę ładunek interesujący w polu Wypełnienie, ale użycie bind_layers nie przeprowadza właściwego rozbioru wymaganej sekcji Wypełnienie.

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) 

Jednym rozwiązaniem myślałem było stworzenie nowej klasy zastępczej Ethernet (lub przeciążona), które mogę potem odnosi się do typowego ładunku Ethernet i mój nowy trailer. Ale nie jestem super programistą Python/scapy i nie jestem pewien, czy to najlepsza opcja.

Oto jak Scapy obecnie mapuje mój pakiet po zastosowaniu bind_layers (TCP, MyEthTrailer). INFO powinien mieć analizy składniowej w klasie Dodat

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

można wymusić dekodowania pakietów TCP SYN pod numerem:

packet[TCP].decode_payload_as(MyEthTrailer) 

Jednakże sposób bind_layers , wydaje się nie działać automatycznie, a to nie działa w przypadku bardziej złożonego pakietu, ponieważ jest to mieszanie protokołu TCP Padding z ładunkiem MyEthTrailer.

[UPDATE-2]

mam to częściowo działa, ale każdy pakiet musi być odpowiednio lanego, to mogę przeczytać ładowność przyczepy i dekoduje go. Na przykład, jeśli pakiet to TCP/DNS/MyEthTrailer, to zadziała. Jeśli nie wiem, że to DNS, a nie jest poprawnie skonfigurowany, to nadal jest mieszany w ładunek TCP i wypełnienie.

Twoja pomoc jest doceniana.

+0

Źródło wtyczki F5 znajduje się tutaj: https://devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ashx. Mam nadzieję, że to pomoże ci się wyizolować. –

Odpowiedz

0

Udało mi się to zrobić przez przeciążenie funkcji pre_dissect mojej nowej klasy niestandardowej MyEthTrailer. Próbuję przeanalizować ładunek ostatniej warstwy, która ma wypełnienie i sprawdzić, czy ma prawidłową długość.

Jest to uchwyt z 2 rzeczy:

CZĘŚĆ sekcja 1 wnikliwie
class MyEthTrailer(Packet): 
    def pre_dissect(self,s): 
     verify_if_payload_is_mine_and_assign_fields() 
CZĘŚĆ 2 Podręcznik Siła ładowność dekodowania
_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 

będę pisać całe rozwiązanie Github i zaktualizować tutaj, jeśli ktoś jest zainteresowany .

+0

Byłbym zainteresowany widząc link GitHub proszę - jak mam problem zmuszając niestandardowej warstwy do odkodowania. Właśnie próbuję implementacji pakietu [TCP] .decode_payload_as (MyEthTrailer). –

Powiązane problemy