pcap から icmp のデータ部を取り出す

WaniCTF'21 で pcap から icmp のデータを抽出して jpeg を作成する問題の writeup で紹介されている Python スクリプトについてメモします。

以下のスクリプトで pcap から ICMP のデータ部を取り出すことができます。

#!/usr/bin/env python3.8
import scapy.all

with open("out.jpg", "wb") as f:
   packets = scapy.all.rdpcap("illegal_image.pcap")
   for p in packets.filter(lambda p: "ICMP" in p and p["IP"].src == "192.168.0.133"):
      f.write(p["ICMP"].load)

scapy を使用するためにはインストールが必要です。

$ sudo apt install python3-scapy

packets.filter 文が理解できないのですが、 取り敢えず lambda 関数の構文は以下の通りです。

lambda 引数 : 戻り値

分からない場合は素直に書くのがよいかもしれません。

for p in packets:
    if p.haslayer(ICMP):
        if p[IP].src == '192.168.0.133':
            data += p[Raw].load


参考
wanictf21spring-writeup/for/illegal_image at main · wani-hackase/wanictf21spring-writeup · GitHub
WaniCTF'21-spring write-up - プログラム系統備忘録ブログ