Win32 Industroyer技术分析与防护方法

201768日,安全公司ESET发现了针对工控系统的恶意软件Win32/Industroyer,并提前向Dragos公司做了通过,Dragos通过对ESET分析结果进行验证后,612日公布了Win32/Industroyerhash信息以及分析报告。

作者:李东宏 张钊 程擂

Industroyer作者具有深厚的工控背景,尤其对电力系统工控协议非常熟悉,Industroyer支持四种工控协议:

  • IEC 60870-5-101 (aka IEC 101)
  • IEC 60870-5-104 (aka IEC 104)
  • IEC 61850
  • OLE for Process Control Data Access (OPC DA)

与2015年乌克兰断电恶意软件(BlackEnergy, KillDisk,以及其他组件)相比,Industroyer功能结构更加高级,可以造成系统崩溃,无法提供正常服务。根据Dragos分析并推测,Industroyer与2016年12月乌克兰断电时间有关。

文章目录

 

  • 文件结构
  • 攻击目标
  • 攻击流程
  • 样本分析
    • Main Backdoor
    • Launcher
    • 104 payload
    • Data wiper component
    • Scanner
    • 其他模块
  • 网络规则
  • 检测与防护方案
    • 主机类
    • 服务类
  • 总结
  • 参考链接
  • 声 明
  • 关于绿盟科技

文件结构

文件名 SHA-1 功能
MainBackdoor.exe F6C21F8189CED6AE150F9EF2E82A3A57843B587D 1.1e版本后门主模块,与C&C(5.39.218.152:443 )通信,接收指令并执行
MainBackdoor.exe CCCCE62996D578B984984426A024D9B250237533 1.1e版本后门主模块,与C&C(5.39.218.152:443 )通信,接收指令并执行
MainBackdoor.exe 2CB8230281B86FA944D3043AE906016C8B5984D9 1.1s版本后门主模块,与C&C(195.16.88.6:443 )通信,接收指令并执行
MainBackdoor.exe 8E39ECA1E48240C01EE570631AE8F0C9A9637187 1.1s版本后门主模块,与C&C(93.115.27.57:443 )通信,接收指令并执行
Launcher.exe 79CA89711CDAEDB16B0CCCCFDCFBD6AA7E57120A Launcher.exe,负责加载payload.dll或haslo.dat,执行攻击操作
Crash104.dll 94488F214B165512D2FC0438A581F5C9E3BD4D4C Crash104.dll,IEC 104 payload
Haslo.dat 5A5FAFBC3FEC8D36FD57B075EBF34119BA3BFF04 Haslo.dat,数据清理模块,由Launcher加载运行,功能同haslo.exe
Haslo.exe B92149F046F00BB69DE329B8457D32C24726EE00 Haslo.exe,数据清理模块,可独立运行
App.exe B335163E6EB854DF5E08E85026B2C3518891EDA8 端口扫描工具

攻击目标

针对工控系统,支持以下四种工控协议:

  • IEC 60870-5-101 (aka IEC 101)
  • IEC 60870-5-104 (aka IEC 104)
  • IEC 61850
  • OLE for Process Control Data Access (OPC DA)

攻击流程

样本分析

Main Backdoor

Main Backdoor通过本地代理10.15.1.69:3128与远程C&C通信,C&C ip地址为硬编码5.39.218.152,端口为443,在其他样本中发现另外两个CC地址:195.16.88.6,93.115.27.57。

当服务器连接成功后,发送POST请求:

POST请求的数据由如下部分组成:

  • 通过GetCurrentHwProfile获取到的硬件序列号

  • 样本硬编码ID号

  • 样本版本号

数据被提交给服务器后,样本等待接收C&C指令:

Main Backdoor所接收到的指令分为以下几种类型:

对命令编号及含义说明如下:

编号 含义
0x1 创建并执行进程
0x2 以特定用户创建并执行进程
0x3 从C&C下载文件
0x4 复制文件
0x5 执行shell命令
0x6 以特定用户执行shell命令
0x7 退出进程
0x8 结束服务进程
0x9 以特定用户结束服务进程
0xA 以特定用户启动服务
0xB 替换服务执行程序

 

Launcher

Launcher模块负责加载payload,命令格式为:

%LAUNCHER%.exe %WORKING_DIRECTORY% %PAYLOAD%.dll %CONFIGURATION%.ini

其中,

  • %WORKING_DIRECTORY%:工作目录,存放payload和配置文件;
  • %PAYLOAD%.dll:所加载的payload名;
  • %CONFIGURATION%.ini:payload配置信息。

Launcher首先启动一个名为“defragsvc”的服务,然后创建两个新线程执行后续操作:

一个新线程加载payload dll文件,调用导出函数crash,执行针对工控协议的攻击操作:

另一个线程加载数据清理模块haslo.dat,调用其导出函数Crash,执行清理操作:

