news 2026/9/29 8:00:12

乌克兰BlackEnergy病毒攻击SCADA实战复盘与防御

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
乌克兰BlackEnergy病毒攻击SCADA实战复盘与防御

简介:这份PDF文档聚焦2015年乌克兰电力系统遭遇BlackEnergy病毒攻击并导致伊万诺-弗兰科夫斯克州大规模停电的真实事件,面向电力系统安全、工控信息安全方向的研究人员与运维人员,提供病毒机理分析与防御思路的参考。文档通过获取不同版本病毒样本、构建分析环境,梳理出远程控制、数据劫持、系统崩溃等攻击路径,并给出加强系统安全、恶意软件检测、实时监控与快速响应等防御方法,同时延伸讨论电力系统安全与信息安全的多层次关系。资源包共1个PDF文件,约2.89MB,内容为期刊论文格式,含摘要、引言、攻击分析与防御建议等完整章节,便于按主题查阅。目前已有172人学习,适合作为电力二次系统安全防护与工控安全研究的入门与进阶参考文献。

1. 乌克兰电力系统BlackEnergy病毒:一次把SCADA打到黑屏的实战复盘

2015年12月23日,乌克兰西部三个区域电力公司的调度中心几乎同时失去对变电站的远程控制权。值班员发现SCADA画面上断路器状态不再刷新,遥控指令下发后无任何返回,随后操作系统弹窗报错、鼠标失控、屏幕被强制锁定。事后复盘,攻击链的起点是一封带恶意宏的Office文档,载荷是BlackEnergy家族的一个变种,后续还叠加了KillDisk组件擦除关键主机数据,并配合电话呼叫中心的话务淹没让运维无法及时响应。这件事之所以被反复研究,不是因为它用了多高深的0day,而是它把“IT侧入口→横向移动→SCADA操作站→通信链路”这条路径完整走通了。今天做电力监控系统安全的工程师,无论你面对的是国产SCADA还是rapid scada这类组态环境,这套攻击链的每一环都值得拆开看:它到底怎么进来的、在操作站上做了什么、为什么常规防病毒没拦住、以及我们现在能怎么防。这篇笔记就按这个顺序,把BlackEnergy的样本行为、SCADA侧可观测痕迹和防御落地步骤讲清楚,适合做工控安全、电力自动化、SCADA运维的读者照着复现分析思路。

2. BlackEnergy样本行为拆解:从宏文档到SCADA操作站的落地路径

2.1 初始投递与宏载荷:为什么钓鱼文档能绕过邮件网关

BlackEnergy这轮攻击的初始投递物是伪装成电力调度相关通知的Office文档,扩展名常见为.xls或.doc,内容与“停电计划”“设备检修单”高度相关。文档打开后提示启用宏,宏代码执行后释放并运行一个可执行载荷。很多单位的邮件网关只做附件类型和静态哈希匹配,对带宏文档的检测依赖沙箱,而沙箱里宏往往因为不联网或等待时间不够没有触发后续行为,于是漏过。

从分析角度,拿到这类样本第一步不是直接双击,而是在隔离环境里提取宏代码。常见做法是用olevba或oletools套件静态抽取:

# 安装 oletools,用于静态分析 Office 宏 pip install oletools # 提取文档中的宏代码,不执行 olevba suspicious.xls # 只看宏的自动执行入口,快速判断是否恶意 olevba --deobf suspicious.xls | grep -i "autoopen\|document_open\|workbook_open"

olevba会输出宏的VBA源码、可疑关键字和IOC。重点看AutoOpen、Document_Open、Workbook_Open这类自动执行函数,以及是否有Shell、CreateObject("WScript.Shell")、URLDownloadToFile等调用。参数上,--deobf会尝试对混淆字符串做还原,遇到大量Chr()拼接的样本时很有用。如果宏里出现下载远程可执行文件的URL,把它记录下来作为IOC,但不要在联网环境里直接访问。

这一步的产出是一份宏行为清单:释放了什么文件、写到哪个路径、是否创建计划任务或注册表Run键。BlackEnergy变种常见做法是把载荷写到%TEMP%或%APPDATA%下,文件名伪装成系统组件,然后通过schtasks或注册表实现持久化。

2.2 载荷落地与持久化:注册表和计划任务两条腿

宏释放的载荷运行后,通常会做三件事:复制自身到用户目录、写入自启动项、尝试连接C2。分析时可以在隔离虚拟机里用Process Monitor和Autoruns观察,也可以直接静态看PE导入表和字符串。

