更新2021-04-25

本文由Hasherezade和Jérôme Segura撰写

Emotet多年来一直是头号通缉犯。庞大的僵尸网络发送了数百万带有恶意附件的垃圾邮件。由于与勒索软件团伙的关系,一旦银行木马变成加载程序,就会造成代价高昂的妥协。

1月27日,欧罗利宣布一个全球性的行动,通过控制其基础设施并从内部摧毁其所谓的最危险的恶意软件背后的僵尸网络。

此后不久,Emotet控制器开始提供一种特殊的有效载荷,该载荷带有代码,可以从受感染的电脑中删除恶意软件。这一点还没有得到正式澄清,一些细节也不太清楚。在这个博客中,我们将回顾这个更新以及它是如何工作的。

发现

在Emotet被撤下后不久,一位研究员观察到的一个新的有效载荷推动到受感染的机器上,代码在特定日期删除恶意软件。

更新后的机器人包含一个清理程序,负责卸载Emotet2021年4月25日最后期限。原来的报告提到了3月25日,但由于从0开始计算,而不是从1开始计算,所以第三个月实际上是4月。

这个特别的更新后来在新闻稿由美国司法部在他们的宣誓书

在janury 26,2021中,利用他们访问Tier 2和Tier 3服务器的代理商,与FBI正在合作的可信外国执法合作伙伴的代理商,在其司法管辖区的服务器上取代了Modet Malware,与执法

BleepingComputer提到外国执法合作伙伴是德国的联邦刑事警察(Bundeskriminalamt或BKA)。

除了我们在下一节中描述的清理例程之外,这个“执法文件”还包含一个可选的执行路径,如果相同的示例在给定日期之前运行,就会遵循该路径。

卸载程序

有效载荷是32位DLL。它具有自我解释性的名称(ModeTloader.dll)和3个导出,所有这些都会导致相同的功能。

如果我们看一下这个导出的函数,我们可以看到3个子程序:

第一个是负责上述清理的。内部,我们可以找到日期检查:

如果截止日期已通过,请立即调用卸载例程。否则,线程将重复进行同一时间检查,并最终在日期传递时调用删除代码。

将当前时间与循环中的截止日期进行比较。只有在超过最后期限时,循环才会退出,然后继续执行卸载例程。

卸载程序本身非常简单。它删除与Emotet关联的服务,删除run键,尝试(但失败)将文件移动到%temp%,然后退出进程。

函数内部:" uninstall_emotet "

正如我们通过观察常规情绪所知道的,它以两种替代方式实现了坚持不懈。

运行的关键

微软\ CurrentVersion \运行

这种类型的安装不需要标高。在这种情况下,Emotet DLL被复制到%APPDATA%\[随机目录名]\[随机DLL名]。(随机延伸)

系统服务

HKLM \ System \服务CurrentControlSet \ \ < emotet随机名称>

如果使用管理员权限运行样本,它将其自身作为系统服务安装..原始DLL被复制到C:\Windows\SysWow64\[随机目录名]\[随机DLL名]。(随机延伸)

因此,清理功能必须考虑两个方案。

我们注意到开发人员在代码中犯了错误,该代码应该将执法文件移动到%TEMP%目录:

GetTempFileNameW(缓冲区,L"UPD", 0, TempFileName)

" 0 "应该是" 1 "因为根据文档如果Uunique不是零,则必须自己创建文件。只创建一个文件名,因为gettempfilename无法保证文件名是唯一的

其目的是生成一个临时路径,但由于在参数uUnique中使用了错误的值,不仅生成了路径,还创建了文件。这将导致进一步的名称冲突,因此,文件没有被移动。

然而,这并不能改变恶意软件已经被阉割的事实,它是无害的,因为它不会运行,因为它的持久性机制已经被移除。

如果立即调用上述删除例程,则初始导出中的其他两个函数不会运行(该过程终止在日常生活结束时,调用ExitProcess)。但是,只有在4月25日之后运行时,才会发生这种情况。

可选的执行路径

现在,让我们看看在不立即调用卸载例程的替代场景中会发生什么。

在等待线程运行之后,执行将到达另外两个函数。第一个枚举正在运行的进程,并搜索当前进程的父进程。

然后它检查进程名是否为“explorer.exe”或“services.exe”,然后读取给父进程的参数。

运行下一阶段

下一个例程从硬编码缓冲区解密并加载第二阶段有效负载。

用上面的循环对硬编码的缓冲区进行解密,然后执行

将流重定向到解密缓冲区(通过“致电edi.”):

下一个PE被揭示:X.dll

在解密有效载荷后,执行将被重定向到以跳转开始的显示缓冲区的开头:

此跳转导致反射装载机程序。在将DLL映射到虚拟格式之后,在内存中的新分配区域中,加载程序将执行重定向。

首先,DLLMain.dll的调用(仅用于初始化)。然后,执行被重定向到一个导出的函数—在当前分析的情况下是这样的Control_RunDll

执行由第二个dll (X.dll)继续。这个模块中的函数是模糊的。

现在所调用的有效载荷看起来与常规的Emotet有效载荷非常相似。类似于DLL,也被命名为X.dll,如:this一个可以在早期的Emotet样本中找到(没有清除例程),例如在这个样本

第二阶段的有效载荷:X.dll

第二阶段有效载荷X.dll是一个典型的Emotet DLL,在硬编码的截止日期未过的情况下加载。

此DLL严重混淆,所有使用的API都是动态加载的。此外,它们的参数不可读取 - 它们是在使用前动态计算的,有时在涉及许多变量的长链操作的帮助下:

这种类型的混淆是Emotet有效载荷的典型特征,它的设计目的是迷惑研究人员。然而,由于跟踪我们能够重建在什么偏移量上调用什么api。

有效载荷有两个替代的执行路径。首先,它检查它是否已安装。如果没有,它遵循第一个执行路径,然后继续安装自己。它生成一个随机的安装名称,并将自己移到这个名称下的特定目录中,同时添加持久性。然后它从新的位置重新运行自己。

如果有效负载检测到它是从目标路径运行的,它将取替代执行路径代替。它连接到C2并与之沟通。

当前示例向一个被破坏的服务器发送请求。内容:

L"DNT: 0\r\nReferer: 80.158.3.161/i8funy5rv04bwu1a/\r\nContent-Type: multipart/form-data;边界 =-------------------- GgmgQLhRJIOZRUuEhSKo \ r \ n”

下图显示了一个受感染的系统通过下载特殊更新文件并返回执法部门拥有的命令和控制服务器的恶意文件进行的网络流量:

卸载背后的动机

带有卸载程序的版本现在通过渠道推送,该渠道旨在分发原始的Emotet。虽然目前删除程序还没有被调用,但Emotet背后的基础设施已经由执法部门控制,因此机器人无法执行恶意操作。

对于具有现有的肌动态感染的受害者,新版本将作为更新,取代前一个。这就是它如何了解其安装路径,并且一旦截止日期过去,就能清除自己。

通过僵尸网络推动代码,即使有良好的意图,始终是棘手的主题,主要是因为法律后果暗示了。Doj Adidivavit介绍了“外国执法代理,而不是联邦调查局代理商更换了存储在海外的服务器上的Model恶意软件,其中由执法部门创建的文件”。

清除程序启动的长时间延迟可能是因为需要给系统管理员时间进行取证分析和检查其他感染。