104 payload

IEC60870-5是IEC(国际电工委员会)制定的用于变电站自动化系统的国际标准。主要包括四个子规约:IEC60870-5-101、IEC60870-5-102、IEC60870-5-103以及IEC60870-5-104。

IEC104协议即IEC60870-5-104,IEC104协议是基于2404端口TCP/IP网络协议的一种应用层协议。

按照控制域(APCI)来划分, IEC104协议有三种数据格式:

  • U格式(定长帧)—-不编号的控制功能格式,用于控制信息传送流程.
  • I格式(变长帧) —–要发送信息的传输格式,有发送编号。
  • S格式(定长帧)—–用于给对方I格式报文确认,S格式报文本身不需发送编号。=

IEC104的传输机制及流程如下图所示:

样本中104.dll的Crash函数被Launcher加载运行后,首先尝试读取104协议配置文件中的内容。

配置文件加载完成后,首先判断stop_comm_service是否为1,如果为1,则结束stop_comm_service_name所指定的进程,如下图所示:

该组件根据配置文件的内容,对每一个104从站,根据IP以及端口信息尝试建立连接,发送启动帧。当模块收到从站返回的确认帧后,根据配置文件中的operation操作来控制对应的从站设备。

第一个operation操作是range模式,这一模式用来发现目标设备的IOAs。

第二个operation操作是shift模式,shift模式与range模式类似,首先会枚举range指定的信息对象地址范围。完成后,会将配置文件中的shift信息附加到range模式中进行操作。

第三个operation操作是sequence模式。当攻击者知道从站的地址时,根据配置文件中的攻击指令,向从站循环发送单点遥控选择及单点遥控执行请求。

Data wiper component

数据清理组件分为两类:haslo.dat和haslo.exe,前者为dll文件,由Launcher模块加载执行,后者为exe文件,可以单独执行,两者功能相同。

Data wiper主要功能为:

  • 遍历SYSTEM\\CurrentControlSet\\Services注册表项,将所有服务ImagePath替换为空,该操作将导致系统服务不可用,系统无法重启:

  • 遍历所有本地以及网络磁盘驱动器,遍历盘符从C到Z,覆写指定类型的文件内容:

若发现以下扩展名的文件,则创建新线程,对文件内容进行覆盖,破坏文件,需要说明的是,并不会对Windows目录下的文件进行修改:

  • 枚举进程,结束以下系统进程,该操作将导致系统崩溃:

Scanner

Industroyer内置了端口扫描器,可以通过-ip和-port参数指定扫描ip范围以及端口范围:

其他模块

  • 101 payload

IEC101协议即IEC60870-5-101,IEC101协议是基于2404端口TCP/IP网络协议的一种应用层协议。该协议主要用于电力系统的监视和控制,作为工控系统和远程终端(RTUs)之间的通信协议。

101 payload被命名为101.dll,一旦该payload被执行,首先解析.ini配置文件中的内容,包括进程名、Windows设备名(通常为COM端口)、信息对象地址(IOA)的范围、特定IOA指定范围的开始及结束值。IOA用于指定设备中的特定数据参数。

配置文件中获取到的进程名属于运行于被攻击者电脑上的应用程序,该应用程序通过串行连接和RTU进行通信。101 payload尝试终止该指定的进程,并且使用CreateFile、WriteFile、ReadFile这些API函数和制定设备通信。配置文件中第一个COM口用于实际通信,其他两个COM口用于防止其他进程访问。

101 payload 尝试遍历所有配置文件中获取到的所有IOA范围内的IOA。对于每一个IOA,该payload都会构造两个“选择以及执行”数据包并且将这两个数据包发送到RTU。其中一个数据包为单命令数据包(C_SC_NA_1),另一个为双命令数据包(C_DC_NA_1)。其主要目标都是用来改变单命令类型IOA的开/关状态以及双命令类型的开/关状态。具体来说,101payload包括三个阶段:第一阶段,尝试将IOA切换到OFF状态;第二阶段,切换IOA到ON状态;第三阶段,再次将IOA切换回OFF状态。

  • 61850 payload

IEC61850用于实现变电站不同设备的自动化系统保护、自动化测量、监控和控制的通信协议。61850 payload是一个独立的恶意工具,包含一个名字为61850.exe的可执行文件以及一个名字为61850.dll的动态链接库。

该payload被执行后,61850.dll首先会获取配置文件i.ini中的内容参数。该配置文件包括一组使用61850协议进行通信的设备IP地址。如果配置文件不存在,则会枚举所有网络中的适配器来获取子网掩码,再枚举所有这些子码掩码下的所有IP地址,并且尝试去与这些IP地址的102端口建立连接。如果配置文件存在,该payload就会根据配置文件中的IP地址,与其102端口建立连接。

