Change 嘶吼专业版

风云再起,APT28或将搅局乌克兰大选_Python

风云再起,APT28或将搅局乌克兰大选_Python_02简述

3月中旬,一份有关乌克兰总统大选的可疑Office文件在野外出现。这份文件讲述了乌克兰大选民调的情况,以及对领跑候选人Volodymyr Zelenskiy的人生经历做了介绍,此外,该文件还用到了一个引人注目的标题,指出了乌克兰和俄罗斯之间的冲突问题。调查后发现,这篇文章实际上是直接复制了Daily Express于今年2月份发表的一篇文章。

风云再起,APT28或将搅局乌克兰大选_Python_03

图1.恶意文档示意

文档的主题以及检测到的时间点都引起了我们的注意,因此我们决定进一步挖掘,以评估这个恶意文档的性质。

风云再起,APT28或将搅局乌克兰大选_Python_02技术分析

风云再起,APT28或将搅局乌克兰大选_Python_05

风云再起,APT28或将搅局乌克兰大选_Python_06

图2:查看和修改文档上的宏所需的密码

恶意文档的第一个特性是受保护的宏,当用户试图读取它时,会立即显示一个要求输入密码的消息框。使用传统的恶意软件分析工具可以轻松绕过此Office密码保护机制,在提取代码之后,可以按如下方式分析纯文本代码。

风云再起,APT28或将搅局乌克兰大选_Python_07

图3:文档宏的源代码

乍一看,代码没有被混淆的痕迹,但是可以在宏中发现异常的函数调用:ActiveDocument.BuiltInDocumentProperties.Item(“Company”)。此方法能恢复属于文档元数据的属性。在特定情况下,代码会试图读取“Company”属性中包含的值,一个base64编码的字符串。

风云再起,APT28或将搅局乌克兰大选_Python_08

图4:存储在文档元数据的“Company”标签中的payload

这种通过在文档属性部分中隐藏恶意payload的做法是Emotet银行恶意软件的惯用手段,Emotet是对全世界组织机构最具侵略性的恶意软件威胁之一。与初始代码不同,解码后的payload是高度混淆的Powershell命令。

风云再起,APT28或将搅局乌克兰大选_Python_09

图5:从base64到ascii转换后的powershell代码

经过几个去混淆阶段后的代码如下:

风云再起,APT28或将搅局乌克兰大选_Python_10

图6:去混淆后的powershell代码

这个脚本非常有趣,因为它的第一个动作就是减少自身存在痕迹,此步动作是通过禁用Powershell脚本块日志记录和反软件扫描接口(anti - alware Scan Interface, AMSI)来实现的。

ScriptBlock的日志记录功能是在Powershell v5中引入的,它能够在Powershell引擎执行代码块时对代码块进行日志记录,包括混淆的代码段和相应的去混淆代码段。而AMSI是一种通用的接口标准,它允许应用程序和服务与安装在机器上的任何反恶意软件产品集成,并在代码执行之前评估代码。关于AMSI的更多细节已经在以前的分析报告中描述过。

因此,此恶意软件会检查当前的Powershell版本,如果版本是3或在3之上,则会禁用上述安全功能。对上述两项功能的绕过是使用几行代码实现的,比如可以通过以下指令禁用ScriptBlock日志记录:



1. $settings = [Ref].Assembly.GetType(“System.Management.Automation.Utils”).GetField(“cachedGroupPolicySettings”,”NonPublic,Static”).GetValue($null);

2. $settings[“HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging”] = @{}

3. $settings[“HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging”].Add(“EnableScriptBlockLogging”, “0”)

而绕过AMSI的代码则更简单:

1. [Ref].Assembly.GetType(‘System.Management.Automation.AmsiUtils’).GetField(‘amsiInitFailed’,’NonPublic,Static’).SetValue($null,$true)<br>

