图 1 测试环境示意图
2.1 中间人攻击
DNP3.0总线协议中,并不是通过设备地址来区分主站和外站,而是通过报文中链路层报文头的DIR位进行判断。当DIR=1,则当前报文是主站到外站的报文;当DIR=0,则当前报文是外站到主站的报文。由于DNP3.0总线协议对主站和外站的判断方法非常简单,所以相对于其他协议更容易受到中间人攻击(Man-in-the-Middle Attack)。
执行中间人攻击时,入侵者直接或间接接入被攻击的SCADA系统的网络中,入侵者先保持静默,拦截总线上的正常报文,获取当前总线上的设备地址,然后模拟系统的主站或外站,向系统内的某个合法设备发送错误的报文,使SCADA系统工作异常。中间人攻击可以分为模仿主站攻击和模仿外站攻击。
在模仿主站攻击过程中,入侵者在获得攻击对象的地址等关键信息后,模仿主站向被攻击外站发送非正常控制指令。入侵者先监听正常报文,得知某关键外站地址为0x10,则产生一个控制报文,将目的地址设为0x10,应用层的功能码设为0x15,该命令可使外站停止发送非请求报文,防止该外站向合法主站发送异常报警信息;然后入侵者再产生第二个报文,目的地址仍为0x10,应用层的功能码设为0x12,该命令可使外站的应用程序停止工作,而主站并不会收到外站发来的异常报文。
在模仿外站攻击过程中,入侵者在获得某个关键外站的工作特性后,模仿外站对主站的请求报文做出虚假响应,使主站对当前系统状态做出错误判断。入侵者接入总线后获取报文,得知某外站返回的储液罐的液位数值稳定在10左右之后,先如前文所述使外站的应用停止工作,然后当主站发出功能码为0x01的报文读取外站数据时,入侵者模拟外站发出液位数值为5的响应,主站就会发出加大储液罐进水流量的命令。在实际现场环境中可能会使储液罐液体溢出,造成事故。
中间人攻击的流程如图 2所示。
图 2 中间人攻击的流程
2.2 拒绝服务攻击
DNP3.0总线协议支持两种数据采集方式,一种是主站发送数据采集请求,然后外站发出响应报文,回复数据;第二种是外站直接发送非请求报文,将数据上送到主站。由于在第二种方法中,外站不需要主站允许就可以发送数据报文,所以入侵者可以利用该功能向主站进行拒绝服务攻击。
在拒绝服务攻击中,入侵者向被攻击对象持续、快速、大量发送无意义的报文,使被攻击者忙于应付这些无意义的报文,而无法执行正常操作,进而使系统瘫痪。
在攻击之前,入侵者先监听正常报文获得主站地址,然后发送大量功能码为0x82的非请求报文,消耗主站资源,使其无法响应其他外站的正常通信报文。
拒绝服务攻击的流程如图 3所示。
图 3 拒绝服务攻击的流程