一旦连接建立成功,即收到目标IP设备的正确响应数据包,61850 payload会使用MMS发送一个初始的请求包。如果收到正确的响应数据包,则继续向目标设备发送一个获取名称表的MMS数据包。这样,该payload在虚拟制造设备(VMD)中编译了该目标设备的名称表。接下来继续向每一个可以建立连接的目标设备发送获取名称表的MMS数据包,并将所有的名称表枚举到一个特殊的域中。

接下来,61850 payload在这些名称表中搜索包含以下字符串组合的变量:

  • CSW,CF,Pos以及Model
  • CSW,ST,Pos以及stVal
  • CSW,CO,Pos,Oper 但不包含$T
  • CSW,CO,Pos,SBO 但不包含$T

字符串“CSW”是用于控制断路器和开关的逻辑节点名称。对于包含“Model”或“stVal”字符串的变量,该payload发送额外的MMS读取请求。该payload还可以发出一个可以改变其状态的MMS写请求。

61850 payload创建一个日志文件,记录其操作的目标设备IP地址、MMS域、命名变量以及目标节点的状态(开或关)。

  • OPC DA payload

OPC(OLE for Process Control, 用于过程控制的OLE)是为过程控制专门设计的OLE技术。基于微软的OLE(现在的Active X)、COM (部件对象模型)和DCOM (分布式部件对象模型)技术,OPC包括一整套接口、属性和方法的标准集。

OPC DA payload为一个独立的恶意工具,包括OPC.exe以及一个DLL文件,作为OPC DA数据协议中的客户端。该payload同时实现了61850以及OPC DA的payload功能。其DLL在PE的导出表中被命名为OPCClientDemo.dll。

该payload不需要获取配置文件的内容,一旦被攻击者执行,会使用ICatInformation::EnumClassesOfCategories枚举所有的OPC服务器,使用CATID_OPCDAServer20类别标识符以及IOPCServer::GetStatus来识别哪些服务器在运行。接下来该payload使用IOPCBrowseServerAddressSpace接口来枚举所有运行在服务器上的OPC项,特别是包含如下字符串的项:

  • ctlSelOn
  • ctlOperOn
  • ctlSelOff
  • ctlOperOff
  • \Pos and stVal

这些项名表明攻击者对于ABB的OPC服务器提供的OPC项更感兴趣。

在最后一步,OPC DA payload尝试通过写两次0x01,使用IOPCSyncIO接口来改变已发现的OPC项值。

该payload会将OPC服务端的名字、OPC项名、质量码和项值写入日志,格式如下:

  • [ServerName:%SERVERNAME%] [State:Before]
  • [ServerName:%SERVERNAME%] [State:After ON]
  • [ServerName:%SERVERNAME%] [State:After OFF]
  • Additional tools: DoS tool

DOS攻击利用漏洞CVE-2015-5374,针对西门子SIPROTEC设备,通过向目标50000端口发送特定的18字节的UDP包,攻击完成后,将导致设备停止响应正常指令,知道手动重启设备才能恢复正常。

所发送的UDP数据包如下:

网络规则

C&C服务器IP 本地代理地址
5.39.218.152:443 10.15.1.69:3128
195.16.88.6:443
93.115.27.57:443

检测与防护方案

主机类

  • 检测并删除以下文件:

101.dll,Crash101.dll,104.dll,Crash104.dll,61850.dll,Crash61850.dll,OPCClientDemo.dll,CrashOPCClientDemo.dll,D2MultiCommService.exe,CrashD2MultiCommService.exe,61850.exe,OPC.exe,haslo.exe,haslo.dat。

  • 检测并删除以下注册表项

HKLM\SYSTEM\CurrentControlSet\Services\defragsvc

服务类

  • 短期服务:绿盟科技工程师现场木马后门清理服务(人工服务+IPS+TAC)。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
  • 中期服务:提供3-6个月的风险监控与巡检服务(IPS+TAC+人工服务)。根除风险,确保事件不复发。
  • 长期服务:基金行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

总结

Win32/Industroyer是一款专门针对工控系统的恶意软件,支持IEC 101、IEC 104、IEC 61850以及OPC DA四种工控协议。样本分为多个模块,主后门程序负责安装其他模块运行,并与C&C通信,接收C&C指令,根据指令执行下一步操作,针对工控协议的攻击分别有独立的payload完成,攻击能够导致工控系统崩溃,无法提供正常服务。

参考链接

  • https://www.welivesecurity.com/wp-content/uploads/2017/06/Win32_Industroyer.pdf
  • https://dragos.com/blog/crashoverride/CrashOverride-01.pdf

声 明

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

本文由 华盟网 作者:小龙 发表,其版权均为 华盟网 所有,文章内容系作者个人观点,不代表 华盟网 对观点赞同或支持。如需转载,请注明文章来源。

0

相关文章

发表评论

电子邮件地址不会被公开。