作者 | 网络安全应急技术国家工程研究中心 彭广明
三菱MELSOFT协议为三菱PLC私有组态协议,用于编程软件与三菱PLC通信。针对该协议公开资料并不多,本次主要对该协议进行分析,并基于分析结果对三菱PLC进行MELSOFT协议模糊测试。
GX WORKS2:三菱PLC编程软件,适用于Q、QnU、L、FX等系列可编程控制器,并且支持PLC仿真。
L61P-CM:L06系列CPU,默认使用TCP/5007或UDP/5008端口与编程软件进行通信。该通信协议为三菱私有协议melsoft。
逆向工具:IDA 7.5
调试工具:x64dbg
3.1 信息搜集及分析
3.1.1 通信端口
GX WORKS2默认以UDP广播方式与PLC UDP 5008端口进行组态协议通信,在GX WORKS2上可通过配置连接目标,以TCP方式与PLC TCP 5007端口进行组态协议通信。
3.1.2 协议相似性
经过网上的一些资料以及对真实PLC流量进行分析,发现MELSOFT协议与三菱MC协议有一些相似之处(三菱MC协议是一个公开协议,可直接从三菱官网下载通讯协议参考手册)。例如报文格式(MC协议3E帧)、“CPU型号读取”功能。
3.1.3 协议交互流程整理
根据网络搜集的资料,初步整理出协议的交互流程如下:
3.2 动态调试GX Works2编程软件
在GX WORKS2运行后,使用x64dbg附加到程序,在“ws2_32.dll”的send/sendto函数设置断点。在GX WORKS2中执行“数据读取”、“远程操作”等操作,查看调用堆栈,分析函数调用关系。
3.3 编程软件DLL调用分析
3.3.1 调用堆栈分析
从调用堆栈中可查找到相关的函数调用,以发送“5A 00 00 01”这条报文为例,主要函数调用顺序如下(部分函数已重命名,括号中为相对dll基址的偏移地址),可以看到函数调用主要集中于ECUNIT_PLC_LN.dll。
ws2_32.dll是用于执行TCP/IP网络通信的操作系统动态链接库。
ECUdp.dll是对ws2_32.dll的简单封装,主要作用是发送和接收UDP数据包。
ECUNIT_PLC_LN.dll主要负责的数据封包和解包,然后调用ECUdp.dll中的相关函数。
ECCommunication2.dll对ECUNIT_PLC_LN.dll进行封装。
_DNavi.dll:调用ECCommunication2.dll中的相关函数。
_DNaviPcEasyFunction.dll:调用_DNavi.dll中的相关函数。
3.3.2 协议数据封装分析
3.3.2.1数据头封装函数
Packet函数位于(ECUNIT_PLC_LN.dll + 0x6C2F)
HeaderMake00位于(ECHEADER_ETHER_PLC_LN.dll + 0x5E3)
3.3.2.2命令数据封装函数
以0101功能码为例, BroadCastDataSend_fn57_0101位于 (ECUNIT_PLC_LN.dll + 0x257BF)
3.3.3 授权码计算
位于(UNIT_PLC_LN.dll + 0x16461),根据CPU型号生成密钥,然后对challenge_code进行编码,最后生成授权码。
3.4 PLC模拟器分析
分析过程与编程软件类似,此处不再赘述,分析对象为QnUDSimRun2.exe。
模拟器通信使用的通信协议与Melsoft略有不同,主要是数据包头部不相同,命令数据部分基本一致。通分析其命令处理函数,可推测数据包中命令数据的字段类型及作用。所有命令处理函数基本都在一个函数中统一进行注册(QnUDSimRun2.exe+0x9070),然后再进行调用。
4.1 通信交互流程
根据分析结果,推测Melsoft协议通信交互流程。
4.2 数据包结构示例
表1 数据帧类型
表2-2读取CPU型号请求报文 data
表3-1读取CPU型号响应报文header
表3-2读取CPU型号响应报文 data
4.3 协议解析插件
以读取CPU型号功能码0101为例,wireshark解析插件效果如下:
本次fuzz工具选择Fuzzowski,该工具由python3编写。根据逆向出melsoft协议格式定义出数据模型,然后进行fuzz测试。主要难点在于获取PLC响应数据,然后计算授权码,再发送到PLC,需要对工具中的checksum模块进行扩展。
5.1 获取响应数据
将Challenge Code响应报文中偏移16位置开始的10个字节存储到全局字典当中,key为challenge_code。
5.1 扩展算法
在checksum模块新增MelsoftAuth算法
在数据块定义中调用扩展的MelsoftAuth算法
目前分析的报文中仍有部分字段语义不明,需要做进一步的分析。协议分析结果基于当前配置,不同配置环境下MELSOFT协议报文略有不同(如GX Works3和FX5U)。后续还需在其他配置下进行研究,以完善MELSOFT协议解析。本次研究仅完成了Melsoft协议的部分解析,希望对同行研究者有所帮助,不当之处还请批评指正。
参考资料:
1.Taking Apart and Taking Over ICS-SCADA Ecosystems A Case Study of Mitsubishi Electric
https://hitcon.org/2021/agenda/8335bbd7-5072-4fca-aae5-b657cbf60336/Taking%20Apart%20and%20Taking%20Over%20ICS%20_%20SCADA%20Ecosystems_%20A%20Case%20Study%20of%20Mitsubishi%20Electric.pdf
2.三菱Q系列PLC安全分析报告
http://plcscan.org/blog/2014/08/mitsubishi-electric-melsec-q-series-plc-analysis-report/
原文始发于微信公众号(网络安全应急技术国家工程实验室):原创 | 三菱PLC MELSOFT通信协议浅析