2025年9月底乌克兰电力部门遭受到恶意攻击,乌克兰新闻媒体TSN在24日报道称:“至少有三个电力区域被攻击,并于当地时间15时左右导致了数小时的停电事故”; “攻击者入侵了监控管理系统,超过一半的地区和部分伊万诺-弗兰科夫斯克地区断电几个小时。ESET公司就发表文章称,乌克兰境内的多家配电公司设备中监测到KillDisk,由此怀疑攻击者使用了BlackEnergy后门用来远程访问并控制电力控制系统。

 Kyivoblenergo电力公司发布公告称:“公司因遭到入侵,导致7个110KV的变电站和23个35KV的变电站出现故障,导致80000用户断电。”

目前现有的工业控制防火墙主要基于通信协议进行屏蔽、过滤,对于基于身份欺骗的攻击,或使用违规的工业控制命令进行的攻击难以抵御。其中的入侵检测系统基本运行在特征数据库之上,通过比对来判别攻击行为。这些保护措施虽然有效,但作用有限,对于零日漏洞攻击这类无法通过比对特征数据库的攻击毫无办法。

关键词:工业控制,协议,防火墙。

Depth analysis of Modbus protocol based on iptables

wang xin tong

School of computer science and technology, Shanghai University of Electric Power, Shanghai

Abstract

At the end of December 2015 Ukraine power sector suffered malicious attacks, Ukraine news media TSN in 24 reported: "at least three regional power was attacked, and in the local time around 15 hours caused power outages"; "the attacker intrusion monitoring management system, more than half of the area and part of Ivano - Franco. Minsk region off for several hours. ESET said in an article that KillDisk was monitored in a number of power distribution companies in Ukraine, and suspected that the attackers had used the BlackEnergy back door for remote access and control of power control systems.

Kyivoblenergo power company announced: "the company because of invasion, resulting in 7 110KV substation and 23 35KV substation failure, resulting in 80000 users power failure."."

In order to defend this attack, China carried out the national infrastructure inspection in May 2016. At present, China still lacks national standards for industrial control system security, and it is still under development. Therefore, the research of industrial control system firewall is an urgent and practical work.

At present, the existing industrial control firewalls are mainly shielded and filtered based on communication protocols. Attacks on identity based attacks or by using illegal industrial control commands are difficult to resist. The intrusion detection system is basically running on the feature database, and the attack behavior is judged by comparison. Although effective, these protections are limited and can not be used against zero day vulnerability attacks, such as those that can not be compared to a feature database.

Key words: Industrial control,protocol,firewall.

目  录

1绪论

1.1 课题背景及意义

1.2 国内外研究现状

1.3 论文组织形式

1.4 本章小结

2 iptables基本工作原理

2.1 iptables简介

2.2 iptables传输数据包过程

2.3 iptablesnfqueue功能模块

2.4 本章小结

3 modbus协议的分析

3.1 modbus协议简介

3.2 modbus/TCP简介

3.2.1 总体通信结构

3.2.2 TCP/IP 上的 MODBUS 应用数据单元

3.2.3 MBAP 报文头描述

3.3 modbus/TCP功能码

3.4 modbus/TCP连接建立

3.5 modbus/TCP抓包分析

3.6 本章小结

4 python代码实现基于iptablesmodbus协议深度分析

4.1 运行环境

4.2 主要模块构成

4.3 modbus协议深度分析之握手包深度分析

4.4 modbus协议深度分析之modbus/TCP包判断

4.5 modbus协议深度分析之modbus/TCP包长度合法性判断

4.6 modbus协议深度分析之modbus/TCP包功能码合法性判断

4.7 modbus协议深度分析之mongodb数据库记录

4.8 本章小节

5 结论

5.1 主要的研究成果

5.2 需要进一步完善的内容

谢词 /

参考文献

1绪论

1.1 课题背景及意义

2015年12月底乌克兰电力部门遭受到恶意攻击,乌克兰新闻媒体TSN在24日报道称:“至少有三个电力区域被攻击,并于当地时间15时左右导致了数小时的停电事故”; “攻击者入侵了监控管理系统,超过一半的地区和部分伊万诺-弗兰科夫斯克地区断电几个小时。ESET公司就发表文章称,乌克兰境内的多家配电公司设备中监测到KillDisk,由此怀疑攻击者使用了BlackEnergy后门用来远程访问并控制电力控制系统。

 Kyivoblenergo电力公司发布公告称:“公司因遭到入侵,导致7个110KV的变电站和23个35KV的变电站出现故障,导致80000用户断电。”

 针对本次攻击,攻击者主要使用的攻击手段包括三种:

 其一,利用电力系统的漏洞植入恶意软件;

 其二,发动网络攻击干扰控制系统引起停电;

 其三,干扰事故后的维修工作。

