freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

工控安全 | Modbus协议分析
2021-03-24 10:53:13

0x00:前言

最近一直在学工控安全,从拜读各种工控老大哥的文章了解工控安全相关理论知识到自己搭建虚拟靶场进行练习再到学习PLC编程,总感觉太虚了,没有实物和项目练习感觉摸不到边。后续准备买个树莓派,尝试联合plc控制继电器做个led控制灯,玩一下~

那今天的主角是modbus协议,来自Modicon公司(现在被施耐德收购了),也分为modbus协议和modbus tcp/ip协议,那么有啥区别呢,从字面上理解,tcp/ip作用于网络层或者传输层的协议,modbus协议作用于应用层与物理层。

基于TCP/IP协议基础上改的modbus tcp主要作用于lnternet,modbus协议主要作用于电气自动化和过程控制。

v2-dfdb65ce6893ff6630d683c841fb113d_720w.png

0x01:关于Modbus协议

前面说到modbus是一种应用层协议,tcp/ip是网络或传输层的协议,modbus可以架在TCP/IP上,也可不, 看使用场景和应用范围。

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

v2-5b96b546a2b9e3f5ee078e6f1307fe04_720w.png

first,modbus tcp是一个非常简单的协议,为什么简单呢,因为真的和tcp/ip协议原理上很像,都有请求/应答、请求方打包自己要请求的功能码和消息域和差错校验等等规范请求包、发送给控制器、二者进行握手交流、最后控制器响应操作打包响应包返回给请求方。

当然这里只是自己一个简略的过程总结。实际通信中涉及非常多的知识点。

接下来提一下modbus的8种功能码,为后面讲解协议做准备。

0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器

如上所示一共8种功能码。这其中有涉及到线圈、离散输入、保持、输入四种寄存器。

线圈寄存器:实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01  0x05  0x0f
离散输入寄存器:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02
保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10
输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04

专业名词解释

继电器

这里首先讲一下何为继电器,因为我一开始就不大清楚啥是继电器,学的云里雾里。所以这些专业名词一定要清楚。会修灯泡的人都应该多多少少听过继电器这一物件。

百度百科的解释如下:

继电器(英文名称:relay)是一种电控制器件,是当输入量(激励量)的变化达到规定要求时,在电气输出电路中使被控量发生预定的阶跃变化的一种电器。它具有控制系统(又称输入回路)和被控制系统(又称输出回路)之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流运作的一种“自动开关”。故在电路中起着自动调节、安全保护、转换电路等作用。

其实简单来说,大家初中都学过法拉第的电磁感应现象吧,就是一块磁铁在通电和未通电情况下拥有的磁力不一样。好!那么应用于生活中就是:现在我们为什么可以控制灯泡的亮灭,通过开关,那么当按下开关时,线圈就会断开(线圈的话 大家小时候拆过的赛车马达里面的铜丝),则不通电。生活用电220v,如果全部加在线圈上,会烧坏的,所以继电器就整上了,只需要5v就可以控制灯泡线圈的断开与连接。通过5v电流控制继电器里面的磁性。

v2-97cc821e218ff0e77141d691653b2ed9_720w.png

欧姆龙牌汽车大灯继电器,和灯泡继电器长得差不多。

线圈

线圈通常指呈环形的导线绕组,最常见的线圈应用有:马达、电感、变压器和环形天线等。电路中的线圈是指电感器。是指导线一根一根绕起来,就是马达的线圈一样。

线圈也是很有讲究的!有学问的,感兴趣的朋友可以去电子发烧友论坛详细了解一下,基本一些功能就是扼流、滤波、震荡。

v2-fc12e6a58b06b076d6749b9a25570586_720w.png

寄存器

cpu里面的物件,用来暂时存储二进制代码的,相当于很贵的存储空间,且一般容量很小,仅仅用来临时存储,搞底层的都知道。

0x02:协议传输过程解析

Modbus协议遵循主—从原则,尽管网络通信方法是对等的。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。所以主从关系决定于发请求者与响应者。

v2-9b2e276c1a4f4a2b9f864824c05ab72f_720w.png

1、查询

查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

2、回应

如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

那通过学习,对modbus八种寄存器做个小总结:

1:线圈寄存器:一个bit控制一个信号,所以一个byte可以控制8路信号,相当于继电器,开关的作用
且支持读写0x01  0x05  0x0f
2:离散输入寄存器:只读的,内容和线圈寄存器一样,只有一种状态码0x02
3:保持寄存器:容积也比较大,两个byte可以拿来存放数据,是可读写的,比如设置时间等等想想对应的状态码0x03 0x06 0x10
4:输入寄存器:功能类似保持寄存器,也是两个bypte,不过只能读不能写:0x04

很好理解吧

当然modbus传输也有两种传输方式:控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。

0x03:总结

总的来说modbus协议很好理解,因为就是基于osi七层模型改的,只动了应用层和物理层。所以modbus的漏洞也是tcp/ip的漏洞。专门拿来在工业互联网中进行应用,对控制器进行下达状态码指令。

下期拿wireshark看一下modbus的流量以及做一下工业互联网比赛的一些流量分析题。

# 工控安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录