前言

近年来,国内外的工控安全事件频出,越来越多国家级APT组织的攻击目标开始转向工控领域,检测工控系统中的入侵行为具有重大意义。本文从实战出发,研究对施耐德的启停攻击过程,搭建开源Snort框架来完成对施耐德M580的攻击检测。

Snort框架

Snort是一款优秀的开源入侵检测系统,在IT系统中已经有广泛应用,该框架的优点如下:

1. 开源而且免费,相对于昂贵的工控安全设备来说是非常合适的。

2. 支持插件扩展,用户可以编写工控协议插件来支持工控协议的解析。

3. 多平台支持,不仅支持linux,还支持windows下的部署。

4. 友好的规则语法,用户可以很轻松地使用snort规则语法来编写检测规则来检测对应的入侵行为。

5. 活跃的开源社区,用户可以很容易获取到大量的snort规则集合,这些规则集合一直在不断更新和丰富。

Snort官网地址如下所示:

https://www.snort.org/

攻击M580

为了编写出检测规则,我们先从最简单的启停攻击着手。顾名思义,启停攻击就是直接对PLC进行启动和停止操作。

使用Unity Pro对该PLC进行启动/停止操作:

众所周知,UMAS是基于modbus的90功能码的,所以下面描述略过了这部分的数据包头部。

启动PLC数据报文如下,UMAS功能码为0x40:

停止PLC数据报文如下,UMAS功能码为0x41:

请求数据包格式如下所示:

报文字段

长度(字节)

描述

sessionkey

1

会话密钥

functioncode

1

UMAS的协议功能码

data

变长

协议数据,不同功能码有不同的数据部分

攻击流程如下:

先通过0x10获取session key,再通过0x40/0x41对PLC进行操作,为了入侵让检测系统检测这一行为,我们关注点是在操作这一部分,只要功能码能匹配上,即可判断是对应的行为。

攻击检测

测试规则

在虚拟机中安装snort工具,安装目录为C:\\Snort,首先在C:\\Snort\\rules文件下新建一个规则文件”umas.rules”,写入检测规则并保存:

#正在将施耐德PLC的CPU设置到STOP状态

alert tcp any any -> any any (msg:"Set Schneider PLC CPU STOP";content:"|00 00|";offset:2;depth:2;content:"|5a|";offset:7;depth:1;content:"|41|";offset:9;depth:1;sid:9899113;)

#正在将施耐德PLC的CPU设置到RUN状态

alert tcp any any -> any any (msg:"Set Schneider PLC CPU Restart";content:"|00 00|";offset:2;depth:2;content:"|5a|";offset:7;depth:1;content:"|40|";offset:9;depth:1;sid:9899114;)

并在配置文件C:\\Snort\\etc\\snort.conf文件启用该规则,删除掉其他规则防止干扰,如下所示:

运行snort对包含启停的umas.pcap进行检测,看是否能检测到攻击流量:Snort.exe -c c:\\Snort\\etc\\snort.conf -r umas.pcap -l c:\\Snort\\log

参数解释:

-c:配置文件路径

-r:pcap数据包路径

-l: 输出日志文件路径

打开c:\\Snort\\log下的告警日志文件:

内容如下,说明成功命中了umas.rules的规则:

检测攻击

在上面我们已经测试了编写的规则已经可以检测流量中针对M580的启停操作,当然,我们直接可以从网卡中抓取流量,实时检测攻击。

运行:snort -W

选择网卡4,运行如下命令开始启动IDS检测流量:Snort.exe -c c:\\Snort\\etc\\snort.conf -l c:\\Snort\\log -I 4

总结

本文通过编写Snort规则来完成对施耐德M580的攻击检测,当然网上的安全研究人员也公开了大量的工控相关的Snort规则,感兴趣的用户可以自行下载。Snort不仅可以检测相关恶意流量,还可以联动防火墙还可以直接阻断恶意行为,具体操作方法可以自行探究。

声明:本文来自工业信息安全产业发展联盟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。