工控协议网关漏洞挖掘与攻击
本文系原创
转载请说明出处:信安科研人
please subscribe my official wechat :信安科研人
获取更多安全资讯
原文:
〇 摘要
随着工业4.0的发展,串行控制服务器或PLC等传统设备通常需要与现代IT网络或互联网(例如云提供商)互连。为了满足这一需求,协议网关支持ICS协议的转换,例如将基于IP的网络连接到一个或多个串行设备,反之亦然。虽然先前的研究表明,协议网关可能会受到本地操作系统漏洞的影响,但尚不清楚协议转换在多大程度上能够抵御攻击或滥用。为了回答这些问题,作者对五个流行的网关进行了跨供应商安全评估,发现了几类安全问题,当被攻击者利用时,可能会损坏或对工业设施的运营产生负面影响。
一 研究对象与研究的问题
1.1 研究对象--协议网关
本质:一种小型设备,功能是转换多种协议以及物理层协议(以太网和串行线路),从而让工业系统中的各组件能够相互通信。
功能:为了让串行线缆传输的OT协议与IT设备进行通讯,协议网关通过将串行OT协议转为TCP/IP,来弥合两者之间的差距,典型的包含网关的OT架构如下:
图1中的过程网络包含: 连接到PLC的设备,诸如继电器、电机、开关和其他传感器, 这些设备需要通过 PLC 向控制网络中的人机接口 (HMI), Historian 或 Engineering Workstation 发送数据 (例如,从温度计读取温度,从转速计 RPM ) 。相互的,操作员还可以从 HMI 发送指令 (例如,打开或关闭阀门,改变 PLC 中的阈值 ) 。
在工业 4.0 中, HMI 通常在单独的网络中使用 Modbus TCP, TCP/IP 等价于 Modbus RTU 协议。 为了使设备能够接收来自 HMI 的指令,并且为了使设备向 HMI 发送数据,需要协议网关将 Modbus RTU 转换为 Modbus TCP ,反之亦然。
种类:
-
在同一协议层内(例如,Modbus RTU to Modbus TCP)翻译的网关,以及在不同的物理层(例如,TCP到RTU)之间翻译的网关。 类似将英语口语翻译成英语盲文。
-
在同一物理层内和跨不同协议(例如,Modbus RTU to Profibus,两个串行协议)翻译的网关。 类似于将德国盲文翻译成英语盲文。
-
跨不同协议和物理层转换的网关(例如,Modbus TCP to Profibus)。类似于将英语翻译成德语盲文。
参考:
转换原理:
上面两个是Modbus TCP转Modbus RTU,下面两个反过来。
1.2 研究问题
协议网关转换翻译协议过程中存在种种漏洞,导致协议转换与翻译失败,进而致使工控系统整体出现差错。
可能存在的问题:
-
允许未经授权访问的身份验证漏洞。
-
弱加密机制致使配置数据库信息泄露。
-
保密机制执行不力可能会导致敏感信息泄露。
-
拒绝服务(DoS) 。
-
攻击者可以利用翻译功能中的漏洞发出可以破坏操作过程的恶意命令。
二 研究方法
2.1 理论框架
-
为被测网关生成入站流量的fuzzer。例如,在测试从 Modbus TCP 到 Modbus RTU 的转换时,fuzzer会生成 Modbus TCP 测试用例。
-
模拟接收站的模拟器,例如实现Modbus RTU 从站的PLC。模拟器是必需的,因为如果协议网关未连接到某些设备,通常会报错。
-
收集有关出站流量信息的嗅探器(即转换后的协议)。
-
收集入站和出站流量以进行分析的分析器。
2.2 分析器分析什么?
自动的分析丢包和错位
三 研究结果
3.1 实验环境
实验用网关
实验使用了两类网关:实时网关、数据站
整体实验环境
3.2 实验结果:漏洞-利用方式-后果
3.2.1 协议翻译攻击
漏洞1:部分网关(实时网关 ;NIO50)错误处理入包。即入包是无效、错误的包,网关可能有翻译并传送这些包、发现无效并丢弃这些包这两种情况。如果是第一种,那么就可能会出现一些安全问题。
漏洞示例:
此图是写多个寄存器操作的报文,正确的报文的message length应该是0xB,正常的网关应该是识别出这个数据包存在问题,修正后翻译或丢弃,而不是直接翻译或者按原样转发。
利用方式:
既然直接翻译或者直接转发,那么可以精心构造恶意数据包。
漏洞利用效果:
构造任意读写的数据包,恶意操纵、损坏设备。
漏洞2: I/O 映射表和翻译例程攻击
背景:这里主要讨论数据站类网关,与实时网关不同的地方在于数据站不会即时将入站协议转换为出站协议。在部署数据站之前,工程师首先需要适当地配置数据站,以便它知道哪个线圈、寄存器和命令映射到出站接口上的哪个开关、传感器或设备。这里将映射结果称为I/O映射表。
可以看出,I/O映射表包含了各个线圈、寄存器等设备的信息,这些信息的机密等级较高,存在以下漏洞:
I/O映射表的恶意提取。此漏洞的前提是攻击者已经获取了系统的访问权限,因此可以对数据站网关的映射表内容进行提取
利用方式:当攻击者从映射表中提取如下的信息,那么我都不敢想他会做出什么事
-
用于写入以关闭电机的线圈
-
用于写入以覆盖温度阈值的保持寄存器
-
用于写入以减慢离心机的速度的保持寄存器
-
用于写入以反向传送带的线圈
漏洞利用效果:
不可估计
3.2.2 网关设备漏洞攻击(放大协议翻译攻击)
漏洞1:证书复用和可解密的配置
背景:Moxa 在与名为 MGate Manager的远程管理软件通信时使用专有协议。 启动 MGate Manager 时,将提示一个字段,工程师输入其用户名和密码以访问协议网关,然后 McGate Manager 自动转储配置,以便工程师可以更改用户界面上的设置。 当工程师完成设置协议网关并单击 "退出" 时,配置将被压缩,加密并上载到网关。
(1)证书复用漏洞:
当要求工程师登录远程管理软件时,密码会传输到 MGate Manager 以将密码hash,这样密码就不会以明文形式传输。可以通过将密码设置为 rand() 来随机化密码,但必须设置随机种子,以便每次协议网关中的内部服务程序重新启动时,随机密码都会被重新创建。
然而,作者所测试的网关的固件版本没有设置随机种子。 因此,从黑客的角度来看,密码看起来是可以预测的。
漏洞利用:服务程序在协议网关重启和上传新配置时重启。因此,每次工程师退出用户界面时,密码都会被回收。
黑客可以重放相同的加密密码以通常具有管理员权限的现场工程师身份登录,而无需知道明文密码。
(2)可解密的配置漏洞:
就算随机种子被正确设置,第二个漏洞仍然可以dump出I/O映射表——通过以太网传输的加密配置包含加密密钥,因此可以解密。
如下图,加密的配置在传输时包含 AES 密钥(注意,AES是对称加密,密钥很重要!)。这相当于发送受密码保护的 zip 文件,但密码在文件名中。
加密的配置包含配置文件、数据库和Secure Shell(SSH)密钥等:
漏洞利用:
(1)信息泄露:解密加密的配置后,作者发现其中包含协议网关的私有RSA密钥和几个数据库。 数据库没有加密,可以使用SQLite3进行dump和修改。I/O映射表、用户表(密码是哈希)、Modbus配置,甚至云配置(如 Azure 连接字符串)和MQTT 凭据都存储在配置中。
(2)重放攻击:获取shell密钥后,攻击者可以访问 MGate Manager(管理员系统) 和 MGate 5105 之间的网络,那么可以对 MGate Manager 进行重放攻击,并解密系统配置,包括 I/O 表。
漏洞2:提权
作者在这里是指WEB页面存在RCE,如下图,不多赘述
漏洞3:内存泄露
介绍此漏洞前需要介绍一下DA10D网关的I/O映射表,DA10D网关的I/O映射表由Red Lion 的管理软件 Crimson 3.1 版配置,配置完后更新到数据站。
图12是如何将Modbus TCP配置的DA10D上的Modbus主线圈映射到DA10D上的Modbus slave线圈(该线圈为Modbus RTU配置)。包含MBSlave(Modbus slave)上四个线圈(000001-000004)的数字CoilWrite网关块映射到MBMaster(Modbus master,为什么叫master,因为网关是slave的master也就是图中最下面一行)线圈(MBMaster.000001-MBMaster.000004)——一个内存块,代表连接到数据站的PLC上的实际线圈。
发送Modbus TCP协议的编写线圈命令到DA10D上的线圈1,将被MBSlave的数字CoilWrite 00001接收,然后发送到MBMaster.0000001。然后将该值发送到通过Modbus RTU连接的PLC的设备。
下图是MGate 5105网关的I/O映射表,可以看到网关扮演着两个角色,一个是Modbus TCP Server,另一个是Modbus RTU/ASCII Master。
图右侧的表指定了在行中定义的任何内部地址发生变化时需要执行的“命令”。 表可以读为:
-
第1行:内部地址0值的任何变化,触发命令“Relay Switch”
-
第2行:内部地址1值的任何变化,触发命令“MotorSwitch”
-
第3行:内部地址2值的任何变化,触发命令“ThermSwitch”
-
第4行:内部地址3值的任何变化,触发命令“EnTachometer”
-
第5行:内部地址4-5值的任何变化,触发命令“SetRPM”
-
第6行:内部地址6-7值的任何变化,触发命令“SetDevID”
左表报告了这些命令如何映射到 Modbus TCP 地址。
使用 I/O 映射表优化了某些操作:
例如,在传入的写入请求写入目标设备之前,首先将其解析并存储在内存中。对于读取请求,数据站通过从内部存储器读取值来立即响应读取请求,而无需轮询实际从属线圈或寄存器的值。为了使内存中的数据与实际值保持同步,网关的第二个例程会定期扫描内存中的值是否发生变化,并生成一个命令(或一系列命令)以将这些值写入相应的设备。
测试DA10D数据站类网关时,(条件一)该数据站网关被配置为在 Modbus TCP 和 Modbus RTU 之间进行协议翻译,(条件二)网关接收到 "write multiple registers" 消息 (函数代码 0x10) 命令且”byte count“字段设置为0,漏洞就会出现。
作者发现,当 "write multiple registers" 消息写入的寄存器数量在x0001和x0008之间且数据字节的数量设置为x00时,DA10D网关以write register request的形式泄漏网关的内存数据。 通过分析可以确认,泄漏的内存数据量等于“number of registers to write”字段中的值乘以 2。 可一次泄漏的最大数据量是16 bytes。
此时, DA10D 会自动读取数据,以将其内部映射寄存器与已写入从属项的值同步。 攻击者通过发送至 DA10D的读消息访问泄漏的数据。
漏洞利用:
泄漏的内存数据的地址来自报文的“starting address”字段,可控,因此攻击者可能会泄露任意内存位置,包括配置和代码。
3.2.3 拒绝服务
漏洞1:
网关的协议翻译功能无法处理大规模数据包。就算是普通云服务器都会有资源上限,网关同理,作者用fuzzer发现在间隔0.5秒连续发送100、2000、3000个数据包后,翻译功能根本来不及处理。
漏洞利用:
构造大量数据包发送至网关
攻击效果:
拒绝服务
个人思考
作者针对工控系统网关,综合考虑两种类型网关的内部结构和业务功能,以及网关所翻译的前后协议这两个方面的因素,利用fuzzer来构造大量的数据发送至网关,挖掘出大量的漏洞。同时,作者在漏洞基础上提出多种利用方式。
本质上,作者挖出了协议本身设计的漏洞、网关翻译功能的漏洞、网关设备本身存储结构等组件的漏洞等,并认为这些漏洞能够对整个工控系统造成重大的影响。
因为此工作大部分是靠错误的协议数据包影响网关而发掘的漏洞,所以这里我将其归类为工控设备漏洞与漏洞利用。