作者:Nonattack
1、概述
UMAS (Unified Messaging Application Services) 统一消息传递应用程序服务,它是用于交换应用程序数据的平台独立协议,通信数据使用标准的Modbus协议。Modbus是Modicon公司在1979年开发的基于消息结构的协议,最早是为Modicon公司的PLC中使用,后为施耐德电气公司所有。Modbus协议是现今使用的最早和应用最广泛的工业控制系统协议之一,主要是用于和现场控制器通信的应用层协议,共有三种工作模式:Modbus/ASCII,Modbus/RTU,和Modbus/TCP。
Modbus协议标准是公开的,其众多功能码早已广为人知,在此不做赘述。但其标准文档中也提到了一些未公开、且为占用状态的功能码,90功能码(0x5A)即为其中一个,UMAS协议即为90功能码的Modbus。
UMAS协议为施耐德电气私有的、用于对其PLC产品进行配置和监控等操作,通过查阅,发现未有相关详细描述文档,因此,本文的主要目的即是对UMAS进行基本研究和归纳,不当之处望指正。UMAS协议的基本结构如下图所示:
2、UMAS协议功能码
UMAS协议即为0x5A功能码的Modbus协议,其通信数据在Wireshark中的识别情况如下图:
功能码全部显示为Unity(Schneider)(90),那么,UMAS有功能码吗?进一步观察Data部分,在Wireshark中其隶属于Modbus部分且未能被详细解析,而恰好此部分即为UMAS所特有的,本节内容所讨论的UMAS功能码并非Modbus协议中的功能码,而是指UMAS特有部分中的功能码,其与PLC的各种配置,包括:PLC读、写、运行/停止、数据上传/下载等操作密切相关。
UMAS协议功能码的梳理与总结,源于对相关DLL文件的分析和对与PLC通信数据分析总结而来,测试中使用了Schneider M340 PLC,在没有PLC的情况下,可使用上位机软件Unity Pro XL(后来软件更名为EcoStruxure Control Expert)自带的仿真器代替PLC进行通信。
安装Unity Pro软件后,通过对特定DLL文件进行分析,可以发现逆向源码中即对协议的名称描述即为UMAS,相关的对PLC特定操作亦可以快速定位到:
结合代码分析和通信数据,UMAS相关功能码和基本含义总结如下:
UMAS功能码 | |||
序号 | 功能码 | 含义 | |
1 | 0x01 | INIT_COMM | 建立UMAS通信 |
2 | 0x02 | READ_ID | 请求PLC ID |
3 | 0x03 | READ_PROJECT_INFO | 读取PLC中工程信息 |
4 | 0x04 | READ_PLC_INFO | 读取PLC内部信息 |
5 | 0x06 | READ_CARD_INFO | 读取PLC SD卡信息 |
6 | 0x0A | REPEAT | 回传发送给PLC的数据 |
7 | 0x10 | TAKE_PLC_RESERVATION | 独占PLC |
8 | 0x11 | RELEASE_PLC_RESERVATION | 释放PLC |
9 | 0x12 | KEEP_ALIVE | 保持连接 |
10 | 0x20 | READ_MEMORY_BLOCK | 准备读取PLC内存块 |
11 | 0x22 | READ_VARIABLES | 以bit/word方式读系统变量 |
12 | 0x23 | WRITE_VARIABLES | 以bit/word方式写系统变量 |
13 | 0x24 | READ_COILS_REGISTERS | 读PLC的线圈/寄存器值 |
14 | 0x25 | WRITE_COILS_REGISTERS | 写PLC的线圈/寄存器值 |
15 | 0x26 | ENABLE/DISABLE DATA DICTIONARY | 启用/关闭数据字典功能 |
16 | 0x30 | INITIALIZE_UPLOAD | 初始化数据上传(From PLC) |
17 | 0x31 | UPLOAD_BLOCK | 上传PLC数据 |
18 | 0x32 | END_STRATEGY_UPLOAD | 完成数据上传 |
19 | 0x33 | INITIALIZE_DOWNLOAD | 初始化数据下装(To PLC) |
20 | 0x34 | DOWNLOAD_BLOCK | 下载数据到PLC |
21 | 0x35 | END_DOWNLOAD | 完成数据下载 |
22 | 0x36 | CREATE/RESTORE/REMOVE BACKUP | 创建/恢复/删除内存卡中的数据备份 |
23 | 0x39 | READ_ETH_MASTER_DATA | Read Ethernet Master Data |
24 | 0x40 | START_PLC | 运行PLC |
25 | 0x41 | STOP_PLC | 停止PLC |
26 | 0x50 | MONITOR_PLC | 监视PLC变量 |
27 | 0x58 | CHECK_PLC | 检查PLC连接状态 |
28 | 0x70 | READ_IO_OBJECT | 读IO目标 |
29 | 0x71 | WRITE_IO_OBJECT | 写IO目标 |
30 | 0x73 | GET_STATUS_MODULE | 获取状态模块 |
3、UMAS协议数据分析
使用Unity Pro连接M340 PLC进行一些列操作,抓取通信过程数据,可对功能码进行对照分析。对于UMAS协议,有一点需要明确的是它是一种应/答式的通信协议:包含某种功能码的数据发送到PLC,PLC对请求解析后按照固定格式回应数据。UMAS的请求与响应数据基本格式如下所示:
请求:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ UMAS CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]
响应:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ RETURN CODE (16 bit) ] [ UMAS PAYLOAD (Variable) ]
[RETURN CODE]即为状态码部分,存在两种可能性:0x01 0xFE–意味着OK;
0x01 0xFD–意味着Error。
功能码0x01:建立通信,抓取的实际建立通信的数据将为:
响应数据包为:
功能码0x03:读取PLC中工程信息,抓取的实际建立通信的数据将为:
响应数据包为:
响应数据包的基本格式为:
[ TCP Packet ] – [ Modbus Header ] – [5A] – [ Response Code (16) ] – [ Unknown (9 bytes) ] – [ Unknown 2 (9 bytes) ] –
[ Modification date (8 bytes) ] – [ Modification date Rep (8 bytes) ] – [ Project Version (16) ] – [ Unknown (16) ] –
[ Project Name length (8) – [ Project name (variable) ]
状态码之后连续两个9字节数据意义不明确,df 07按照小端数据换算过来即为2015,即工程修改时间为2015年;工程版本为0.0.01
功能码0x40/0x41:启动/停止PLC
启动PLC的请求数据为:
UMAS CODE部分为00 40,不同情况下使用01 40亦可以启动PLC运行(与PLC固件版本相关)。
相应的停止PLC的UMAS CODE部分为00 41或01 41均可。尝试对Schneider M340 PLC发送启/停数据包,验证数据格式及功能的可行性,如下所示:PLC被停止后,其run灯变为闪烁状态(并非熄灭):
结合对UMAS功能码的理解,尝试编写数据解析插件并对数据包解析,可得到如下效果:
请求数据包:
回复数据包:
4、总结
本文基于对施耐德组态软件Unity Pro的关键DLL分析和对上位机与PLC通信数据分析,梳理总结了UMAS协议基本功能码,同时尝试编写Wireshark解析插件以方便数据包分析,验证了插件的可用性和数据的正确性。
参考资料:
[1] https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
[2] https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/vulnerabilities-in-schneider-electric-somachine-and-m221-plc/
[3] https://www.lshack.cn/827/
[4] https://www.cnblogs.com/zzqcn/p/4840589.html
本文暂时没有评论,来添加一个吧(●'◡'●)