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ő.)
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).
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
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. . . .