Scapy - Как вскрыть поле трейлера Ethernet

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

Я вижу интересующую полезную нагрузку в поле Padding, но использование bind_layers не выполняет должного анализа требуемого раздела 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)

Одно из решений, которое я задумал, заключалось в создании нового класса замены 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.

Ваша помощь очень ценится.


person xlash    schedule 28.03.2016    source источник
comment
Источник подключаемого модуля F5 находится здесь: devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ash. Надеюсь, это поможет вам изолироваться.   -  person Jason Rahm    schedule 06.04.2016


Ответы (1)


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

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

PART 1 DISSECT section
class MyEthTrailer(Packet):
    def pre_dissect(self,s):
        verify_if_payload_is_mine_and_assign_fields()
PART 2 Manual Force payload decode
_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 и обновлю здесь, если кому-то интересно.

person xlash    schedule 07.04.2016
comment
Мне было бы интересно увидеть ссылку на GitHub, так как у меня возникла проблема с принудительным декодированием настраиваемого слоя. Я просто пытаюсь реализовать пакет [TCP] .decode_payload_as (MyEthTrailer). - person Tim Seed; 09.05.2016