2016-03-28 36 views
5

sto usando i prodotti F5 Networks BIG-IP, che sono l'aggiunta di un Ethernet II telaio del rimorchio su misura per il debug. Sto provando con Scapy a legare un nuovo livello per questo trailer, ma non sono in grado di farlo.Scapy - Come sezionare un campo Trailer Ethernet

posso vedere il carico utile di interesse nel campo del riempimento ma utilizzando bind_layers non esegue la corretta dissezione della sezione di riempimento desiderato.

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) 

Una soluzione che stavo pensando era quello di creare una nuova classe di sostituzione Ethernet (o sovraccarico), che posso poi si riferisce alla tipica payload Ethernet e il mio nuovo trailer. Ma io non sono un super programmatore di Python/scapy, e non sono sicuro che questa sia l'opzione migliore.

Questo è il modo in Scapy attualmente associa il mio pacchetto dopo applico bind_layers (TCP, MyEthTrailer). Le informazioni che ho dovuto parse è nella classe Imbottitura

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

posso forzare la decodifica di un pacchetto TCP SYN chiamando [UPDATE-1]

:

packet[TCP].decode_payload_as(MyEthTrailer) 

Tuttavia, il metodo bind_layers , non sembra funzionare automaticamente, e questo non funziona con più complesso pacchetto perché è mescolare TCP Imbottitura con MyEthTrailer payload.

[UPDATE-2]

ho preso parte a lavorare, ma ogni pacchetto deve essere colato correttamente, allora posso leggere il payload rimorchio e decodificarlo. Ad esempio se un pacchetto è TCP/DNS/MyEthTrailer, funzionerà. Se non so che è DNS, e non è impostato correttamente, è ancora mescolato nel carico utile TCP e Padding.

vostro aiuto è apprezzato.

+0

L'origine del plug-in F5 è qui: https://devcentral.f5.com/wiki/AdvDesignConfig.F5WiresharkPlugin.ashx. Spero che questo ti aiuterà a isolare. –

risposta

0

Sono stato in grado di farlo sovraccaricando la funzione pre_dissect della mia nuova classe personalizzata MyEthTrailer. Cerco di analizzare il payload dell'ultimo livello che contiene Padding e verificare se ha la lunghezza corretta.

Si tratta di maneggiare con 2 cose:

PARTE sezione 1 sezionare
class MyEthTrailer(Packet): 
    def pre_dissect(self,s): 
     verify_if_payload_is_mine_and_assign_fields() 
PARTE 2 Manuale di Forza payload decodifica
_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 

mi post l'intera soluzione per Github e aggiornare qui se qualcuno è interessato .

+0

Sarei interessato a vedere un collegamento GitHub per favore - poiché sto avendo un problema che impone la decodifica di un livello personalizzato. Sto solo provando l'implementazione del pacchetto [TCP] .decode_payload_as (MyEthTrailer). –