保护工业控制系统和 OT 环境免受远程攻击比以往任何时候都更为重要,尤其是CVE-2017-14469和现在的 CVE-2021-22659 等漏洞都是针对罗克韦尔自动化公司广泛使用的 Micrologix 1400 控制器。OPSWAT 奖学金项目的学生在受控环境中测试了这一漏洞,凸显了安全的必要性。
在本博客中,我们将探讨学生们如何演示攻击者如何利用该漏洞导致系统崩溃,以及如何利用缺乏适当的输入验证来破坏 PLC 的运行。
什么是 PLC?罗克韦尔自动化 Micrologix 1400 解读
PLC (可编程逻辑控制器)是一种工业计算机,旨在通过控制机械和其他工业操作实现流程自动化。它可在恶劣环境中工作,并根据传感器输入执行特定任务。罗克韦尔自动化的 MicroLogix 1400 控制器是一种紧凑型模块化 PLC,通常用于中小型应用。它以成本效益和灵活性著称,支持各种通信协议,并提供数字和模拟输入/输出选项,用于与设备连接。
编程通常通过梯形图逻辑使用罗克韦尔自动化的软件完成,用户可以创建控制序列。MicroLogix 1400 用途广泛,适用于机器控制和过程自动化等任务。其模块化设计使用户可以根据具体应用要求扩展和定制系统。
CVE-2021-22659 简介
2021 年 1 月,罗克韦尔自动化收到印度 Veermata Jijabai 技术学院 (VJTI) COE-CNDS 的 Parul Sindhwad 和 Faruk Kazi 博士关于 MicroLogix™ 1400 控制器漏洞的报告。他们在 21.6 及更早版本中发现了一个安全漏洞,允许未经认证的远程攻击者发送特制的 Modbus 数据包,使攻击者能够检索或修改寄存器中的随机值。如果被成功利用,可能会导致缓冲区溢出,造成拒绝服务。故障 LED 灯将闪烁红色,通信可能中断。从拒绝服务状态恢复需要用户清除故障。
NVD 将此安全漏洞评估为 "高度严重"。
攻击阶段
未通过身份验证的远程攻击者通过网络访问存在漏洞的 MicroLogix 1400 PLC,可以发送特制数据包来修改寄存器中的值。这可能会导致设备出现拒绝服务情况,造成系统损坏和停机。此类事件会严重扰乱企业的生产运营和其他业务活动。
Modbus 协议
Modbus 协议由 Modicon 于 1979 年开发,是一种消息传递结构,旨在建立智能设备之间的客户端-服务器通信。该协议最初设计用于 Modicon 的 PLC,后来成为工业电子设备之间的标准通信协议。
Modbus 协议有以太网(Modbus TCP)和串行线路(Modbus RTU 和 Modbus ASCII)两种。Modbus RTU(远程终端设备)通过串行通信以二进制形式直接传输数据,而Modbus TCP(传输控制协议)则将 Modbus 协议数据嵌入 TCP 数据包,通过 TCP/IP 网络传输。
Modbus 报文结构
Modbus 是一种请求-响应协议,客户端向 Modbus 设备发送请求,设备随后作出响应。
从主站发送到副站的 Modbus 报文包含副站地址、"命令"(如 "读寄存器 "或 "写寄存器")、数据和校验和(LRC 或 CRC)。
读取或修改数据时,数据地址用于 Modbus 查询报文。Modbus 定义了四种数据类型:线圈、输入状态、输入寄存器和保持寄存器。其中两种数据类型存储开关(1 位)值,称为线圈和离散输入;另两种数据类型以 16 位字存储数值,称为寄存器。每个寄存器都可以只读或读写。
数据类型 | 访问 | 说明 |
线圈 | 读写器 | 单比特输出。 |
离散输入 | 只读 | 单比特输入 |
输入寄存器 | 只读 | 16 位输入寄存器 |
保持寄存器 | 读写器 | 16 位输出寄存器。 |
Modbus 功能代码分为三类:
- 公共功能代码 - 从 1 到 127,用户自定义代码除外。
- 用户自定义功能代码 - 分为 65 至 72 和 100 至 110 两个范围。
- 保留功能代码 - 某些公司用于传统产品,不对外公开使用。
功能类型 | 功能名称 | 功能代码 | ||
数据访问 | 位访问 | 物理离散输入 | 读取离散输入 | 2 |
内部位或物理线圈 | 读取线圈 写入单线圈 写入多个线圈 | 1 5 15 | ||
16 位访问 | 物理输入寄存器 | 读取输入寄存器 | 4 | |
内部寄存器或物理输出寄存器 | 读取多个保持寄存器 写入单个保持寄存器 写入多个保持寄存器 读/写多个寄存器 屏蔽写寄存器 读取 FIFO 队列 | 3 6 16 23 22 24 | ||
文件记录访问 | 读取文件记录 写入文件记录 | 20 21 | ||
诊断 | 读取异常状态 诊断 获取 Com 事件计数器 获取通信事件日志 报告从属设备 ID 读取设备标识 | 7 8 11 12 17 43 | ||
其他 | 封装接口传输 | 43 |
功能类型:数据访问 子类型:位访问 类别:物理离散输入 功能名称:读取离散输入端 功能代码:2 |
功能类型:数据访问 子类型:位访问 类别:内部位或物理线圈 功能名称:读取线圈 功能代码:1 |
功能类型:数据访问 子类型:位访问 类别:内部位或物理线圈 功能名称:写入单线圈 功能代码:5 |
功能类型:数据访问 子类型:位访问 类别:内部位或物理线圈 功能名称:写入多个线圈 功能代码:15 |
功能类型:数据访问 子类型:16 位访问 类别:物理输入寄存器 功能名称:读取输入寄存器 功能代码:4 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:读取多个保持寄存器 功能代码:3 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:写入单个保持寄存器 功能代码:6 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:写多个保持寄存器 功能代码:16 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:读/写多个寄存器 功能代码:23 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:掩码写寄存器 功能代码:22 |
功能类型:数据访问 子类型:16 位访问 类别:内部寄存器或物理输出寄存器 功能名称:读取 FIFO 队列 功能代码:24 |
功能类型:数据访问 子类型:文件记录访问 功能名称:读取文件记录 功能代码:20 |
功能类型:数据访问 子类型:文件记录访问 功能名称:写文件记录 功能代码:21 |
功能类型: 功能名称:读取异常状态 功能代码:7 |
功能类型: 功能名称:诊断 功能代码:8 |
功能类型: 功能名称:获取通信事件计数器 功能代码:11 |
功能类型: 功能名称:获取通信事件日志 功能代码:12 |
功能类型: 功能名称:报告从属设备 ID 功能代码:17 |
功能类型: 功能名称:读取设备标识 功能代码:43 |
功能类型: 功能名称:封装接口传输 功能代码:43 |
剥削
脆弱性分析
通过分析,我们的OPSWAT 研究生研究员发现,在 Modbus TCP 通信过程中,协议缺乏对传输数据包的验证和加密。此外,MicroLogix 1400 PLC 的输入验证也没有正确实施。因此,远程攻击者可以通过数据包嗅探分析 Modbus TCP 数据包,并通过 Modbus TCP 协议向 PLC 发送任何未经验证的请求。由于 MicroLogix 1400 PLC 设备缺乏输入验证,远程验证攻击者可以发送大量带有随机值的数据包,从而可能导致 PLC 崩溃。
重写寄存器
最初,我们试图捕获用于读写 PLC 上寄存器的 Modbus TCP 数据包。为此,我们检查了一个名为 Modbus Poll 的应用程序生成的数据包,该应用程序可帮助读写 MicroLogix 1400 PLC 上的寄存器。
通过使用 Wireshark 捕获网络接口的所有数据包,我们可以识别出用于写入单个寄存器的 Modbus TCP 数据包:
根据嗅探数据包的结构,我们开发了一个简单的 Python 脚本来发送 TCP 数据包,请求写入目标 PLC 上的寄存器。在这种情况下,PLC 的 IP 地址为192.168.93.89。
PLC 的寄存器在收到我们的恶意未验证数据包后被更改。

