卡巴斯基对APT ToddyCat的分析

卡巴斯基对APT ToddyCat的分析

揭露攻击欧洲和亚洲知名实体的未知​​ APT 攻击者

ToddyCat 是一个相对较新的 APT 攻击者,我们无法将其与其他已知攻击者联系起来,它负责自 2020 年 12 月以来检测到的针对欧洲和亚洲知名实体的多组攻击。关于这个威胁参与者的信息我们仍然知之甚少,但我们知道它的主要显着标志是两个以前不为人知的工具,我们称之为“武士后门”(Samurai backdoor)和“忍者特洛伊木马”(Ninja Trojan)。

该组织于 2020 年 12 月开始活动,利用未知漏洞攻击台湾和越南的选定 Exchange 服务器,该漏洞导致创建了著名的 China Chopper web shell,进而用于启动多阶段感染链。在该链中,我们观察到了许多组件,其中包括自定义加载程序,这些加载程序用于完成被动后门 Samurai 的最终执行。

在第一阶段,即 2020 年 12 月至 2021 年 2 月期间,该组织针对台湾和越南的数量非常有限的服务器,这些服务器与三个组织有关。

从 2 月 26 日到 3 月初,我们观察到快速升级和攻击者滥用 ProxyLogon 漏洞危害欧洲和亚洲的多个组织。

我们怀疑该组织于 2020 年 12 月开始利用 Microsoft Exchange 漏洞,但不幸的是,我们没有足够的信息来证实这一假设。无论如何,值得注意的是,所有在 12 月至 2 月期间被感染的目标机器都是 Microsoft Windows Exchange 服务器。攻击者利用未知漏洞破坏了服务器,攻击链的其余部分与 3 月份使用的相同。

其他供应商观察到了 3 月份发起的攻击。我们在 ESET 的同事将这组活动称为“Websiic”,而越南公司 GTSC发布了一份关于感染媒介和用于部署第一个 dropper 的技术的报告。也就是说,据我们所知,没有一个公共账户描述了整个感染链的目击事件或作为该组织行动的一部分部署的恶意软件的后期阶段。

第一波攻击专门针对 Microsoft Exchange 服务器,这些服务器受到 Samurai 的攻击,Samurai 是一种复杂的被动后门,通常在端口 80 和 443 上运行。该恶意软件允许任意 C# 代码执行,并与多个模块一起使用,允许攻击者管理远程系统并在目标网络内横向移动。

在某些特定情况下,Samurai 后门还被用来启动另一个我们称之为 Ninja 的复杂恶意程序。该工具可能是 ToddyCat 专门使用的未知后利用工具包的一个组件。

根据代码逻辑,Ninja 似乎是一种协作工具,允许多个操作员同时在同一台机器上工作。它提供了大量命令,允许攻击者控制远程系统、避免检测并深入目标网络。某些功能类似于其他臭名昭著的后利用工具包中提供的功能。例如,Ninja 有一个像 Cobalt Strike 枢轴监听器这样的功能,它可以限制从目标网络到远程 C2 的直接连接数量,并控制没有互联网访问的系统。它还提供了控制 HTTP 指示器和伪装 HTTP 请求中的恶意流量的能力,这些流量通过修改 HTTP 标头和 URL 路径而显得合法。

自 2020 年 12 月首次出现以来,ToddyCat 一直在继续其激烈的活动,尤其是在亚洲,我们检测到许多其他的加载程序和安装程序变体,类似于那些被滥用来加载 Samurai 和 Ninja 恶意软件的加载程序和安装程序。我们还观察到其他针对台式机的攻击波,这些攻击是通过 Telegram 发送恶意加载程序而感染的。

第一次战役

感染载体

根据我们的遥测数据,ToddyCat 于 2020 年 12 月 22 日开始使用针对 Microsoft Exchange 组件的未知漏洞攻击服务器。该漏洞用于部署China Chopper web shell,该shell又用于下载和执行另一个dropper debug.exe。

从 2 月 26 日开始,我们使用 ProxyLogon 部署了在 12 月和 1 月观察到的相同感染链和样本。

阶段 1 — 释放程序

dropper 安装所有其他组件并创建多个注册表项以强制合法的 svchost.exe 进程加载最终的 Samurai 后门。

卡巴斯基对APT ToddyCat的分析
感染流程

程序 debug.exe 使用了每次调用 Windows API 时都会使用的特殊解析函数。代码检查指针是否已经解析并放入全局变量中。如果未找到该值,则继续使用解析函数检索地址,该函数接收包含 API 的库的句柄和请求的 API 名称的加密字符串,然后使用 XOR-解密该字符串基于算法。

卡巴斯基对APT ToddyCat的分析
用于解析和调用 CryptDestroyKey 和 CryptReleaseKey 函数的代码片段

dropper 被配置为加载存储在另一个文件 debug.xml 中的加密有效负载。使用标准 Wincrypt 函数和 CALG_3DES_112 算法和嵌入代码中的静态密钥对数据进行解密。解密后,该文件会显示一个结构,其中包含用于安装下一阶段的多个有效负载和值。

