PLC攻击(一):应用层攻击
阅读原文时间:2023年07月08日阅读:2

转载请注明出处:信安科研人
please subscribe my official wechat :信安科研人
获取更多安全资讯

参考文献:

A Stealth Program Injection Attack against S7-300 PLCs

A Control Injection Attack against S7 PLCs -Manipulating the Decompiled Code.

Patch Now and Attack Later - Exploiting S7 PLCs by Time-Of-Day Block

按照时间顺序自上至下排序的三个工作全是来自

IHP – Leibniz-Institut für innovative Mikroelektronik, Frankfurt (Oder), Germany Brandenburg University of Technology Cottbus-Senftenberg, Cottbus, Germany

的Wael Alsabbagh以及 Peter Langendörfer所做,该团队从PLC的应用层出发,主要针对西门子s7系列的PLC,到目前为止,设计了三种攻击方式。


方式一 一种针对S7-300度隐蔽的程序注入攻击

一 研究背景

背景一 PLC通信协议

  • PLC一般通过TCP/IP与工作站通信

  • 西门子的TIA和PLC一般通过S7通信

背景二 PLC遭受的威胁较大

二 研究思路

首先损害plc的安全性,并更改运行的控制逻辑程序。

第二,从控制中心的工程软件中隐藏受感染的逻辑,该软件可以从PLC远程获取逻辑并揭示控制逻辑的感染。(怎么从远程感染不是本文的重点)

三 研究内容

实验架构

​编辑

PLC读取来自传感器1、2、3和4的输入信号。当水箱充满水时,安装在两个水箱上的两个上部传感器 (Num. 1,3) 向设备报告,而当水箱为空时,两个下部传感器 (Num. 2,4) 向设备报告。然后,PLC根据接收到的传感器读数为泵提供电源,放水至水箱。

攻击者模型和攻击面

  • 攻击者已经获取网络访问权限,切可以通过102端口发送数据包至PLC

  • 攻击者无TIA软件,也不了解PLC控制生产链具体细节

  • 攻击者不知道PLC的通信协议以及现在所运行的控制逻辑程序

攻击方法详述

A.损害PLC的安全性——解除PLC的密码保护

挑战: 读写PLC需要8个字符长度的密码

方法一般有两种,一种是重放攻击,通过提取,密码的hash,然后发送至PLC

另一种是暴力攻击,按照hash自列密码的结果,暴力破解。

答:本文用重放攻击,但是移除了PLC设置的原密码

技术背景:

​编辑密码写入S7-300 PLC的本质是写数据至SDB块中,SDB被定义为一个静态字节:0x3042(这部分作者应该是想说是内存中SDB的段地址),具体的,写到块0000(0x30303030)中,综合相加也就是地址0x304230303030处。

那么,有两种操作:一种是从这个地址中获取密码;一种是直接删除这个数据(密码),让PLC不再受密码保护。

作者选了第二种。

TIA修改通信密码的流程:

怎么删除?从密码更新的流程出发:更新或删除密码时必须提供旧密码;

  1. 更新新密码时,PLC首先要清空块SDB0的内容

  2. 然后将新的密码写入块中

重放方法:

  • 用TIA更新PLC配置的密码,使用旧密码更新,同时用wireshark记录流量

  • 只保留记录流量中,删除SBD0块操作对应的流量(?怎么找出来的?)

  • 重放处理后的流量,发现PLC不再有密码保护

B.从PLC中偷用户程序字节代码

通信方式:用Python-snap7库与PLC通信

通信目的:请求目标机器中的控制逻辑程序

使用工具:Python-snap7库中的函数full_upload(type , block number),具体功能参考Search — python-snap7 0.0rc0 documentation

上传方式:如full_upload(OB块,1),上传至攻击者的机器中,以供后续恶意代码注入

C. 将用户字节码反编译为STL代码

编辑

NOP指令对应的字节就是F000,用如图的方法提取所有STL指令对应的字节,构建数据库记录这个映射。

D.隐蔽的控制注入攻击

为什么要隐蔽?因为不隐蔽的攻击很容易被发现。

