操作龙车:针对博彩公司的APT组织
引言
我们最近发现一项我们称之为龙棋操作Operation Dragon Castling的 APT 行动。该行动针对的似乎是位于东南亚,特别是台湾、菲律宾和香港的博彩公司。我们可以中等程度的信心将此活动归因于一个讲中文的APT组织,但很遗憾的是无法将攻击归因于特定的团体,也不确定攻击者的目的。
我们发现该APT组织使用的模块之一MulCom backdoor与 BlackBerry Cylance Threat Research Team 在其 2017 年的报告中描述的 FFRat 样本以及 Palo Alto Networks 在其 2015 年报告中的样本有显著的代码相似性。基于此,我们怀疑FFRat的代码库正在几个中国对手团体之间共享。不幸的是,这不足以作为可信的归因,因为FFRat本身从未被可靠地归因。
在这篇博文中,我们将描述这些攻击中使用的恶意程式和APT组织植入的后门,以及其他用以获得持久性和访问受感染机器的恶意档案。我们还将讨论我们看到的两种传播途径:一个是感染的安装程序,另一个是利用一个合法的易受攻击的应用程序 WPS Office。
我们识别出随著 WPS Office 更新的 wpsupdateexe 出现的一个新漏洞CVE202224934,我们怀疑攻击者利用了这个漏洞。
我们要感谢台湾的 [TeamT5](https//teamt5org/en/) 为我们提供了与这一感染途径相关的 IoCs。
基础设施和工具集
在上图中,我们描述了恶意档案之间的关系。其中一些关系可能不太准确,例如,我们不完全确定 MulCom backdoor 是否是由 CorePlugin 加载的。然而,我们坚信它是该行动中使用的恶意档案之一。
感染途径
在这一行动中,我们看到多种感染途径。其中之一,攻击者向其中一个目标公司的支持团队发送了一封包含感染安装程序的电子邮件,要求检查其软件中的错误。在此文中,我们将描述我们看到的另一个途径:一个假冒的 WPS Office 更新包。我们怀疑攻击者利用了 WPS updater wpsupdateexe 中的一个漏洞,这是 WPS Office 安装包的一部分。我们已联系 WPS Office 团队处理我们发现的漏洞[CVE202224934](https//cvemitreorg/cgibin/cvenamecginame=CVE202224934),该漏洞已经修复。
在我们的调查中,我们注意到 WPS 更新程序过程中出现可疑行为。当分析该二进位档时,我们发现了一个潜在的安全问题,让攻击者能够利用该更新程序与攻击者控制的服务器进行通信,执行包括下载和运行任意可执行档案在内的操作。要利用该漏洞,需要修改 HKEYCURRENTUSER 下的一个注册表键,这样做将使攻击者在系统上获得持久性并控制更新过程。在我们分析的案例中,恶意二进位档是从 updatewps[]cn 网域下载的,这是属于 Kingsoft 的一个域名,但该伺服器的 IP 地址10314018716与该公司无关,所以我们猜测这是一个攻击者用来提供假更新的伺服器。下载的二进位档setupCN205211108830PersonalDownloadTrialeexe B9BEA7D1822D9996E0F04CB5BF5103C48828C5121B82E3EB9860E7C4577E2954会投放两个档案以进行侧载:一个签名过的 QMSpeedupRocketTrayInjectHelper64exe Tencent Technology (a3f3bc958107258b3aa6e9e959377dfa607534cc6a426ee8ae193b463483c341) 和一个恶意 DLL QMSpeedupRocketTrayStub64dll。
投放器 1 (QMSpeedupRocketTrayStub64dll)
76adf4fd93b70c4dece4b536b4fae76793d9aa7d8d6ee1750c1ad1f0ffa75491
第一阶段是一个与 CampC (控制和命令伺服器) 通信的后门mirrorscentos8788912[]com。在联系 CampC 伺服器之前,后门会执行几个准备操作。它钩住了三个函数: GetProcAddress、FreeLibrary 和 LdrUnloadDll。为了获得 CampC 网域,它将自身映射到内存中,并从结尾的偏移量 1064 开始读取数据。该网域名以明文形式存储,并以宽字元串的形式存在于二进位档中。
然后,它初始化一个带有名为 ScriptHelper 的 JScript 类的对象。该投放器利用 ImpersonateLoggedOnUser API 调用重用来自 explorerexe 的 Token,因此它实际上在同一用户下运行。此外,它还利用 RegOverridePredefKey 将当前的 HKEYCURRENTUSER 重定向到 impersonated user 的 HKEYCURRENTUSER。为了与 CampC 通信,它构造了一个包含系统信息的 UserAgent 字符串,例如:Mozilla/40 (compatible MSIE 90 Windows NT 61NET CLR 20)。外泄的信息包括:Internet Explorer 版本、Windows 版本、User AgentPost Platform 注册值的值。
之后,该样本构造 JScript 代码进行执行。代码的标头包含两个变数的定义:代表 CampC 网域名的 server 和一个硬编码的 key。然后它向 /api/connect 发送 HTTP GET 请求,响应应为加密的 JScript 代码,并被解密、附加到所构造的标头并使用之前创建的 JScript 类执行。
在分析时,CampC 当时没有响应,但根据遥测数据,我们可以得出结论,正在从 hxxp//mirrorscentos8788912com/upload/ea76ad28a3916f52a748a4f475700987exe 下载下一阶段到 ProgramDataicbclogtmpexe 并执行它。
投放器 2 (IcbcLog)
a428351dcb235b16dc5190c108e6734b09c3b7be93c0ef3d838cf91641b328b3
第二个投放器是执行器,当执行时,会尝试通过 COM Session Moniker Privilege Escalation ([MS17012](https//docsmicrosoftcom/enus/securityupdates/securitybulletins/2017/ms17012)) 提升权限,然后投放几个以以下资源 ID 存储的二进位档:
资源 ID 档案名 描述1825 smcachedat CampC 域名列表1832 logdll Loader (CoreX) 64位1840 bdservicehostexe 为 sideloading 的签名 PE 64位1841 N/A 用于 sideloading 的档名1817 instdat 工作路径1816 hostcfgdat 用于 Host 标头,在 CampC 通信中使用1833 bdservicehostexe 为 sideloading 的签名 PE 32位 N/A1831 logdll Loader (32位) N/A
加密的有效载荷具有以下结构:
加密金钥是从偏移量 0x8 开始的宽字元串。加密数据从偏移量 0x528 开始。要解密数据,使用 CryptHashData API 创建密钥的 SHA256 哈希,然后使用硬编码的 IV 0123456789abcde 通过 CryptDecrypt API 使用 AES256 算法解密数据。然后,解密数据使用 RtlDecompressBuffer 解压缩。为了检查解密是否成功,将对数据的 CRC32 计算并与原始资源数据中偏移量 0x4 的值进行比较。当所有有效载荷被写入磁碟后,执行 bdservicehostexe 以运行下一阶段。
Loader (CoreX)
97c392ca71d11de76b69d8bf6caf06fa3802d0157257764a0e3d6f0159436c42
Loader (CoreX) DLL 在前一阶段Dropper 2中被侧载,并作为一个投放器。与 Dropper 1 类似,它也钩住了 GetProcAddress 和 FreeLibrary API 函数。这些钩子执行该库的主代码。主代码首先检查它是否由 regsvr32exe 加载,然后检索其资源中的加密数据。这些数据被写入与 syscfgdat 相同的资料夹中。然后将该档案加载并使用 AES256 解密,设置选项如下:
金钥为计算机名称,IV 为 qwertyui12345678AES256 设置参数以 ltkeygt#ltIVgt 格式嵌入资源中。因此,您可能会看到 cbfc2vyuzckloknf#8o3yfn0uee429m8dAES256 设置参数
主要代码持续检查是否有 ekrnexe 的进程在运行。ekrnexe 是 ESET 的核心服务。如果 ESET 核心服务正在运行,它将试图重新映射 ntdlldll。我们推测这用于避开 ntdlldll 的钩子。
服务检查之后,它将解压并执行 Shellcode,这又加载下一阶段的 DLL。该 DLL 作为 Shellcode 的一部分未加密地储存。该 Shellcode 列举 ntdlldll 的导出,并构建一个哈希数组以按名称排序所有 Zw 函数Windows 原生 API 系统调用的哈希,然后依据它们的 RVA 排序。通过这样做,Shellcode 利用 Zw 函数的 RVA 的顺序等于相应的系统调用的顺序,因此在该数组中 Zw 函数的索引是一个系统调用号,可以通过系统调用指令调用。因此,安全解决方案可以基于用户空间 API 的钩子进行躲避。最后,载入嵌入的核心模块 DLL 并执行。
Proto8 (核心模块)
f3ed09ee3fe869e76f34eee1ef974d1b24297a13a58ebff20ea4541b9a2d86c7
核心模块是一个单一的 DLL,负责设置恶意程式的工作目录、加载配置档、更新其代码、加载插件、向 CampC 伺服器报警并等待指令。
它具有四个主要步骤的级联结构:
第一步
第一部分主要致力于初步检查和一些逃避技术。首先,核心模块验证 DLL 是由 spdlogdexe一个用于持久性使用的可执行档,见下文运行,或者它不是由 rundll32exe 运行。如果这个检查失败,执行就会终止。该 DLL 通过钩住 GetProcAddress 和 FreeLibrary 函数来执行主函数,与前面的感染阶段类似。
GetProcAddress 钩中包含有趣的调试输出in googo。
然后,恶意程式创建一个名为 Sample 的新窗口,并附加一个自定义回调函数。通过 SendMessageW 向该窗口发送 ID 为 0x411 的消息,这将导致上述回调执行主函数。该回调函数还可以处理 0x412 的消息 ID,尽管没有特定的功能与之关联。
导出函数 Core2 发送消息 0x411
导出函数 Ldr2 发送消息 0x412
窗口回调仅包含对消息 0x411 的实现,但也检查 0x412
第二步
在第二步中,该模组尝试自我更新、加载配置文件并设置工作目录WD。
自我更新该恶意程式首先会查找名为 newversiondat 的档案 如果存在,它的内容会被读入内存,在新线程中执行,并打印出调试字串 “run code ok”。我们未能发现该档案,但根据名称和上下文,这很可能是一种自我更新功能。
加载配置档 instdat 并设置工作目录。首先,核心模块配置文件 instdat 在以下三个位置寻找:
核心模块 DLL 所在的目录加载核心模块 DLL 的可执行文件所处的目录CProgramData它以明文形式包含恶意程式的工作目录的路径。如果找不到,则使用硬编码的目录名称并创建该目录。工作目录是恶意程式用于在随后的执行阶段中放置或读取其所使用的任何文件的位置。
加载配置文件 smcachedat。
设置工作目录后,样本将从中加载配置文件 smcachedat。该文件包含用于与 CampC 伺服器通信的域名、协议和端口号详见第4步以及一个 “comment” 字符串。这个字符串可能用于识别行动或个别受害者。它用于在受害者的计算机上创建一个空文件见下文,并且在与 CampC 伺服器通信的初始报警中发送。 我们将其称为 “comment string”,因为我们看到几个版本的 smcachedat,其中字符串的内容为 “the comment string here”,在另一个名为 commentdat 的配置文件中也出现,该文件具有 INI 文件格式,并在键 COMMENT 下包含该字符串。
创建 log 文件
在样本找到并读取 smcachedat 后,即基于受害者的用户名及 smcachedat 中的注释字符串创建一个文件。如果不在字符串中,它将使用一个默认的硬编码值例如 M8699lck。根据扩展名,它可能是某种日志,但我们尚未见到任何恶意程式写入它的部分,因此它可能只是作为锁文件使用。在文件成功创建后,恶意程式创建一个互斥体并进入下一步。
第三步
接下来,恶意程式收集受感染环境的资讯如用户名、DNS 和 NetBios 计算机名称以及操作系统版本和架构并设置其内部结构,最显著的是一个 “call objects” 列表。call objects 是与特定功能相关联的结构,并保存在一个带有硬编码 4字节键的 “dispatcher” 结构中的映射中。这些键值ID稍后用于根据来自 CampC 伺服器的命令调用这些函数。
键值的结构,前三个字节在给定样本中始终相同,而最后一字节在所有我们见到的核心模块样本中始终相同。例如,调用 RevertToSelf 函数的函数在某些版本的核心模组中被标识为 0x20210326,在其他版本中为 0x19181726。这表明 ID 数字的前三个字节与核心模组版本有关,或者更可能与基础结构版本有关,而最后一字节则是函数的实际 ID。
ID最后字节 函数描述0x02 未实现的函数0x19 检索 smcachedat 的内容并将其发送到 CampC 伺服器0x1A 写入数据到 smcachedat0x25 冒充登录用户或 explorerexe 过程0x26 调用 RevertToSelf 的函数0x31 接收数据并将其复制到新分配的可执行缓冲区中0x33 接收核心插件代码,将其写入磁碟并然后加载和调用0x56 将值写入 commentdat
Webdav
在初始化呼叫对象时,核心模块还尝试通过调用 WNetAddConnection3W 连接到 URL hxxps//davjianguoyuncom/dav/,使用用户名 12121jhksdf 和密码 121121212。在分析时,该地址没有响应,但 jianguoyun[]com 是一家中国文件共享服务。我们的假设是这可能是一种获取插件代码或核心模组自身的更新版本的方式。
插件
核心模组包含一个函数,它接收一个包含插件 DLL 数据的缓冲区,将其保存为工作目录中的名称为 kbglttickcountgtdat 的档案,将其载入到内存中,然后调用其导出的函数 InitCorePlug。磁碟上的插件文件设置为在重新启动时删除,通过调用带参数 MOVEFILEDELAYUNTILREBOOT 的 MoveFileExW 实现。关于插件的详细信息,请参见专门的插件部分。
第四步
在最终步骤中,恶意程式将遍历 smcachedat 配置文件中包含的 CampC 伺服器,并尝试访问每一个。smcachedat 配置文件的结构如下:
黑洞加速器appsmcachedat 配置文件的结构
协议字符串可以有九个可能的值之一:
TCPHTTPSUDPDNSICMPHTTPSIPV6WEBSSHHTTP根据与特定 CampC 域名相关的协议,恶意程式会设置连接,发送报警到 CampC 并等待命令。
在这篇博文中,我们将主要集中在 HTTP 协议选项上,因为我们看到这是攻击者使用的。
使用 HTTP 协议时,核心模块首先打开两个持久请求句柄 一个用于 POST,一个用于 GET 请求,两者均指向 /connect。这些句柄通过在 POST 请求中发送空缓冲区并检查 GET 请求的 HTTP 状态码进行测试。随后,恶意程式通过调用 InternetWriteFile API 使用先前打开的 POST 请求句柄发送初步报警到 CampC 伺服器,并通过调用 InternetReadFile 从 GET 请求句柄读取数据。
HTTP 数据包顺序
HTTP POST 报警
核心模块使用以下主要是硬编码的HTTP 头部:
Accept /xcid {ltuuidgt} 为每对 GET/POST 请求生成新的 uuidPragma nocacheCachecontrol notransformUserAgent ltuseragentgt 从注册表生成或使用硬编码字符串见下文Host lthostvaluegt CampC 伺服器域名或来自 hostcfgdat 的值见下文Connection KeepAliveContentLength 4294967295最大 uint,仅在 POST 请求中UserAgent 标头
UserAgent 字符串与 Dropper 1 模块中的相同方法从注册表生成包括登录用户的模拟访问注册表或如果访问注册表失败则使用硬编码字符串:“Mozilla/40 (compatible MSIE 80 Windows NT 61 WOW64 Trident/40 SLCC2 NET CLR 2050727 NET CLR 3530729 NET CLR 3030729 Media Center PC 60)”。
Host 标头
设置该标头时,恶意程式会查找 ID 为 1816 的资源或当资源未找到时查找名为 hostcfgdat 的档案。如果找到资源或档案,内容将被用作所有 CampC 通信的 Host HTTP 标头的值,而不是 smcachedat 中发现的 CampC 域名。这不会改变请求实际所发送的 CampC 域名 这暗示了 CampC 伺服器可能位于反向代理之后。
初步报警
恶意程式发送的第一个数据包包含一个经过 base64 编码的 LZNT1 压缩缓冲区,包括新生成的 uuid不同于用于 xcid 标头的 uuid、受害者的用户名、操作系统版本和架构、计算机 DNS 和 BIOS 名称,以及在 smcachedat 或 commentdat 找到的注释字符串。如果该文件存在,则来自 commentdat 的值优先。
在我们分析的核心模块样本中,实际上在从 commentdat 读取值的函数中出现了一个错字 它寻找的是键 “COMMNET” 而不是 “COMMENT”。
随后,恶意程式进入一个循环,等待来自 CampC 伺服器的命令,以一个呼叫对象的 ID 值的形式传送。每条发送到 CampC 伺服器的消息中都包含一个硬编码的四字节数字值,其结构与用作呼叫对象映射中键的值相同。 我们看到的与 CampC 伺服器传送的消息相关的 ID 数字包括:
ID最后字节 用途0x1B 发送给 CampC 的消息,其中包含 smcachedat 的内容0x24 发送给 CampC 的消息,其中包含调试字符串0x2F 发送给 CampC 的一般消息0x30 发送给 CampC 的消息,特定目的未知0x32 与插件相关的消息发送至 CampC0x80 初步报警发送至 CampC 伺服器
除了 HTTP 协议外,其他几种协议的有趣观察:
HTTPS 不使用持久请求句柄HTTPS 使用 HTTP GET 请求,数据以 Base64 编码在 cookie 标头中发送初步报警HTTPS、TCP 和 UDP 使用自定义魔法标头:MagicCode hhjjdfgh核心模块的一般观察
我们观察到的核心样本经常通过 OutputDebugStringA 和 OutputDebugStringW 或通过将其发送到 CampC 伺服器输出调试字符串。核心模块使用的一些调试字符串示例包括:在执行开头的文件路径、在自我更新后的 “run code ok”、“In googo” 在 GetProcAddress 的钩子中,“recv bomb” 和 “sent bomb” 在主要 CampC 通信函数中等等。
字符串混淆我们遇到了只有明文字符串的核心模块样本,但也有一些样本中某些字符串被 XOR 混淆,使用唯一每个样本硬编码的密钥。
即使在包含混淆字符串的样本中,许多明文字符串仍然存在,且似乎在决定哪些字符串将被混淆而不会被混淆方面没有逻辑。例如,大多数格式字符串都是混淆的,但重要的 IoCs,如凭证或档名则不是。
以此为例:在函数检索 commentdat 中的值时,大多数字符串都是混淆的,而调用 GetPrivateProfileStringW 是通过 GetProcAddress API 动态解析的,但写入该配置文件的同一函数中的所有字符串均为明文,并且直接调用 WritePrivateProfileStringW。
总的来看,核心模块代码相当健壮,并包含许多保护措施和不同场景的选项例如,用于 CampC 通信的可能协议数量,但我们可能只看到了仍在积极开发中的这种恶意程式的样本,因为我们见到的许多功能尚未实现,仅作为占位符。
插件
在下面的部分中,我们将描述 Core Module (Proto8) 使用的插件功能,以扩展其功能。
我们将描述三个插件,具有各种功能,例如:
获得持久性绕过 UAC注册 RPC 接口创建新账户后门功能核心插件0985D65FA981ABD57A4929D8ECD866FC72CE8C286BA9EB252CA180E280BD8755
这个插件是一个 DLL 二进位档,由上述无文件核心模块 (Proto8) 加载。它透过添加方法来管理额外插件来扩展恶意程式的功能。这些额外插件导出函数 “GetPlugin”,核心插件则执行该函数。
这部分使用与核心模组相同的命令 ID 基于调用约定见上文,另外添加了三种新方法:
ID最后字节 函数描述0x2B 将有关插件位置的信息发送到 CampC 伺服器0x2C 移除一个插件0x2A 加载一个插件
所有核心模组使用的插件二进位档都存储在工作目录中,文件名为 kbglttickcountgtdat。一旦 Core Plugin 被加载,它会首先从工作目录中移除所有插件 详情请参见下面的图片。
Zload(Atomxdllxps1dll)2ABC43865E49F8835844D30372697FDA55992E5A6A13808CFEED1C37BA8F7876
我们称之为 Zload 的 DLL 是由 Core Plugin 加载的一个插件示例。它导出四个函数:“GetPlugin”、“Install”、“corezload” 和 ”zload”。此插件的主要功能是设置持久性、创建后门用户账户,以及在受感染系统上隐藏自己。我们将重点介绍导出的函数 zload、corezload 和预设的 DllMain 函数,因为它们包含最有趣的功能。
Zload进程启动器该函数相当简单,它的主要目的是执行另一个二进位档。它首先检索 Zload 插件二进位档所在的目录的路径 (ltrootfoldergt),并在其中创建一个名为 mec 的新子文件夹。然后将三个文件重命名并移动到该目录中:
将 Zload 插件二进位档本身重命名为 ltrootfoldergtmeclogextsdll,将 ltrootfoldergtspdlogdexe 重命名为 ltrootfoldergtmecspdagentexe,以及将 ltrootfoldergtkbini 重命名为 ltrootfoldergtmeckbini。在文件重命名和移动后,它通过执行二进位档 ltrootfoldergtmecspdagentexe原先是 ltrootfoldergtspdlogdexe创建一个新进程。
corezload持久性设置此函数负责通过注册自己到安全支持供应商 (SSPs) 列表中来获得持久性。Windows SSP DLL 在系统启动时加载到 Local Security Authority (LSA) 程序中。此函数的代码显著类似于在 GitHub 上找到的 mimikatssp/AddSecurityPackageRawRPC 源代码。
DllMain侧载、设置预设 DllMain 函数利用几种持久性和逃避技术。它还允许攻击者在受感染系统上创建一个后门账户,并降低整体系统安全性。
持久性该插件首先检查自己的 DLL 是否由 “lsassexe” 或 “spdagentexe” 加载。如果 DLL 是由 “spdagentexe” 加载的,则它将调整当前进程的令牌权限。
如果它是由 “lsassexe” 加载的,则会从配置文件 “kbini” 检索路径 “kbltnumgtdll”,并写入注册表键 HKEYLOCALMACHINESYSTEMCurrentControlSetServicesWinSock2Parameters 下的 AutodialDLL。这确保了持久性,因为它使 DLL “kbltnumgtdll” 每当调用 Winsock 2 函数库 (ws232dll) 时都会被加载。
避免监控为了避免检测,插件首先检查正在运行的进程列表中是否存在 “avpexe”Kaspersky Antivirus或 “NortonSecurityexe”,如果找到其中之一则退出。如果系统中未找到这些进程,它将继续隐藏自己,通过将自己的进程名称改为 “explorerexe”。
该插件还能绕过 UAC 机制,通过 CMSTP COM 接口提升其进程权限,例如 CMSTPLUA {3E5FC7F99A5143679063A120244FBEC7}。
后门用户账户创建接下来,插件执行注册表操作详细信息见附录,降低系统保护:
允许本地账户在通过网络登录时获得完全管理员权限启用无用户密码的远程桌面连接禁用管理员账户的管理批准,这意味著所有应用程序都以完全管理员权限运行允许匿名SID成为Windows的每个组的一部分允许Null Session用户列出域中的用户和组允许Null Session用户访问共享资料夹设置可以被Null Session用户访问的管道名称在这步骤中,插件将 WebClient 服务的启动类型更改为 “Automatic”。它创建一个用户名为 “DefaultAccount”,密码为 “Admin@1999!” 的新账户,然后将该账户添加到 “Administrator” 和 “Remote Desktop Users” 组中。它还隐藏了登录屏幕上的新账户。
最后,该插件检查运行中的进程列表中是否存在名称为 “360trayexe” 和 “360sdexe” 的进程,并如果都未找到,则执行档案 spdlogdexe。
MecGame(kbnumdll)4C73A62A9F19EEBB4FEFF4FDB88E4682EF852E37FFF957C9E1CFF27C5E5D47AD
MecGame 是可以由 Core Plugin 加载的另一个插件示例。它的主要目的是类似于先前描述的 Zload 插件 它通过注册一个具有 UUID {1052E3752CE2458EAA80F3B7D6EA23AF} 的 RPC 接口来执行二进位档 “spdlogdexe” 并获得持久性。该 RPC 接口表示一个解码并执行 Base64 编码的 Shellcode 的函数。
MecGame 插件有几种方法来根据可用权限执行 spdlogdexe。它还创建一个锁文件,名称为 MSSYSlck 或 ltUserNamegtXPSlck,具体取决于加载它的进程的名称,并删除文件 atomxddll 和 logextsdll。
它可以作为服务安装,服务名称为 “inteloem”,或被任何通过 Winsock2 函数库连接到互联网的可执行文件加载。
MulComABA89668C6E9681671A95B3D7A08AAE2A067DEED2D835BA6F6FD18556C88A5F2
这个 DLL 是一个后门模块,导出四个函数:“OperateRoutineW”、“StartRoutineW”、“StopRoutineW” 和 ”WorkRoutineW”;主要恶意功能是 “StartRoutineW”。
为了正常执行,后门需要通过共享对象访问配置数据,该对象的文件映射名称是 “Global4ED8FD412D1B4CC3B87402F0C60FF9CB” 或 Local4ED8FD412D1B4CC3B87402F0C60FF9CB。不幸的是,我们未能接触到该配置数据,因此缺少一些信息,例如该模块使用的 CampC 伺服器域名。
该后门支持 15 条命令尽管其中某些命令尚未实现,并由以下数字标识:
命令 ID 函数描述1 发送来自执行命令的数据。仅在通过 NTLM 进行代理身份验证时使用2 了解有关域名、用户名和 explorerexe 进程的安全标识符的信息。它获得所有远程桌面会话的用户名、域名和计算机名称。3 列举根磁碟4 列举文件并获取其创建时间、最后访问时间和最后写入时间5 使用重复的令牌创建进程。该令牌是从列表中的进程之一获得的详见附录。6 列举文件,并了解其创建时间、最后访问时间、最后写入时间7 重命名文件8 删除文件9 创建目录101 发送通过 GetLastError API 函数获得的错误码102 列举特定文件夹中的文件,并获取其创建时间、最后访问时间和最后写入时间103 将文件上传到 CampC 伺服器104 未实现保留105/106/107 的组合 创建目录并从 CampC 伺服器下载文件
通信协议MulCom 后门支持通过 HTTP 和 TCP 协议进行通信。它与 CampC 伺服器交换的数据经过加密并使用 RC4 和 aPack 算法进行压缩,使用从配置数据对象加载的 RC4 金钥。
它也能够使用 Basic、NTLM、Negotiate 或 SOCKS4 和 SOCKS5 协议进行代理服务器身份验证。
在成功通过代理服务器身份验证后,后门将数据 XOR 加密,使用常数 0xBC。这些数据集具有以下结构:
[![](https//decodedavastio/wpcontent/uploads/sites/2/2022/03/getacp1024x177png