位置
magic0x12345678
DotNet_Loader_v2_Payloadwebsvc.dll payload compatible with .Net Framework v2.0
DotNet_Loader_v4_Payloadwebsvc.dll payload compatible with .Net Framework v4.0
Loader_Dll_Payloadiiswmi.dll dll loader
ServiceNameWebUpdate
Path_DotNet_Loader%COMMONPROGRAMFILES%\System\websvc.dll
Path_Loader_Dll%COMMONPROGRAMFILES%\microsoft shared\WMI\iiswmi.dll
RegKey_Path_Service_SvcHostSOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
RegKey_Path_InterfaceSOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
Reg_Interface_Payload_v4Samurai backdoor for .Net Framework v4.0
Reg_Interface_Payload_v2Samurai backdoor for .Net Framework v2.0

从文件中检索到值后,恶意软件会执行一系列操作,以便在感染链中暂存下一个组件:

1:尝试创建将包含用于下一阶段的 DLL 的目录 %COMMONPROGRAMFILES%\Microsoft Shared\wmi\

2:检查对应于后续阶段的服务是否已经存在,如果存在则尝试停止它。

3:通过尝试打开注册表项 SOFTWARE\Microsoft\.NETFramework\policy\v2.0 检查是否安装了 2.0 版的 .NET 框架

4:如果密钥存在,恶意软件会将我们称为 DotNet_Loader_v2_Payload 的元素放入 %COMMONPROGRAMFILES%\System\websvc.dll;否则,它会将 DotNet_Loader_v4_Payload 的内容放在同一路径中。

5:在路径 %COMMONPROGRAMFILES%\microsoft shared\WMI\iiswmi.dll 下删除用于启动第二阶段的 DLL 加载程序

6:一旦上述文件在系统上可用,恶意软件就会尝试创建下面指定的注册表项以保持系统上的持久性。该键中的值指示为执行二进制文件而创建的服务的名称。按照下面的示例,一旦执行了服务相关进程,就会与命令行 %SystemRoot%\System32\svchost.exe -k httpsvc 相关联。

Registry Key: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
Value name: httpsvc
Value: WebUpdate

7:创建服务后,恶意软件会尝试配置第二阶段 DLL 和其中的入口点,以便在服务启动时执行。这是通过使用以下值设置相应的注册表项来完成的:

Registry Key: $HKLM\System\ControlSet\Services\WebUpdate\Parameters
Value name: ServiceDll
Value: %ProgramFiles%\Common Files\microsoft shared\WMI\iiswmi.dll

Registry Key: $HKLM\System\ControlSet\Services\WebUpdate\Parameters
Value name: ServiceMain
Value: INIT

恶意软件将感染链中的最终有效负载作为压缩、加密和 base64 编码的 blob释放在以下注册表项下:

Registry Key: $HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
Value name: 
Value: ILQ3Pz8/Pz87P9IFVEskWKpIeTB0jZx5SVXYXhh1fG...%encoded data%

第 2 阶段 – DLL 加载程序

在上一步中创建的注册表项强制 svchost.exe 进程加载用 C++ 开发的恶意库 iiswmi.dll。库中使用的代码与 dropper 非常相似,它使用在 dropper 中观察到的相同的特殊解析函数调用 Windows API。

该组件只是一个加载器,它尝试从注册表中获取加密的有效负载,并将其作为参数传递给在运行时手动加载的另一个 DLL。

恶意软件尝试读取之前写入的注册表项 SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9} 的内容,如果成功,则在路径 %COMMONPROGRAMFILES%\System\ 中加载之前删除的 DLL: websvc.dll。

为了调用下一阶段,恶意软件调用加载的 DLL (websvc.dll) 中的 Init 导出,同时将前一个注册表项的内容作为参数传递。

卡巴斯基对APT ToddyCat的分析
用于加载和执行 websvc.dll 的代码片段

第 3 阶段 – .NET 加载器

websvc.dll 库是用 C# 开发的,它是另一个加载器,需要一个加密的有效负载作为输入参数。该输入由两个用管道字符 (“|”) 分隔的 base64 编码字符串组成。第一个字符串包含最后阶段,第二个字符串包含在下一阶段执行期间使用的加密配置。

该库对第一个字符串进行解码,并使用密钥 0x3F 的简单 XOR 对结果数据进行解密,并使用 Gzip 解压缩。生成的有效负载是另一个用 C# 编写的库,它被加载到内存中,并通过调用加载代码中定义的类“X”中的名为“Equal”的方法来执行。从注册表加载的第二个 base64 编码字符串作为参数传递给新的 C# 库。

卡巴斯基对APT ToddyCat的分析
用于加载和执行最后阶段的代码片段

武士后门(Samurai backdoor)

最后一个阶段是一个以前不为人知的模块化后门,我们称之为 Samurai,因为恶意软件使用的重要字典中使用了一个常量关键字,用于在其模块之间共享数据。

该库是用 C# 开发的,使用 .NET HTTPListener 类来接收和处理 HTTP POST 请求,寻找携带攻击者发出的加密 C# 源代码的特制请求。这些程序将在运行时依次编译和执行。

该恶意软件使用一种算法进行混淆,该算法通过使代码难以阅读来增加逆向工程的难度。代码中的多个函数被分配了随机名称,而一些函数执行非常简单的操作,例如获取作为输入传递的对象的属性。

