使用工控漏扫对SCADA系统的各个组成模块进行安全检查,会让整个工控网络的安全风险无处遁形;通过对部分未公开漏洞的工控机的fuzzing测试,可以较为准确的发现这些未公开漏洞的工控机存在的安全风险;针对SCADA系统的安全防护系列手段,在电力、烟草、油化、铁路等众多涉及国计民生的关键生产领域都具有一定的适用性,能主动减轻攻击者针对SCADA网络造成的破坏和影响。
编者注:该篇文章将刊登到绿盟科技技术刊物。
SCADA中的FUZZING测试
使用工控漏扫ICSscan可以较为准确的发现SCADA系统中各个组成部分存在的安全隐患,尤其是PLC等工控机的安全漏洞和安全隐患以及windows系统的安全风险,这给工控系统漏洞的扫描带来了极大的便利。 工控漏扫在对IED、RTU等设备进行评估时,以稳压器或者温度控制器为例,由于厂商众多,再者考虑到厂商公开漏洞的情况,很难对厂商数量繁多的稳压器或温度控制器进行标准化的漏洞扫描。
基于这样的安全现状,可以考虑使用FUZZING测试技术来对这些未公开漏洞的厂商的工控设备进行设备健壮性的安全测试,并形成统一格式的安全报表,以解决未公开漏洞这一问题。
小编的注释:FUZZING可以提供一种智能方法来试图注入不规则消息内容和数据输入,以此来验证系统的可靠性。使用FUZZING系统进行测试主要有三个步骤:
- 第一输入数据;
- 第二输入的数据经过FUZZING系统进行变换;
- 第三输出数据。
如图1所示。FUZZING平台首先需要对被测的工控设备或系统进行配置,知道被测对象具体的型号和来自什么厂商(说哪种语言),接着建立连接(打招呼握手),选择相应测试用例集(准备交流的话题)。准备工作完成后就可以运行挖掘任务了,FUZZING平台除了向被测设备发送符合规范的通话报文(同一种语言),还会自动产生并发送大量变形后的报文(各种语言混杂以及不正确的语法),这个过程叫模糊测试(FUZZING),其目的是通过变异输入来观察被测设备是否有相应的容错能力(能否听得懂)。
举个简单的例子:
- FUZZING平台问:你是猴子派来的救兵吗? 被测对象:是的(正常回答)。
- FUZZING平台接着问:猴子派来的救兵是你吗? 被测对象:是的(正常回答)。
- FUZZING平台出大招:You,救兵,Monkey? 被测对象:……(非正常回答)。
图1 FUZZING测试流程
使用Autodafe进行SCADA FUZZING测试
Autodafe是一个可以对程序及协议进行健壮性测试的著名的FUZZING测试工具。Autodafe其实是一个FUZZING框架,我们可以在BT5或者kali上安装它。然后还需要准备一台被测试的设备,被测试的设备可以是稳压器或者温度调节器,当然也可以是一台普通PC。这里我使用一台装有windows系统的普通PC进行安全测试。
前期准备工作:
- Modbus消息:使用功能代码06的Write单寄存器的查询请求;
- 利用wireshark捕获使用功能代码06的Modbus Write单寄存器分组,捕获或下载分组踪迹后,在wireshark中将分组捕获导出为PDML格式,并保存到Autodafe目录中;
- 使用PDML2AD实用工具将PDML文件转换成Autodafe脚本语言;
- 输入命令cat Modbus_query_write.ad查看经过解析的文件;
- 使用ADC实用工具编译modbus_query_write.ad文件;
就像在NIPS入侵防护系统上打回放包一样,我们需要把整个攻击过程进行抓包做成回放包(使用wireshark等抓包工具捕获操作的整个过程,通过将捕获的数据包回放到网卡上,模拟原始数据包在网络上传输情况)。这里简单来说就是先模拟一次对被测设备的控制过程,将该过程存储后扔到autodafe中进行变异,变异后再进行回放输出。当然最后输出的时候还是要用到autodafe的核心模块autodafe,autodafe是fuzz的核心引擎,用来解析.adc文件,生成fuzz数据同时发包。
重点语句有以下三个:
- pdml2ad –v -p modbus_query_write.pdml modbus_query_write.ad; (使用PDML2AD实用工具将PDML文件转化成autodafe脚本语言,-v表示显示冗长信息,-p表示恢复协议)
- adc modbus_query_write.ad modbus_query_write.adc; (使用ADC实用工具编译modbus_query_write.ad文件)
- autodafe –v –r 192.168.2.28 –p 502 modbus_query_write.adc; (Autodafe命令中,-v表示显示冗余信息,-r表示远程主机。默认是tcp,如需udp,则添加-u参数)
如果是对一台普通PC进行安全测试,那最终使用autodafe的语句又会有些变化了。比如要对一台使用4000端口和攻击机进行通信的被测PC进行安全测试。 最终要使用这样一条语句: autodafe –b –vv –p 4000 –r 127.0.0.1 –P 8000 –D 192.168.0.1 ./vuln2.adc
来对目标主机的4000端口进行测试。在图2中可以看到fuzz不断在增加fuzz变量的大小。图3显示和目标主机的4000端口连接失败。
图2 fuzz变量增加过程
图3 和4000端口连接失败
使用TFTP Daemon Fuzzer进行SCADA FUZZING测试
TFTP Daemon Fuzzer是另一款可以给CBC设备带来短暂中断影响的fuzzing工具。CBC设备和稳压器类似。从工具名可以看出,该fuzzing工具主要是针对使用TFTP协议的设备进行fuzzing测试。在执行TFTPfuzz脚本之前,我们可以使用wireshark对fuzzing过程进行抓包以查看测试过程中fuzz的变化。图4是测试过程,图5可以看出fuzz引擎在尝试不同的测试内容,fuzzing测试可能会对设备造成一定的影响,故在生产环境中还需要考虑测试策略。
图4 测试过程
图5 尝试不同测试内容
SCADA网络安全防范
虽然无法在部署之前了解和检测所有安全漏洞,但可以肯定的是通过采用下面纵深防御措施一定可以主动地减轻攻击者对SCADA网络造成的安全破坏:
- 开发安全策略;
- 实现ACL;
- 使用MAC地址过滤;
- 使用VLAN分段;
- 加强SCADA设备物理安全,包括警报和防撬管理;
- 不允许使用第三方USB及相关存储设备;
- 实现支持SCADA协议防御机制的NIDS/NIPS;
- 整合操作系统和固件升级(包括补丁维护);
- 实现高强度的加密功能;
- 确保已经准备好二重或三重身份验证策略;
- 确保计划内的内部安全评估得到如期执行;
- 考虑使用工控漏扫ICSscan以及包含fuzzing测试功能的ICSscan定期对工控系统进行安全评估;
- 如果可能的话,使用诸如SSH、DNPsec、TLS、DTLS、SSL、PKI和IPsec之类的保护性协议;
- 如果使用的是拨号调制解调器,那么实现支持活动日志、加密、名字和口令身份验证的增强型安全措施;
- 实现一套SIEM安全信息和事件管理系统来完成日志聚合、日志审查和审计分析;
- 为所有合适的防火墙、交换机、路由器、NIPS和NIDS设备实现可扩展的边界网络策略。