为什么容易被发现?因为有检测和保护机制,攻击会破坏这些机制,从而被发现。

有哪些检测和保护机制?如检查代码大小、周期时间变化、代码比较等。

如何绕过?因为TIA会将在线的PLC上的控制程序与控制中心的离线的用户控制程序进行比较来发现是否存在问题,作者通过构造虚假的PLC,将TIA与真PLC的连接重定向到假的PLC,并传送原始的控制程序给TIA即可,本质上是中间人攻击。

方案细节:

(1)如何假扮PLC?

背景:PN-DCP协议(数据流量层协议)有个漏洞。

这个协议用于发现设备或配置设备的名称、IP地址等。TIA通过广播一个名为"identify all"的数据包来请求网络中的所有可访问设备,所有可用的S7 PLC将回应'identify ok'数据包,这个数据包含有设备的名称、IP地址等信息。
没有对身份验证,当TIA收到identify ok后就会与这个ok数据包中包含的ip地址进行连接。

目标:阻止TIA门户到达远程PLC,并将其连接到伪造的PLC。

做法: 在旧会话期间记录了TIA门户和远程PLC之间的 “identify all” 和 “identify ok” 数据包,然后修改了真实PLC的响应数据包,将PLC的ip地址替换为192.168.0.1与假PLC的ip地址192.168.0.3。

  • 首先,两个远程站之间传输的所有数据包都将首先通过 MITM 系统,然后构建攻击 ARP 表(ARP 中毒攻击)。

  • 之后,MITM 系统通过网络发送一个“identify all”数据包(见图 8a),远程 PLC 通过将“identify ok”数据包发送给攻击者以响应,如图 8b 所示。

  • 一旦 TIA Portal 通过网络发送一个新的“identify all”数据包以尝试与远程 PLC 连接,MITM 系统就会侦听网络,识别请求并丢弃数据包,以防止真正的 PLC 响应此请求,然后将伪造的“identify ok”数据包发送回 TIA Portal,如图 8c 所示。​编辑

(2)如何传送原始控制逻辑给TIA才能不让其对比发现异常?

如果管理员怀疑远程PLC运行的控制逻辑程序不对,他将请求现在运行的逻辑程序的情况,然后进行对比。

欺骗方法如下:

先记录一个TIA与远程PLC之间的历史上传的session,然后修改安全检查期间所抓取的数据包中的ip为假PLC的ip。


方式二 操作反编译的代码以对S7PLC发起控制注入攻击

攻击方案的简述:

本文讨论了一种允许攻击者以高级反编译格式修改在 S7 PLC 中运行的控制逻辑程序的方法。

动机: 梯形图程序LAD代码暴露了控制逻辑的结构和语义

背景一 PLC基本结构

  • 每个供应商都有自己的专有固件、编程、通信协议和维护软件。但是,基本的硬件和软件架构是相似的,这意味着所有 PLC 都包含变量和控制其输入和输出的逻辑。

  • PLC代码是用供应商的控制逻辑语言在工程站上编写的。然后将控制逻辑编译为可执行格式,并下载到PLC。

  • PLC处于工业内网,攻击PLC可以获取内网拓扑信息

背景二 相关工作

  1. 精心构造数据包,通过工作站或以太网删除控制逻辑程序

  2. 在运行时修改控制逻辑,损害固件和身份验证缺陷,并触发PLC故障状态

攻击者模型

  • 无法访问TIA Portal软件

  • 可以向/从目标PLC发送/接收消息

  • 具备在TIA和PLC之间的中间人攻击系统

攻击流程

A.从PLC中窃取机器字节码

前提:

  • PLC只通过处理从工程站发送的上传/下载请求来发送/接收控制逻辑程序

  • 其中,上传对应的协议字段标识为0x1e,下载为0x1b。

    编辑

  • 字节码始终位于提取的原始数据中的两个字节码开始键0x0082和结束键0x6500之间

编辑

依据前提,从TIA与PLC之间上传/下载控制程序的数据流中过滤出控制程序的机器字节码

B.将机器字节码解编译为梯形图LAD

