2017年6月8日,安全公司ESET发现了针对工控系统的恶意软件Win32/Industroyer,并提前向Dragos公司做了通过,Dragos通过对ESET分析结果进行验证后,6月12日公布了Win32/Industroyer的hash信息以及分析报告。
作者:李东宏 张钊 程擂
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月乌克兰断电时间有关。
文件结构
文件名 | 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
声 明
本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。
关于绿盟科技
北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。
基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。
北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。
如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880