我正在尝试构建一个带有替罪羊的MODBUS包,但是Wireshark无法识别它。我的意思是,MODBUS被解释为TCP数据.
下面是Scapy的python代码:
from scapy.all import *
class Modbus(Packet):
name = "Modbus/tcp"
fields_desc = [ ShortField("Transaction Identifier", 1),
ShortField("Protocol Identifier", 0),
ShortField("Length", 5),
XByteField("Unit Identifier",0),
]
def make_test():
pkt = TCP(sport=502, dport=502)
return Ether()/IP(src="5.5.5.101",dst="5.5.5.100")/pkt/Modbus()
while True:
send(make_test())
有人知道怎么修理它吗?
发布于 2019-10-24 10:53:10
我运行了相同的代码并进行了2次更改,Wireshark将其识别为Modbus:
首先,在发送空数据包(n=0)时,长度字段的默认值必须是2,而不是5(根据维基百科,n+2)。
第二,您错过了字段函数代码。
最后,我的fields_desc看起来是这样的:
fields_desc = [ ShortField("Transaction Identifier", 1),
ShortField("Protocol Identifier", 0),
ShortField("Length", 2),
XByteField("Unit Identifier",0),
ByteField("Function Code", 0)
]
Wireshark抱怨是因为0实际上不是一个有效的函数代码,但它正确地将其解释为modbus。
发布于 2021-08-10 14:33:04
在您的代码中没有3路TCP握手,这意味着主机之间没有建立通信通道。为了解决这个问题,需要创建套接字。
这是我的代码,可能对其他人有帮助。
from scapy.all import *
import time
# Modbus ADU
class ModbusTCP(Packet):
name = "Modbus/TCP"
fields_desc = [ ShortField("Transaction Identifier", 1),
ShortField("Protocol Identifier", 0),
ShortField("Length", 6),
XByteField("Unit Identifier", 247),
]
# Modbus PDU
class Modbus(Packet):
name = "Modbus"
fields_desc = [ XByteField("Function Code", 4),
ShortField("Reference Number", 1),
ShortField("Word Count", 2),
]
# Create a socket and connect
s = socket.socket()
s.connect(("192.168.95.10", 502)) # IP and port
ss = StreamSocket(s, Raw)
while True:
try:
# Encapsulate modbus inside the raw data, then send and receive
# Anything can be done with response
ss.sr1(Raw(ModbusTCP()/Modbus()))
time.sleep(1)
except KeyboardInterrupt:
break
参考文献:
https://stackoverflow.com/questions/39249572
复制相似问题