作者: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
热门跟贴