前言
近年来,国内外的工控安全事件频出,越来越多国家级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不仅可以检测相关恶意流量,还可以联动防火墙还可以直接阻断恶意行为,具体操作方法可以自行探究。
声明:本文来自工业信息安全产业发展联盟,版权归作者所有。文章内容仅代表作者独立观点,不代表士冗科技立场,转载目的在于传递更多信息。如有侵权,请联系 service@expshell.com。