摘要:1、導入modbus_tcp和cst來選擇讀取線圈和寄存器 2、TCP通信只需設置PLC的IP就可以 3、設置讀取保持寄存器的值(1爲設備ID,100爲開始讀取的地址,25爲讀取值的位數) 4、成功讀取到PLC寄存器的值。因爲大部分真實的Mdobus PLC都是通過Modbus TCP協議通訊的,所以RTU的通信讀寫我們通過模擬器來實現。

前言:

如今工業控制系統設計的領域包括交通運輸、能源行業、裝備製造、機械製造等多個國家關鍵基礎領域。工業控制系統的信息安全問題關係到國家安全和社會穩定。Modbus 協議是一種典型的工業控制系統通信協議,是目前應用最爲廣泛的工業控制協議之一。由於其設計簡單、容易開發的特性,使得Modbus TCP 協議極易被惡意攻擊者利用,從而對工業控制系統造成破壞和損失。

通過前兩篇模擬器和 Smod框架的講解 相信大家對Modbus有了大概的認識,本文主要是通過Python代碼和Mbtget工具多種姿勢讀寫Modbus PLC,讓大家對Mdobus有更深入的理解。

一、Modbus_tk庫介紹:

Modbus_tk是使用python語言實現的Modbus協議棧,該函數庫即支持主機也支持從機,既支持RTU也支持TCP。

下載安裝pip install modbus_tk,下圖是modbus_tk庫包含的內容:

RTU通信讀寫寄存器

因爲代碼這塊主要講RTU通信和TCP通信讀寫寄存器,那什麼是RTU呢?Modbus是一種應用層協議,它定義了與基礎網絡無關的數據單元(ADU),可以在以太網(TCP/IP)或串行鏈路上進行通信。在串行鏈路上,Modbus協議有兩種傳輸模式——ASCII模式和RTU模式。其中,ASCII(AmericanStandard Code for Information Interchange)爲美國國家信息交換標準編碼,RTU( Remote Terminal Unit)爲遠程終端設備。所以RTU通信就是通過模擬遠程終端設備讀寫寄存器。

RTU通信我們需要的輔助工具是VSPD(Virtual Serial Port Driver 9.0 by Eltima Software)虛擬串口工具,如下圖所示,幫助我們添加模擬的端口是COM1/COM2:

添加端口之後,打開我們計算機的設備管理就增加了如下端口示意圖:

配置好串口之後,接着來配置我們的模擬器Modbus Slave(PLC),爲什麼要用模擬器呢?因爲大部分真實的Mdobus PLC都是通過Modbus TCP協議通訊的,所以RTU的通信讀寫我們通過模擬器來實現。

 1、選擇連接方式爲Serial Port(串口)
 2、串口設置爲上圖的COM1->COM2
 3、通信方式選擇RTU
 4、波特率9600、數據位8位、無校驗位、1位停止位默認不變
 5、模擬器的寄存器上設置好供modbus_tk讀取的值

接下來就是通過Python的modbus_tk庫來讀取寄存器的值:

 1、導入modbus_rtu和cst來選擇讀取線圈和寄存器
 2、設置好串口讀取的參數(端口、波特率、校驗位和停止位)
 3、設置讀取寄存器值(1爲設備ID,0爲開始讀取的地址,9爲讀取的位數)
 4、顯示之前在保持寄存器裏設置的值,讀取成功

TCP通信讀寫PLC

講完了RTU通信,那現在講一下ModbusTCP通信。在實際的工業系統應用中,Modbus TCP的使用也更加普遍。雖然TCP中沒有了CRC校驗,但是數據包中已經進行了校驗,再加上工業PLC網絡大部分不對外開放,所以Modbus TCP通信也是相對比較安全的,但是如果攻擊者進入了工業系統內網中,那後果不堪設想。ModbusTCP通信使用TCP502端口和正常的從機IP地址來進行聯繫。

下圖是modbus_tk庫進行TCP通信讀取Schneider M340的代碼和結果:

 1、導入modbus_tcp和cst來選擇讀取線圈和寄存器
 2、TCP通信只需設置PLC的IP就可以
 3、設置讀取保持寄存器的值(1爲設備ID,100爲開始讀取的地址,25爲讀取值的位數)
 4、成功讀取到PLC寄存器的值

二、Mbtget工具介紹:

介紹完了用代碼來讀取Modbus PLC的值,大家是不是覺得還是比較麻煩,我用個工具不香嗎?哈哈,接下來介紹的就是輕量級的工具——Mbtget。它是簡單的perl腳本編寫的,通過一行命令寥寥幾個參數就可以讀寫線圈和寄存器的值,十分方便。

首先是在linux上的安裝:

安裝十分的簡單,完成後我們使用help命令查看Mbtget的使用方法和功能,如下圖所示:

我們先來個簡單的,-r1代表讀取線圈狀態,-u1代表UID爲1,-n8代表讀取八位值,再接上PLC的IP,就得到了如下的圖,成功讀取了線圈:

接下來填寫的是-r3讀保持寄存器,-u1代表UID爲1,-a100代表讀取的地址從一百位起,-n16代表讀取16位值,再接上PLC的IP,就得到了如下的圖,成功讀取了保持寄存器:

最後我們選擇演示寫值入寄存器,-w6代表寫入單個的保持寄存器,12代表寫入的值,-a1代表從地址第一位開始,-d代表將Tx(發送transport)和Rx (接受receive)用十六進制表示出來,如下圖所示,寫入成功:

Mbtget工具的使用已經講完啦,大家覺得是不是特別簡單實用。畢竟篇幅有限,關於Python的modbus_tk庫和Mbtget工具的使用,大家如有不解之處,可以隨時私信或者評論俺。

總結:

Modbus TCP協議是一種通用的工業以太網協議,如今Modbus TCP協議已被廣泛應用於無數工業控制系統中,因此對Modbus TCP協議進行信息安全研究對整個工業控制系統的安全性研究具有重要意義。而經過文中對Modbus PLC的任意讀寫操作,證明了進行工業控制系統信息安全研究的必要性。同時也暴露出Modbus TCP協議目前存在缺乏認證機制、無授權訪問控制機制、無防重放攻擊機制以及缺乏機密性保護等問題。

例如可以設計Modbus TCP信息安全防護模型,可以分爲密碼模塊、站間認證模塊、防重放模塊和授權訪問控制模塊。這樣的安全防護思路和想法很多,需要大家沉下心努力去研究探索,才能在工控安全的道路上越走越遠。

*本文作者:黃一113530,轉載請註明來自FreeBuf.COM

相關文章