此外,该恶意软件使用多个 while 循环和 switch case 在指令之间跳转,从而使控制流扁平化,并且难以跟踪代码中的操作顺序。通过修改 switch case 表达式值并使用 break 和 goto 语句重新启动循环、重新评估 switch 表达式并跳转到正确的指令来控制流程。

卡巴斯基对APT ToddyCat的分析
带有while循环和switch case的代码片段

恶意软件的逻辑首先解密作为输入参数提供的配置数据。这些数据使用 base64 编码,并使用硬编码密钥 90 EE 0C E1 6C 0D C9 0C 使用 DES 算法加密。生成的有效负载是一个配置文件,该文件是为每个受害者定制的,包含多行以及后门使用的多个参数。

以下是配置块结构的示例:

keywordxyz 
C:\Windows\Temp\
http://*:80/owa/auth/sslauth/
https://*:443/owa/auth/sslauth/

第一行包含一个关键字,需要作为变量包含在收到的 POST 请求中,将其标记为指定由后门处理,还用于指定重要的会话参数,如 AES 会话密钥和包含的变量名称列表应该处理的数据。

在某些变体中,第二行用作目录路径,其值用于覆盖 TEMP 环境变量。所有其他行都是用于配置 HTTPListener 组件的 URI 前缀,其中每一行都是由方案(HTTP 或 HTTPS)、主机、可选端口和可选路径组成的字符串,用于定义哪个请求将由HTTPListener 对象。

在某些情况下,配置中包含的 URL 前缀包括受害者的域,如下例所示:

https://mail.%redacted%.gov.%redacted%/owa/auth/sslauth

一旦配置成功解密,后门会根据提供的配置启动监听器并等待传入​​的请求。请求的结构必须如下例所示:

POST /owa/auth/sslauth/ HTTP/1.0
Host: example.xyz
Headers...

keywordxyz={session_AES_key,variable2,variable3}&variable2=[C# source
code]&variable3=[argument_for_the_compiled_program\r\nassembly_reference1;assemb
ly_reference2]

在哪里:

{} = encrypted with default AES key + base64 encoded
[] = encrypted with session AES key + base64 encoded

### Input config ###
keywordxyz
C:\Windows\Temp\
http://*:80/owa/auth/sslauth/

请求正文应包含三个值,其中之一等于作为输入接收的配置中指定的关键字。相关值应使用 base64 编码并使用预定义密钥使用 AES 加密。结果字符串将包含三个由逗号分隔的值:第一个值是另一个 AES 密钥,用于解密其他 POST 值,第二个是包含 C# 源代码的变量的名称,第三个包含包含参数的变量的名称和应添加到已编译项目的程序集引用列表。

编译后,后门会尝试从名为“core”的类中调用名为“run”的方法,该类应包含在接收的程序中。被调用的方法接收两个参数作为输入:

  • 第一个是一个字典,其中包含一个名为“samurai”的键,将当前工作目录路径作为值保存。
  • 第二个是攻击者在 POST 请求的第三个元素中提供的值。

如果请求有效且代码成功执行,后门会回复 HTTP 200 代码,包括响应正文中调用的 .NET 程序集生成的结果。消息将使用会话密钥使用 AES 加密,并将使用 Base64 进行编码。

上传的模块

在调查过程中,我们发现了一些由攻击者上传并由 Samurai 后门编译的模块:

模块描述
远程命令使用 Windows 命令行 cmd.exe 执行任意命令。
文件枚举器获取攻击者提供的特定路径中的文件和目录列表作为参数。
文件泄露从受感染的机器上下载任意文件。
代理连接启动与代码中指定的远程 IP 地址和 TCP 端口的连接。
代理处理程序将通过 HTTP 请求收到的有效负载转发到远程 IP 地址,反之亦然。

值得一提的是传递给模块的参数,在某些情况下是具有特定格式的结构。所有模块都必须包含一个“运行”方法,该方法需要两个参数,一个包含当前工作目录的“samurai”关键字的字典,以及一个攻击者提供的字符串。该字符串应包含由分号字符 (“;”) 分隔的值。

例如,以下是远程命令模块的有效字符串:

Y21kLmV4ZQ==;ZGlyICVNQUxESVIlXCoubXdy;TUFMRElSPUM6XE1hbGRpcg==

该字符串包含三个不同的字段,每个字段都使用 base64 编码。此示例的解码值如下:

cmd.exe;dir %MALDIR%\*.mwr;MALDIR=C:\Maldir

第一个值是要执行的程序,第二个是要传递给新进程的参数,最后一个是环境变量。

使用此结构中的参数对 Samurai 后门进行繁琐的管理表明,Samurai 后门是更大解决方案的服务器端组件,该解决方案至少包括另一个客户端组件,为操作员提供接口,可用于自动上传一些预定义模块.

进一步支持这一假设的证据与代理模块有关,这是两个不同的 C# 程序,用于将 TCP 数据包转发到任意主机。攻击者使用这些模块启动正在运行的 Samurai 后门实例和远程主机之间的连接,并使用后门作为代理转发数据包。它可能用于在受感染的网络内横向移动。大多数检测到的模块都配置为与标准端口上的内部 IP 通信,例如:135、445、389、80 和 443。

