针对S7-300 PLC的隐形程序注入攻击
一、摘要
在本文中,我们展示了S7-300 PLC的脆弱性,并证明了利用PLC中运行的逻辑程序的执行过程是可行的。我们讨论了一种危及密码保护的PLC的重放攻击,然后展示了如何从目标检索字节码并将字节码反编译为STL源代码。之后,我们将介绍如何执行典型的注入攻击,这表明即使对代码进行非常微小的修改也足以伤害目标系统。最后,我们将重放攻击与注入方法相结合,以实现更强大的攻击——隐形程序注入攻击——它可以通过使用伪PLC来隐藏先前的修改,模拟真实受感染的设备。对于真实场景,我们使用S7-300 PLC在真实工业环境中实施了所有攻击。我们最终建议采取缓解措施来保护系统免受此类威胁。
二、介绍
我们的重点是研究利用西门子S7-300可编程逻辑控制器的可能性,下图1显示了我们在本工作中执行的五种攻击场景的概述,包括:
(1) 危及可编程逻辑控制器的安全性。
(2) 从PLC中窃取控制逻辑程序。
(3) 将盗取的字节码反编译为STL源代码。
(4) 感染控制逻辑代码。
(5) 对ICS操作员隐藏正在进行的注入攻击。
三、场景分析
(一)损害可编程逻辑控制器的安全措施
西门子PLC通常有密码保护,以防止未经授权访问和篡改其设备中运行的逻辑程序。本文中,我们使用重放攻击,删除PLC设置的密码,而不改变目标PLC的当前配置。PLC上的典型重放攻击包括记录与TIA门户/PLC发送的特定请求/响应相关的数据包序列,然后在未经授权的情况下将捕获的/精心编制的数据包发送到目标。从技术上讲,当将密码写入S7-300 PLC时,它实际上嵌入SDB块中,SDB块由静态字节0x3042定义,精确地说是在块编号0000:0x30303030中,因此,在执行任何函数或命令之前,加载过程首先检查SDB0块(0x304230303030),以查看是否已设置密码。我们这里有两种情况:
(1)PLC没有密码,我们可以通过在PLC和TIA门户之间发送之前捕获的包含设置新密码的加载过程序列,轻松设置新密码。
(2)PLC已经有了一个密码,我们想用一个新的密码更新它,或者完全删除密码。在本文中,我们只对第二种情况感兴趣,即PLC已经有密码保护。
对于PLC已经有密码保护的情况,块SDB0有一个密码,要更新/删除密码,在进行任何更改之前,用户应始终提供旧密码。当合法用户使用新密码更新PLC时,PLC无法用新密码直接覆盖SDB0。这意味着PLC首先需要清除此块以前的内容中,然后将新密码写入该块。这个有趣的发现触发了这样一个想法:在用新密码更新旧密码期间,我们可以使用捕获旧的加载过程序列来操纵密码的设置。我们使用Wireshark作为网络嗅探器记录TIA门户和PLC之间的整个密码修改过程,过滤生成的数据包,只保留负责删除块SDB0内容的数据包,忽略将新密码写入SDB0的数据包。这样