我国为了防御这个攻击 ,在2016年五月进行了全国基础设施大检查,当前我国还缺乏工业控制系统安全的国家标准,仍在制定中。所以研究工业控制系统防火墙是一件迫在眉睫且具有现实意义的工作。

目前现有的工业控制防火墙主要基于通信协议进行屏蔽、过滤,对于基于身份欺骗的攻击,或使用违规的工业控制命令进行的攻击难以抵御。其中的入侵检测系统基本运行在特征数据库之上,通过比对来判别攻击行为。这些保护措施虽然有效,但作用有限,对于零日漏洞攻击这类无法通过比对特征数据库的攻击毫无办法。

1.2 国内外研究现状

北京匡恩网络的“K盾”——IAD智能保护平台 为工业网络提供了全方位的综合防御与保护,并且完整覆盖了工控系统整个运转生命周期。软件层面上,该平台建立在机器智能学习引擎、深度数据包解析引擎和开放式特征匹配三大功能引擎之上,支持工业网络协议,可适用于DCS、SCADA等控制系统。

 北京威努特公司的产品能够保护工业控制网与管理信息网之间的边界,支持对OPC等协议的深度解析,阻止来自管理信息网的安全威胁,保护数据采集系统安全。

 加拿大多芬诺的产品内置50多种专有工业通信协议,与常规防火墙不同的是,Tofino防火墙是基于内置工业通讯协议的防护模式,由于工业通讯协议通常是基于常规TCP/IP在应用层的高级开发所以该防火墙不仅是在端口上的防护,更重要的是基于应用层上数据包深度检查,属于新一代工业通讯协议防火墙,为工业通讯提供独特的、工业级的专业隔离防护解决方案

但是,目前我国缺少自主品牌的工业控制系统防火墙,由于工业控制系统的重要性和独特性决定了其无法使用国外的防火墙产品,所以研究工业控制系统防火墙有其现实意义且对我国的工控安全和信息安全有重要意义。

1.3 论文组织形式

本论文共分为五章。

第一章 绪论。

第二章 iptables防火墙简介和其规则,最重要的是其nfqueue功能模块。

第三章 modbus协议分析,最重要的是modbus/TCP协议的深度分析,包括长度、功能码和其握手包深度分析等。

第四章 使用python代码实现基于iptables框架对modbus/TCP协议的深度检测,运行环境为kali2.0

第五章 总结与其他可扩展性

1.4 本章小结

本章主要为绪论部分,对课题的背景、研究意义和论文组织形式等进行阐述。详情可见各章节。

2 iptables简介

本章将介绍iptables防火墙框架,重点阐述iptables扩展功能之nfqueue模块。

2.1 iptables简介

netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规 则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。

Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是Linux防火墙的管理工具而已。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。

2.2 iptables传输数据包过程

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。 

② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。 

③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

iptables的规则表和链:

表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。下面罗列一下这四张表和五个链。注意一定要明白这些表和链的关系及作用。

2.3 iptables之nfqueue功能模块

Nfqueue是iptables和ip6tables的target,这个target可以将数据包从原来的内核空间交给用户空间。编程人员可以在用户空间设置自己的规则,对数据包进行判断。

那么在用户空间,可以使用libnetfilter_queue来连接到queue  0(默认)并且从内核获得该消息,然后,必须给出对这个数据包的裁决(Drop,Accept等等)