与方式一一样的思路,构建一个字节码与指令的映射,然后设计一个自动化映射程序。

C.构建感染程序

依据人工经验,构建恶意的LAD程序,然后形成最终的机器字节码格式,放入数据包中推给PLC,达到攻击效果


方式三 使用TIME-OF-DAY块攻击S7系列PLC

思路背景:

传统的应用层控制逻辑攻击需要在线进行,在线的将恶意代码注入到PLC中,方法三针对这个点,进行一场离线攻击。

技术背景:

编辑

(1)西门子PLC执行环境

  • 首先,CPU首先检查所有输入的状态,即拍摄输入的映像(例如传感器、开关等),并将其保存在I/O内存中。

  • 之后,逻辑控制程序以持续时间约为1毫秒的时间片执行。每个时间片分为三个部分,按顺序执行:操作系统、用户程序和通信。时间切片的数量在很大程度上取决于当前的用户程序。

  • 在程序执行结束后,CPU会更新所有输出状态,即更新保存在I/O内存中的输出映像。

  • 然后,CPU返回周期的开始,并重新启动周期时间监控。

(2)西门子用户程序

组织块(OB)、函数(FC)、功能块(FB)、数据块(DB)、系统功能(SFC)、系统功能块(SFB)和系统数据块(SDB)

OB、FC和FB包含实际代码,而DB为数据结构提供存储,并为当前PLC配置提供SDB。

一个简单的PLC程序由至少一个名为OB1的组织块组成,这与传统C程序中的主要()函数相当。

在更复杂的程序中,工程师可以使用函数FC和函数块FB来封装代码。唯一的区别是额外的数据块数据库作为调用FB的参数。SFC和SFB内置在PLC中,操作系统周期性调用主块(OB1)来执行用户程序。

PLC周期时间

循环时间是操作系统运行主程序、所有中断周期的程序部分、系统活动的和,每个周期时间长度不一样,很大程度上取决于当前用户程序的复杂性以及中断用户程序执行的事件次数。

编辑

即,如果主OB1中调用中断OB次数过多,整个周期的时间变长,超过硬件配置的设置,则会产生软件错误,将会调用OB8o来处理这个错误。如果没有加载OB8o,PLC会转向停止模式

PLC中有很多种中断块,如当天的时间中断(OB10-OB17)、时延迟中断(OB20至-OB23)、循环中断(OB30-OB38)、硬件中断(OB40-OB47)等,本文只对时间中断块OB10感兴趣。

(3)时间中断块(OB10)

目的是达到time of day中断,这种中断取决于具体的需求,可以细化到发生一次中断、一分钟、一天、一个月等

三种方式能够达到这个目的:

  1. 自启动

  2. 配置设置TOD中断,然后通过调用逻辑程序中的SFC30(ACT_TINT)指令来激活

  3. 通过调用SFC28(SET_TINT)指令来设置TOD中断,然后调用SFC30来调用并激活他

本文选第三种

​编辑

简述

编辑

首先设置两个SFC命令的参数,然后注入PLC程序(OB1)中,如果到达了设定的攻击时间,那么产生中断,跳转到OB10,停止运行CPU

攻击细节

A.准备(离线)

(1)设置SFC28的参数

编辑

(2)设置SFC30的参数

编辑

(3)配置TOD Oregnization Block(OB10)

攻击者代码会被编程入OB10,OB10旨在将CPU置于停止模式。

这三步的实现可以参考西门子官网的资料OB10

B.注入攻击命令至PLC

使用作者开源的工具PLCinjectGitHub - SCADACS/PLCinject

将指定的命令注入到PLC程序中。

C.攻击(离线)

成功注入后,PLC中的CPU将会检查每个执行周期中的中断条件,当到达设置的攻击时间,中断将被激活,然后执行OB10,OB10功能为CPU中断,中断时间可由攻击者任意设置设置。


总结

这三个工作有一个核心共同点,那就是都是PLC控制逻辑指令恶意利用,加上网络攻击中的中间人攻击方式,达到了对PLC应用层的攻击。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章