Wireshark не получает ответ Scapy Modbus

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

Есть идеи, почему это происходит?

Я также выполнил обнюхивание с помощью функции 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 )

person bulkmoustache    schedule 12.02.2014    source источник
comment
Какие фильтры вы используете в Wireshark?   -  person Nanomurf    schedule 13.02.2014


Ответы (1)


Во-первых, у вас есть ошибка в коде (которая присутствует в исходной версии 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()

Это работает лучше?

person Pierre    schedule 15.02.2014