# 用 pefile 快速提取样本的导入表和可疑字符串 import pefile import re pe = pefile.PE("blackenergy_payload.exe") # 打印导入的DLL和函数,关注网络、进程、注册表相关API for entry in pe.DIRECTORY_ENTRY_IMPORT: print(entry.dll.decode()) for imp in entry.imports: if imp.name: print(" ", imp.name.decode()) # 提取样本中的URL和IP,作为C2线索 data = open("blackenergy_payload.exe", "rb").read() urls = re.findall(rb"https?://[\w\./\-]+", data) ips = re.findall(rb"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", data) print("URLs:", urls) print("IPs:", ips)

pefile解析导入表能快速判断样本能力:如果同时导入InternetOpenUrl、RegSetValueEx、CreateProcess,基本可以确认它有下载、持久化、执行三段能力。字符串提取是粗筛,遇到加壳样本可能拿不到明文URL,这时需要先脱壳或走动态分析。参数上,正则匹配IP时要注意排除版本号之类的误报,提取到的IP不要直接访问,放到威胁情报平台比对即可。

持久化方面,BlackEnergy常见的是注册表Run键和计划任务。检查命令:

# 查看当前用户和系统的自启动项 reg query HKCU\Software\Microsoft\Windows\CurrentVersion\Run reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run # 查看计划任务中是否有可疑项 schtasks /query /fo LIST /v | findstr /i "TaskName TaskToRun"

在真实排查中,重点看TaskToRun指向的路径是否在%TEMP%、%APPDATA%这类用户可写目录,以及任务触发时间是否异常频繁。BlackEnergy的持久化不会用特别显眼的名字,往往伪装成Java Update、Adobe Flash Player之类。

2.3 横向移动到SCADA操作站:凭据抓取与远程执行

进入IT网络后,攻击者要打到SCADA操作站,靠的是凭据复用和远程管理通道。常见手法是用Mimikatz类工具抓取内存中的明文密码或哈希,然后用PsExec、WMI、RDP横向。对防御方来说,SCADA操作站如果和办公网在同一域、用同一套账号密码,基本等于把门开着。

从检测角度,可以在操作站和跳板机上监控以下行为:非工作时间的psexec服务创建、WMI远程调用、异常RDP登录来源。Windows事件日志里重点看4688进程创建、4624登录、7045服务安装。下面是一段用PowerShell拉取相关事件的示例:

# 查找最近7天内安装的服务,关注可疑路径 Get-WinEvent -FilterHashtable @{LogName='System'; ID=7045; StartTime=(Get-Date).AddDays(-7)} | Select-Object TimeCreated, Message | Format-List # 查找来自非管理网段的4624登录 Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624; StartTime=(Get-Date).AddDays(-7)} | Where-Object { $_.Message -match "10\.10\.20\." } | Select-Object TimeCreated, Message | Format-List

参数说明:FilterHashtable按日志名、事件ID和时间过滤,比全量拉取快很多;StartTime按需调整,排查期间建议覆盖攻击时间窗口前后各一周。输出里重点看服务路径是否指向用户目录、登录类型是否为3或10(网络登录、远程交互)。如果SCADA操作站上出现来自办公网段的RDP登录,而运维又没有相应操作记录,这就是高优先级告警。

3. SCADA侧可观测痕迹:操作站被控后画面为什么还在刷新

3.1 HMI与通信链路:BlackEnergy在操作站上做了什么

很多人以为病毒进了操作站就会立刻让画面卡死,实际不是。BlackEnergy在操作站上的行为分阶段:先潜伏、收集信息、等待指令,最后才执行破坏动作。破坏阶段常见的是结束SCADA相关进程、删除或篡改工程文件、断开通信,配合KillDisk擦除磁盘。乌克兰事件中,操作员先看到的是遥控失效,然后才是系统崩溃,中间有时间差。

从SCADA组态和通信角度看,操作站与RTU/PLC之间通常走IEC 60870-5-101/104、DNP3或厂商私有协议。BlackEnergy本身不直接解析这些规约,它是在操作系统层面破坏HMI进程和通信服务。所以排查时要区分:是通信链路断了,还是操作站主机被控了。判断方法很简单,在调度主站侧看前置通信机的通道状态,如果通道正常但操作站画面不刷新,问题大概率在操作站主机。

# 在操作站上检查SCADA相关进程和网络连接 tasklist | findstr /i "scada hmi client runtime" netstat -ano | findstr "2404 20000" # 查看与前置机/RTU的TCP连接是否还在 netstat -ano | findstr "ESTABLISHED" | findstr "10.10.30."

