引言
我们最近发现一项我们称之为「龙棋操作」(Operation Dragon Castling
)的 APT
行动。该行动针对的似乎是位于东南亚,特别是台湾、菲律宾和香港的博彩公司。我们可以中等程度的信心将此活动归因于一个讲中文的APT组织,但很遗憾的是无法将攻击归因于特定的团体,也不确定攻击者的目的。
我们发现该APT组织使用的模块之一(MulCom backdoor
)与 BlackBerry Cylance Threat ResearchTeam
在其 2017 年的报告中描述的 FFRat
样本以及 Palo Alto Networks
在其 2015年报告中的样本有显著的代码相似性。基于此,我们怀疑FFRat的代码库正在几个中国对手团体之间共享。不幸的是,这不足以作为可信的归因,因为FFRat本身从未被可靠地归因。
在这篇博文中,我们将描述这些攻击中使用的恶意程式和APT组织植入的后门,以及其他用以获得持久性和访问受感染机器的恶意档案。我们还将讨论我们看到的两种传播途径:一个是感染的安装程序,另一个是利用一个合法的易受攻击的应用程序
WPS Office
。
我们识别出随著 WPS Office
更新的 wpsupdate.exe出现的一个新漏洞(),我们怀疑攻击者利用了这个漏洞。
我们要感谢台湾的 “ 为我们提供了与这一感染途径相关的 IoCs。
基础设施和工具集
在上图中,我们描述了恶意档案之间的关系。其中一些关系可能不太准确,例如,我们不完全确定 MulCom backdoor
是否是由
CorePlugin
加载的。然而,我们坚信它是该行动中使用的恶意档案之一。
感染途径
在这一行动中,我们看到多种感染途径。其中之一,攻击者向其中一个目标公司的支持团队发送了一封包含感染安装程序的电子邮件,要求检查其软件中的错误。在此文中,我们将描述我们看到的另一个途径:一个假冒的
WPS Office
更新包。我们怀疑攻击者利用了 WPS updater
wpsupdate.exe 中的一个漏洞,这是 WPS Office安装包的一部分。我们已联系 WPS Office团队处理我们发现的漏洞(“),该漏洞已经修复。
在我们的调查中,我们注意到 WPS更新程序过程中出现可疑行为。当分析该二进位档时,我们发现了一个潜在的安全问题,让攻击者能够利用该更新程序与攻击者控制的服务器进行通信,执行包括下载和运行任意可执行档案在内的操作。要利用该漏洞,需要修改
HKEY_CURRENT_USER
下的一个注册表键,这样做将使攻击者在系统上获得持久性并控制更新过程。在我们分析的案例中,恶意二进位档是从
update.wps[.]cn
网域下载的,这是属于 Kingsoft
的一个域名,但该伺服器的 IP地址(103.140.187.16
)与该公司无关,所以我们猜测这是一个攻击者用来提供假更新的伺服器。
下载的二进位档(setup_CN_2052_11.1.0.8830_PersonalDownload_Triale.exe -
)会投放两个档案以进行侧载:一个签名过的
B9BEA7D1822D9996E0F04CB5BF5103C48828C5121B82E3EB9860E7C4577E2954
QMSpeedupRocketTrayInjectHelper64.exe - Tencent Technology
和一个恶意 DLL
(a3f3bc958107258b3aa6e9e959377dfa607534cc6a426ee8ae193b463483c341)
QMSpeedupRocketTrayStub64.dll
。
投放器 1 (QMSpeedupRocketTrayStub64.dll)
76adf4fd93b70c4dece4b536b4fae76793d9aa7d8d6ee1750c1ad1f0ffa75491
第一阶段是一个与 C&C (控制和命令伺服器) 通信的后门(mirrors.centos.8788912[.]com
)。在联系 C&C伺服器之前,后门会执行几个准备操作。它钩住了三个函数: GetProcAddress
、FreeLibrary
和
LdrUnloadDll
。为了获得 C&C 网域,它将自身映射到内存中,并从结尾的偏移量 1064
开始读取数据。该网域名以明文形式存储,并以宽字元串的形式存在于二进位档中。
然后,它初始化一个带有名为 ScriptHelper
的 JScript
类的对象。该投放器利用 ImpersonateLoggedOnUser
API 调用重用来自 explorer.exe
的 Token,因此它实际上在同一用户下运行。此外,它还利用
RegOverridePredefKey
将当前的 HKEY_CURRENT_USER
重定向到 impersonated user 的
HKEY_CURRENT_USER
。为了与 C&C 通信,它构造了一个包含系统信息的 UserAgent 字符串,例如:Mozilla/4.0
。外泄的信息包括:Internet Explorer版本、Windows 版本、
(compatible; MSIE 9.0; Windows NT 6.1;.NET CLR 2.0)_User Agent\Post Platform_
注册值的值。
之后,该样本构造 JScript
代码进行执行。代码的标头包含两个变数的定义:代表 C&C 网域名的 server
和一个硬编码的
key
。然后它向 /api/connect
发送 HTTP GET
请求,响应应为加密的 JScript
代码,并被解密、附加到所构造的标头并使用之前创建的 JScript
类执行。
在分析时,C&C 当时没有响应,但根据遥测数据,我们可以得出结论,正在从
hxxp://mirrors.centos.8788912.com/upload/ea76ad28a3916f52a748a4f475700987.exe
下载下一阶段到 %ProgramData%\icbc_logtmp.exe
并执行它。
投放器 2 (IcbcLog)
a428351dcb235b16dc5190c108e6734b09c3b7be93c0ef3d838cf91641b328b3
第二个投放器是执行器,当执行时,会尝试通过 COM Session Moniker Privilege Escalation
提升权限,然后投放几个以以下资源 ID 存储的二进位档:
()
资源 ID | 档案名 | 描述
—|—|—
1825| smcache.dat| C&C 域名列表
1832| log.dll| Loader (CoreX) 64位
1840| bdservicehost.exe| 为 sideloading 的签名 PE 64位
1841| N/A| 用于 sideloading 的档名
1817| inst.dat| 工作路径
1816| hostcfg.dat| 用于 Host 标头,在 C&C 通信中使用
1833| bdservicehost.exe| 为 sideloading 的签名 PE 32位 – N/A
1831| log.dll| Loader (32位) – N/A
加密的有效载荷具有以下结构:
加密金钥是从偏移量 0x8
开始的宽字元串。加密数据从偏移量 0x528
开始。要解密数据,使用 CryptHashData
API 创建密钥的
SHA256 哈希,然后使用硬编码的 IV 0123456789abcde
通过 CryptDecrypt
API 使用 AES256
算法解密数据。然后,解密数据使用 RtlDecompressBuffer
解压缩。为了检查解密是否成功,将对数据的 CRC32
计算并与原始资源数据中偏移量 0x4
的值进行比较。当所有有效载荷被写入磁碟后,执行 bdservicehost.exe
以运行下一阶段。
Loader (CoreX)
97c392ca71d11de76b69d8bf6caf06fa3802d0157257764a0e3d6f0159436c42
Loader (CoreX)
DLL 在前一阶段(Dropper 2
)中被侧载,并作为一个投放器。与 Dropper 1
类似,它也钩住了
GetProcAddress
和 FreeLibrary
API 函数。这些钩子执行该库的主代码。主代码首先检查它是否由
regsvr32.exe
加载,然后检索其资源中的加密数据。这些数据被写入与 syscfg.dat
相同的资料夹中。然后将该档案加载并使用
AES-256 解密,设置选项如下:
- 金钥为计算机名称,IV 为
qwertyui12345678
- AES-256 设置参数以
<key>#<IV>
格式嵌入资源中。因此,您可能会看到cbfc2vyuzckloknf#8o3yfn0uee429m8d
AES-256 设置参数
主要代码持续检查是否有 ekrn.exe
的进程在运行。ekrn.exe
是 ESET 的核心服务。如果 ESET核心服务正在运行,它将试图重新映射 ntdll.dll
。我们推测这用于避开 ntdll.dll
的钩子。
服务检查之后,它将解压并执行 Shellcode,这又加载下一阶段的 DLL。该 DLL 作为 Shellcode 的一部分未加密地储存。该
Shellcode 列举 ntdll.dll
的导出,并构建一个哈希数组以按名称排序所有 Zw*
函数(Windows 原生 API系统调用)的哈希,然后依据它们的 RVA 排序。通过这样做,Shellcode 利用 Zw*
函数的 RVA的顺序等于相应的系统调用的顺序,因此在该数组中 Zw*
函数的索引是一个系统调用号,可以通过系统调用指令调用。因此,安全解决方案可以基于用户空间 API的钩子进行躲避。最后,载入嵌入的核心模块 DLL 并执行。
Proto8 (核心模块)
f3ed09ee3fe869e76f34eee1ef974d1b24297a13a58ebff20ea4541b9a2d86c7
核心模块是一个单一的 DLL,负责设置恶意程式的工作目录、加载配置档、更新其代码、加载插件、向 C&C 伺服器报警并等待指令。
它具有四个主要步骤的级联结构:
第一步
第一部分主要致力于初步检查和一些逃避技术。首先,核心模块验证 DLL 是由
spdlogd.exe
(一个用于持久性使用的可执行档,见下文)运行,或者它不是由 rundll32.exe
运行。如果这个检查失败,执行就会终止。该
DLL 通过钩住 GetProcAddress
和 FreeLibrary
函数来执行主函数,与前面的感染阶段类似。
GetProcAddress 钩中包含有趣的调试输出「in googo」。
然后,恶意程式创建一个名为 Sample
的新窗口,并附加一个自定义回调函数。通过 SendMessageW
向该窗口发送 ID 为 0x411
的消息,这将导致上述回调执行主函数。该回调函数还可以处理 0x412
的消息 ID,尽管没有特定的功能与之关联。
导出函数 Core2 发送消息 0x411
导出函数 Ldr2 发送消息 0x412
窗口回调仅包含对消息 0x411 的实现,但也检查 0x412
第二步
在第二步中,该模组尝试自我更新、加载配置文件并设置工作目录(WD)。
自我更新
该恶意程式首先会查找名为 new_version.dat
的档案 – 如果存在,它的内容会被读入内存,在新线程中执行,并打印出调试字串 “runcode ok”
。我们未能发现该档案,但根据名称和上下文,这很可能是一种自我更新功能。
加载配置档 inst.dat
并设置工作目录。首先,核心模块配置文件 inst.dat
在以下三个位置寻找:
- 核心模块 DLL 所在的目录
- 加载核心模块 DLL 的可执行文件所处的目录
C:\ProgramData\
它以明文形式包含恶意程式的工作目录的路径。如果找不到,则使用硬编码的目录名称并创建该目录。工作目录是恶意程式用于在随后的执行阶段中放置或读取其所使用的任何文件的位置。
加载配置文件 smcache.dat
。
设置工作目录后,样本将从中加载配置文件 smcache.dat
。该文件包含用于与 C&C 伺服器通信的域名、协议和端口号(详见第4步)以及一个
“comment”
字符串。这个字符串可能用于识别行动或个别受害者。它用于在受害者的计算机上创建一个空文件(见下文),并且在与 C&C伺服器通信的初始报警中发送。 我们将其称为 “comment string”
,因为我们看到几个版本的 smcache.dat
,其中字符串的内容为
“the comment string here”
,在另一个名为 comment.dat
的配置文件中也出现,该文件具有 INI 文件格式,并在键
COMMENT 下包含该字符串。
创建 log
文件
在样本找到并读取 smcache.dat 后,即基于受害者的用户名及 smcache.dat中的注释字符串创建一个文件。如果不在字符串中,它将使用一个默认的硬编码值(例如
M86_99.lck
)。根据扩展名,它可能是某种日志,但我们尚未见到任何恶意程式写入它的部分,因此它可能只是作为锁文件使用。在文件成功创建后,恶意程式创建一个互斥体并进入下一步。
第三步
接下来,恶意程式收集受感染环境的资讯(如用户名、DNS 和 NetBios 计算机名称以及操作系统版本和架构)并设置其内部结构,最显著的是一个 “callobjects”
列表。call objects
是与特定功能相关联的结构,并保存在一个带有硬编码 4字节键的 “dispatcher”
结构中的映射中。这些键值(ID)稍后用于根据来自 C&C 伺服器的命令调用这些函数。
键值的结构,前三个字节在给定样本中始终相同,而最后一字节在所有我们见到的核心模块样本中始终相同。例如,调用 RevertToSelf
函数的函数在某些版本的核心模组中被标识为 0x20210326
,在其他版本中为 _0x19181726_
。这表明 ID数字的前三个字节与核心模组版本有关,或者更可能与基础结构版本有关,而最后一字节则是函数的实际 ID。
ID(最后字节) | 函数描述
—|—
0x02| 未实现的函数
0x19| 检索 smcache.dat
的内容并将其发送到 C&C 伺服器
0x1A| 写入数据到 smcache.dat
0x25| 冒充登录用户或 explorer.exe
过程
0x26| 调用 RevertToSelf
的函数
0x31| 接收数据并将其复制到新分配的可执行缓冲区中
0x33| 接收核心插件代码,将其写入磁碟并然后加载和调用
0x56| 将值写入 comment.dat
Webdav
在初始化呼叫对象时,核心模块还尝试通过调用 WNetAddConnection3W
连接到 URL
hxxps://dav.jianguoyun.com/dav/
,使用用户名 12121jhksdf
和密码
121121212
。在分析时,该地址没有响应,但 jianguoyun[.]com
是一家中国文件共享服务。我们的假设是这可能是一种获取插件代码或核心模组自身的更新版本的方式。
插件
核心模组包含一个函数,它接收一个包含插件 DLL 数据的缓冲区,将其保存为工作目录中的名称为 kbg<tick_count>.dat
的档案,将其载入到内存中,然后调用其导出的函数 InitCorePlug
。磁碟上的插件文件设置为在重新启动时删除,通过调用带参数
MOVEFILE_DELAY_UNTIL_REBOOT
的 MoveFileExW
实现。关于插件的详细信息,请参见专门的插件部分。
第四步
在最终步骤中,恶意程式将遍历 smcache.dat
配置文件中包含的 C&C 伺服器,并尝试访问每一个。smcache.dat
配置文件的结构如下:
smcache.dat
配置文件的结构
协议字符串可以有九个可能的值之一:
TCP
HTTPS
UDP
DNS
ICMP
HTTPSIPV6
WEB
SSH
HTTP
根据与特定 C&C 域名相关的协议,恶意程式会设置连接,发送报警到 C&C 并等待命令。
在这篇博文中,我们将主要集中在 HTTP 协议选项上,因为我们看到这是攻击者使用的。
使用 HTTP 协议时,核心模块首先打开两个持久请求句柄 – 一个用于 POST
,一个用于 GET
请求,两者均指向
/connect
。这些句柄通过在 POST
请求中发送空缓冲区并检查 GET
请求的 HTTP 状态码进行测试。随后,恶意程式通过调用
InternetWriteFile
API 使用先前打开的 POST
请求句柄发送初步报警到 C&C 伺服器,并通过调用
InternetReadFile
从 GET
请求句柄读取数据。
HTTP 数据包顺序
HTTP POST 报警
核心模块使用以下(主要是硬编码的)HTTP 头部:
Accept: */*
x-cid: {_<uuid>_}
– 为每对GET/POST
请求生成新的 uuidPragma: no-cache
Cache-control: no-transform
User-Agent: <user_agent>
– 从注册表生成或使用硬编码字符串(见下文)Host: <host_value>
– C&C 伺服器域名或来自 hostcfg.dat 的值(见下文)Connection: Keep-Alive
Content-Length: 4294967295
(最大 uint,仅在 POST 请求中)
User-Agent 标头
User-Agent 字符串与 Dropper 1
模块中的相同方法从注册表生成(包括登录用户的模拟访问注册表)或如果访问注册表失败则使用硬编码字符串:“Mozilla/4.0 (compatible;
。
MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NETCLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)”
Host 标头
设置该标头时,恶意程式会查找 ID 为 1816
的资源或当资源未找到时查找名为 hostcfg.dat
的档案。如果找到资源或档案,内容将被用作所有 C&C 通信的 Host
HTTP 标头的值,而不是 smcache.dat
中发现的 C&C域名。这不会改变请求实际所发送的 C&C 域名 – 这暗示了 C&C 伺服器可能位于反向代理之后。
初步报警
恶意程式发送的第一个数据包包含一个经过 base64 编码的 LZNT1 压缩缓冲区,包括新生成的 uuid(不同于用于 x-cid 标头的
uuid)、受害者的用户名、操作系统版本和架构、计算机 DNS 和 BIOS 名称,以及在 smcache.dat
或 comment.dat
找到的注释字符串。如果该文件存在,则来自 comment.dat
的值优先。
在我们分析的核心模块样本中,实际上在从 comment.dat
读取值的函数中出现了一个错字 – 它寻找的是键 “COMMNET”
而不是
“COMMENT”
。
随后,恶意程式进入一个循环,等待来自 C&C 伺服器的命令,以一个呼叫对象的 ID 值的形式传送。
每条发送到 C&C 伺服器的消息中都包含一个硬编码的四字节数字值,其结构与用作呼叫对象映射中键的值相同。 我们看到的与 C&C 伺服器传送的消息相关的 ID数字包括:
ID(最后字节) | 用途
—|—
0x1B| 发送给 C&C 的消息,其中包含 smcache.dat
的内容
0x24| 发送给 C&C 的消息,其中包含调试字符串
0x2F| 发送给 C&C 的一般消息
0x30| 发送给 C&C 的消息,特定目的未知
0x32| 与插件相关的消息发送至 C&C
0x80| 初步报警发送至 C&C 伺服器
除了 HTTP 协议外,其他几种协议的有趣观察:
- HTTPS 不使用持久请求句柄
- HTTPS 使用 HTTP
GET
请求,数据以 Base64 编码在 cookie 标头中发送初步报警 - HTTPS、TCP 和 UDP 使用自定义「魔法」标头:
Magic-Code: hhjjdfgh
核心模块的一般观察
我们观察到的核心样本经常通过 OutputDebugStringA
和 OutputDebugStringW
或通过将其发送到 C&C伺服器输出调试字符串。核心模块使用的一些调试字符串示例包括:在执行开头的文件路径、在自我更新后的 “run code ok”
、“In googo”
在 GetProcAddress
的钩子中,“recv bomb”
和 “sent bomb”
在主要 C&C 通信函数中等等。
字符串混淆
我们遇到了只有明文字符串的核心模块样本,但也有一些样本中某些字符串被 XOR 混淆,使用唯一(每个样本)硬编码的密钥。
即使在包含混淆字符串的样本中,许多明文字符串仍然存在,且似乎在决定哪些字符串将被混淆而不会被混淆方面没有逻辑。例如,大多数格式字符串都是混淆的,但重要的
IoCs,如凭证或档名则不是。
以此为例:在函数检索 comment.dat
中的值时,大多数字符串都是混淆的,而调用 GetPrivateProfileStringW
是通过
GetProcAddress
API 动态解析的,但写入该配置文件的同一函数中的所有字符串均为明文,并且直接调用
WritePrivateProfileStringW
。
总的来看,核心模块代码相当健壮,并包含许多保护措施和不同场景的选项(例如,用于 C&C通信的可能协议数量),但我们可能只看到了仍在积极开发中的这种恶意程式的样本,因为我们见到的许多功能尚未实现,仅作为占位符。
插件
在下面的部分中,我们将描述 Core Module (Proto8)
使用的插件功能,以扩展其功能。
我们将描述三个插件,具有各种功能,例如:
- 获得持久性
- 绕过 UAC
- 注册 RPC 接口
- 创建新账户
- 后门功能
核心插件
0985D65FA981ABD57A4929D8ECD866FC72CE8C286BA9EB252CA180E280BD8755
这个插件是一个 DLL 二进位档,由上述无文件核心模块 (Proto8
) 加载。它透过添加方法来管理额外插件来扩展恶意程式的功能。这些额外插件导出函数
“GetPlugin”
,核心插件则执行该函数。
这部分使用与核心模组相同的命令 ID 基于调用约定(见上文),另外添加了三种新方法:
ID(最后字节) | 函数描述
—|—
0x2B| 将有关插件位置的信息发送到 C&C 伺服器
0x2C| 移除一个插件
0x2A| 加载一个插件
所有核心模组使用的插件二进位档都存储在工作目录中,文件名为 kbg<tick_count>.dat
。一旦 Core Plugin
被加载,它会首先从工作目录中移除所有插件 – 详情请参见下面的图片。
Zload(Atomx.dll,xps1.dll)
2ABC43865E49F8835844D30372697FDA55992E5A6A13808CFEED1C37BA8F7876
我们称之为 Zload
的 DLL 是由 Core Plugin
加载的一个插件示例。它导出四个函数:“GetPlugin”
、“Install”
、“core_zload”
和
”zload”
。此插件的主要功能是设置持久性、创建后门用户账户,以及在受感染系统上隐藏自己。我们将重点介绍导出的函数
zload
、core_zload
和预设的 DllMain
函数,因为它们包含最有趣的功能。
Zload(进程启动器)
该函数相当简单,它的主要目的是执行另一个二进位档。它首先检索 Zload
插件二进位档所在的目录的路径
(<root_folder>)
,并在其中创建一个名为 mec
的新子文件夹。然后将三个文件重命名并移动到该目录中:
- 将
Zload
插件二进位档本身重命名为<root_folder>\mec\logexts.dll
, - 将
<root_folder>\spdlogd.exe
重命名为<root_folder>\mec\spdagent.exe
,以及 - 将
<root_folder>\kb.ini
重命名为<root_folder>\mec\kb.ini
。
在文件重命名和移动后,它通过执行二进位档 <root_folder>\mec\spdagent.exe
(原先是
<root_folder>\spdlogd.exe
)创建一个新进程。
core_zload(持久性设置)
此函数负责通过注册自己到安全支持供应商 (SSPs) 列表中来获得持久性。Windows SSP DLL 在系统启动时加载到 Local SecurityAuthority (LSA)
程序中。此函数的代码显著类似于在 GitHub 上找到的
mimikat_ssp/AddSecurityPackage_RawRPC
。
DllMain(侧载、设置)
预设 DllMain 函数利用几种持久性和逃避技术。它还允许攻击者在受感染系统上创建一个后门账户,并降低整体系统安全性。
持久性
该插件首先检查自己的 DLL 是否由 “lsass.exe”
或 “spdagent.exe”
加载。如果 DLL 是由
“spdagent.exe”
加载的,则它将调整当前进程的令牌权限。
如果它是由 “lsass.exe”
加载的,则会从配置文件 “kb.ini”
检索路径 “kb<num>.dll”
,并写入注册表键
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WinSock2\\Parameters
下的 AutodialDLL
。这确保了持久性,因为它使 DLL “kb<num>.dll”
每当调用 Winsock 2 函数库
(ws2_32.dll
) 时都会被加载。
避免监控
为了避免检测,插件首先检查正在运行的进程列表中是否存在 “avp.exe”
(Kaspersky Antivirus)或
“NortonSecurity.exe”
,如果找到其中之一则退出。如果系统中未找到这些进程,它将继续隐藏自己,通过将自己的进程名称改为
“explorer.exe”
。
该插件还能绕过 UAC 机制,通过 CMSTP COM
接口提升其进程权限,例如 CMSTPLUA
。
{3E5FC7F9-9A51-4367-9063-A120244FBEC7}
后门用户账户创建
接下来,插件执行注册表操作(详细信息见附录),降低系统保护:
- 允许本地账户在通过网络登录时获得完全管理员权限
- 启用无用户密码的远程桌面连接
- 禁用管理员账户的管理批准,这意味著所有应用程序都以完全管理员权限运行
- 允许匿名SID成为Windows的每个组的一部分
- 允许「Null Session」用户列出域中的用户和组
- 允许「Null Session」用户访问共享资料夹
- 设置可以被「Null Session」用户访问的管道名称
在这步骤中,插件将 WebClient
服务的启动类型更改为 “Automatic”
。它创建一个用户名为
“DefaultAccount”
,密码为 “Admin@1999!”
的新账户,然后将该账户添加到 “Administrator”
和
“Remote Desktop Users”
组中。它还隐藏了登录屏幕上的新账户。
最后,该插件检查运行中的进程列表中是否存在名称为 “360tray.exe”
和 “360sd.exe”
的进程,并如果都未找到,则执行档案
"spdlogd.exe"
。
MecGame(kb%num%.dll)
4C73A62A9F19EEBB4FEFF4FDB88E4682EF852E37FFF957C9E1CFF27C5E5D47AD
MecGame
是可以由 Core Plugin
加载的另一个插件示例。它的主要目的是类似于先前描述的 Zload
插件 – 它通过注册一个具有
UUID {1052E375-2CE2-458E-AA80-F3B7D6EA23AF}
的 RPC 接口来执行二进位档 “spdlogd.exe”
并获得持久性。该 RPC 接口表示一个解码并执行 Base64 编码的 Shellcode 的函数。
MecGame
插件有几种方法来根据可用权限执行 spdlogd.exe
。它还创建一个锁文件,名称为 MSSYS.lck
或
<UserName>-XPS.lck
,具体取决于加载它的进程的名称,并删除文件 atomxd.dll
和 logexts.dll
。
它可以作为服务安装,服务名称为 “inteloem”
,或被任何通过 Winsock2 函数库连接到互联网的可执行文件加载。
MulCom
ABA89668C6E9681671A95B3D7A08AAE2A067DEED2D835BA6F6FD18556C88A5F2
这个 DLL 是一个后门模块,导出四个函数:“OperateRoutineW”
、“StartRoutineW”
、“StopRoutineW”
和
”WorkRoutineW”
;主要恶意功能是 “StartRoutineW”
。
为了正常执行,后门需要通过共享对象访问配置数据,该对象的文件映射名称是
“Global\\4ED8FD41-2D1B-4CC3-B874-02F0C60FF9CB”
或
"Local\\4ED8FD41-2D1B-4CC3-B874-02F0C60FF9CB"
。不幸的是,我们未能接触到该配置数据,因此缺少一些信息,例如该模块使用的
C&C 伺服器域名。
该后门支持 15 条命令(尽管其中某些命令尚未实现),并由以下数字标识:
命令 ID| 函数描述
—|—
1| 发送来自执行命令的数据。仅在通过 NTLM 进行代理身份验证时使用
2| 了解有关域名、用户名和 explorer.exe
进程的安全标识符的信息。它获得所有远程桌面会话的用户名、域名和计算机名称。
3| 列举根磁碟
4| 列举文件并获取其创建时间、最后访问时间和最后写入时间
5| 使用重复的令牌创建进程。该令牌是从列表中的进程之一获得的(详见附录)。
6| 列举文件,并了解其创建时间、最后访问时间、最后写入时间
7| 重命名文件
8| 删除文件
9| 创建目录
101| 发送通过 GetLastError
API 函数获得的错误码
102| 列举特定文件夹中的文件,并获取其创建时间、最后访问时间和最后写入时间
103| 将文件上传到 C&C 伺服器
104| 未实现(保留)
105/106/107 的组合| 创建目录并从 C&C 伺服器下载文件
通信协议
MulCom
后门支持通过 HTTP 和 TCP 协议进行通信。它与 C&C 伺服器交换的数据经过加密并使用 RC4 和 aPack算法进行压缩,使用从配置数据对象加载的 RC4 金钥。
它也能够使用 Basic、NTLM、Negotiate 或 SOCKS4 和 SOCKS5 协议进行代理服务器身份验证。
在成功通过代理服务器身份验证后,后门将数据 XOR 加密,使用常数 0xBC
。这些数据集具有以下结构:
[![](https://decoded.avast.io/wp-
content/uploads/sites/2/2022/03/getacp-1024×177.png