0x00 概述
Phobos家族是最近出现的一种勒索软件,在2019年初首次被研究人员发现。自此开始,该恶意软件持续被发现存在新的变种。与原有变种相比,新的变种不仅持续改进其攻击方法,并且还经常修改加密文件的扩展名。尽管该勒索软件持续的时间比较短暂,但有不少受害者都表示,他们支付了勒索的赎金,但文件却没有被恢复。
两周前,FortiGuard实验室从野外捕获了一个新的威胁样本。这是一个Microsoft Word文档,带有一个恶意宏,用于传播Phobos勒索软件名为EKING的变种。我们对该样本进行了深入的分析,在这篇分析文章中,我们将展现该变种是如何感染受害者的系统,以及它是如何在受害者设备和共享网络文件夹上扫描并使用AES算法加密文件的。
0x01 在Word中打开捕获的样本
打开Word文档之后,会显示出一条警告,指示受害者单击黄色栏中的“启用内容”按钮以启用宏,如下图所示。
由于宏可能包含恶意代码,因此在默认情况下,MS Office Word会显示一个“安全警告”,警告用户该文档可能存在风险。然后,用户可以通过单击“启用内容”按钮来决定是否执行宏。
MS Office Word中的样本内容。
但是,这个文档中的安全警告是一个圈套。通过查看宏代码,我们发现其中有一个名为Document_Close()的内置文件函数,当MS Office Word退出时,会自动调用该函数。换而言之,当受害者关闭文档时,将会执行恶意的宏代码。这种方式还可以绕过某些沙箱解决方案,FortiSandbox将这个恶意Word文件识别为风险软件(Riskware)。
宏代码非常简洁清晰,它从打开的样本中提取一个Base 64编码的块,并保存在位于C:\Users\Public\Ksh1.xls的本地文件中。然后,通过调用命令“Certutil -decode C:\Users\Public\Ksh1.xls C:\Users\Public\Ksh1.pdf”将文件解码为另一个文件。“Ksh1.pdf”是经过Base64解码后的文件,实际上是一个PE文件(DLL文件)。下面是宏代码的截图,展示了将在何处将Base64编码后的文件“Ksh1.xls”解码为“Ksh1.pdf”。
经过Base64解码后提取的文件:
宏的最后一项任务是执行命令“Rundll32 C:\Users\Public\Ksh1.pdf,In”来运行解码后的PE文件“Ksh1.pdf”。解码后的PE文件“Ksh1.pdf”是包含导出函数“In”的DLL文件,在上述命令行中由“Rundll32.exe”调用。
导出函数In的ASM代码:
上图展示了“Ksh1.pdf”的导出函数In的ASM代码。根据我在ASM代码旁边插入的注释,我们很容易理解,它首先在“C:\Users\Public\cs5”处创建了一个新的目录。然后,通过调用API “URLDownloadToFile()”从URL“hxxp://178[.]62[.]19[.]66/campo/v/v”下载文件并保存到“C:\Users\Public\cs5\cs5.exe”。最后,通过调用API “CreateProcessA()”来运行下载的“cs5.exe”文件。在这里,下载URL字符串和完整文件路径字符串都在DLL文件“Ksh1.pdf”中进行了硬编码。值得关注的是,下载的文件“cs5.exe”是Phobos的Payload文件。
0x02 分析Payload EXE文件
“C:\Users\Public\cs5\cs5.exe”是Phobos的EKING变种的Payload,该变种使用了未知的加壳工具,如下图是Exeinfo PE显示的结果。
受保护的Phobos Payload EXE文件:
Phobos具有AES加密的配置块,其中包含许多配置信息(在我们分析的变种中包含69项)。它们在一个函数中被解密,然后随着索引号参数一起被使用。其中还包含用于加密文件的新扩展名字符串、用于生成加密密钥的数据、文件扩展名列表、Phobos的版本信息、受害者的勒索提示信息等等。
在下图,我们可以看到对具有新扩展名的加密文件“.id[<
从配置块解密新的扩展名:
0x03 启动第二个进程并执行两组命令
当“cs5.exe”运行时,它通过调用API CreateProcessWithTokenW() 以及来自Explorer.exe进程的令牌来创建自身的第二个进程,从而让第二个进程在Explorer.exe令牌的安全上下文中运行。这样一来,它就具有在受害者的系统上读写更多文件所需的特权。
Phobos在两个创建的线程中执行两组命令。
下面列出了第一组命令,其中包含我添加的注释:
- vssadmin delete shadows /all /quiet – Deletes all of the volume's shadow copies.
- wmic shadowcopy delete – Deletes shadow copies from local computer.
- bcdedit /set {default} bootstatuspolicy ignoreallfailures
- bcdedit /set {default} recoveryenabled no – Disables the automatic startup repair feature.
- wbadmin delete catalog –quiet – Deletes the backup catalog.
- Exit
通过删除Windows系统用于系统还原的卷影副本,受害者无法再使用这一功能来还原加密的文件。勒索软件还可以防止受害者通过自动启动修复功能还原文件,或者从备份目录中还原文件。
第二组命令关闭了受感染系统上的Windows防火墙,如下所示。
- netsh advfirewall set currentprofile state off(Windows 7及更高版本)
- netsh firewall set opmode mode=disable(Windows XP和Windows 2003)
0x04 添加自动运行项
该恶意软件还从加密的配置块中解密字符串“Software\Microsoft\Windows\CurrentVersion\Run”(索引号为0x11),这是注册表的子路径。然后,会同时在HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下创建一个自动运行项“cs5”。下图是在HKEY_CURRENT_USER下添加的自动运行项的截图。
添加自动运行项“cs5”:
除了将此项添加到系统注册表的自动运行组之外,勒索软件还会将“cs5.exe”复制到两个启动文件夹中,分别是“%AppData%\Microsoft\Windows\Start Menu\Programs\Startup”和“%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup”。下图展示了将“cs5.exe”复制到两个启动文件夹中的ASM代码片段。
将Payload文件复制到启动文件夹中:
在Windows启动时,Windows系统会自动执行这两个文件夹中的可执行文件。这意味着,Windows将在启动过程中运行4个“cs5.exe”文件以保证恶意软件的持久化。我们无需担心会发生冲突,因为Phobos使用了Mutex对象来确保仅有一个进程正在运行。如果存在相同的Mutex对象,则其他的“cs5.exe”进程将会退出。
0x05 Phobos在受害者系统上执行的核心任务
对于一个勒索软件来说,其核心任务就是加密受害者的文件,然后进行勒索,以换取对文件的解密。在这里,我们将详细分析Phobos的EKING变种是如何执行这一任务的。
为了提高性能,它创建了多个线程来扫描和加密受害者系统上的文件。此外,它使用了大量Event对象来控制和同步这些线程的进度。
5.1 用于终止进程的线程
通过使用线程的方式,勒索软件可以终止特定名称的41个进程(在列表中指定)。名称列表同样也是保存在配置块中,其索引号为0x0a。
- msftesql.exe;sqlagent.exe;sqlbrowser.exe;sqlservr.exe;sqlwriter.exe;oracle.exe;ocssd.exe;dbsnmp.exe;synctime.exe;agntsvc.exe;mydesktopqos.exe;isqlplussvc.exe;xfssvccon.exe;mydesktopservice.exe;ocautoupds.exe;agntsvc.exe;agntsvc.exe;agntsvc.exe;encsvc.exe;firefoxconfig.exe;tbirdconfig.exe;ocomm.exe;mysqld.exe;mysqld-nt.exe;mysqld-opt.exe;dbeng50.exe;sqbcoreservice.exe;excel.exe;infopath.exe;msaccess.exe;mspub.exe;onenote.exe;outlook.exe;powerpnt.exe;steam.exe;thebat.exe;thebat64.exe;thunderbird.exe;visio.exe;winword.exe;wordpad.exe
在其他勒索软件家族中,也经常会发现相同的进程名称列表,这些勒索软件也会进行相同的操作。
这些进程属于MS SQL Server、Oracle Database、VMware、Panda Security、MySql、FireFox、SQL Anywhere、RedGate SQL Backup、MS Excel、MS Word、MS Access、MS PowerPoint、MS Publisher、MS OneNote、MS Outlook、The Bat!、Thunderbird、WordPad等产品。
Phobos会继续终止这些应用程序,以迫使它们释放当前打开的任何文件,从而可以对其进行加密。
5.2 用于扫描文件并进行加密的线程
该线程的线程函数调用API GetLogicalDrives()来获取并枚举受害者系统上的所有逻辑驱动器,例如“C:\”、“D:\”、“E:\”等等。然后,它为每个逻辑驱动器创建两个扫描线程。这意味着,每个逻辑驱动器中的文件都会使用两个线程进行处理。
忽略两个系统文件夹:
为了避免对受害者的Windows系统进行破坏,它会忽略两个系统文件夹及其子文件夹,不对其中的文件进行加密,这两个文件夹分别是“%WinDir%”(通常为“C:\Windows”)和“%ProgramData%\Microsoft\Windows\Caches”。下图展示了Phobos检测当前路径(“\\?\D:”)是否与它需要忽略的两个系统文件夹匹配。
如前所述,勒索软件创建了两个线程来扫描每个驱动器中的文件。一个线程用于普通扫描(一个文件接着一个文件),另一个线程仅用于与数据库相关的文件的特殊扫描。我们可以认为这些文件对受害者的价值要大于其他文件。然后,会按照以下扩展名的顺序(索引号为0x06)来扫描数据库文件:
- fdb;sql;4dd;4dl;abs;abx;accdb;accdc;accde;adb;adf;ckp;db;db-journal;
- db-shm;db-wal;db2;db3;dbc;dbf;dbs;dbt;dbv;dcb;dp1;eco;edb;epim;fcd;gdb;
- mdb;mdf;ldf;myd;ndf;nwdb;nyf;sqlitedb;sqlite3;sqlite;
除此之外,勒索软件还包含两个扩展名排除列表。其中一个包含了Phobos此前曾使用过的加密文件扩展名,如下所示(索引号为0x07):
- eking;actin;Acton;actor;Acuff;Acuna;acute;adage;Adair;Adame;banhu;banjo;Banks;Banta;Barak;Caleb;Cales;Caley;calix;Calle;Calum;Calvo;deuce;Dever;devil;Devoe;Devon;Devos;dewar;eight;eject;eking;Elbie;elbow;elder;phobos;help;blend;bqux;com;mamba;KARLOS;DDoS;phoenix;PLUT;karma;bbc;CAPITAL;WALLET;
另一个列表包含此变种用于向受害者显示勒索信息的文件,以及一些Windows系统文件,如下所示(索引号为0x08):
- info.hta;info.txt;boot.ini;bootfont.bin;ntldr;ntdetect.com;io.sys;osen.txt
扫描线程在回调函数中使用这两个排除列表来过滤文件,以根据其规则进行加密。同时,Phobos还在每个扫描线程中创建了一个加密线程,用于对受害者的文件进行加密。那么,扫描线程和加密线程如何协同工作呢?扫描线程继续扫描文件,并将具有完整路径的文件名复制到公共缓冲区中,在选择一个文件后会设置一个事件。随后,加密线程就可以从公共缓冲区中获取文件名并进行加密。
5.3 加密算法和密钥的使用
Phobos使用AES算法的CBC模式作为其加密文件的加密算法。在我的分析中发现,Phobos的这一变种没有使用Windows提供的用于AES的内置Crypto API,而是自行实现了AES的功能。
我们知道,当人们在谈论AES CBC加密和解密时,通常会提到“IV”和“Key”。
对于其密钥长度,我们知道Phobos使用256位密钥(20H字节),这是最强的文件加密。此外,它使用非对称的公私钥密码系统来保护AES密钥。公钥包含在索引号为0x2的配置块中,在解密后使用。
AES密钥和已经加密的公钥:
AES密钥是使用10H字节的随机数据和10H字节的数据,由解密的公钥生成的。如下图所示,在内存窗口的最上方生成了AES密钥(20H字节),接下来是加密的AES密钥(80H字节)的相关数据,这部分数据是使用卷序列号“%systemdrive%”(例如受害者系统上的“C:\”)和公钥生成的,同时还包含函数Sub_401706中的一些解密后的常量值。在加密的AES密钥之后还有四个字节,其中包含上述两部分的CRC32哈希值。
一旦受害者提供了系统驱动器卷序列号(使用Phobos中的API GetVolumeInformationW())、加密的AES密钥以及其他常量值数据,攻击者就可以使用其持有的私钥来还原AES密钥。加密的AES密钥将被记录在加密的文件中,稍后我们将分析加密的文件结构。正因如此,在勒索提示信息中要求了受害者提供系统驱动器的卷序列号。
IV(初始向量)数据的长度为10H字节,通常是随机生成的。它也像加密的AES密钥一样,记录在加密的文件中。IV与AES密钥共同用于数据加密,就如同MD5算法中的盐一样。
在获得IV数据和AES密钥之后,就可以对加密的文件进行解密。
5.4 用于加密文件的线程
如上所述,加密线程是由扫描线程启动。在扫描线程选择文件后,就会将该文件的完整路径复制到加密线程的公用缓冲区,该缓冲区由扫描线程通知(设置事件对象)。
然后,它将配置块中的格式字符串(索引号0x04)解密为那些加密文件的新文件扩展名,如下所示,其中的“<
- .id[<>-2987].[wiruxa@airmail.cc].eking
具有新扩展名的加密文件:
这一过程只是使用新的扩展名,对加密文件进行重命名的操作。这一次,由扫描线程选择和过滤的文件是“\\?\E:\test_file.txt”,其加密的文件名是“\\?\E:\test_file.txt.id[[581F1093-2987].[wiruxa@airmail.cc].eking”。
然后,继续读取所选择文件的内容(例如“E:\test_file.txt”)。我们知道AES加密块的大小固定为10H字节。因此,如果要加密的数据大小没有与10H对齐,就需要使用填充数据来附加在原始数据的后面,以解决该问题。Phobos勒索软件使用的填充字符为“00”。
调用AES_CBC_Encrypt()函数来加密文件内容:
上图显示了Phobos调用AES_CBC_Encrypt()函数,其参数arg0是一个密钥对象(AES_CTX Struct),其中包含用于加密文件内容的IV和密钥(填充了三个“00”)。
加密后,Phobos通过调用API WriteFile()将密文保存到加密文件中(例如“E:\test_file.txt.id[[581F1093-2987].[wiruxa@airmail.cc].eking”),如下图所示。
将密文保存到加密文件中:
加密的文件内容由两部分组成,第一部分是原始文件内容的密文,第二部分是一组数据,我们称之为decryption_config_block,它用于解密第一部分。下图展示了加密文件内容的截图,我们主要分析一下decryption_config_block中包含的内容。
加密后的文件内容示例:
前10H字节(使用红色标记)是加密的原始文件内容。后面的40H字节(使用蓝色标记)是一个加密块,其中包含一些常量值以及原始文件名,这些文件使用相同的AES密钥和IV进行加密。随后的14H字节“00”可以视为是数据定界符。后面的10H字节(使用黑色标记)是这个文件的IV数据。接下来的Dword 0x03负责通知原始文件内容附加填充的大小。有80H数据块(使用绿色标记)是加密的AES密钥的相关数据,该数据在扫描线程中生成,并且对于不同的扫描线程来说是不同的。下面的Dword 0xF2是整个decryption_config_block的大小。最后的6个字节“4B E5 1F 84 A9 77”是从配置块中索引号为0x00的位置解密获得的。
之后,Phobos要做的最后一件事就是调用API DeleteFileW()来清除受害者系统中的原始文件。
5.5 扫描网络共享资源
该线程函数用于网络共享资源。Phobos使用参数dwScope的不同值来多次调用API WNetOpenEnum()。这些参数值分别是RESOURCE_CONNECTED、RESOURCE_RECENT、RESOURCE_CONTEXT、RESOURCE_REMEMBERED和RESOURCE_GLOBALNET。
RESOURCE_CONNECTED:列举所有当前连接的资源;
RESOURCE_RECENT:列举所有最近连接的资源;
RESOURCE_CONTEXT:仅列举调用方的网络上下文中的资源;
RESOURCE_REMEMBERED:列举所有记住的(持久)连接;
RESOURCE_GLOBALNET:列举网络上的所有资源。
在这里,使用到WNetOpenEnumW()和WNetEnumResourceW()这两个API来枚举网络共享资源。
在成功获取到其中的一种资源后,Phobos将使用上面的资源的完整地址(例如\\?\UNC\{resource name}\{folder name}),运行5.2中所描述的两个扫描进程,开始扫描并筛选其中的文件。随后,如5.4中所描述的,扫描线程启动加密线程,并对选择的文件进行加密。
针对其中一个共享资源,准备启动扫描线程:
上图展示了通过RESOURCE_CONNECTED获取的共享资源(“\\?\UNC\VBoxSvr\vbox_share_folder”),该资源调用Sub_405840函数,从而针对这个共享资源启动新的扫描线程。
5.6 用于监视和扫描新逻辑驱动器的线程
我们之前分析过,Phobos会扫描本地逻辑驱动器以及网络共享资源上的文件,这些都是受害者系统当前的所有资源。
然而,还有另外一个线程,其主要任务是监视新的逻辑驱动器。例如,受害者如果连接了U盘或手机,Windows系统会将其视为新的逻辑驱动器。这个过程会被这一线程捕获。该线程每秒运行一次检测,并对检测到的任何新逻辑驱动器启动两个新的扫描线程。下图展示了该线程功能的逻辑结构伪代码。
用于扫描新逻辑驱动器的伪代码:
0x06 向受害者显示勒索提示信息
Phobos的主线程会等待所有扫描线程和加密线程完成工作。然后,将info.hta(HTML版本勒索提示信息)和info.txt(TXT版本勒索提示信息)这两个文件拖放到桌面以及受害者系统上可用逻辑驱动器的根目录中。它还使用“open”命令调用API ShellExecuteExW(),以在受害者的屏幕上打开HTML版本的info.hta,如下图所示。
向受害者显示勒索提示信息:
0x07 总结
在这篇文章中,我对Phobos勒索软件的EKING变种进行了深入分析。我们介绍了如何从原始MS Word文档样本中下载Payload文件(cs5.exe),以及Phobos采取了哪些措施来使其在受害者的系统上持久存在。
我们深入分析了Phobos的核心任务——扫描并加密受害者系统上的文件。经过分析之后,我们现在知道,它不仅仅会扫描逻辑驱动器上的文件,还会扫描网络共享资源和新连接的逻辑驱动器。在最后,我们分析了Phobos的变种是如何使用多个线程来完成其工作的。
最后,我们解释了Phobos在完成加密后如何向受害者显示其勒索提示信息。
为了保护设备免受恶意软件的攻击,我们建议不要打开不受信任来源的电子邮件附件。
0x08 防护方案
使用Web过滤、反病毒和内容安全产品,可以防范Phobos变种的攻击,例如:
FortiGuard Web过滤服务将下载URL标记为“恶意网站”;
FortiGuard反病毒服务将Word文档和下载的Payload文件检测为“VBA/Agent.KBU!tr”和“W32/Phobos.HGAF!tr.ransom”并阻止;
FortiSandbox将Word文档检测为风险软件;
使用FortiMail的用户可以检测到原始Word文档,并通过CDR服务进一步加强保护,该服务可以用于消除Office文档中的宏威胁。
此外,为了防止设备遭受到恶意软件攻击,我们建议用户不要打开不受信任来源的电子邮件附件。我们强烈建议对所有最终用户进行关于如何甄别潜在恶意邮件的培训。
0x09 威胁指标
9.1 网址
hxxp://178[.]62[.]19[.]66/campo/v/v
9.2 样本SHA-256
Word文档:
667F88E8DCD4A15529ED02BB20DA6AE2E5B195717EB630B20B9732C8573C4E83
Phobos Payload:
6E9C9B72D1BDB993184C7AA05D961E706A57B3BECF151CA4F883A80A07FDD955
0x0A 参考
https://id-ransomware.blogspot.com/2017/10/phobos-ransomware.html
本文翻译自:https://www.fortinet.com/blog/threat-research/deep-analysis-the-eking-variant-of-phobos-ransomware如若转载,请注明原文地址。