2016-03-28 2 views
5

Я использую продукты F5 Networks Big-IP, которые добавляют настраиваемый кадр трейлера Ethernet II для целей отладки. Я пытаюсь с Scapy связать новый слой для этого трейлера, но я не могу этого сделать.Scapy - Как рассечь поле трейлера Ethernet

Я вижу полезную нагрузку, интересующую поле Padding, но используя bind_layers не выполняет надлежащего раскрытия требуемой секции заполнения.

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) 

Одно решение, которое я думал было создать новый Ethernet класса замены (или перегружена), который я могу тогда относится к типичной полезной нагрузки Ethernet и мой новый трейлер. Но я не супер программист Python/scapy, и я не уверен, что это лучший вариант.

Вот как Scapy в настоящее время отображает мой пакет после применения bind_layers (TCP, MyEthTrailer). Информацию я должен иметь синтаксического анализа находится в Padding классе

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

[ОБНОВЛЕНИЕ-1]

можно заставить декодирования пакета TCP SYN путем вызова:

packet[TCP].decode_payload_as(MyEthTrailer) 

Тем не менее, метод bind_layers , похоже, не работает автоматически, и это не работает с более сложным пакетом, потому что он смешивает TCP Padding с полезной нагрузкой MyEthTrailer.

[ДОПОЛНЕНО-2]

Я получил это частично работает, но каждый пакет должен быть литыми правильно, то я могу прочитать полезную нагрузку прицепа и декодировать его. Например, если пакет является TCP/DNS/MyEthTrailer, это будет работать. Если я не знаю, что это DNS, и он не настроен должным образом, он все еще смешан в полезной нагрузке TCP и Padding.

Ваша помощь приветствуется.

+0

Источник плагина F5 находится здесь: https://devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ashx. Надеюсь, это поможет вам изолировать. –

ответ

0

Я смог сделать это, перегрузив функцию pre_dissect моего нового пользовательского класса MyEthTrailer. Я пытаюсь проанализировать полезную нагрузку последнего слоя с Padding и проверить, имеет ли он правильную длину.

Это ручка с 2 вещами:

ЧАСТЬ 1 рассекать раздел
class MyEthTrailer(Packet): 
    def pre_dissect(self,s): 
     verify_if_payload_is_mine_and_assign_fields() 
ЧАСТЬ 2 Руководство Force полезной расшифровывает
_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 

Я вывешу все решение Github и обновлять здесь, если кто-то заинтересован ,

+0

Мне было бы интересно увидеть ссылку GitHub, так как у меня возникла проблема с форсированием пользовательского уровня. Я просто пытаюсь выполнить пакет [TCP] .decode_payload_as (MyEthTrailer). –