第一个程序用于初始化连接,并将远程 IP 和远程端口嵌入代码中。

卡巴斯基对APT ToddyCat的分析
带有套接字对象创建的代码片段

当连接建立时,套接字对象被添加到“run”方法接收到的第一个参数中。此参数通常是包含关键字“samurai”的字典。

因此,套接字对象作为唯一键的值存储在字典中,其名称由单词“ninja”和字母数字唯一代码组成。然后将相同的值嵌入到用于处理数据包的第二个程序中。

卡巴斯基对APT ToddyCat的分析
套接字对象处理的代码片段

这表明 C# 源代码可能是由跟踪代理会话的客户端程序动态生成的。

忍者木马

在特定情况下,Samurai 后门被用来部署另一种复杂的恶意软件,我们称之为 Ninja,这是一种用 C++ 开发的工具,可能是由 ToddyCat 开发的未知后利用工具包的一部分。

该工具旨在完全控制远程系统,并为攻击者提供在目标网络中深入操作的能力。攻击者可以使用许多不同的命令来提供以下功能:

  • 枚举和管理正在运行的进程;
  • 管理文件系统;
  • 启动多个反向 shell 会话;
  • 在任意进程中注入代码;
  • 在运行时加载其他模块(可能是插件);
  • 提供代理功能以在 C2 和远程主机之间转发 TCP 数据包。

此外,该工具可以配置为使用多种协议进行通信,它包括逃避检测的功能,伪装其在 HTTP 和 HTTPS 请求中的恶意流量,这些请求试图通过使用流行的主机名和 URL 路径组合显得合法。该配置是完全可定制的,并且类似于著名的后期开发工具提供的其他功能,例如 Cobalt Strike 及其 Malleable C2 配置文件。

攻击者可以将代理配置为仅在特定时间范围内工作,可以使用特定命令动态配置。

最后但并非最不重要的一点是,每个代理也可以作为服务器组件工作,从其他代理接收数据包,解析请求并将它们转发到另一个预定义的 C2。此功能允许攻击者创建服务器链并在没有直接互联网连接的情况下与代理进行通信。它还可以用来避免网络检测,方法是通过唯一节点转发目标 Intranet 内生成的所有恶意流量,而不是从所有受感染的机器生成活动。

加载器

我们从未观察过 Ninja 存储在文件系统上;它通常由另一个组件加载到内存中。加载程序通常是一个可执行文件,它与 iiswmi.dll 库和 Samurai 安装程序(例如前面提到的 debug.exe)有许多相似之处。

加载程序使用相同的“特殊解析函数”调用 Windows API 并使用 3DES(112 位)解密文件有效负载,并使用 LZSS 算法解压缩解密数据。

生成的有效负载是一个库,该库将由加载程序映射到内存中,而没有 DOS 标头,并将调用导出函数“调试”来调用它。

我们观察到多种变体,并且该工具在这一年中不断发展。第一个示例缺少一些功能,例如在客户端处理多个会话的能力以及与 HTTP 和 HTTPS 协议通信的能力。嵌入式配置结构也略有不同。

在本文中,我们将描述最后检测到的版本。

配置

恶意软件通过从嵌入在二进制文件中的加密有效负载中检索配置参数来启动操作,该二进制文件与常量值“0xAA”进行异或运算,并使用 LZSS 算法进行压缩。

分析的配置包含具有以下值的 15 个元素的列表:

范围描述
2B847033-C95F-92E3-D847-29C6AE934CDC用于保证原子执行的互斥体名称。
C2_INFO包含与 C2 服务器通信的信息的结构。
/Collector/3.0/用于 HTTP 和 HTTPS 协议的 URL 路径。
Content-Type:application/x-www-form-urlencoded与 HTTP 和 HTTPS 协议一起使用的 HTTP 标头。
Host:mobile.pipe.microsoft.com:8080与 HTTP 和 HTTPS 协议一起使用的 HTTP 标头。
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) 像 Gecko与 HTTP 和 HTTPS 协议一起使用的用户代理。
0工作时间开始。
0工作分钟开始。
0工作第二个开始。
0工作时间停止。
0工作分钟停止。
0工作第二站。
0TCP C2 通信间隔。
300HTTP C2 通信间隔。
0本地服务器端口。

第一个元素是互斥锁名称,它可以是任何字符串,但通常看起来像一个 GUID 值。C2_INFO 是一个字符串,它包含以特定结构组织的多个值。

HTTP 配置

攻击者还可以自定义 HTTP URL 路径和标头来模仿合法服务并隐藏恶意流量。示例中的特定值将生成如下请求。

POST /Collector/3.0/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: mobile.pipe.microsoft.com:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko
Content-Length: 430
Cache-Control: no-cache

我们可以推断出攻击者试图模仿 Microsoft Teams 的行为,尽管“User-Agent”和“Host”标头不正确。

C2信息

C2_INFO 包含多个按以下格式指定的信息项:

%Protocol% \r %C2_Hostname% \r %C2_Port% \r %Proxy_Type% \r Proxy_Info