2404是IEC 60870-5-104常用端口,20000是部分厂商私有端口。如果进程还在但连接断了,看防火墙和路由;如果进程没了,看是崩溃还是被结束。BlackEnergy破坏阶段会调用taskkill或直接TerminateProcess结束HMI进程,事件日志里可能留下应用程序错误记录。

3.2 用国产SCADA和rapid scada做对照排查

不同SCADA平台的可观测点不一样。国产SCADA(如南瑞、四方、许继等)通常有前置通信进程、实时库、历史库、告警服务,操作站上还会装组态开发环境。rapid scada这类组态软件则常见rapid scada runtime、scada engine进程,工程文件放在特定目录。排查时先摸清本单位的进程清单和端口清单,做成基线,再对比异常。

排查对象国产SCADA常见进程/端口rapid scada常见进程/端口异常信号
通信服务前置通信进程,104端口2404ScadaServer,自定义端口进程消失、端口无监听
实时库实时库服务,本地共享内存ScadaComm,本地管道数据不刷新、共享内存异常
操作站HMI画面客户端,连接前置机ScadaWeb/ScadaClient画面卡死、进程被结束
工程文件组态工程目录,常被篡改工程XML/配置文件文件被删、内容被改

这张表不是让你照搬,而是提醒:先建立自己环境的基线,再谈检测。BlackEnergy这类攻击最怕的就是你有基线,因为它的行为在基线对比下会显得很突兀。比如平时操作站不会在凌晨3点启动cmd.exe,不会从办公网段发起RDP,不会突然结束HMI进程,这些“不会”就是检测点。

3.3 网络侧检测:C2通信和异常指令的抓法

BlackEnergy的C2通信常用HTTP或HTTPS,伪装成正常更新流量。网络侧检测靠流量基线加IOC匹配。没有流量镜像条件的,至少在边界防火墙和核心交换机上开NetFlow,看操作站和前置机是否有异常外联。

# 用 tcpdump 抓取操作站与前置机之间的104报文,保存后分析 tcpdump -i eth0 -w scada_104.pcap host 10.10.30.10 and port 2404 # 用 tshark 统计会话和异常外联 tshark -r scada_104.pcap -q -z conv,tcp tshark -r scada_104.pcap -Y "ip.dst != 10.10.30.0/24" -T fields -e ip.dst | sort | uniq -c

参数说明:-i eth0指定网卡,host和port限定抓取范围,避免全量抓包撑爆磁盘。tshark的conv,tcp看会话统计,-Y过滤非工控网段的目的IP,如果操作站有大量外联到互联网的会话,基本可以判定异常。注意抓包要在镜像口或TAP上做,不要在操作站本机抓,避免影响生产。

4. 防御落地:从边界到操作站的五层加固清单

4.1 边界与邮件:把宏文档和可执行附件拦在外面

第一层是边界。邮件网关要能检测带宏文档,不能只看扩展名。常见做法是禁用来自外部的Office宏,或者对宏文档做沙箱动态分析。防火墙侧限制工控网段主动外联,只允许必要的白名单地址。

# 示例:用 iptables 限制工控网段主动外联,只放行白名单 iptables -A FORWARD -s 10.10.30.0/24 -m state --state NEW -j DROP iptables -I FORWARD -s 10.10.30.0/24 -d 10.10.10.10 -p tcp --dport 443 -j ACCEPT iptables -I FORWARD -s 10.10.30.0/24 -d 10.10.10.11 -p tcp --dport 80 -j ACCEPT

这段规则的意思是:工控网段默认不允许主动发起新连接,只放行到指定更新服务器和补丁服务器的流量。参数上,-m state --state NEW匹配新建连接,-I插入到链首保证白名单先匹配。实际部署前要在测试环境验证,避免误断正常通信。

4.2 主机加固:操作站白名单与应用控制

第二层是操作站主机。核心思路是应用白名单:只允许SCADA相关进程和必要系统进程运行,其他一律拦截。Windows上可以用AppLocker或WDAC,Linux上用SELinux/AppArmor。同时关闭不必要的服务,比如操作站上不该有Office、不该有浏览器、不该有邮件客户端。

# 示例:用 AppLocker 创建默认规则后,只允许指定目录的程序运行 # 先导出当前策略,再编辑,避免直接锁死自己 Get-AppLockerPolicy -Effective -Xml > applocker_backup.xml # 查看当前 AppLocker 规则 Get-AppLockerPolicy -Local | Test-AppLockerPolicy -Path "C:\Scada\*.exe" -User Everyone

参数说明:Get-AppLockerPolicy -Effective导出当前生效策略,改之前一定备份。Test-AppLockerPolicy可以预演某路径下的程序是否会被放行,避免上线后SCADA起不来。白名单目录要包含SCADA安装目录、实时库目录、必要的系统目录,其他一律拒绝。

