首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新Python3 Scapy中特定的Netflow V 10/ IPFIX流数据字段?

如何更新Python3 Scapy中特定的Netflow V 10/ IPFIX流数据字段?
EN

Stack Overflow用户
提问于 2022-10-15 11:14:56
回答 1查看 103关注 0票数 0

场景

我有一个包含Netflow V 10/ IPFIX数据模板和数据流的PCAP,并希望重新播放PCAP。在发送数据包之前,我想更新一个流数据字段(即当前时间的startTime )。

当前代码

我当前的代码能够读取PCAP,获取最后一层(Netflowv10),创建一个套接字并通过接口发送数据包。套接字负责以太网-> IP -> UDP层,而Scapy中的'getlayer‘函数保留Netflow v10模板&数据流层,就像来自捐助方PCAP那样。

问题

我想要帮助的问题是,如何更新startTime流数据字段?

代码

我只为这个问题提供了与该问题有关的Python3代码,涉及Scapy。

代码语言:javascript
复制
packets = sniff(session=NetflowSession, offline=open(pcap_file, "rb"))

for packet in packets:

    if packet.haslayer(NetflowDataflowsetV9):
        # This return the NetflowDateflowset Records key/value pairs
        flowset = netflowv9_defragment(packet[NetflowDataflowsetV9].records)

变量'flowset‘返回一个列表,不是一个可调用的对象。纵观Scapy的文档,并没有提供太多的帮助。

如有任何建议或建议,将不胜感激。(预先谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-23 09:01:37

首先,这里不应该使用netflowv9_defragment:它与session=NetflowSession具有相同的效果,并且应该给出一个数据包列表。

流集的主要帮助页是https://scapy.readthedocs.io/en/latest/layers/netflow.html,但是在https://github.com/secdev/scapy/blob/master/test/scapy/layers/netflow.uts中也有一些测试用例给出了模块如何工作的信息。

你可以做这样的事

代码语言:javascript
复制
for packet in packets:
    if packet.haslayer(NetflowDataflowsetV9):
        for rec in packet.records:
            if 'startTime' in rec:
                rec.startTime = 12345

在我看来,构建示例是理解如何构建netflow数据包的一个很好的方法:

代码语言:javascript
复制
header = Ether()/IP()/UDP()
netflow_header = NetflowHeader()/NetflowHeaderV9()

# Let's first build the template. Those need an ID > 255.
# The (full) list of possible fieldType is available in the
# NetflowV910TemplateFieldTypes list. You can also use the int value.
flowset = NetflowFlowsetV9(
    templates=[NetflowTemplateV9(
        template_fields=[
            NetflowTemplateFieldV9(fieldType="IN_BYTES", fieldLength=1),
            NetflowTemplateFieldV9(fieldType="IN_PKTS", fieldLength=4),
            NetflowTemplateFieldV9(fieldType="PROTOCOL"),
            NetflowTemplateFieldV9(fieldType="IPV4_SRC_ADDR"),
            NetflowTemplateFieldV9(fieldType="IPV4_DST_ADDR"),
        ],
        templateID=256,
        fieldCount=5)
    ],
    flowSetID=0
)
# Let's generate the record class. This will be a Packet class
# In case you provided several templates in ghe flowset, you will need
# to pass the template ID as second parameter
recordClass = GetNetflowRecordV9(flowset)
# Now lets build the data records
dataFS = NetflowDataflowsetV9(
    templateID=256,
    records=[ # Some random data.
        recordClass(
            IN_BYTES=b"\x12",
            IN_PKTS=b"\0\0\0\0",
            PROTOCOL=6,
            IPV4_SRC_ADDR="192.168.0.10",
            IPV4_DST_ADDR="192.168.0.11"
        ),
        recordClass(
            IN_BYTES=b"\x0c",
            IN_PKTS=b"\1\1\1\1",
            PROTOCOL=3,
            IPV4_SRC_ADDR="172.0.0.10",
            IPV4_DST_ADDR="172.0.0.11"
        )
    ],
)
pkt = header / netflow_header / flowset / dataFS
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74078924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档