PLC是一种数字运算操作的电子系统,专为在工业环境下应用而设计。它采用可编程序的存储器,用来在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令,并通过数字式、模拟式的输入和输出,控制各种类型的机械或生产过程,作为工业控制系统的核心组件,PLC的安全是工控安全的重中之重。
TM221CE24R是施耐德公司的一款产品,本次实验着重研究对此款PLC的攻击实验,进行资产确认、功能枚举、DOS攻击、重放攻击、FUZZ测试、ARP欺骗等试验。通过这些试验,对挖掘PLC的漏洞提供一些思路。之后对攻击成功的流量重新做实验,在PLC之前串联珞安科技工业防火墙,测试防火墙的防护能力。
图1-SchneiderTM221 PLC
具体实验组网拓扑图如下,其中工业防火墙串联PLC,实验首先将工业防火墙设为调试模式进行攻击实验,即防火墙对流量不拦截,测试防火墙防护能力时将防火墙设为工作模式,防火墙对攻击流量进行拦截。
图2-实验箱组网逻辑拓扑图
一、资产确认:
1.1 通过plcscan工具,能够确认该PLC具体型号为TM221CE24R,使用modbus协议
图3-Plcscan确认PLC具体型号
使用防火墙的防护效果:防火墙的黑名单事件已识别此次扫描并进行拦截
图4-开启防火墙后plcscan扫描防护墙的日志
plcscan扫描后无法识别modbus。
图5-开启防火墙后plcscan扫描失败
1.2 通过nmap的modicon-info脚本扫描502端口,也可以列出PLC的具体信息,服务为modbus
图6-Nmap脚本确认PLC具体型号
使用防火墙的防护效果:使用珞安科技工业防火墙,自带黑名单,重新使用nmap扫描,从防火墙端的黑名单事件可以看出,匹配到探测流量后将流量抛弃。
图7-开启防火墙后nmap扫描防火墙的日志
Nmap扫描后已无法识别modbus
图8-开启防火墙后nmap识别modbus失败
二、smod框架测试
既然使用了modbus协议,首先考虑使用smod进行渗透测试。Smod是一个模块化的Modbus渗透测试框架,可以用来测试Modbus协议所需的各种诊断和攻击功能。这是一个使用Python和Scapy的完整的Modbus协议实现。这个软件可以在python 2.7.x下的Linux / OSX上运行。Smod安装后有如下modules:
图9-Smod主要功能
2.1 暴力破解PLC的UID及枚举功能
通过smod框架首先爆破出UID,再通过UID枚举出PLC的功能。同时爆破出的UID还可以进行读取线圈、读取保持寄存器等操作。
图10-Smod枚举UID
Modbus PLC的功能进行枚举(/modbus/scanner/getfunc),携带上UID
图11-Smod枚举功能码
使用防火墙的防护效果:防火墙对爆破的流量进行了识别且丢弃,黑名单事件如下:
图12-开启防火墙后,smod枚举时防火墙记录的日志
图13-防火墙记录的黑名单信息
在防护墙防护后,爆破UID的速度变得很慢,在枚举功能时smod框架直接报错。
图14-防火墙开启后smod框架枚举失败
2.2 读取线圈
图15-Smod读取线圈
2.3 保持寄存器进行读取(/modbus/function/readHoldingRegister)
图16-Smod读取保持寄存器
此为PLC的正常功能,防火墙默认并未做限制,未识别到安全事件。
三、DOS攻击
3.1 Synflood攻击
SYN攻击利用TCP建立连接时3次握手,通过原始套接字发送源地址虚假的SYN报文,使目标主机永远无法完成3次握手,占满了系统的协议栈队列,资源得不到释放,进而拒绝服务。使用如下命令进行Synflood dos攻击:
图17-Hping3进行synflood攻击
可以看到dos攻击产生效果,PLC无响应,wireshark抓包发现发送了大量TCP的包
图18-Hping3进行synflood攻击流量
图19Hping3进行synflood攻击后HMI与PLC已无法通信
使用防火墙的防护效果:
防火墙对synflood攻击进行了识别且丢弃,在攻击防护事件中有如下记录:
图20-synflood攻击防火墙日志记录
防火墙开启后流量峰值明显下降
图21-synflood攻击开启防火墙峰值下降
四、重放攻击
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。以下为重放攻击的步骤:
1.攻击机接入交换机,PLC串联防火墙后接入交换机。
2.使用MachineExpert-Basic配置选择TM221CE24R后,选择试运行,添加正确IP后点登录。
3.点击控制器到PLC(上传),即将PLC的程序下载到本地电脑。
图22-通过MachineExpert-Basic连接PLC并上传程序到本地
4.点击停止控制器,启动控制器,分别抓包,从大量包中分析出停止及启动PLC的程序。
启动PLC发包为hex: 589600000006015a2540ff00
停止PLC发包为hex: 1a7b00000006015a2741ff00
5.点击编程,主任务中存在编程后的程序,可以通过手动改变M点位和I点位的开关来达到调试PLC的目的,如开启LED灯,开启电机,关闭电机等。
图23-通过MachineExpert-Basic连接PLC并调试程序
6.通过wireshark抓包得到改变各个状态的数据,从大量包中获取数据编写脚本。得到modbus_exploit3.py
7.运行modbus_exploit3.py 对应命令,可通过重放攻击改变实验箱状态,如PLC启动、PLC停止、流水灯启动、流水灯停止、电机开启、电机关闭等
图24-重放攻击脚本
图25-重放攻击实验
重放攻击的流量属于正常的业务流量,防火墙识别了协议,但并未拦截,需单独配置规则拦截。
图26-防火墙协议分析抓取到了流量
五、FUZZ测试
使用peach进行FUZZ测试,抓取写单个寄存器(0x06)的流量编写peach的xml文件,未能发现问题,且peach的用例运行较慢。
图27-peach fuzz写单个寄存器的配置文件
图28-peach运行截图及fuzz结果
更改peach配置,改为fuzz功能码90,且monitor使用WindowsDebugger,速度变快,在fuzz过程中,出现实验箱灯光闪烁、电机转动等现象,FUZZ两天未能发现漏洞。
图29-peach fuzz 90功能码且改变monitor的配置文件
使用防火墙的防护效果:开启防火墙后,FUZZ时产生大量规约告警事件,防火墙对无效的流量进行了告警
图30-防火墙对无效的fuzz流量进行告警
且对部分fuzz流量进行了丢弃
图31-防火墙对部分黑名单流量进行丢弃
六、ARP欺骗
具体测试步骤如下:
1.设定kali的ip为192.168.2.32
2.在主机192.168.2.30上执行arp –a
可以查看接口192.168.2.30下面25和32的物理地址
3.在kali上执行右侧命令。
4.重新执行arp –a,可以看到192.168.2.25的物理地址已经修改为和192.168.2.32一样了。
图32-kali进行arp欺骗实验
图33-Arp欺骗成功,PLC的物理地址已修改
通过上述实验,可以发现施耐德TM221CE24R型号PLC使用modbus协议,因工控协议缺乏安全验证机制,可以很轻易的实现攻击,如UID的爆破、功能码的枚举、重放攻击等。另外DOS攻击也是针对PLC攻击的有效手段。FUZZ是发现工控协议漏洞的一种手段,但效率有待提高。可以成功对PLC的地址进行ARP欺骗,混淆网络设备。
但也发现,通过珞安科技工业防火墙可以对上述攻击进行有效防护,在默认规则情况下,能防护住nmap、plcscan的探测,也能阻止功能码的枚举。对于DOS攻击也能进行一定的消减,丢弃大量攻击流量。对于FUZZ过程中的异常流量,能够有效识别并给出告警。但对于正常的读取线圈、读取保持寄存器或者正常功能的重放攻击不能拦截,需写入对应规则。综合来看,防护效果明显。
珞安科技工业防火墙通过对主流工业协议进行解析,综合运用工控威胁特征识别技术、机器自学习与可信白名单技术,提供传统防火墙的网络层控制和状态监控能力的同时,能够有效抵御各类针对工控系统的网络攻击和恶意破坏,为生产控制系统的稳定运行提供安全保障。
珞 安 科 技 简 介
推荐阅读
原文始发于微信公众号(珞安科技):攻防有道:SchneiderTM221 PLC攻击实验