协议是标识通信协议的数值:

  1. HTTP
  2. HTTPS
  3. TCP

C2 主机名和端口是不言自明的。

“Proxy_Type”是另一个整数,可以有三个不同的值:

  1. 没有代理。直接连接C2
  2. 系统代理
  3. 手动代理

当该值等于“3”时,代理将尝试根据指定的协议对嵌入在“Proxy_Info”中包含不同信息的base64字符串进行解码。当协议为 HTTP 或 HTTPS 时,必须指定以下信息:

%Proxy_Address% : %Proxy_Port% \t %Proxy Username% \t %Proxy_Password%

如果协议是 TCP,则解码后的字符串可以指定一个最多 255 跳的代理链。

%Proxy_Address% \t %Proxy_Port% \t %Remote_Host% \t %Remote_Port% \r
%Proxy_Address% \t %Proxy_Port% \t %Remote_Host% \t %Remote_Port% \r
%Proxy_Address% \t %Proxy_Port% \t %Remote_Host% \t %Remote_Port% \r
%Proxy_Address% \t %Proxy_Port% \t %Remote_Host% \t %Remote_Port% \r
... up to 255

代理将使用该信息来初始化与 C2 的连接。

工作时间配置

Ninja 代理包含一个有趣的“工作时间”功能,可用于强制恶意软件仅在特定时间范围内工作。例如,它可以将恶意软件配置为仅在典型工作时间的上午 9 点到下午 6 点工作。此功能有助于避免被特定安全解决方案(例如基于行为的入侵检测系统)检测到。当值等于 0 时,该功能被禁用并且代理随时工作。攻击者可以使用特定命令远程配置这些选项。

本地服务器

最后一个值是本地服务器端口。启用本地服务器功能后,代理充当 C2。它等待代理连接,解码收到的请求并将它们转发到远程 C2。此功能可能用于“透视”和从受感染机器访问其他内部系统。此外,攻击者可以使用特定命令修改此值。

通讯协议

恶意软件通信受到一系列加密和编码算法的保护,HTTP 和 TCP 协议之间存在细微差别。

两种协议都使用如下消息格式:

Message_ID@Message_payload

“Message_ID”根据命令类型而变化,“Message_payload”包含压缩的真实有效负载,与静态值 0x3F 进行异或并使用自定义字母表使用 base64 算法编码。

然后使用通过从自定义 base64 字母表中选择两个随机字符生成的会话密钥,使用 AES 256 对生成的消息进行加密。代理将使用随机字符生成 SHA1 哈希,用于 AES 加密。

然后使用 base64 算法再次对加密数据进行编码,并将生成的字符串附加到先前生成的随机字符中,以允许服务器解密信息。

当代理配置为使用 HTTP/S 协议时,数据将包含在标准 POST 请求中。

如果 C2 使用 TCP 协议进行通信,代理将发送具有常量值 0x6CC8DF01 的第一个数据包,然后发送具有生成的有效负载的其他数据包。服务器应回复具有相同常量值 0x6CC8DF01 的数据包,然后使用相同算法加密的其他数据包。常数值并不总是相同的,而是根据变量而变化。

第一条消息使用“Message_ID”10001 发送,其中包含有关受感染系统和代理配置的信息。

  • 系统信息(使用 Kernel32.GetNativeSystemInfo 函数收集)
  • 操作系统信息(使用 Ntdll.RtlGetVersion 函数收集)
  • 计算机名称
  • 本地 IP 地址
  • 代理文件路径
  • 代理 PID
  • 代理睡眠时间
  • 代理 C2 配置(C2 主机名、端口、代理信息)

命令

服务器响应通常具有以下结构:

  • 魔术常数 0x887766
  • 命令数
  • 命令列表

“魔术常数”是一个整数,其值根据变量而变化。命令列表是一个数组,攻击者可以为每个元素指定:

  • 命令 ID
  • 参数大小
  • Arguments

参数值根据“CommandID”而变化,但通常它们是多个值除以“*”字符的字符串。

命令编号描述响应 ID
20000启用会话
20001禁用会话
20002更新睡眠时间
20003杀死机器人
20004以用户身份执行程序
20005设置本地服务器端口
20006安全出口
20010Shell::开始新会话30010
20011Shell::句柄命令30011
20012Shell::关闭会话30012
20013Shell::终止会话树30013
20020文件::获取驱动器列表30020
20021File::获取目录内容30021
20022文件::创建目录30022
20023文件::删除文件30023
20024文件::删除目录30024
20025文件::移动文件30025
20026File::Change Create\Last access\Last write Time30026
20030文件::读取文件30030
20031文件::写文件30031
20040代理::开始会话30040
20041代理::设置套接字为可写30041
20042代理::发送数据30042
20043代理::接收数据30043
20044代理::关闭会话30044
20045代理::重新连接30045
20050枚举进程(文件名|pid|线程数)30050
20051杀死进程列表
20052进程注入30052
20053插件::加载30053
20054插件::读取输出30054
20055插件::卸载30055
20056枚举进程(SessionID\PID\Domain\Username)30056
20060注入::开始新会话30060
20061注入::列出活动会话30061
20062注入::关闭会话30062
20064Injection::在新进程中注入代码30064
20065注入::读取“pobject”30065
20068注入::读取“create_object”30068
21000配置工作时间31000

