在 Python 中使用 Scapy 过滤 OPC UA 数据包



如何通过数据包的协议过滤传入的数据包?我在Python中使用Scappy,我想专门过滤OPC-UA数据包。我只找到了关于TCP数据包的示例。

from scapy.all import *
from scapy.layers.inet import IP,TCP,ICMP, Ether, UDP
interface = "eth0"   #Name of interface to be sniffed
sniff(iface=interface, prn=check_pkt, store=0, filter="opc")

遗憾的是,scapy 目前不支持 OpcUa。

但是,您可以通过使用标准 opc ua 端口进行过滤(即 4840(来实现您的目标。

filter = "port 4840"

还可以检查包中包含的字节,以便对 opc ua 包进行更详细的过滤。

例如:

filter = "(port 4840) " 
"and (tcp[20:4] = 0x4d534746) " 
"and ((tcp[46:2] = 0x3a03) or (tcp[46:2] = 0x7702)) "

这将过滤所有 Opc Ua 包,其中 message_type="MSG" 和 chunk_type="F" 是 ReadRequests 或 PublishRequests。

在这种情况下,tcp[20:4]表示"在 Tcp 数据包中从字节 20 开始并取接下来的 4 个字节",0x4d534746MSGF的十六进制表示形式。

有关伯克利数据包过滤器语法的更多信息,请参阅此处。

最新更新