2017年6年27日,乌克兰一家公司声称遭受一款名为“Petya”勒索病毒袭击。随后病毒迅速在全球网络蔓延,乌克兰境内地铁、电力公司、电信公司、切尔诺贝利核电站、银行系统等多处国家基础设施均被感染导致运行异常。Petya主要通过邮件附件以及网盘传播,但笔者通过分析国内外资料发现,不能完全排除Petya未使用美国国家安全局所创建的黑客工具(这些工具由黑客小组Shadow Brokers在4月份公布)。

欧洲成为本次勒索病毒攻击的“重灾区”:在ESET统计的袭击受灾图中,乌克兰占据了总量的百分之七十五。而欧洲以外的国家仅占2.94%。

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(1)

图片来源:ESET安全实验室数据调研中心

Petya发作后,会展示比特币付款警告界面。但笔者通过资料收集及逆向分析证实———付款完全没用,Petya作者所使用的邮箱服务提供商Posteo更是早已声明,关闭了攻击者的相关邮箱账户。而作者正是通过这个邮箱获取到受害者的唯一标识(ec_data)。

初识Petya

Petya是一款2016年被首次发现的基于Windows系列操作系统的加密勒索软件。Petya首先会修改系统主引导记录(MBR)代码,然后进一步加密系统主文件表(MFT),进而造成Windows无法成功启动。病毒随后会要求用户使用比特币付款,来恢复被破坏的数据。

发作的Patya

Petya病毒攻击漂亮的两步棋:MBR与MFT

计算机开机访问硬盘时所要读取的第一个扇区就是主引导扇区(MBR),主引导扇区记录着硬盘本身相关信息以及各个分区大小及信息。而在NTFS中,所有文件数据——文件名、创建日期、访问权限(使用访问控制列表ACL实现)以及内容——都作为元数据储存在主文件表(MFT)中。设计MFT会大大简化一些文件系统的运行成本。

一旦系统感染了Petya,病毒会马上修改主引导记录(MBR)。这样病毒可以在下次系统重新启动时劫持并修改系统的正常加载过程。一旦拿下MBR,病毒会进一步感染MFT表,并通过MFT表特性提取相应扩展名文件进行加密。

MBR是硬盘引导的第一步,MFT保存了文件系统的重要信息。也就是说 ,病毒作者根据MBR与MFT的特性选择了感染的位置。这也是病毒作者的高明之处。

Petya的执行流程

Petya共分为多个阶段:传播阶段、初期感染阶段、MBR感染和加密阶段。

Petya勒索软件通过邮件或者系统漏洞进行传播。

关于漏洞:Petya主要是利用最新的永恒之蓝漏洞与一些网络共享漏洞。病毒会通过这些漏洞将自身复制到目标的//admin$中,然后使用PsExec或者WMIC服务中的启动函数来远程执行。这两者都是可以合法调用的函数功能。

初始感染阶段,Petya通过runDLL32.exe将自身调起,以防被安全软件查出:

rundll32.exe perfc.dat,#1

一旦perfc.dat被加载,首先它将自删除,然后使用空字节填充自己来针对性的防止特征码扫描。接下来,病毒尝试设置本机已被感染的标志。

C:\Windows\perfc

Patya进一步感染,重写系统MBR内容,将一个完整的MBR内核写入主引导记录中,并进行异常重启。修改后的MBR会针对硬盘进行改写,病毒在屏幕上模拟CHKDSK,让用户误以为系统正在对硬盘进行修复。最后病毒会释放出赎金索要界面。

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(2)

虚假的CHKDSK

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(3)

勒索界面

大体流程可以看下图:

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(4)

Petya的加密

Petya的加密是有目的性的,它只对以下格式文件进行加密:

.3ds .7z .accdb .ai .asp .aspx .avhd .back .bak .c .cfg .conf .cpp .cs .ctl .dbf .disk.doc .docx.dwg.eml.fdb.gz.h.hdd .kdbx .mail .mdb .msg .nrg .ora .ost .ova .ovf .pdf .php .pmf .ppt .pptx .pst .pvi .py .pyc .rar .rtf .sln .sql .tar .vbox .vbs .vcb .vdi .vfd .vmc .vmdk .vmsd .vmx .vsdx .vsv .work .xls .xlsx .xvd .zip

病毒会对特定文件在用户模式下进行BASE64加密,生成安装密钥,并写入readme.txt中等待展示。系统重新启动后,受感染的MBR被加载,磁盘加密开始,加密MFT,病毒使用Salsa20算法随机生成Salsa20密钥(32byte长度)用于磁盘加密。加密过后这个Key就会被清除。由于安装密钥与Salsa20密钥之间没有关联,那么作者为什么要展示这个安装密钥呢?(答:Petya倾向于破坏硬盘数据而不是勒索,请不要支付赎金!

挖掘Petya免疫方法

研究人员发现了Petya的kill-switch(免疫开关),我们下面来分析一下它的原理。Petya样本是一个模块dll(dat)文件,从这个模块的导出函数里我们发现了他的恶意行为。执行了这个函数之后,首先他会执行三个令牌权限申请函数:SeShutdownPrivilege、SeDebugPrivilege和SeTcbPrivilege。

程序紧接着进行Hash校验、完整性校验、文件名获取等操作。然后,我们竟然很幸运的发现了阻止病毒执行的开关(kill-switch)如下图。

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(5)

kill-switch

病毒在执行Msub_CreateWindowsFile函数后,PathFileExistsW函数会检查eax指向的文件是否存在。如果存在,程序会调用ExitProcess代码将自己关闭,从而终止恶意软件的执行。那么我们必须要让程序执行ExitProcess分支,所以我们需要知道eax寄存器的内容。根据分析我们定位到了ebp pszPath的内存中,通过动态调试在此处下断点。

安全工程师展示如何挖掘Petya免疫开关(安全工程师展示如何挖掘Petya免疫开关)(6)

中断成功

由上图可以看见,我们测试的DLL完整路径为:C:\ _Virus\Petya.dll。第一个函数PathFindFileNameW返回的是Petya.dll,第二个函数PathCombineW返回的则是C:\ Windows \Petya.dll。第三个函数PathFindExtensionW是以上一个函数的返回值为参数,返回C:\Windows\Petya。此时这段字符串写入了EAX指向的内存中(红线处),然后马上返回到上一级并执行了我们刚才的kill-switch——PathFileExistsW。

到此我们终于明白了这个eax寄存器里的内容,它就是C:\Windows\Petya文件(也就是所谓的“免疫开关”)。如果此文件存在,恶意软件将结束自己的执行感染旅程。(完)

,