一般在iptables中的target有以下五种(ACCEPT,DROP,RETURN,QUEUE,other_chain,而NFQUEUE是QUEUE的扩展。相比于QUEUE,它可以由用户指定不同的queue number。

结合python的scapy,socket和dpkt等强大模块,可以实现对数据包的拆包,解码等。

例如:命令iptables -I INPUT -s 192.168.37.0/24 -j NFQUEUE --queue-num 0,可在INPUT链中将源目标IP网段为192.168.37.0/24的数据包放到nfqueue队列中,序号为0。编程人员可通过这个接口,将此数据包从内核空间提取到用户空间,结合dpkt库对数据包实现拆包和解码,从而实现对数据包内容的深度解析。

2.4 本章小结

本章主要介绍了iptables防火墙基本架构,着重阐述了iptables中的nfqueue模块,实现了将数据包从内核空间提取到用户空间。

3 modbus协议分析

3.1 modbus协议简介

Modbus是由Modicon在1979年发明的,是全球第一个真正用于工业现场的总线协议。

Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一种通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一个控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。

3.2 modbus/TCP简介

3.2.1总体通信结构:

MODBUS TCP/IP 的通信系统可以包括不同类型的设备:

(1)连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备

(2)互连设备,例如:在 TCP/IP 网络和串行链路子网之间互连的网桥、路由器或网关联接,该子网允许将 MODBUS 串行链路客户机和服务器终端设备连接起来。

如图1:

图 1 MODBUS TCP/IP 通信结构

MODBUS 协议定义了一个与基础通信层无关的 简 单 协议 数据单元 (PDU) ) 。特定总线或网络上的 MODBUS 协议映射能够在 应用 数据单元 (ADU )上引入一些附加域。3.2.2 TCP/IP 上的 MODBUS 应用数据单元

这节描述了 MODBUS TCP/IP 网络中进行的 MODBUS 请求或响应的封装。

如图2:

图2 TCP/IP 上的 MODBUS 的请求/响应

在 TCP/IP 上使用一种专用报文头识别 MODBUS 应用数据单元。 将这种报文头称为 MBAP 报文头(MODBUS 协议报文头) 。

这种报文头提供一些与串行链路上使用的 MODBUS RTU 应用数据单元比较的差别:

用MBAP报文头中的单个字节单元标识符取代MODBUS串行链路上通常使用的MODBUS

从地址域。这个单元标识符用于设备的通信,这些设备使用单个 IP 地址支持多个独立MODBUS 终端单元,例如:网桥、路由器和网关。

用接收者可以验证完成报文的方式设计所有 MODBUS 请求和响应。对于 MODBUS PDU

有固定长度的功能码来说,仅功能码就足够了。对于在请求或响应中携带一个可变数据的功能码来说,数据域包括字节数。

当在 TCP 上携带 MODBUS 时,即使将报文分成多个信息包来传输,办事在 MBAP 报文头上携带附加长度信息,以便接收者能识别报文边界。显式和隐式长度规则的存在以CRC-32 差错校验码的使用(在以太网上)将对请求或响应报文产生极小的未检出干扰。

3.2.3 MBAP 报文头描述

MBAP 报文头包括下列域,如表1:

表1 MBAP 报文头组成

报文头为 7 个字节长:

事务处理标识符: 用于事务处理配对。 在响应中, MODBUS 服务器复制请求的事务处理标识符。

协议标识符:用于系统内的多路复用。通过值 0 识别 MODBUS 协议。

长度:长度域是下一个域的字节数,包括单元标识符和数据域。

单元标识符:为了系统内路由,使用这个域。专门用于通过以太网 TCP-IP 网络和 MODBUS 串

行链路之间的网关对 MODBUS 或 MODBUS+串行链路从站的通信。 MODBUS 客户机在请求中设置这个域,在响应中服务器必须利用相同的值返回这个域。

3.3 modbus/TCP功能码

modbus功能码如图3:

图3 modbus功能码

主要介绍以下三个功能码:

3.3.1 01 (0x01) 读线圈

在一个远程设备中,使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。

根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为 1= ON 和 0= OFF。

第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端) 。字节数量域说明了数据的完整字节数。

3.3.2 02 (0x02)读离散量输入

在一个远程设备中,使用该功能码读取离散量输入的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址, 即指定的第一个输入地址和输入编号。 从零开始寻址输入。 因此寻址输入 1-16 为 0-15。

根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为 1= ON 和 0=OFF。第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端) 。字节数量域说明了数据的完整字节数。

3.3.3 03 (0x03) 读保持寄存器

在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求 PDU 说明了起始寄存器地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器 1-16 为 0-15。

将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特

3.4 modbus/TCP连接建立

MODBUS 报文传输服务必须在 502 口上提供一个侦听套接字,允许接收新的连接和与其他设备交换数据。

当报文传输服务需要与远端服务器交换数据时,它必须与远端 502 口建立一个新的客户连接,以便与远距离交换数据。本地口必须高于 1024,并且每个客户连接各不相同。

如果客户机与服务器的连接数量大于授权的连接数量,则最早建立的无用的连接被关闭。激活访问控制机制检查远端客户机的 IP 地址是否是经过授权的。如果未经授权,将拒绝新的连接。