有些命令是不言自明的,有些则不是,在某些情况下我们无法完全理解它们,因为我们仍然缺少一些信息。

启用和禁用会话命令用于激活或停用代理。攻击者应在发送任何其他命令之前启用该机器人,这些命令将被停用的机器人丢弃。启用命令也是启用“本地服务器”功能所必需的。

Shell、Proxy 和 Injection 命令旨在运行多个并行会话,这可能意味着多个操作员可以同时在目标机器上工作。代理管理三种结构,一种用于 Shell,一种用于代理,最后一种用于注入命令。

例如,当攻击者想要启动一个 shell 时,他们必须使用命令“20010”,这将强制代理创建一个新进程和用于重定向标准输入和标准输出的新管道。“Shell session ID”必须由攻击者指定,该值将存储在本地数组中,其中包含活动会话列表。如果命令成功,代理将回复一个信息列表,如新的 PID 和管道句柄。

命令 20011 可用于读取或写入管道中的数据。攻击者必须提供有效的“Shell session id”、事件 ID 和管道句柄。在处理命令之前,代理将通过将值与本地结构中的值进行比较来检查提供的 ID 是否有效。

命令 20012 用于关闭活动会话,从本地数组中删除“Session_ID”,终止正在运行的进程并关闭管道句柄。类似的逻辑用于管理 Proxy 命令,该命令可用于使用 TCP 协议将数据包转发到其他远程主机。

Plugin 命令用于加载代理进程地址空间中的其他未知库。我们没有关于其他模块的信息,但我们认为它们是额外的插件,攻击者可以使用它们来提供更多功能。

基于静态分析,我们知道库应该至少导出三个函数:GET、RUN 和 CLOSE;然后通过使用文件映射对象与主进程共享数据。

“Process Injection”(20052)命令和“Injection”命令集可能会引起一些混淆,但它们完全不同。第一个用于在正在运行的进程中注入任意 shellcode。第二个用于在攻击指定的新进程中注入另一个代理模块。注入的代码不是任意的shellcode,而是应该通过使用特定文件映射对象与主代理通信的东西。

攻击者使用命令 20060 启动一个新的注入会话,攻击者基本上提供了将被注入新程序的 shellcode,其路径将使用命令 20064 指定。

“Injection::Inject code in a new process”命令将强制代理启动攻击者指定的程序。指定的程序将被创建为挂起,并且代理将在创建的进程中分配的新部分中写入 shellcode。

然后代理获取远程线程的上下文以获取指令指针地址并将该偏移中的指令替换为以下内容:

dec eax
sub esp, 40h
dec eax
mov eax, %SHELLCODE_ADDRESS%
call eax

最后,代码将恢复远程进程,该进程将执行注入的代码。

然后使用命令 20065 和 20068 从文件映射对象中读取数据,这些数据应该包含由注入代码生成的信息。

其他广告系列和变体

其他变体

在我们的调查中,我们发现了几个在 2021 年演变并用于不同活动的加载程序和安装程序变体。

安装器

所有安装程序的逻辑都非常相似:它们从外部文件加载有效负载,通常位于同一目录中,名称根据变体不同:

  • debug.xml
  • web.xml
  • access.log
  • cache.dat
  • reg.txt
  • logo.jpg

文件总是使用相同的算法 CALG_3DES_112 解密,但加载的数据通常是为受害者量身定制的。

所有安装程序都使用加密文件中指定的名称和描述创建新服务。他们还在以下 Windows 注册表项中设置注册表值(httpsvc 或 w3esvc):

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost

这些值会导致 svchost.exe 自动启动恶意服务并将代码加载到其进程地址内存中。注册表值包含恶意服务名称。安装程序变体之间的主要区别与最终有效负载有关。根据初步调查,我们知道第一个变体(从 2020 年 12 月到 2021 年 5 月)被配置为将其有效负载存储在注册表项中,例如:

$HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
$HKLM\SOFTWARE\Classes\Interface\{AFDB6869-CAFA-25D2-C0E0-09B80690F21D}

从 3 月开始,我们还观察到新的变体被配置为将最终后门存储在文件系统中的其他加密文件中。最常见的将 Stage 2 加载器丢弃在以下路径中:

%System32%\Triedit.dll
%System32%\fveapi.dll

以及以下路径中的第 3 阶段加载程序和加密有效负载:

%WINDIR%\Microsoft.NET\Framework\sbs_clrhost.dll
%WINDIR%\Microsoft.NET\Framework\sbs_clrhost.dat
%WINDIR%\Microsoft.NET\Framework\Util.dll
%WINDIR%\Microsoft.NET\Framework\Util.dat

从 2021 年 9 月开始,我们观察到新样本被配置为再次将最终有效负载存储在 Windows 注册表中,但恶意软件不依赖静态注册表项值,而是配置为在 $HKLM\SOFTWARE\Classes\ 中创建动态生成的密钥接口\,基于磁盘驱动器的序列号:

卡巴斯基对APT ToddyCat的分析
基于卷序列号创建注册表项的代码片段

用于为每个示例生成最终注册表项名称更改的常量。

加载器