4.3 网络分区与访问控制:让操作站打不到办公网

第三层是网络分区。工控网和办公网之间要有防火墙,且规则是白名单。操作站不能直接访问互联网,不能访问办公网的共享和邮件。远程运维走堡垒机,所有操作可审计。

区域允许访问禁止访问审计要求
操作站前置机、实时库办公网、互联网进程、登录、指令
前置机RTU/PLC、操作站办公网、互联网通信报文、配置变更
工程师站操作站、前置机互联网操作录屏、命令历史
办公网互联网、办公系统工控网直连常规IT审计

这张表的关键是“禁止”列。很多单位分区做了,但规则是双向放行,等于没分。正确做法是工控网到办公网默认拒绝,只放行必要的采集和告警上报。

4.4 监测与响应:把SCADA操作站的日志接进SOC

第四层是监测。操作站和前置机的日志要集中采集,包括Windows事件日志、SCADA自身操作日志、通信日志。检测规则围绕前面说的基线:异常进程、异常登录、异常外联、异常指令。

-- 示例:在 SIEM 中查询操作站上的异常进程创建 SELECT host, user, process_name, command_line, timestamp FROM process_events WHERE host IN ('scada_op1', 'scada_op2') AND process_name IN ('cmd.exe', 'powershell.exe', 'psexec.exe') AND timestamp BETWEEN '2025-01-01 00:00:00' AND '2025-01-02 00:00:00' ORDER BY timestamp;

这条查询找的是操作站上不该出现的命令行工具。参数上,host列表按实际资产填,process_name按基线调整。如果SCADA操作站平时根本不跑cmd.exe,那任何一次出现都值得查。响应流程要提前定好:发现异常先隔离主机还是先保通信,谁有权决定,这些要在演练中确定。

4.5 备份与恢复:KillDisk来了也有后悔药

第五层是备份。BlackEnergy配合KillDisk擦数据,没有离线备份就只能重建。SCADA工程文件、组态配置、实时库快照、历史数据都要定期备份,且备份介质要离线或不可写。恢复演练要定期做,确保备份真的能恢复。

# 示例:用 rsync 做 SCADA 工程目录的增量备份到离线存储 rsync -avz --delete /opt/scada/project/ /mnt/backup/scada_project/ rsync -avz --delete /opt/scada/config/ /mnt/backup/scada_config/ # 备份后校验关键文件哈希,确保完整性 sha256sum /opt/scada/project/*.xml > /mnt/backup/scada_project.sha256

参数说明:-a保留权限和时间,-v输出详情,-z压缩传输,--delete让目标与源一致。注意--delete有风险,源目录被误删会同步到备份,所以备份侧最好再做一层快照或版本化。校验哈希是为了发现备份文件被篡改或损坏。

5. 避坑与排查:BlackEnergy类攻击防守中最容易翻车的五件事

5.1 只查病毒不查行为,样本一变就瞎

现象:杀毒软件扫不出,就认为系统干净。原因:BlackEnergy变种多,静态特征一改就免杀。解决:把检测重心从文件哈希转到行为,重点看进程链、网络连接、持久化项。操作站上出现winword.exe启动cmd.exe再启动未知程序,这条链本身就是告警,不管文件哈希是否命中。

5.2 操作站和办公网同域同账号,横向移动一路绿灯

现象:攻击者用一个办公网账号就能登录操作站。原因:域账号复用、权限过大。解决:工控网独立域或独立账号体系,操作站登录账号与办公网隔离,限制域管账号在工控网的登录。排查时看4624事件里操作站的登录来源,如果有办公网IP,立即查。

5.3 只防边界不防内网,U盘和运维笔记本成跳板

现象:边界防火墙很严,但病毒从运维笔记本带进来。原因:移动介质和自带设备未管控。解决:运维笔记本接入工控网前做安全检查,U盘统一管理,操作站禁用USB存储。排查时看操作站上是否有新挂载的USB设备记录,事件日志里找设备安装事件。

5.4 日志没集中,出事只能看单机

现象:操作站被控后日志被删,查不到攻击路径。原因:日志本地存储,权限没分离。解决:日志实时发到SOC或日志服务器,操作站本地不留或只留短期。排查时如果发现某台操作站日志突然中断,先查网络再查主机,可能是攻击者断日志。

5.5 备份在线可写,KillDisk一擦全没

