ESET研究人员最近发现了一种新的未被公开的模块化后门,SideWalk,正在被一个APT小组使用,研究人员将其命名为sparlinggoblin,这个后门最近攻击一家美国电脑零售公司,这个后门与该组织使用的另一个后门 CROSSWALK 有很多相似之处。
SideWalk是一个模块化后门,可以动态加载从其C&C服务器发送的额外模块,使用Google Docs 作为dead drop resolver,并使用Cloudflare worker作为C&C服务器。CloudFlare Worker 是 CloudFlare 提供的无服务器应用程序,有免费版,可以用来测试 JS 脚本。
2019年11月,研究人员发现了Winnti组织针对香港几所大学的活动,在该活动中,攻击者主要利用ShadowPad后门和Winnti恶意软件,但也利用Spyder后门和基于DarkShell的后门,研究人员将其命名为Doraemon。之后,研究人员观察到多个针对世界各地使用类似工具集和ttp的组织的攻击。考虑到这些特定的ttp,并避免增加“Winnti组织”标签的混淆,研究人员决定将这组活动记录为一个新组织,研究人员将其命名为SparklingGoblin,研究人员相信它与Winnti组织有关。
自2020年年中以来,SparklingGoblin一直非常活跃,并在2021年持续了活跃状态。该组织的目标主要是东亚和东南亚
SideWalk后门是chacha20加密的shellcode,由SparklingGoblin的基于installutil的. net加载程序从磁盘加载。
SideWalk分段机制
如下所示,SideWalk后门与CROSSWALK有许多相似之处,后者是FireEye公司APT41开发的模块化后门。
第一阶段
SideWalk 的 shellcode 以 Microsoft.WebService.targets 的名义在磁盘上加密部署,并使用 SparklingGoblin 的基于 InstallUtil 的 .NET 加载器加载,该加载程序使用修改过的ConfuserEx来混淆,ConfuserEx是该组织经常使用的 .NET 应用程序的开源保护程序。
SparklingGoblin的.NET加载程序通过使用以下一个文件名的计划任务进行持久化:
任务开始;
任务管理器;
网络服务;
它使用 InstallUtil.exe 实用程序使用以下命令执行加载程序:
其中 InstallWebService.sql 是恶意的 .NET 加载程序。当以 /U 标志开始时,如下所示,将调用来自 .NET 加载程序的 UPrivate 命名空间方法中的 USCInstaller 类的 Uninstall 方法。
基于 InstallUtil 的加载器的层次结构
上图显示了由Uninstall方法调用的RunShellcode方法的消除混淆版本。
Uninstall 方法调用的 .NET 加载程序方法,该方法解密并注入 shellcode
如上所述,加载程序负责从磁盘读取加密的shellcode,对其进行解密,并使用process hollowing 技术将其注入合法的进程。请注意,使用的解密算法因示例而异。
另外,需要注意的是,SparklingGoblin使用了各种不同的shellcode加载程序,如mottug加载程序和基于chacha20的加载程序。Motnug 是一个非常简单的 shellcode 加载器,经常用于加载 CROSSWALK 后门,而基于 ChaCha20 的加载器,顾名思义,用于解密和加载使用 ChaCha20 算法加密的 shellcode。这个加载器中使用的 ChaCha20 实现与下面描述的 SideWalk 后门中使用的相同。此实现是基于计数器的(CTR 模式),使用 12 字节的随机数和 32 字节的密钥,计数器值为 11,导致以下初始状态:
0x0000000B计数器值不同于通常的ChaCha20实现,在ChaCha20实现中它通常被设置为0
初始化
与 CROSSWALK 类似,SideWalk shellcode 使用一个主要结构来存储字符串、变量、导入地址表 (IAT) 及其配置数据。然后将此结构作为参数传递给所有需要它的函数。在 SideWalk 的初始化过程中,首先将字符串解密并添加到结构中,然后填充负责存储 IAT 的结构部分,最后解密 SideWalk 的配置。
数据和字符串池解密
在执行开始时,shellcode 末尾的数据部分使用 XOR 循环和这个 16 字节的密钥解密:B0 1D 1E 4B 68 76 FF 2E 49 16 EB 2B 74 4C BB 3A。此部分解密后将包含 SideWalk 将使用的字符串,包括:
注册表项;
解密密钥;
从 C&C 服务器接收的写入文件的路径;
要使用的 HTTP 方法;
HTTP 请求参数;
用于检索本地代理配置的 URL;
用于从 Google Docs 文档中检索加密 IP 地址的分隔符;
解密后的字符串池如下图所示。
来自 SideWalk 的解密配置字符串
与 SideWalk 类似,CROSSWALK 也通过使用 XOR 循环和 16 字节密钥解密字符串池来开始执行。
指令解密
在对 shellcode 末尾的数据部分进行解密后,SideWalk 然后继续解密其余指令(从偏移量 0x528 开始),使用相同的 XOR 循环和不同的 16 字节密钥:26 74 94 78 36 60 C1 0C 41 56 0E 60 B1 54 D7 31。
防篡改技术
一旦解密了数据和代码,SideWalk 将继续通过计算 32 位校验和来验证其完整性,每 32 位字将结果向右旋转 13 位,并将哈希值与对应于未篡改的shellcode的引用值进行比较。如果哈希值与参考值不同,则它退出。这允许shellcode检测代码的断点或补丁,并避免在这种情况下执行。相应的反编译代码如下图所示。
SideWalk防篡改程序反编译代码
IAT
除了字符串池之外,解码后的数据还包含要加载的 DLL 的名称以及函数名称的哈希值。与使用哈希的字符串表示的 CROSSWALK 相反,哈希直接存储在其原始二进制表示中。在解析了导入地址之后,主结构的相应部分如图7所示。要加载的DLL的名称以灰色突出显示,要导入的Windows API函数名称的哈希值用紫色表示,导入函数的地址用绿色表示。
SideWalk 的 IAT 结构
SideWalk对解码数据中列出的每个dll的导出进行迭代,并使用自定义哈希算法对它们进行哈希,然后将它们与要导入的函数名的哈希值进行比较。一旦找到匹配项,匹配函数的地址就会添加到主结构中。
配置
一旦IAT被填充,SideWalk将继续解密它的配置。配置使用ChaCha20算法加密,解密密钥是上面提到的字符串池的一部分。ChaCha20实现与基于ChaCha20的加载程序使用的实现相同。解密后的配置包含了SideWalk用于正确操作的值,以及 update.facebookint.workers[.]dev C&C 服务器,以及 Google Docs 文档的 URL,该文档稍后被用作dead-drop解析程序。
请注意,update.facebookint.workers[.]dev 域是一个 Cloudflare 工作程序,它允许恶意软件操作员自定义服务器,在广泛使用的公共 Web 服务上运行。在该活动期间,SparklingGoblin 还使用了 Cobalt Strike 的 Cloudflare 工作域:cdn.cloudfiare.workers[.]dev。
网络活动
SideWalk 的一项功能是在开始与 C&C 服务器通信之前检查是否存在代理配置。为此,它尝试了两种技术:
调用 API 函数 WinHttpGetIEProxyConfigForCurrentUser,其配置中包含预定义的 URL:
https://msdn.microsoft.com
https://www.google.com
https://www.twitter.com
https://www.facebook.com
如果 SideWalk 能够将其权限调整为 SeDebugPrivilege,它会尝试从 HKU\< user SID >\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer检索代理配置。否则,它会尝试从HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer获取它。
如果找到了代理,SideWalk将使用它与C&C服务器通信。这种行为与 CROSSWALK 处理代理的方式非常相似。
SideWalk试图通过从explorer.exe窃取用户令牌(要搜索的进程名在配置中)并调用Windows API WinHttpGetIEProxyConfigForCurrentUser来获取当前用户会话的代理配置。
请注意,SideWalk 具有模拟登录用户的必要权限,因为它由基于 InstallUtil 的 .NET 加载程序加载,该加载程序作为计划任务持续存在,因此在 SYSTEM 帐户下运行。反编译过程如下图所示。
在检索代理配置之前负责模拟用户的反编译代码
请求格式
SideWalk使用Google Docs 页面作为dead-drop解析程序,如下面的截图所示,在编写本文时,它仍然是打开的。请注意,任何人都可以编辑此页面。
SideWalk 用作dead-drop解析程序的 Google Docs 文档
页面上显示的字符串格式如下图所示:
Google Docs 文档中字符串的格式
该字符串由以下部分组成:
用于正确解析的分隔符;
有效载荷及其大小,包括一个 ChaCha20 加密的 IP 地址、解密它的密钥,以及用于完整性检查的解密密钥的哈希值;
当前未使用的其他字符串;
为了便于将来使用该格式,研究人员在 GitHub 存储库中提供了一个脚本。
解密后的 IP 地址为 80.85.155[.]80。该 C&C 服务器使用 facebookint[.]com 域的自签名证书。该域已归属于 Microsoft 的 BARIUM,它与我们定义的 Winnti Group 部分重叠。由于此 IP 地址不是恶意软件使用的第一个 IP 地址,因此它被认为是备选地址。
SideWalk 用于与其 C&C 服务器通信的通信协议是 HTTPS,发送到 C&C 的 POST 请求标头的格式可以在下图中看到。
SideWalk使用的POST请求示例
URL 以及 gtsid 和 gtuvid 参数的值都是随机生成的。Host 字段是从 Google Docs 获取的 IP,或者设置为 update.facebookint.workers[.]dev。 POST 请求的数据是加密的有效载荷。此请求使用的格式是SideWalk操作符在C&C服务器和受感染设备之间使用的通信格式,例如请求和响应。POST请求数据的格式如下图所示。
POST请求数据的格式
请注意,此格式用于请求和响应,这意味着当 SideWalk 处理从 C&C 服务器发回的数据时,它会根据相同的格式对其进行解析。 CROSSWALK 和 SideWalk 在 C&C 服务器通信端没有特别的相似之处。
在这种格式中,字段是:
hash:从0x10到payload的total_size的数据哈希值。哈希算法是对哈希数据的不同部分进行多次 MD5 调用的自定义哈希组合。
size:大小等于total_size – 0x0D。
key1, key2:ChaCha20 密钥,用于加密头缓冲区和数据缓冲区。
参数缓冲区:可选缓冲区(可能是 0…0)。
受害者 ID:身份验证信息,它是各种设备信息(包括设备 GUID 和计算机名称)的自定义哈希的结果。
执行 ID:在启动线程之前,此 ID 是使用 CryptGenRandom 生成的,。每次执行都不同。
命令 ID/响应 ID:当恶意软件向 C&C 服务器发出请求时,恶意软件已处理的操作 ID,以及当它是 C&C 服务器对恶意软件的响应时要执行的命令 ID。
计数器:自当前 SideWalk 进程启动以来执行的命令数。
数据:由恶意软件获取或由 C&C 服务器发送的 ChaCha20 加密、压缩数据。
压缩大小:LZ4 压缩数据的大小。
数据大小:未压缩的数据大小。
标头缓冲区和数据缓冲区使用相应的密钥进行加密,第一个代表识别受感染设备的元数据,第二个缓冲区对应于 C&C 服务器和恶意软件之间共享的实际数据,下图显示的这些字段的详细信息在解密后可见。
功能
当研究人员开始分析SideWalk时,由于其 C&C 服务器已经关闭,在不知道 C&C 服务器发送的数据的情况下无法完全理解某些可能的操作,但下表中记录了恶意软件的大部分功能。
SideWalk支持的C&C命令如下所示:
注意:由于研究人员没有从C&C服务器检索任何插件,因此很难评估SideWalk的全部功能。
CROSSWALK 连接
尽管 SideWalk 和 CROSSWALK 代码不同,但这两类代码在架构上有很多相似之处,包括类似的反篡改技术、线程模型和数据布局,以及在执行过程中处理数据的方式。在功能方面,这两个后门都是模块化的,能够处理代理以与其 C&C 服务器正确通信。
考虑到所有这些相似性,研究人员认为SideWalk和CROSSWALK很可能是由相同的开发者编写的。
系统架构
SideWalk和CROSSWALK的线程模型非常相似。开发者在线程之间划分任务,并使用PostThreadMessage Windows API调用在线程之间进行通信。例如,一个线程负责发出请求,一旦它得到响应,它就会把响应传递给相应的线程。
编程风格也非常相似:使用功能性方法。数据结构存储配置、字符串和导入,并将其作为参数传递给所有需要它的函数。
以下有一些函数原型:
__int64 getMachineGuid(main_struct* main_struct, __int64 machineguid)
__int64 writeBufferToFile(main_struct* main_struct,__int64 缓冲区,无符号整数 nbBytes)
__int64 recv(main_struct* main_struct, __int64 socket, unsigned int nbBytes, __int64 buffer)
SideWalk 和 CROSSWALK 都是模块化后门,可以加载 C&C 服务器发送的附加模块。 SideWalk 模块处理的实现方式类似于 CROSSWALK。一些可能的模块操作是执行、安装和卸载。
功能
与CROSSWALK一样,在初始化过程中,SideWalk在开始执行时使用ROR4循环计算shellcode的32位哈希值。
CROSSWALK 和 SideWalk 收集类似的工件,其中包括:
IP配置;
操作系统版本;
用户名;
计算机名称;
文档名称;
当前进程 ID;
当前时间;
CROSSWALK 和 SideWalk 中的代理处理是相同的。两者都使用通用的合法 URL(例如 https://www.google.com 或 https://www.twitter.com)和 WinHttpGetIEProxyConfigForCurrentUser Windows API 调用来检索代理配置。
数据布局
SideWalk和CROSSWALK遵循相同的shellcode布局,指令后面跟着字符串、IAT和加密的配置数据。
数据处理
SideWalk 和 CROSSWALK 都以相同的方式处理 shellcode 末尾的数据:
首先,使用 16 字节 XOR 循环解密数据部分;
然后,来自存储在数据部分中的名称哈希的函数地址被解析并存储在其主结构中(指向数据部分中的 IAT);
最后,其包含 C&C 服务器地址的配置被解密(尽管 SideWalk 使用的解密算法不同);
SideWalk 和 CROSSWALK 的相似之处如下:
总结
SideWalk是一个由sparlinggoblin APT团队使用的未被公开的后门。它很可能是由与CROSSWALK背后的开发组织相同的开发人员设计的。
本文翻译自:https://www.welivesecurity.com/2021/08/24/sidewalk-may-be-as-dangerous-as-crosswalk/如若转载,请注明原文地址