通信协议
Twizt 木马使用自己的二进制协议通过 TCP 或 UDP 进行通信,该协议允许它连接到 C&C 服务器以及其他受感染的计算机,并在主 C&C 服务器不可用时通过它们获取命令。早期版本的 Twizt 木马只有一个硬编码的 C&C 服务器 IP 地址。
后来,Twizt 木马二进制文件在其配置中获得了 512 个节点的嵌入 IP 地址列表。此外,它仍然从另一个节点或 C&C 服务器接收更新的节点列表。 Twizt 木马具有与其他节点交换加密消息的功能。
Twizt 木马原始通信示例
消息对重要数据使用多层加密,每条加密消息都有一个非常简单的格式:
数据是用硬编码密钥“twizt)”加密的,在所有的研究样本中都是一样的。解密后的消息是这样的:
来自木马的解密消息
无论消息结构如何,它都有以下必填字段:
Murmurhash3:为整个解密的消息(不包括哈希字段本身)计算哈希值。如果哈希无效,则节点不会处理该消息。
随机数:这可能是为了使每个消息都是唯一的。如果省略此字段,所有携带相同载荷的加密消息也将是相同的,并且很容易被检测为恶意通信。
NodeA SID / NodeB SID:本地或远程节点的唯一会话标识符,由节点随机生成。
消息类型:确定消息所携带的有效载荷的类型。
Flag:未知,可以是 0 或 1。
有效载荷大小:不能小于 8。
有效载荷:可能有不同的长度和格,并且可能根据消息类型字段而变化。有效载荷还包括一个NodeA SID/NodeB SID字段和有效载荷数据。 NodeB SID 字段可能包含本地或远程节点唯一会话标识符。在第一个请求中,该值为 0(8 字节)。在其他请求中,它可能采用另一个节点提供的值,或者可以根据消息类型设置为此节点 SID。
支持以下消息类型:
00 00 00 00——信标消息;
01 00 00 00——更新节点列表;
02 00 00 00——节点列表更新确认;
03 00 00 00——下载并执行;
通信流程
下图显示了两个节点之间的通信流程:
Twizt 木马通信流程示例
上图中,“节点A”代表本地节点(客户端); “节点 B”代表远程节点(服务器)。执行完整的交换周期后,恶意软件会继续与信标消息通信。
信标消息(节点 A -> 节点 B)
通信从客户端(发起连接的节点)发送的信标消息开始。此类消息具有以下特点:
NodeA SID:设置为预生成的随机数;
消息类型:等于0;
有效载荷大小:始终为 8。
有效载荷包含以下字段:
NodeB SID:是 4 个零字节;
有效载荷数据:是 4 个零字节。
信标消息示例
更新节点列表(节点 B -> 节点 A)
响应第一个有效信标消息的服务器通常会发送此消息,在更新节点列表消息中:
NodeA SID:设置为客户端先前提供的值;
消息类型:等于 1
有效载荷包含以下字段:
NodeB SID:服务器生成的编号;
有效载荷数据:包含一个节点列表;
RSA trailer:256 字节的 加密的RSA trailer,包含此消息类型中恶意软件未使用的数据。
更新的节点列表消息示例
有效载荷数据包含一个包含节点 IP 地址的 24 字节结构列表,该列表前面有节点数(上例中的 0x10)和 4 个零字节。列表中的每个条目都具有以下格式:
Rank 字段显示自节点在线以来经过的秒数。节点按等级升序排列。 C&C 服务器(或其他节点)向客户端发送最近在线的 16 个节点的列表。
发送此消息后,远程主机还会发送一条代码为 0 的消息(信标消息)。但是,字段 NodeA SID 和 NodeB SID 交换位置:
在更新节点列表消息之后发送的信标消息
节点列表更新确认(节点 A -> 节点 B)
客户端收到节点列表后,发送确认消息。请注意,NodeB SID 在这些消息中排在第一位。
在节点列表更新确认消息中:
消息类型:等于 2。
更新节点确认消息示例
然后客户端发送更新节点列表消息,其中包括其顶级活动节点的列表:
消息类型:等于 1。
客户端发送的更新节点列表消息
这使得客户端和服务器能够交换他们的节点列表。
运行命令(节点 B -> 节点 A)
为了响应来自客户端的更新节点列表消息,服务器可以发送命令以下载并运行另一个可执行文件,在这类消息中,NodeB SID首先出现。
消息类型:等于 3;
RSA 加密数据:256 字节缓冲区,可以使用恶意软件配置中的 RSA 公钥解密。该缓冲区等于更新节点列表消息中的 RSA 结尾部分。缓冲区包含验证完整性和使用 RC4 加密 URL 解密命令内容所需的 RC4 密钥和哈希值。
RC4 加密 URL:加密命令内容,包含一个或多个 RC4 加密 URL,用于下载要执行的文件。
运行命令消息示例
使用恶意软件配置中的 RSA 公钥解密 RSA 加密的数据,解密后的数据具有以下格式,并包含用于解密命令数据的 20 字节长度的 RC4 密钥(在本例中为 URL),以及 RC4 加密数据的 MD6-512 哈希(64 字节),MD6哈希之后的其余数据没有被使用。
运行命令消息的 RSA 解密内容
来自 RSA 缓冲区的“Unknown1”和“Unknown2”字段具有未知用途,在命令解析期间不会使用它们。“Encrypted data length”字段包含 RC4 加密数据的长度。解密 RSA 缓冲区后,我们还可以解密 URL。整个解密流程如下:
运行命令消息的解密和完整性验证流程
我们无法创建 RSA 加密的数据,因为我们没有私钥。但是,如果我们通过从 C&C 服务器收到的 RSA 加密数据中提取 RC4 密钥,我们就可以使用此密钥加密虚假URL。木马可以成功解密虚假 URL,但不会执行该命令,因为它使用 64 字节 MD6 哈希值验证消息完整性,该值也存储在 RSA 加密数据中。
使用修改后的 MD6-512 算法,Twizt 计算来自 RC4 加密 URL(由上图中的红色框表示)的 64 字节哈希值,并将其与来自 RSA 加密数据的参考值进行比较。如果值不相等,则不执行该命令。
MD6 哈希验证
早期的 Twizt 版本仅支持一个 URL,较新版本的 Twizt 木马支持以下格式的多个 URL:
d|http ://185.215.113[.]84/alfa_|http ://185.215.113[.]84/beta_
前缀中的字符“d”可能意味着下载命令,目前只支持“下载”命令:
解析解密的命令内容
节点列表文件
由于 Twizt 是一个点对点木马,它需要存储有关其他已知节点的数据以及它在进一步传播时收到的命令。当恶意软件收到更新的节点列表时,它会将此列表保存到位于 %userprofile% 目录中的隐藏配置文件“nodescfg.dat”中:
节点配置文件路径
节点数据以 8 字节结构存储(未加密):
“最后访问时间戳”字段是从1980年到节点最后一次在线的秒数。它是通过NtQuerySystemTime和RtlTimeToSecondsSince1980获得的:
设置成功访问节点的最后访问时间戳
下面是一个节点列表文件内容的示例:
节点列表文件格式
恶意软件启动时会加载包含节点列表的文件,通过这种方式,木马会保存一个节点列表以便在重新启动后使用。
命令配置文件
当 Twizt 木马收到来自 C&C 服务器或其他节点的命令时,它会将命令保存到位于 %userprofile% 目录中的“cmdcfg.dat”文件中,命令以与从服务器接收到的相同的形式保存。因此,它包括 RSA 加密的标头和 RC4 加密的命令数据。
命令配置文件格式
当恶意软件作为一个服务器,它发送从命令配置文件加载的数据不变。这会允许木马交换从 C&C 服务器收到的命令,而无需使用RSA私钥对命令进行签名。
下载程序
有两种情况 Twizt 木马可以下载额外的有效载荷。
第一个选项是使用硬编码的基本 URL 和路径列表。因此,Twizt 尝试使用生成的 URL 下载有效载荷。 Twizt 通常使用六个路径。我们观察到以下路径组合:
恶意软件会遍历路径并检查附加的基本 URL(“https://185[.]215.113.84/”和“https://185[.]215.113.84/twizt/”中的分析的样品)。检查之间的延迟为 1 秒。下载尝试在单独线程中的无限循环中执行。 Twizt 在下载周期之间使用 90 秒的长延迟:
从存储在示例中的 URL 下载有效载荷
第二种情况是当Twizt从C&C服务器或另一个节点接收到相应的命令时,Twizt可以下载额外的有效载荷。在尝试下载有效载荷之前,恶意软件会检查其大小。如果有效载荷的大小小于5000字节,则不会下载。
恶意软件希望收到一个加密文件,该文件保存在名为“%temp%\{n1}{n2}.exe”的“%temp%”文件夹中,其中{n1}和{n2}是10000到40000之间的随机数。Twizt使用以下User-agent头文件下载:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36
有效载荷解密
有效载荷下载后,以原始加密形式保存。恶意软件使用 CreateFileMapping/MapViewOfFile 将文件数据映射到内存中。文件的前 256 个字节是 RSA 加密的标头。有效载荷数据使用来自标头的 16 字节 RC4 密钥解密。
具有 MD5 哈希“9fa3010c557db8477aec95587748dc82”的样本包含以下 RSA 公钥:
在与 C&C 服务器通信后,木马会从 URL“https://185[.]215.113.84/xgettin”下载了一个带有 MD5 哈希值“43750aaa981077dde08d61fe2b7d1578”的文件。
该文件以 RSA 加密的标头开头,长度为 256 字节:
phorpix下载文件的加密内容
使用 RSA 公钥解密标头后,它具有一个非常简单的格式:
我们可以使用标头中的 RC4 密钥来解密有效载荷:
解密 Phorpiex 下载的文件
当载荷在 C&C 服务器上准备好时,未加密载荷的 murmurhash3 128 位值在载荷加密期间用作 RC4 密钥。 Twizt 计算解密有效载荷的 murmurhash3 值并将其与 RC4 密钥进行比较。恶意软件仅在值相同时才执行有效载荷:
下载文件的完整性验证
总结
直到最近,Phorpiex 才被认为是一个复杂的僵尸网络。因为它的所有模块都很简单,执行的功能最少。早期版本的 Tldr 模块没有对有效载荷使用加密。然而,这并没有阻止僵尸网络的攻击。
具有蠕虫或病毒功能的恶意软件可以在很长一段时间内继续自主传播,而无需其开发者进一步参与。然而,在大多数情况下,开发者需要使用C&C服务器来控制木马,从而能够从僵尸网络中获利。我们应该注意到,对于phorpix这样规模的僵尸网络来说,很难找到不影响C&C服务器的可靠主机。如果将 C&C服务器的 IP 地址添加到拒绝列表中,则创建者将进一步处于不利地位,从而降低控制僵尸网络的效率。更改 C&C 服务器的 IP 地址可能非常困难。
Phorpiex 僵尸网络使用的技术无需 C&C 服务器即可有效实现其目标。我们在本文介绍了用于这种规模僵尸网络的加密货币裁剪技术可以产生的可观利润(每年数十万美元),并且不需要通过 C&C 服务器进行任何类型的管理。
在过去的一年中,Phorpiex 收到了一项重大更新,将其转变为点对点僵尸网络,允许它在没有集中式基础设施的情况下进行管理。C&C 服务器现在可以更改其 IP 地址并发出命令。
安全提示
当复制和粘贴加密钱包地址时,请务必仔细检查原始地址和粘贴地址是否匹配;
在发送大量加密货币之前,首先发送一个最小金额,探测交易的真实性;
保持操作系统更新,不要从未经验证的来源下载软件;
跳过广告,如果你想在加密领域寻找钱包或加密交易和交换平台,请务必查看搜索中的第一个网站,而不是广告。搜过结果可能会误导你,因为CPR已经发现攻击者使用谷歌广告偷加密钱包;
始终仔细检查 URL。
本文翻译自:https://research.checkpoint.com/2021/phorpiex-botnet-is-back-with-a-new-twizt-hijacking-hundreds-of-crypto-transactions/如若转载,请注明原文地址