2014-02-12 3 views
0

Я запускаю приведенный ниже пример кода с удаленным ПЛК с запуском Wireshark. Почему я получаю запрос (я тоже должен получить ответ)? Кажется, что ПЛК отправляет ответ, так как вывод Scapy говорит Received 1 packets, got 1 answers, remaining 0 packets.Wireshark не получает ответ Scapy Modbus

Любые идеи, почему это происходит?

Я также выполнял обнюхивание с помощью функции sniff() от Scapy, но результат тот же (только получить запрос).

#! /usr/bin/env python 

import logging 
logging.getLogger("scapy").setLevel(1) 

from scapy import * 
from modLib import * 

# IP for all transmissions 
ip = IP(dst="192.168.10.131") 

# Sets up the session with a TCP three-way handshake 
# Send the syn, receive the syn/ack 
tcp = TCP(flags = 'S', window = 65535, sport = RandShort(), dport = 502, options = [('MSS', 1360), ('NOP', 1), ('NOP', 1), ('SAckOK', '')]) 
synAck = sr1 (ip/tcp) 

# Send the ack 
tcp.flags = 'A' 
tcp.sport = synAck[TCP].dport 
tcp.seq = synAck[TCP].ack 
tcp.ack = synAck[TCP].seq + 1 
tcp.options = '' 
send(ip/tcp) 

# Creates and sends the Modbus Read Holding Registers command packet 
# Send the ack/push i.e. the request, receive the data i.e. the response 
tcp.flags = 'AP' 
adu = ModbusADU() 
pdu = ModbusPDU03() 
adu = adu/pdu 
tcp = tcp/adu 
data = sr1((ip/tcp), timeout = 2) 
data.show() 

# Acknowledges the response 
# Ack the data response 
# TODO: note, the 17 below should be replaced with a read packet length method... 
tcp.flags = 'A' 
tcp.seq = data[TCP].ack 
tcp.ack = data[TCP] + 17 
tcp.payload = '' 
finAck = sr1(ip/tcp) 
+0

Какой фильтр (ы) вы используете в Wireshark? – Nanomurf

ответ

0

Во-первых, у вас есть ошибка в вашем коде (который присутствует в оригинальной версии http://www.digitalbond.com/scadapedia/security-controls/scapy-modbus-extensions/), вам нужно добавить .seq там: tcp.ack = data[TCP].seq + 17.

Как говорится в комментарии, вы можете написать tcp.ack = data[TCP].seq + len(data[TCP].payload).

В любом случае, как правило, бесполезно выполнять работу TCP-стека за те вещи, которые вы пытаетесь сделать.

Я хотел бы сделать что-то вроде этого:

from scapy import * 
from modLib import * 
import socket 

sock = socket.socket() 
sock.connect(("192.168.10.131", 502)) 
s = StreamSocket(sock, basecls=ModbusADU) 

ans, unans = s.sr(ModbusADU()/ModbusPDU03()) 
ans.show() 

ли эта работа лучше?

Смежные вопросы