该指令能够修改“amsiInitFailed”变量的值,将其设置为“true”。这样,当“ScanContent”方法使用此变量来确定AMSI是否应该扫描要执行的命令时,它会返回值amsi_result_not_detection,并让payload运行。从手法上看,恶意软件背后的创作者似乎参考了这篇文章(https://www.mdsec.co.uk/2018/06/exploring-powershell-amsi-and-logging-evasion/)中对AMSI和BlockLogging禁用技术的研究。

在偷偷设置好InternetExplorer 11 的用户代理之后,payload会尝试从“hxxps://functiondiscovery[.]net:8443/admin/get”处下载下一个感染阶段所需文件。此代码还包含了Powershell Empire特征指示器:cookie“session = J + kcj5bWE11g4zBLrjvZjNO296I =”。

风云再起,APT28或将搅局乌克兰大选_Python_11

图7:恶意软件设置的用户代理

C2最后定位为捷克共和国。该IP在2018年10月首次出现,并一直活跃到2019年4月。


图8:关于DropURL/C2的信息

风云再起,APT28或将搅局乌克兰大选_Python_12归因

与C2服务器连接的脚本部分是使用当前流行的后开发工具Empire创建的,还有一些使用Empire生成的脚本作为后期开发模块的Sofacy样本已有许多安全组织机构对其做过分析。

2018年9月至12月,APT28(又名Fancy Bear、Pawn Storm、SofacyGroup、Sednit和STRONTIUM)对欧洲的民主机构发动了数次***。

APT28小组至少自2007年以来一直活跃,目标是世界各地的政府、军队和安全组织。该组织还参与了2016年总统大选的一系列袭击行动。

据Symantec去年10月发布的一份报告显示,该组织正在欧洲和南美积极开展针对政府和军事组织的网络间谍活动。

此外,根据FireEye对对俄罗斯相关的APT组织的分析,APT28正越来越依赖于公共代码库,如Carberp、PowerShell Empire、P.A.S. webshell、Metasploit模块等,不光会加快他们的开发周期,而且能方便他们推脱责任。此外,恶意文件的内容和发现的时间点都可能表明,此次行动背后或许有政府支持。风云再起,APT28或将搅局乌克兰大选_Python_13


不过,我们在对此样本的功能做归因分析时也产生了一些疑惑。如前所述,用户可以很直观地看到文档的内容,那么为什么要启用宏呢?此外,宏代码是完全可读的,没有使用加密或混淆来逃避检测。唯一的宏保护机制是锁定dev项目,但是使用常见的恶意软件分析工具就能轻易地绕过它。所有这些,都不是典型的APT28 dropper的特征,照理说应该是经过重重混淆才对。SecurityArtWork团队认为该样本是属于Sofacy组的,因为它与Vitali Kremez之前研究过的较早的样本(8cccdce85beca7b7dc805a7f048fcd1bc8f7614dd7e13c2986a9fa5dfbbdf9)之间存在相似性——宏代码中使用的函数名,以及使用WMI连接器启动新的恶意进程之间的相似性。

然而,分析这两个文档时,即使某些函数的名称相等,宏也不会显示相同的结构。在下列右图中对应的是Vitali Kremez分析的样本,代码经过重度混淆:它包含了“$”字符,用来逃避AV检测,以及一个用于执行解码的自定义base64例程。风云再起,APT28或将搅局乌克兰大选_Python_14

图9:宏比较:新样本(左)与旧样本(右)

调用WMI的宏部分有一个技巧,用于绕过Microsoft ASR,并能从Office应用程序启动一个新进程。由于类似的代码片段在Github上是公开的,所以这个技巧和使用的代码与俄罗斯组织没有直接关系。因此,文档之间宏代码的相似性很大程度上取决于对开源代码重复使用。

风云再起,APT28或将搅局乌克兰大选_Python_15结论

我们并不能完全确定此项行动与APT28有关,不过我们正在调查与Sofacy小组有关的近期其他样本,以便更好的探索他们对政治选举可能带来的影响。

风云再起,APT28或将搅局乌克兰大选_Python_16