现象:有备份,但备份盘挂载在操作站上且可写,一起被擦。原因:备份架构没做隔离。解决:备份走独立网络,备份存储对操作站只读或不可见,关键备份离线保存。排查时定期做恢复演练,别等真出事才发现备份是空的。

6. 进阶技巧:用通信基线做SCADA异常指令检测

前面讲的都是主机和网络层的通用检测,真正能提前发现SCADA被控的,是通信行为基线。IEC 60870-5-104和DNP3这类规约的报文结构相对固定,正常运行时遥控指令很少,遥测遥信是周期性的。如果短时间内出现大量遥控指令,或者非工作时间出现遥控,这就是强信号。

我一般会先抓一段正常运行时的104报文,统计每天各类报文的数量和时段分布,做成基线。然后写个简单脚本,对实时流量做滑动窗口统计,偏离基线就告警。

# 示例:统计104报文中遥控类报文的数量,偏离基线则告警 # 假设已用 tshark 导出报文类型字段 import collections import time # 模拟从 tshark 输出读取的报文类型序列 packet_types = ["C_IC_NA_1", "M_SP_NA_1", "M_ME_NC_1", "C_SC_NA_1", "C_DC_NA_1"] # 统计遥控类报文(C_SC_NA_1 单点遥控,C_DC_NA_1 双点遥控) control_types = {"C_SC_NA_1", "C_DC_NA_1"} window = collections.deque(maxlen=300) # 5分钟窗口,假设每秒1条 alerts = [] for ptype in packet_types: window.append(ptype) control_count = sum(1 for p in window if p in control_types) # 基线:5分钟内遥控报文不超过5条,超过则告警 if control_count > 5: alerts.append((time.time(), control_count)) print("告警:", alerts)

这段代码是思路演示,实际部署要接真实流量。参数上,maxlen决定窗口大小,control_count阈值按现场基线调。关键是先跑一段时间只记录不告警,确认基线稳定后再开告警。误报主要来自正常操作,比如计划内的倒闸操作,所以要把计划操作时间表接进来做白名单。

另一个技巧是看遥控指令的源IP和目的IP。正常遥控来自操作站到前置机再到RTU,如果出现从办公网段或未知IP发起的104连接,直接告警。这个规则简单但有效,我在几个现场都用过,抓到过配置错误的测试工具,也拦过异常扫描。

最后说个习惯:每次分析完样本或排查完事件,把IOC和检测规则更新到自己的知识库,别只留在邮件里。BlackEnergy这类攻击不会只来一次,变种会换C2、换文件名,但行为模式变化不大。把行为规则沉淀下来,下次就不用从零开始。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 8:00:08

Windows提权实用指南:敏感信息搜索与凭据收集全流程

1. 为什么敏感信息搜索是Windows提权的第一站考OSCP的时候我有个特别深的体会:真正让你省力的不是某个0day漏洞,而是系统自己堆在角落里的密码。Windows权限提升这条路,很多人一上来就翻内核漏洞、找exp,结果折腾半天不如先静下心…

作者头像 李华
网站建设 2026/9/29 7:58:46

Agent 设计模式拆解:从 Prompt 到 Multi-Agent

一、厘清两个概念:LLM vs Agent 很多人把"用 ChatGPT"当成"用了 Agent",其实两者差了一个"身体"。要理解 Agent 设计模式,先要分清这两个词。 LLM(大语言模型) 是一个文本进、文本出的…

作者头像 李华
网站建设 2026/9/29 7:58:08

奶瓶系统无线安全审计实战:从监听模式到WPA握手包抓取

简介:一份围绕无线网络安全测试的图文教程PDF,面向网络安全初学者、渗透测试爱好者及网络管理员,系统讲解“奶瓶”(FeedingBottle)无线安全测试工具的完整使用流程。该工具基于Tiny Core Linux构建,相比BT3…

作者头像 李华
网站建设 2026/9/29 7:56:01

ModelSim报错:Unable to checkout a viewer license全解析与修复指南

很多ModelSim用户第一次看到这个弹窗的第一反应,大概率是一脸懵:编译、仿真都看不出问题,脚本跑得顺顺的,结果一打开图形界面就弹出一句“Unable to checkout a viewer license necessary for use of the ModelSim graphical user…

作者头像 李华
网站建设 2026/9/29 7:51:49

Python进阶:高效发送Markdown群消息

Markdown 格式消息允许您在消息内容中嵌入格式化元素,如加粗、斜体、代码块、列表和链接,这对于发送格式化的通知、告警或简报非常有用。1. Markdown 消息的数据结构Markdown 消息的请求体结构与文本消息类似,但 msgtype 字段必须设置为 &quo…

作者头像 李华