scapy で pcap から snmptrap パケットを再現して送信

Python で pcap から snmptrap のパケットを再現

業務上、snmptrap を生成して trapper の検証をする必要があったため、以下のツールを作成した。
参考 Sending packets from pcap with changed src/dst in scapy
import argparse

from scapy.all import *

class SNMPTrapGenerator(object):
    def __init__(self, infile, dst_ip, src_ip=None):
            self.rd = PcapReader(infile)
            self.dst_ip = dst_ip
            self.src_ip = src_ip
        except IOError:
            print "Failed reading file %s contents" % infile

    def send(self, count=100):
        pkt_cnt = 0
        p_out = []

        for p in self.rd:
            pkt_cnt += 1
            np = p.payload
            if IP in np and UDP in np:
                np[IP].dst = self.dst_ip
                if self.src_ip is not None:
                    np[IP].src = self.src_ip
                del np[IP].chksum
                del np[UDP].chksum
                if pkt_cnt % count == 0:
                    p_out = []

        # Send remianing in final batch
        print "Total packets sent %d" % pkt_cnt

def main():
    parser = argparse.ArgumentParser(prog="snmptrapgen", add_help=True)
    parser.add_argument("-f", "--file", type=str,
                        required=True, help="Specify .pcap file.")
    parser.add_argument("-d", "--dst_ip", type=str,
                        required=True, help="Sepcify destination ip address.")
    parser.add_argument("-s", "--src_ip", type=str,
                        required=False, help="Specify source ip address.p")
    args = parser.parse_args()

    stg = SNMPTrapGenerator(args.file, args.dst_ip)

if __name__ == "__main__":


scapy と pypcap が必要であるため、以下のコマンドでインストールする。

# yum -y install libpcap-devel python-pip
# pip install scapy pypcap

あとは自前の pcap ファイルを使って snmptrapd などのサーバーに投入することができる。
頑張れば scapy で好きなパケットを作れたりするので試験したいパケットなどがあれば積極的に使っていきたい。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.