5

私は F5 Networks Big-IP 製品を使用しています。これには、デバッグ用にカスタムの Ethernet II トレーラ フレームが追加されています。このトレーラー用に新しいレイヤーをバインドするために Scapy を使用していますが、実行できません。

パディング フィールドに目的のペイロードが表示されますが、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)

私が考えていた解決策の 1 つは、新しいイーサネット置換クラス (またはオーバーロードされたクラス) を作成することでした。これにより、通常のイーサネット ペイロードと新しいトレーラを参照できます。しかし、私は超 Python/scapy プログラマーではないので、これが最善の選択肢であるかどうかはわかりません。

これは、bind_layers(TCP,MyEthTrailer) を適用した後、Scapy が現在パケットをマップする方法です。解析する必要がある情報は 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 パディングと MyEthTrailer ペイロードを混同しているため、より複雑なパケットでは機能しません。

[更新-2]

部分的に動作するようになりましたが、すべてのパケットを適切にキャストする必要があります。その後、トレーラー ペイロードを読み取ってデコードできます。たとえば、パケットが TCP/DNS/MyEthTrailer の場合、これは機能します。それが DNS だとわからず、適切に設定されていない場合でも、TCP ペイロードとパディングに混在しています。

あなたの助けに感謝します。

4

1 に答える 1

0

新しいカスタム クラス MyEthTrailer の pre_dissect 関数をオーバーロードすることで、これを行うことができました。パディングのある最後のレイヤーのペイロードを解析して、正しい長さかどうかを確認しようとしました。

これは2つのことで処理されます:

パート 1 解剖セクション
class MyEthTrailer(Packet):
    def pre_dissect(self,s):
        verify_if_payload_is_mine_and_assign_fields()
パート 2 手動強制ペイロード デコード
_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 に投稿し、興味があればここで更新します。

于 2016-04-07T12:47:39.287 に答える