Ukrenergo是乌克兰国内的主要能源供应企业,2016年12月17日晚,该公司经历了一次供电故障,影响到基辅附近诺威佩特里夫茨村的北部变电站自动化控制系统,该停电事故主要影响的范围是基辅(乌克兰首都)北部及其周边地区。
事件综述
Ukrenergo是乌克兰国内的主要能源供应企业,2016年12月17日晚,该公司经历了一次供电故障,影响到基辅附近诺威佩特里夫茨村的北部变电站自动化控制系统,该停电事故主要影响的范围是基辅(乌克兰首都)北部及其周边地区。
停电事件发生后30分钟,Ukrenergo工程师将设备切换为手工模式,并开始恢复供电;75分钟后完全恢复供电。
2016年12月18日上午,Ukrenergo负责人Vsevolod Kovalchuk在Facebook上发布信息描述了上述经过,并称本次停电的原因可能是设备故障,也可能是由于网络攻击。
针对本次停电事件,绿盟科技安全团队响应如图1所示:
历史回顾
乌克兰电网近期遭受的攻击事件如图2所示。绿盟科技安全团队通过对恶意代码的分析发现本次事件的攻击者是Telebots组织,该组织与BlackEnergy组织有关。
电力系统简介
电力系统是由发电、输电、变电、配电和用电连接成的统一整体,如图3所示。其中,升压变电所是将电压升高,变为高压电从而进行远距离电力传送;降压变电所是将高压电的电压降低,以供区域电网或终端用户使用;配电变电所负责将电网输送来的电能分配给各类用户。在整个电力系统中,几乎每个环节都依赖计算机技术的支撑,比如各级电网调度控制中心的计算机系统、变电站的计算机监控系统等等。
国内变电站主要结构示意图如图4所示:
- 纵向加密:对变电站送往调度中心的通道数据进行加密。
- 远动装置:负责将变电站内的信息送往远方的调度中心。
- 网络分析仪:记录变电站内部网络的通信报文。
- 国外变电站主要结构示意图如图5所示:
- 保护装置:对采集到的一次设备电压电流、开关量信号执行相应保护控制逻辑。
- 合并单元:负责采集一次设备的电压电流信号。
- 智能终端:负责采集一次设备的开关量信号,以及执行保护装置下发的开关控制命令。
- 状态监测与诊断装置:变电站现场的辅助监测类设备。
- 协议转换服务器:负责协议转换,使得采用不同协议的设备之间可以互相通信。
- 监控主机:负责变电站现场信息的汇总展示。
- 调度中心:集中展示和控制下面多个变电站的集控中心。(1)国内将变电站内的区域通过防火墙分隔成了安全I区和安全II区。安全I区:实时生产控制区,可以直接控制电力一次设备的运行。安全II区:非实时控制区,如电能量计量系统,故障录波管理系统等。
- (2)国内变电站是完全隔离的局域网,不与公网连接;而国外的变电站可以通过办公区以VPN等形式接入变电站的内部网络。
- 国内和国外变电站的主要区别表现在以下两点:
样本执行概要
该样本的执行流程图如图6所示:
样本结构
此样本是一个复合样本,包含多个样本文件:
文件类型 | MD5 | 功能 |
XLS | FD0FD58B20B1476E8F67D6A05307E9BC
7D4FC63F2096A485D2DA3DB1150E6D34 |
释放并执行
C:\User\xxx\AppData\Local\Temp\explorer.exe |
explorer.exe | 1019C101FC1AE71E5C1687E34F0628E6 | 下载并执行
C:\User\xxx\AppData\Local\Temp\lsass.exe |
lsass.exe | 873C7701E16BC68AD7A90886B5D0A3F0
75EE947E31A40AB4B5CDE9F4A767310B 0FCE93CD9BEEEA30A7F0E2A819D2B968 |
远控木马,根据服务器发送的命令执行不同的功能 |
KillDisk.exe | B75C869561E014F4D384773427C879A6
FFB1E8BABAECC4A8CB3D763412294469 |
删除系统日志,清空部分扇区数据,导致系统崩溃无法重启 |
keylogger.exe | 4919569CD19164C1F123F97C5B44B03B | 记录键盘消息 |
LDAPquery.exe | 76691C58103431624D26F2B8384A57B0 | 查询LDAP服务器 |
mimikatz.exe | BDE6C0DAC3E594A4A859B490AAAF1217 | 抓取系统口令 |
CredRaptor.exe | 389AE3A4589E355E173E9B077D6F1A0A | 窃取浏览器中用户的用户名和密码 |
Intercepter-NG.exe | 5BD6B79A4443AFD27F7ED1FBF66060EA | 抓包工具 |
VBS | 2D7866989D659C1F8AE795E5CAB40BF3
C404B959B51AD0425F1789F03E2C6ECF |
获取并执行指令 |
telebot.exe | 24313581BBBFFA9A784B48075B525810 | 远控木马,根据不同的指令执行不同的功能 |
表1 样本文件列表
XLS
主要功能:
通过运行文档中的宏代码,将可执行文件释放到临时目录“C:\User\xxx\AppData\Local\Temp”,并命名为“explorer.exe”来隐藏自身。
行为分析:
该文件运行后如图7所示:
图8中为宏代码中定义的数组中的第一个,这些数组中的数据是一个PE文件,“77”和“90”分别对应16进制的“4D5A”。
explorer.exe
主要功能:
该文件是一个下载器,主要功能是从服务器下载文件并执行。
行为分析:
样本会首先连接域名,所连接的域名如图10所示。该域名是一个允许任何人下载和上传文件的托管网站,如图11所示。
对该样本文件逆向分析如下:(1)首先调用connect函数,要连接的IP地址为188.234.144.11,如图12所示。该IP是一个存储文件的服务器。
(2)发送数据,如图13:
(3)接收数据后创建文件,如图14:
(4)将接收的数据写入文件中,如图15:
(5)之后逐部分读取文件内容到内存中,如图16:
(6)进行解密,如图17:
(7)解密部分的代码表2所示:
.text:00405142 mov eax, [esp+2C8h] .text:00405149 mov edx, [esp+5Ch] .text:0040514D mov edi, ebx .text:0040514F mov ebx, [esp+1Ch] .text:00405153 mov ecx, [esp+2C4h] .text:0040515A or eax, [esp+54h] .text:0040515E add edx, [esp+50h] .text:00405162 mov [ebx+edi], al .text:00405165 inc edi .text:00405166 mov esi, eax .text:00405168 lea edx, [ecx+edx+4] .text:0040516C mov [esp+20h], edi .text:00405170 mov [esp+4Ch], edi .text:00405174 mov edi, [esp+18h] .text:00405178 mov ebx, edx .text:0040517A shl esi, 6 .text:0040517D mov dl, 1 .text:0040517F nop .text:00405180 .text:00405180 loc_405180: ; CODE XREF: micro::main::hd9f3cc455036707f+25FCj .text:00405180 xor ecx, ecx .text:00405182 mov [esp+5Ch], ebx .text:00405186 .text:00405186 loc_405186: ; CODE XREF: micro::main::hd9f3cc455036707f+269Dj .text:00405186 cmp edi, ebx .text:00405188 jz loc_406B19 .text:0040518E movzx eax, byte ptr [ebx] .text:00405191 mov [esp+50h], eax .text:00405195 movzx eax, byte ptr [eax+45CD5Fh] .text:0040519C cmp eax, 0FDh .text:004051A1 jb short loc_4051AF .text:004051A3 inc ebx .text:004051A4 inc ecx .text:004051A5 cmp al, 0FDh .text:004051A7 jnz loc_405338 .text:004051AD jmp short loc_405186 .text:004051AF ; --------------------------------------------------------------------------- .text:004051AF .text:004051AF loc_4051AF: ; CODE XREF: micro::main::hd9f3cc455036707f+2691j .text:004051AF or eax, esi .text:004051B1 inc ebx .text:004051B2 shl eax, 6 .text:004051B5 mov [esp+54h], eax .text:004051B9 .text:004051B9 loc_4051B9: ; CODE XREF: micro::main::hd9f3cc455036707f+26DCj .text:004051B9 mov eax, [esp+2D8h] .text:004051C0 mov esi, 1 .text:004051C5 lea eax, (loc_402B28 - 402B28h)[ebx+eax] .text:004051C8 cmp eax, 1 .text:004051CB jz loc_406C0C .text:004051D1 movzx esi, byte ptr [ebx] .text:004051D4 movzx eax, ds:_const_47[esi] .text:004051DB cmp eax, 0FCh .text:004051E0 jbe short loc_4051EE .text:004051E2 inc ebx .text:004051E3 inc ecx .text:004051E4 cmp al, 0FDh .text:004051E6 jnz loc_406B2A .text:004051EC jmp short loc_4051B9 .text:004051EE ; --------------------------------------------------------------------------- .text:004051EE .text:004051EE loc_4051EE: ; CODE XREF: micro::main::hd9f3cc455036707f+26D0j .text:004051EE or eax, [esp+54h] .text:004051F2 mov edx, [esp+2D0h] .text:004051F9 mov [esp+18h], edi .text:004051FD mov edi, ecx .text:004051FF mov [esp+2CCh], eax .text:00405206 shl eax, 6 .text:00405209 mov [esp+54h], eax .text:0040520D mov eax, [esp+5Ch] .text:00405211 lea eax, (loc_402B28 - 402B28h)[eax+edx] .text:00405214 .text:00405214 loc_405214: ; CODE XREF: micro::main::hd9f3cc455036707f+2734j .text:00405214 mov edx, eax .text:00405216 add edx, edi .text:00405218 jz loc_406BA6 .text:0040521E mov edx, [esp+5Ch] .text:00405222 movzx ecx, byte ptr [edx+edi+2] .text:00405227 movzx ebx, ds:_const_47[ecx] .text:0040522E mov [esp+50h], ecx .text:00405232 cmp ebx, 0FCh .text:00405238 jbe short loc_405246 .text:0040523A inc edi .text:0040523B cmp bl, 0FDh .text:0040523E jnz loc_406B8A .text:00405244 jmp short loc_405214 .text:00405246 ; --------------------------------------------------------------------------- .text:00405246 .text:00405246 loc_405246: ; CODE XREF: micro::main::hd9f3cc455036707f+2728j .text:00405246 or ebx, [esp+54h] .text:0040524A mov ecx, [esp+5Ch] .text:0040524E xor esi, esi .text:00405250 mov eax, ebx .text:00405252 shl eax, 6 .text:00405255 mov [esp+54h], eax .text:00405259 mov eax, [esp+4] .text:0040525D lea eax, (loc_402B28 - 402B28h)[ecx+eax] .text:00405260 add eax, edi .text:00405262 .text:00405262 loc_405262: ; CODE XREF: micro::main::hd9f3cc455036707f+2781j .text:00405262 mov edx, eax .text:00405264 add edx, esi .text:00405266 jz loc_406C4A .text:0040526C lea edx, [ecx+esi] .text:0040526F movzx edx, byte ptr [edx+edi+3] .text:00405274 mov [esp+50h], edx .text:00405278 movzx edx, ds:_const_47[edx] .text:0040527F cmp edx, 0FCh .text:00405285 jbe short loc_405293 .text:00405287 inc esi .text:00405288 cmp dl, 0FDh .text:0040528B jnz loc_406BB7 .text:00405291 jmp short loc_405262 .text:00405293 ; --------------------------------------------------------------------------- .text:00405293 .text:00405293 loc_405293: ; CODE XREF: micro::main::hd9f3cc455036707f+2775j .text:00405293 mov eax, [esp+20h] .text:00405297 mov [esp+2C8h], edx .text:0040529E mov [esp+2C4h], esi .text:004052A5 mov [esp+50h], edi .text:004052A9 cmp eax, [esp+48h] .text:004052AD jnz short loc_4052C8 .text:004052AF lea ecx, [esp+44h] .text:004052B3 call __ZN40_$LT$alloc__raw_vec__RawVec$LT$T$GT$$GT$6double17h06f32d01d77fcc35E_703 .text:004052B8 mov eax, [esp+44h] .text:004052BC mov ecx, [esp+4Ch] .text:004052C0 mov [esp+1Ch], eax .text:004052C4 mov [esp+20h], ecx .text:004052C8 .text:004052C8 loc_4052C8: ; CODE XREF: micro::main::hd9f3cc455036707f+279Dj .text:004052C8 mov edx, [esp+2CCh] .text:004052CF mov eax, [esp+1Ch] .text:004052D3 mov ecx, [esp+20h] .text:004052D7 shr edx, 4 .text:004052DA mov byte ptr ds:(loc_402B28 - 402B28h)[eax+ecx], dl .text:004052DD mov eax, [esp+4Ch] .text:004052E1 inc eax .text:004052E2 mov [esp+4Ch], eax .text:004052E6 mov ecx, eax .text:004052E8 mov edi, [esp+48h] .text:004052EC cmp eax, edi .text:004052EE jnz short loc_405301 .text:004052F0 lea ecx, [esp+44h] .text:004052F4 call __ZN40_$LT$alloc__raw_vec__RawVec$LT$T$GT$$GT$6double17h06f32d01d77fcc35E_703 .text:004052F9 mov edi, [esp+48h] .text:004052FD mov ecx, [esp+4Ch] .text:00405301 .text:00405301 loc_405301: ; CODE XREF: micro::main::hd9f3cc455036707f+27DEj .text:00405301 mov eax, [esp+44h] .text:00405305 shr ebx, 2 .text:00405308 mov [esp+1Ch], eax .text:0040530C mov byte ptr ds:(loc_402B28 - 402B28h)[eax+ecx], bl .text:0040530F inc ecx .text:00405310 mov ebx, ecx .text:00405312 mov [esp+4Ch], ecx .text:00405316 cmp ecx, edi .text:00405318 jnz loc_405142
(8)创建lsass.exe文件,如图18:
(9)将文件内容写入\AppData\Local\Temp\lsass.exe中,如图19:
(10)完成后即删除原txt文件,如图20:
(11)创建进程,如图21:
lsass.exe
主要功能:
接收服务器的指令,执行不同的功能。
行为分析:
首先使用pyinstxtractor.py将样本反编译成py文件,图22为反编译后的py文件。
图23为解密后的代码:
该代码会从远程服务器获取指令,先尝试直接从服务器读取指令,如果失败则尝试获取指令文件中的内容,在本地新建一个长度为10字节的随机dat文件,将指令文件中的内容写入dat文件中。
指令解析如表3所示:
命令 | 功能 |
help | 显示可以执行的指令 |
cmd||(cmd command) | 执行(cmd command)中的命令(读取数据时cp866解码后用utf-8编码) |
cmdd||(cmd command) | 执行(cmd command)中的命令 |
getphoto||(path) | 获取路径为(path)的文件(发送数据时用本机编码方式解码再用utf-8编码) |
getdoc||(doc path) | 获取路径为(doc path)的文件 |
forcecheckin||random data | 获取主机信息 |
time||(int) | 设置sleep的时间 |
ss||(random data) | 未实现,从名称判断为获取截屏 |
表3 指令解析
KillDisk.exe
主要功能:
清除系统扇区,删除重要的系统文件,对特定类型的文件内容进行覆盖,结束系统进程,致使系统崩溃,无法修复。
行为分析:
样本首先会提升进程权限,使病毒程序具有关机和修改系统目录文件的权限。
启动cmd创建服务,如图27:
创建服务后启动服务,如图28:
而启动的服务程序即是它本身,如图29:
创建线程删除日志文件,隐藏操作痕迹,如图30:
样本企图对PhysicalDriver0到PhysicalDriver15进行内存填充,如图31:
对打开的每个磁盘的291个扇区进行内存的清零操作,如图32:
上述操作完成后,操作系统已经无法重启。
重复三次结束系统关键进程的操作来结束一些系统进程,如图33。被结束的系统进程包含但不仅限于:system,vmacthlp.exe,VGAuthService.exe,vmtoolsd.exe,dllhost.exe,WmiPrvSE.exe,msdtc.exe,SearchIndexer.exe,sppsvc.exe,PCHunter32.exe。
上述行为最终会导致系统崩溃,重新启动。然而由于系统扇区内存已被清零,导致系统无法重启。
通过代码跟踪分析,发现了KillDisk组件的一个变种,可以运行在多种平台上。攻击者利用该变种文件不仅可以攻击Windows上位机控制的SCADA/ICS系统,可以攻击Linux上位机控制的SCADA/ICS系统。目前该变种文件已经被作为Linux系统的勒索软件,勒索赎金为222btc,折合人民币1729875元,如图34:
keylogger.exe
主要功能:
键盘记录器,记录用户的键盘输入并保存到临时目录下伪装成.tmp文件,攻击者如果有文件系统的读写权限,则只需读取该文件即可获得用户在某进程/窗口/文件下的所有键盘操作记录。
行为分析:
在temp目录下生成键盘记录日志文件,如图35:
日志文件的内容如图36所示:
日志文件包含以下信息:
1.键盘钩子设置情况。
2.进行键盘操作的进程PID、标题、进程名。
3.用户的键盘输入内容。
随后样本会注入各进程设置键盘钩子以获取键盘消息,如图37:
记录键盘消息,如图38:
该样本不存在设置启动项的行为,是一次性的执行流程。然而攻击者既然已获得了上传并运行文件的权限,完全可以手工将其加入启动项列表中,借以绕过杀毒软件的检测。
LDAPquery.exe
主要功能:
该文件是一个LDAP服务器的查询工具,成功连接至LDAP服务器后,可以通过ldap_search的方式查询分区、计算机、用户等信息。
行为分析:
连接到LDAP服务器,如图39:
成功连接LDAP服务器后(服务器地址根据运行参数而决定,若参数为空则连接默认LDAP服务器),样本将自动通过ldap_search函数查询服务器的相关信息并回显。
查询分区信息,如图40:
查询计算机信息,如图41:
查询用户信息,如图42:
查询其他信息,如图43:
mimikatz.exe
主要功能:
获取管理员的用户名和密码,该样本只能工作在32位系统环境中,它通过注入lsass.exe并读取内存来抓取用户名、工作组、密码等信息。
由于lsass.exe中的密码字段并非用hash加密且加密参数留驻于内存未能擦除,所以该样本可通过读取内存中加密的密文密码和加密参数,并调用lsasrv.dll中的解密模块进行解密,借以还原出用户的密码明文。
该样本可以获取所有处在于“已登录”状态的用户名和口令。
行为分析:
注入并读取lsass.exe的内存,如图44:
样本将从读到的内存基址中以偏移的方式分别获取以下内容的动态地址:
1.用户名
2.工作组
3.用户口令(密文)
读取动态地址中的用户名,如图45、图46:
CredRaptor.exe
主要功能:
该样本通过检查系统版本来确定IE浏览器的版本,从而对不同版本的IE浏览器文件夹下存储的用户名密码文件进行解析,获取用户信息。获取信息的浏览器包含Google Chrome,Internet Explorer,Mozilla Firefox和Opera。
行为分析:
首先程序检查系统版本,如图50:
CryptUnprotectData函数可以解密同一用户在相同权限下加密的数据。
尝试读取iexplorer的用户信息,如图53:
获取日志文件的路径,如图54:
使用SQL语句 SELECT ORIGIN_URL,USERNAME_VALUE,PASSWORD_VALUE FROM LOGINS进行查询操作,如图57:
Intercepter-NG.exe
主要功能:
该样本是俄罗斯人编写的一款抓包工具,其特点为:
- 监听不同类型的密码或Hash包括:
ICQ\IRC\AIM\FTP\IMAP\POP3\SMTP\LDAP\BNC\SOCKS\
HTTP\WWW\NNTP\CVS\TELNET\MRA\DC++\VNC\MYSQL\ORACLE\NTLM
- 监听以下即时通讯工具的实时聊天内容:ICQ\AIM\JABBER\YAHOO\MSN\IRC\MRA
- 混杂模式\ARP\DHCP\Gateway\智能扫描模式
- Raw mode\eXtreme\Resurrection mode
- 捕获数据报并提供离线分析功能
- 通过RPCAP daemon捕获传输远程数据
- NAT\SOCKS\DHCP
- ARP\DNS over ICMP\DHCP\SSL\SSLSTRIP\WPAD\SMBRelay 中间人攻击
- 可以工作在NT平台,任何的*nix平台,以及IOS和Android平台。
具体内容请参见官网:
VBS
主要功能:
从服务端获取并执行指令。
行为分析:
向远程服务器请求数据,并将请求到的数据转换成指令执行,如图61:
VBS样本的指令格式*:report_id$arg0 arg1
command | Function |
!cmd arg1 | 执行arg1 |
!cmdd arg1 | 执行arg1 |
!dump arg1 | 发送对arg1再次进行编码的内容 |
!timeout arg1 | 设置sleep的时间 |
!bye | 设置exitFlag = True(该变量控制程序是否退出) |
!kill | 自我删除, 设置exitFlag = True(该变量控制程序是否退出) |
!up (int) | 将arg1指定的文件内容编码后发送 |
表4 VBS样本指令格式
telebot.exe
主要功能:
此样本是一个木马程序,根据不同指令执行不同功能。
行为分析:
从邮箱获取文件然后进行解码来获取命令然后执行。
邮箱样本的指令格式{“CMD”:“”,“”:“jobid”,“ARG”:“*”}。
command | Function |
CMD:download
ARG:filepath |
将filepath指定的文件发给自己的邮箱 |
CMD:cmd
ARG:cmd command |
执行(cmd command)中的命令并将输出信息和出错信息发给自己邮箱 |
CMD:upload
ARG:url |
下载url代表的文件并在本地运行 |
CMD:forcecheckin,
ARG: |
向自己发邮件,内容为字符串信息和本机信息 |
表5 邮箱样本指令格式
通过登陆自己邮箱,将窃取到的信息发送到自己的邮箱,如图65:
经验证该账号密码仍然可用,但需要进行验证,如图67:
攻击定位
通过对样本的分析,发现样本会连接两个IP地址和一个域名,信息如下:
- IP(188.234.144.11),位于俄罗斯地区,如图68:
2.IP(93.190.137.212)位于荷兰,如图69:
3.lsass中链接的域名为
https://api.telegram.org/bot140192111:AAGSxqO9Xz9meTaG7Ecdh80LGnYXNIbbgp4
此域名解析的结果如图70:
防护方案
-
绿盟科技检测服务
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?service_id=1018
-
绿盟科技木马专杀解决方案
- 短期服务:绿盟科技工程师现场木马后门清理服务(人工服务+IPS+TAC+终端防护(金山V8+))。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
- 中期服务:提供3-6个月的风险监控与巡检服务(IPS+TAC+人工服务)。根除风险,确保事件不复发。
- 长期服务:基于行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)
总结
此次攻击和BlackEnergy类似,攻击者使用带有Microsoft Excel文档的spearphishing电子邮件,其中包含恶意宏作为初始感染向量。不同的是这次恶意文档没有使用任何社会工程学的方法来诱导受害者点击启动宏按钮,这样攻击是否成功只能完全依靠受害者是否点击它。
宏病毒运行后释放恶意文件,开始执行恶意功能。
关于绿盟科技
北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。
基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。
北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。
更多内容,请下载附件:乌克兰Ukrenergo断电事件技术分析与防护方案
如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880