loader
Foto

Modbus TCP szerver és kliens implementálása Python nyelven

A Modbus TCP protokoll -hiába a rengeteg hiányossága- ma is az egyik legjobban elterjedt ipari protokoll. Ezért elővesszük újra ezt a protokollt, és a korábban publikált szerver mellé elkészítünk egy klienst is. Ezután egy filter segítségével vizsgálni fogjuk a hálózati forgalmat.

A Modbus TCP az ipari rendszereknél, üzemeknél, gyártósorok hálózatánál nagyon elterjedt protokoll, noha nem rendelkezik semmilyen titkosítással, illetve session kezeléssel sem. Megismerhetők tehát az érzékeny adatok a hálózati forgalom figyelésével, illetve az elkapott frame-ek kiadása is nagyon egyszerű ennél az elterjedt ipari protokollnál.

Ahhoz, hogy a kliens elkészíthető legyen Python nyelven, szükséges a "pyModbusTcp"csomag telepítése. A következő utasítás segítségével ellenőrizhető az, hogy ez a kérdéses csomag megtalálható-e a virtuális gépünkön.

pip3 list

Ha nem látjuk a listában, akkor telepíteni kell a következő utasítás segítségével.

pip3 install pyModbusTcp

 

A következő Python kód a Modbus TCP klienst valósítja meg.

from pyModbusTCP.client import ModbusClient
import random
import time

try:
    c = ModbusClient(host="192.168.56.113", auto_open=True, auto_close=False)
    c.port = 502
    c.debug = False

    wV = 0

    while True:
        rV0 = random.randint(0, 500)
        rV1 = random.randint(0, 500)
        rV2 = random.randint(0, 500)
        rV3 = random.randint(0, 500)
        rV4 = random.randint(0, 500)

        randDelay = random.randint(0,10)

        c.read_holding_registers(0, 5)
        c.write_single_register(0, rV0)
        c.write_single_register(1, rV1)
        c.write_single_register(2, rV2)
        c.write_single_register(3, rV3)
        c.write_single_register(4, rV4)

        time.sleep(randDelay)
        wV += 1
        print("Number of cycles: " + str(wV) + ", " + str(rV0) + " - " + str(rV1) + " - " + str(rV2) + " - " + str(rV3) + " - " + str(rV4))

except ValueError:
    print("Error.... ")

 

A fenti Python kódban látható a modbus TCP szerver IP címe (192.168.56.113). A szerver megvalósításáért a következő Python kód felelős.

#!/usr/bin/env python

from pymodbus.server.asynchronous import StartTcpServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext

import logging

store = ModbusSlaveContext(
    di = ModbusSequentialDataBlock(0, [17]*100), # Discrete Inputs initializer
    co = ModbusSequentialDataBlock(0, [17]*100), # Coils initializer
    hr = ModbusSequentialDataBlock(0, [17]*100), # Holding Register initializer
    ir = ModbusSequentialDataBlock(0, [17]*100)) # Input Registers initializer
context = ModbusServerContext(slaves=store, single=True)

identity = ModbusDeviceIdentification()
identity.VendorName = 'WebElektronika.'
identity.ProductCode = 'TestCode'
identity.VendorUrl = 'https://github.com/riptideio/pyModbus'
identity.ProductName = 'Modbus Server'
identity.ModelName = 'PyModbus'
identity.MajorMinorRevision = '1.0'
identity.UserApplicationName = 'Modbus Test'

FORMAT = ('%(asctime)-15s %(threadName)-15s' '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')

logging.basicConfig(filename='logModbus.txt', encoding='utf-8', level=logging.DEBUG)
log = logging.getLogger()

print ('Starting Modbus server...')
StartTcpServer(context, identity=identity, address=("0.0.0.0", 502))


Indítsuk el a szervert, ajd azután a klienst a következő utasítás segítségével.

python3 modbusClient1.py

Az első ábrán látható a kliens futás közben, a terminálablakban megjelennek azok a véletlen számok, amelyek elküldésre kerülnek a szerver felé. (A klines futtatásánál a "sudo" nem kötelező.)

kep
1. ábra   A kliens futtatása a terminálablakban.
 

Indítsuk el a Wireshark hlózati monitorozó alkalmazást, majd szűkítsük le a Modbus TCP protokollra a figyelmünket. Ezért a filterablakban írjuk be a "modbus"-t.
Látható az, hogy a "kérés-válasz" alapú ipari protokoll nem rendelkezik titkosítással, a véletlen számok könnyen kiolvashatók a hálózati forgalomból (2. ábra).

kep
2. ábra   Látható a Wireshark felületén, hogy az ipari hálózatban a modbus TCP protokoll segítségével átküldött véletlenszámok nem kerülnek titkosításra
 

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Az nmap (grafikus megjelenítésnél a ZenMap) használata az IT biztonság, illetve az üzemeltetés területén dolgozó szakembereknél szinte elkerülhetetlen. Az ingyenes szoftver segítségével tesztelhetők a számítógépeink, a számítógéphálózatunk, vizsgálha. . . .

A Python programozási nyelv nagyon elterjedt a fejlesztők körében. Használják beágyazott rendszereknél, webes alkalmazásoknál, IT biztonság különböző területein, stb. Látható, hogy nagyon széles a felhasználási területe ennek a nyelvnek, ideje volt m. . . .

Bemutatjuk most a saját (!) Wifi-s hálózatunk tesztelésének az alapjait. Megnézzük, hogy hogyan lehet biztonságos jelszót választani. Feltörhetetlen rendszer nem létezik, de megismerve a tesztelés folyamatát, válaszokat kaphatunk arra vonatkozólag, h. . . .