当客户机与服务器间的 MODBUS 通信结束时,客户机必须关闭用于通信的连接。

某些操作模式(两操作端点之间通信断开、一个端点的故障和重新启动、………)会对 TCP 连接产生影响。一个连接可被视为在这一侧关闭或异常终止而没有另一侧的确认,称这种连接为“半打开”的连接。

3.5 modbus/TCP抓包分析

3.5.1工具及环境

对于modbus/TCP协议进行Server-Clint端抓包,对抓到的包其中的具体字段进行分析,有助于后续使用python进行深度检测编程,因为只有明白了各字节的具体含义,才能判断其合法性。

工具:使用python分别编写server和client端程序,模拟server和client通信过程。其中server端代码放在虚拟机中,client端代码放在主机中。

虚拟机:kali 2.0

主机:win7 64位

3.5.2抓包过程

server端:输入python server.py等待client连接。

client端:输入python client.py,回车开启连接。

3.5.3抓包结果及分析

由于modbus/TCP通信是面向连接的,所以在正式通信前需要进行三次握手,通信完毕后进行四次挥手。所以具体分析分为两部分:(1)握手包部分 (2)modbus/TCP正式通信部分

  1. 握手包所抓到的握手包大致结构如下,包含2-4层具体信息。

如图4:

图 4 握手包大致结构

关键字段如下:

三层:1°Protocol:TCP(6)

表示上层所用协议为:TCP

  2°Source:192.168.37.132

 表示源IP地址为:192.168.37.132

 Destination: 192.168.37.1

 表示目的IP地址为:192.168.37.1

四层:1°source port:502

 表示源端口为502

destination port:3432

 表示目的端口为3432

  2°Flags各标记位如图5所示:

W : CWR - 拥塞窗口减少

E : ECE - 显式拥塞提醒回应 

U : URG - 紧急 

A : ACK - 应答 

P : PUSH - 推送; 数据包立即发送 

R : RST - 复位;中断一个连接 

S : SYN - 同步; 表示开始会话请求 

F : FIN - 结束; 结束会话 

图5:Flags标记位

  1. modbus/TCP包结构如下,如图6(截取四层及以上部分):

1°TCP层类似握手包部分分析

2°应用层:Transaction Identifier:1

modbus/TCP协议的事物识别号

protocol Identifier:0

modbus/TCP协议的识别号

Length:6

该字段后的数据长度

Unit Identifier:2

单元识别号

Function Code:1

modbus/TCP功能码

Reference Number:1

参数号

Bit Count:1

数据内容

图6 modbus/TCP包(四层及以上)

3.6 本章小节

本章介绍了modbus协议,着重介绍了modbus/TCP协议的具体内容和连接建立和具体字段,为下一章的pyhton代码的具体实现打下基础。

4 pyhon代码实现基于iptables的modbus协议深度分析

4.1 运行环境

kali2.0

python 2.7

4.2 主要模块构成

Judge_modbus类:

(1)def __init__(self,debug=False)函数:完成参数初始化

(2)def start(self,package)函数:完成拆包和解码,包含def judge_tcp_attack(self)和def judge_modbus_attack(self)函数

(3)def judge_tcp_attack(self)函数,完成对握手包深度分析即TCP标志位攻击检测,并记录数据库

(4)def judge_modbus_attack(self)函数,和modbus/TCP攻击检测,并记录数据库

4.3 modbus协议深度分析之握手包深度分析

此部分代码对握手包进行了深度解析和判断(黑名单原则):

  1. 握手包中syn和fin标记位不能同时为1
  2. 握手包中标记位不能都为0
  3. 握手包中不存在fin标记位为1且ack标记位为0的情况

主要代码:if(self.afterdecode[66:68]=='03'):#syn和fin标记位不能同时为1

print ("this is syn/fin attack")

return False

elif(self.afterdecode[66:68]=='00'): #标记位不能都为0

print ("this is flag='0x00' attack")

return False

elif(self.afterdecode[66:68]=='01'):#不能fin标记位为1且ack标记位为0

print ("this is fin attack")

return False

else:

print 'there is no tcp flag attack'

return True

4.4 modbus协议深度分析之modbus/TCP包判断

由于modbus/TCP协议是面向连接的,所以在主从机通信前会建立三次握手(然而实际情况有4次握手),通信结束后会四次挥手(然而实际情况有3次挥手)。

所以区分握手包和modbus通信包是拆包和解包后必须的一步,之后才能分别对他们进行各字段的深度检测和分析(白名单原则)。