加载器是用于从 3DES 解密有效负载并将其加载到内存中的基本工具。随着时间的推移,它们与安装程序一起被修改,以说明最终有效负载存储方式的变化。

一些加载器,如上一段中提到的,被配置为从加密文件加载另一个有效负载,并将结果数据作为参数传递给另一个库,即第 3 阶段加载器,存储在特定位置。

其他加载器被配置为从注册表加载有效负载并将其传递给 Stage 3 库。

一些变体包括在运行时直接运行 .NET 代码的函数,而不依赖于另一个外部 Stage 3 库。

最后,我们观察了其他主要用于桌面系统的加载器来加载忍者木马。

针对桌面系统的其他攻击

第一波攻击专门针对 Microsoft Exchange 服务器,但从 2021 年 9 月开始,我们还观察到在中亚的桌面系统上检测到一组新的加载程序,其文件名为“01.09.2021 г..exe”、“03.09.2021” г.exe”、“нота мид кр регламент.exe”和“Тех.Инструкции.exe”。

这些文件是配置为运行 Ninja 组件的加载器,但它们作为嵌入 zip 档案的可执行文件分发,并通过流行的消息传递应用程序 Telegram 发送。

这些程序被配置为从另一个文件“license.txt”加载有效负载,该文件应该位于同一目录中。然后,恶意软件使用前面描述的“特殊解析函数”调用 Windows API 并使用 3DES (112) 位解密文件有效负载并解压缩解密的数据。

生成的有效负载是 Ninja 库,它将由加载程序在没有 DOS 标头的情况下映射到内存中,并将调用导出函数“Debug”来调用它。

如何检测 Samurai 后门

用于部署和保证 Samurai 持久性的整个感染方案旨在避免取证分析和最常见的表面检查。

正如我们所说,恶意代码是由合法的 svchosts.exe 进程加载的,这意味着通过简单的进程枚举无法检测到后门。

此外,通过观察开放的 TCP 端口无法发现后门,因为它使用 .NET HTTPListener 类,该类构建在 HTTP.sys 之上并允许不同进程共享相同的端口。对于 Samurai 后门,它使用端口 80 或 443,Microsoft Exchange 也使用这些端口。

我们将此后门检测为“HEUR:Backdoor.MSIL.Samurai.gen”,但在您没有使用我们的产品的荒谬情况下,检查后门是否正在运行的一种简单方法是尝试找到一个共享的 IoC在这篇博文中或尝试执行以下命令:

#>netsh http show servicestate verbose=yes

微软所述,该命令会显示 HTTP 服务的快照,您可以尝试查找可疑的注册 URL,如下所示:

Server session ID: ED00000020000013
    Version: 2.0
    State: Active
    Properties:
    ...
            Max bandwidth: inherited
            Max connections: inherited
            Timeouts:
                Timeout values inherited
            Number of registered URLs: 2
            Registered URLs:
                HTTP://*:80/OWA/AUTH/TOKEN/
                HTTPS://*:443/OWA/AUTH/TOKEN/

受害者

根据我们所知,我们知道 ToddyCat 将注意力集中在高知名度的目标上;其中大多数是政府组织和军事实体,以及军事承包商。

我们知道 2021 年 2 月之前发起的攻击针对的政府实体数量非常有限:

  • 台湾
  • 越南

在 ProxyLogon 发布后,世界各地的检测数量迅速增加,我们还观察到以下国家的受害者:

  • 阿富汗
  • 印度
  • 伊朗
  • 马来西亚
  • 巴基斯坦
  • 俄罗斯
  • 斯洛伐克
  • 泰国
  • 英国

2021 年 5 月之后,我们观察到其他变体和活动,这些变体和活动属于同一组,并影响了前面提到的大多数亚洲国家和以下国家:

  • 吉尔吉斯斯坦
  • 乌兹别克斯坦
  • 印度尼西亚
卡巴斯基对APT ToddyCat的分析
总体受影响的受害者地图

归因

不幸的是,我们无法将攻击归因于已知的 APT 组;出于这个原因,我们将这个实体命名为 ToddyCat。

在我们的调查中,我们注意到 ToddyCat 的受害者与多个华语群体通常针对的国家和部门有关。事实上,我们观察到三个不同的知名组织在相似的时间范围内被 ToddyCat 和另一个使用 FunnyDream 后门的说中文的 APT 组织入侵。

这种重叠引起了我们的注意,因为根据我们的遥测很少看到 ToddyCat 恶意软件集群;我们观察到三个不同国家的两个 APT 破坏了相同的目标。此外,在所有情况下,暂存位置都很接近,在一种情况下,它们使用相同的目录。

目标 1
C:\ProgramData\Microsoft\DRM\rundll.dll – FunnyDream 相关
C:\ProgramData\Microsoft\mf\svchost.dll – ToddyCat

目标 2
C:\ProgramData\adobe\avps.exe – FunnyDream 相关
C:\ProgramData\adobe\2.dll – ToddyCat

尽管有重叠,但我们目前对将 ToddyCat 与 FunnyDream 集群合并没有信心。考虑到我们发现的所有受害者的高调性质,他们可能对几个 APT 组织感兴趣。此外,尽管临时位置偶尔接近,但我们没有具体证据表明两个恶意软件家族直接交互(例如,一个部署另一个),并且特定目录经常被多个攻击者使用。

