可编程逻辑控制器简称PLC,被广泛运用在各行业的工业控制系统上,如钢铁、石油、化工、电力、建材、机械制造、汽车、轻纺、交通运输、环保及文化娱乐等行业,我国早期PLC均为进口PLC,德国西门子PLC以其高性价比、高可靠性在我国拥有较高市场占有率。近年工业网络安全事件频发,PLC成为主要受害对象,其中又以西门子PLC受到攻击占比高。
人们逐渐意识到保护工业控制器PLC的重要性。其中,基本的防护措施就是给PLC设置访问控制权限。但黑客攻击手段层出不穷,本文要分析的“注入攻击”就是一种攻克加密PLC的攻击方式,攻击过程包括获取PLC明文密码、修改PLC访问控制权限、感染PLC逻辑控制程序并重新注入到PLC控制器中,终致使生产过程中控制点位地址发生变化,局面失控,轻则停产,重则设备损坏,甚至威胁工作人员生命安全,乃至重大民生安全。
本文针对西门子S7-300系列PLC注入攻击的关键部分进行分析。其工业控制系统的网络架构如下图所示,主要控制设备处于工业网中,我们常说的“工控内网”主要指过程监控层和现场控制层两个网络层。
工业控制系统典型架构图
本文假定攻击者已进入工控内网,故省略前置渗透过程。
PART/1
环境搭建
一、设备与工具清单
1、西门子S7-300 PLC(VM1)
2、工程师站(VM2),运行工控编程软件Step7,对PLC编程组态
3、黑客渗透PC机(VM3)
4、其他主要工具包括:snap7(PLC连接)、Hex Workshop Hex Editor (64 bit)(修改十六进制文件)
二、环境搭建简述
1、控制设备S7-300 PLC使用软件形态的PLC(WinAC)
2、使用Step7对PLC编程组态并设置PLC访问控制权限(假定密码为“1”)
PART/2
注入攻击主要环节分析
一、PLC 密码获取
获取PLC的加密密码是我们攻击成功的步。获取方式可通过分析含有密码传输的数据包或者密码存储文件来进行。
方法1:分析通讯中的 PLC 加密算法
S7-300 PLC密文为8位,经研究pcap数据包得到传输密文的加密方法:
其中:p是明文密码位数,0x20为“空格”的十六进制。
方法2:分析存储时 PLC 加密算法
1、初探 PLC 防护等级
使用snap7尝试上、下载,wireshark抓包发现PLC可能已禁止Download。
向PLC下载时wireshark抓取的错误报文
2、分析 MC7 文件得知防护等级和密文
PLC是一个结构化的组成,内部包括多个不同的模块,每个模块完成不同功能(用“块名称+编号”命名),譬如OB1块存储主程序,负责调用子程序块FC中的子程序;系统数据块SDB块保存用户组态数据,PLC密码加密后就存储于SDB0块中,SDB1、SDB4、SDB7块存储与SDB0相关的组态数据,所有模块都是MC7字节码形式的十六进制文件。
根据PLC存储特点可知,要获得PLC的存储密码必须使用snap7上载SDB0块,“0C 0F 00”标识PLC为加密状态,防护级别“02”代表“只读”,其后8字节即为密文(未加密无“0C 0F 00”)。
SDB0块的MC7字节码(含密文)
3、经研究分析SDB0块可得PLC密码存储时加密算法
SDB0块中密文的加密算法(可逆)
二、PLC 密码清除,修改控制权限为“可读可写”
步骤1:使用snap7查看PLC当前防护情况:
PLC当前防护情况
步骤2:使用snap7查看PLC当前块列表:
PLC当前块列表(删除SDB0前)
步骤3:删除PLC中SDB0块
经研究编写删除PLC中SDB0块的脚本delete.py,运行脚本。
delete.py脚本中主要片段
步骤4:使用snap7查看PLC当前块列表,SDB0已经不见。
PLC当前块列表(删除SDB0后)
步骤5:替换SDB0块(无密码)、SDB1块、SDB4块、SDB7块并启动PLC。
依次加载SDB块并下载到PLC中
SDB0块出现,重启step7下载,没有出现输入密码框,SDB0替换成功。
三、PLC 程序的 MC7 字节码分析与注入
使用snap7上载PLC运行程序(程序存储于OB1块),图13中LAD(梯形图)和图14中STL(语句表)是PLC的两种编程语言,可以相互转化,OB1块的MC7字节码文件中控制语句与STL语言相对应:
PLC中运行程序(修改前LAD)
PLC中运行程序(修改前STL)
OB1块的MC7字节码(修改前)
第37-38字节:80 00,代表AM0.0;第39-40字节:D8 80,代表=Q0.0;第41-42字节:65 00,代表语句BE,中止在当前块中程序扫描;第43-44字节:01 00,执行代码区结束标志。
修改OB1块字节码下载到PLC(这里将“80 00”修改为“81 00”、“D8 80”修改为“D9 80”)。
对比图13、14和图16、17,发现此时PLC控制程序已发生改变,按钮地址M0.0变成M0.1,输出地址Q0.0变成Q0.1,地址变化将导致生产失控。
PLC中运行程序(修改后的LAD)
PLC中运行程序(修改后的STL)
在实际攻击中可结合中间人方式绕过工控防护设备即隐藏注入攻击。
PART/3
研究结论及防护建议
一、注入攻击的影响与危害
按照攻击目的,PLC注入攻击可分为PLC控制逻辑和PLC固件破坏两种:
1、控制逻辑
本文分析的注入攻击类型即为控制逻辑攻击,此类攻击主要感染PLC控制逻辑代码(PLC程序),破坏控制逻辑。譬如工控蠕虫病毒攻击(唯一一种真正的工控病毒)就使用了PLC密码破解模块,密码自动化破解是工控蠕虫能主动感染PLC的关键。
2、固件攻击
主要以破坏固件导致PLC宕机为主。PLC无条件信任其内在的固件验证机制成为了其原生缺陷,导致异常固件无法被检查。被攻击后PLC会彻底瘫痪无法正常工作。
二、防护建议浅谈
从上述分析可知密码防护是工控设备道防线,防护等级越高自身安全性越高。另外,在工业内网部署工控安全设备,将工控系统正常运行时禁止的操作(非异常行为,属于正常行为出现在非正常时间,如Run、Stop、Write、Upload、Download等)加入安全设备规则库中,配置好防护规则,从网络层面可做好有效的安全防护。
三、部分防御规则参考
可以在工控防火墙/IDS和审计设备上搭载相应规则,对如下高危动作进行及时识别和处置。
作为数字化解决方案,集团将在“云智原生”战略指引下,坚持“主动安全 业务驱动”理念,打造安全可信的产品与解决方案、的安全服务和优质的安全人才培养体系,将安全能力不断融入到客户的业务变革当中去,为提升百行百业用户信息安全防护能力与水平、加速数字经济与实体经济的深度融合贡献智慧和力量。