在 Micro Logix 1400 中,大多数数学指令使用三个参数:源 A、源 B 和目的地
源 A 和源 B 的值可以来自两个名为 N13:3 和 N13:4 的 16 位寄存器。此外,这些 16 位寄存器(如 N13:3 和 N13:4)中的值被限制在 -32,768 至 +32,767 的范围内。如果 N13:3 和 N13:4 的值很大,匹配指令的结果可能会超出数据类型的最大范围,从而可能导致 PLC 崩溃。因此,要导致 PLC 崩溃,就必须向所有寄存器(包括 N13:3 和 N13:4)写入较大的随机值。为此,我们对 Python 脚本进行了如下修改:
模拟攻击
为了模拟真实世界中的攻击,我们的OPSWAT 研究生研究员尝试诱导位于OPSWAT CIP 实验室的 MicroLogix 1400 PLC 崩溃,前提是攻击者和 PLC 位于同一个网络中,并且能够相互通信。
在OPSWAT 实验室的 MicroLogix 1400 PLC 的正常运行状态下,当 PLC 处于远程运行模式时,所有寄存器的值都是有效的,并在其数据类型的指定范围内,表明用户程序运行正常。
在执行我们的 Python 脚本后,将向 PLC 发送大量 Modbus TCP 数据包,要求在未经验证的情况下向所有寄存器写入大量随机值:
收到这些恶意数据包请求后,包括 N13:3 和 N13:4 在内的所有寄存器的值都被设置为 16990。对 N13:3 和 N13:4 寄存器进行 ADD 操作的结果超出了 16 位寄存器的有效范围。这个问题会导致整数溢出,从而引发故障并中断 PLC 的运行,如 FAULTED 状态所示。
我们的OPSWAT 研究生研究员利用 CVE-2021-22659 成功破解了 MicroLogix 1400 PLC。
补救措施
面对 CVE-2021-22659 这样的漏洞,全面的补救措施对于保护 OT 和网络物理系统至关重要。以下是一些可用于防止攻击扩散的关键策略:
- 检测已知的 CVE:定期扫描网络,查找 CVE-2021-22659 等漏洞。
- 监控异常行为:标记与 Micrologix 1400 PLC 通信频率的异常增加,这可能表明正在发生未经授权的数据传输攻击。
- 识别新设备连接:当有新设备连接到 PLC 时,系统应进行检测。
- 网络隔离:隔离受影响的设备有助于防止攻击横向扩散,从而将影响降至最低。
OPSWAT的MetaDefender OT Security 通过检测 CVE、持续监控网络异常行为和识别未经授权的连接来满足这些需求。它利用人工智能学习正常的流量模式,建立基准行为,并实施策略来提醒异常情况。这样就能对潜在威胁做出即时、明智的反应。
在发生利用 CVE-2021-22659 的攻击时,MetaDefender OT Security 可与MetaDefender Industrial Firewall 集成,根据设定的规则阻止可疑通信。防火墙使用人工智能学习常规流量模式并执行策略,以防止未经授权的连接。
MetaDefender OT Security 将这些检测、警报和网络分段功能结合在一起,成为工业环境的理想防御机制,大大降低了操作技术环境中网络威胁的风险和影响。
了解OPSWAT的深度防御网络安全平台如何增强和完善您的态势。立即与专家联系,获取免费演示。