结论

ToddyCat 是一个复杂的 APT 组织,它使用多种技术来避免检测,从而保持低调。在调查过程中,我们发现了数十个样本,但尽管文件数量众多且活动持续时间长,但我们无法将攻击归因于已知组织;还有很多关于我们没有的操作的技术信息。

受影响的政府和军​​方组织表明,该组织专注于非常引人注目的目标,并且可能用于实现可能与地缘政治利益相关的关键目标。

根据我们的遥测,该组织对东南亚的目标表现出浓厚的兴趣,但他们的活动也影响到亚洲其他地区和欧洲的目标。

我们将继续监视该组并为您提供最新信息。

卡巴斯基情报报告服务的客户可以使用更多信息、IoC 和关于 ToddyCat 的 YARA 规则。联系方式:[email protected]

ToddyCat 的侵害指标(IOCs)

5cfdb7340316abc5586448842c52aabc Dropper google.log
93c186c33e4bbe2abdcc6dfea86fbbff Dropper
5a912beec77d465fc2a27f0ce9b4052b Dll Loader Stage 2 iiswmi.dll
f595edf293af9b5b83c5ffc2e4c0f14b Dll Loader Stage 3 websvc.dll
5a531f237b8723396bcfd7c24885177f Dll Loader Stage 2 fveapi.dll
1ad6dccb520893b3831a9cfe94786b82 Dll Loader Stage 2 fveapi.dll
f595edf293af9b5b83c5ffc2e4c0f14b Dll Loader Stage 3 sbs_clrhost.dll
8a00d23192c4441c3ee3e56acebf64b0 Samurai Backdoor
5e721804f556e20bf9ddeec41ccf915d Ninja Trojan

其他变种

33694faf25f95b4c7e81d52d82e27e7b 1.dll – Installer
832bb747262fed7bd45d88f28775bca6 Техинстр egov – ГЦП – Акрамов.exe – Loader
8fb70ba9b7e5038710b258976ea97c98 28.09.2021. Управление ИР и ИС.exe – Loader
ee881e0e8b496bb62ed0b699f63ce7a6 Loader
ae5d2cef136ac1994b63c7f8d95c9c84 Loader
5c3bf5d7c3a113ee495e967f236ab614 System.Core.dll – Loader
bde2073dea3a0f447eeb072c7e568ee7 wabext.dll – Loader
350313b5e1683429c9ffcbc0f7aebf3b rcdll.dll – Loader

Ninja C2地址

149.28.28[.]159
eohsdnsaaojrhnqo.windowshost[.]us

恶意文件路径

C:\inetpub\temp\debug.exe
C:\Windows\Temp\debug.exe
C:\Windows\Temp\debug.xml
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\web.exe
C:\Users\Public\Downloads\dw.exe
C:\Users\Public\Downloads\chrome.log
C:\Windows\System32\chr.exe
C:\googleup.exe
C:\Program Files\microsoft\exchange server\v15\frontend\httpproxy\owa\auth\googleup.log
C:\google.exe
C:\Users\Public\Downloads\x64.exe
C:\Users\Public\Downloads\1.dll
C:\Program Files\Common Files\microsoft shared\WMI\iiswmi.dll
C:\Program Files\Common Files\microsoft shared\Triedit\Triedit.dll
C:\Program Files\Common Files\System\websvc.dll
C:\Windows\Microsoft.NET\Framework\sbs_clrhost.dll
C:\Windows\Microsoft.NET\Framework\sbs_clrhost.dat
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\web.xml
C:\Users\Public\Downloads\debug.xml
C:\Users\Public\Downloads\cache.dat
C:\Windows\System32\config\index.dat
C:\Windows\Microsoft.NET\Framework\netfx.dat
%ProgramData%\adobe\2.dll
%ProgramData%\adobe\acrobat.exe
%ProgramData%\git\git.exe
%ProgramData%\intel\mstacx.dll
%ProgramData%\microsoft\drm\svchost.dll
%ProgramData%\microsoft\mf\svchost.dll
%ProgramData%\microsoft\mf\svhost.dll
%program files%\Common Files\services\System.Core.dll
%public%\Downloads\1.dll
%public%\Downloads\config.dll
%system%\Triedit.dll
%userprofile%\Downloads\Telegram Desktop\03.09.2021 г.zip
%userprofile%\Downloads\Telegram Desktop\Тех.Инструкции.zip
%userprofile%\libraries\1.dll
%userprofile%\libraries\chrome.exe
%userprofile%\libraries\chrome.log
%userprofile%\libraries\config.dll
C:\intel\2.dll
C:\intel\86.dll
C:\intel\x86.dll

注册表

$HKLM\System\ControlSet\Services\WebUpdate
$HKLM\System\ControlSet\Services\PowerService
$HKLM\SOFTWARE\Classes\Interface\{6FD0637B-85C6-D3A9-CCE9-65A3F73ADED9}
$HKLM\SOFTWARE\Classes\Interface\{AFDB6869-CAFA-25D2-C0E0-09B80690F21D}

from

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注