握手包特征如下:

由于python代码实现了三层及以上包的拆解和转码,IP包头长为固定20字节,IP包内容一般为空(可以理解为第几字节的内容相对固定),所以利用列表判断具体字节位是否满足握手包或modbus/TCP包的特征。

一个modbus/TCP通信前的握手包特征如下:

  1. 第44到47字节必须为01f6(TCP层中端口号必须为502)
  2. 第85到86字节必须不为00(modbus/TCP协议标识为00)
  3. 由于是握手包,TCP层以上没有内容,所以TCP层中的push为肯定为0,所以此字节转为16进制必须小于8
  4. 第19字节必须为6,,因为此字节是IP层对上层协议标识(TCP为6).

同时满足上述四个条件的数据包才是modbus/TCP协议通信前的握手包。

if(self.afterdecode[44:48]=='01f6' and self.afterdecode[85:87]!='00' and self.afterdecode[67]<'8' and self.afterdecode[19]=='6'):

print "This is handshake between modbus/tcp communication "

return True

一个modbus/TCP通信包特征如下:

  1. 第44到47字节必须为01f6(TCP层中端口号必须为502)
  2. 第85到86字节必须为00(modbus/TCP协议标识为00)
  3. 由于是modbus/TCP,TCP层以上有内容,所以TCP层中的push为肯定为1,所以此字节转为16进制必须大于8
  4. 第19字节必须为6,,因为此字节是IP层对上层协议标识(TCP为6).

elif(self.afterdecode[44:48]=='01f6' and self.afterdecode[85:87]=='00' and self.afterdecode[67]>='8' and self.afterdecode[19]=='6'):

同时满足以上四个条件的数据包才是modbus/TCP通信包

4.5 modbus协议深度分析之modbus/TCP包长度合法性判断

一个正常的modbus/TCP包对其长度有明确规定,必须小于260字节,所以大于260字节的都非法。主要代码如下:

If(self.afterdecode[87:89]>'00fe'):#modbus frame must <=260bytes

print "This modbus package's length is illegal"

4.6 modbus协议深度分析之modbus/TCP包功能码合法性判断

不在下列列表中的功能码即为非法

modbus_func_code={

"dispersed_and_input": "02",

"read_coil":"01",

"write_single_coil":"05",

"write_multiple_coil":"0f",

"read_input_register":"04",

"read_multiple_register":"03",

"write_single_register":"06",

"write_multiple_register":"10",

"read_write_multiple_register":"17",

"cannot_write_register":"16",

"read_file_record":"14",

"write_file_record":"15",

"read_recognize":"2b",

}

for name in self.modbus_func_code:#judge function code

if(self.afterdecode[94:96]==self.modbus_func_code[name]):

break

elif(name!="read_recognize"):

continue

else:

print ("function code illegal")

return False

print "this modbus package's length is legal and function code is legal"

print ("this modbus package is safe")

4.7 modbus协议深度分析之mongodb数据库记录

   self.mongodb.log_collect()函数完成mongodb数据库记录,详情可见mongodb部分

4.8 本章小节

本章为最重要的一章,对数据包的拆解、转码,握手包和modbus/TCP包的区分,TCP标记位检测和modbus/TCP数据包深度检测代码进行了详细说明。

5 结论

5.1 主要的研究成果

本文的modbus数据包深度检测部分和mongodb数据库记录部分,命令行部分和iptables框架部分共同组成基于iptables架构的工控防火墙。主要从软件层面上实现了对握手包和modbus/TCP包的深度检测,后台记录mongodb数据库,命令行输入规则,tornado框架,web页面登入。

本文的python代码(详见虚拟机)通过nfqueue扩展模块,将iptables截获的符合条件的包从内核空间提取到用户空间,交由用户处理。利用python强大的第三方库对数据包实现解包和转码,对其具体内容进行合法性判断。首先区分握手包和modbus/TCP数据包。对于握手包,进行TCP标记位检测,从而有效实现对非法标记位的过滤。对于modbus/TCP数据包,对其长度和功能码进行判断。对于所有的非法数据包,后台记录进mongodb数据库,并进行拦截。

5.2 需要进一步完善的内容

modbus数据包深度检测部分还可以继续完善,例如加入对读写寄存器的寄存器地址和读写内容进行深度检测,判断其合法性。下一步可以实现软硬结合,将代码装到X86架构的嵌入式主机,实现硬件防火墙。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