场景
我有一个包含Netflow V 10/ IPFIX数据模板和数据流的PCAP,并希望重新播放PCAP。在发送数据包之前,我想更新一个流数据字段(即当前时间的startTime )。
当前代码
我当前的代码能够读取PCAP,获取最后一层(Netflowv10),创建一个套接字并通过接口发送数据包。套接字负责以太网-> IP -> UDP层,而Scapy中的'getlayer‘函数保留Netflow v10模板&数据流层,就像来自捐助方PCAP那样。
问题
我想要帮助的问题是,如何更新startTime流数据字段?
代码
我只为这个问题提供了与该问题有关的Python3代码,涉及Scapy。
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的文档,并没有提供太多的帮助。
如有任何建议或建议,将不胜感激。(预先谢谢:)
发布于 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中也有一些测试用例给出了模块如何工作的信息。
你可以做这样的事
for packet in packets:
if packet.haslayer(NetflowDataflowsetV9):
for rec in packet.records:
if 'startTime' in rec:
rec.startTime = 12345在我看来,构建示例是理解如何构建netflow数据包的一个很好的方法:
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 / dataFShttps://stackoverflow.com/questions/74078924
复制相似问题