ESET 研究人员发现了一种独特且以前未出现过的 Windows 二进制加载程序,与其他此类加载程序不同,它作为服务器运行并在内存中执行接收到的模块。研究人员将这个新的恶意软件命名为Wslink,Wslink是其中一个dll的名称。
在过去两年中,研究人员只在中欧、北美和中东的观察中发现过几次由Wslink发起的攻击。初始攻击向量是未知的,大多数示例都使用了MPRESS,部分代码是虚拟化的。不幸的是,到目前为止,研究人员还无法获得它应该接收的任何模块。根据对比,目前还有已知的恶意软件与它在代码、功能或操作上具有相似性。
接下来,我们将对加载程序和研究人员自己的客户端进行分析,这最初研究人员是用来测试检测方法的。这个客户端的源代码可能对恶意软件分析的初学者感兴趣,它展示了如何重用和与先前分析的恶意软件的现有功能进行交互。
技术分析
Wslink作为服务运行,侦听服务参数(Parameters)项的ServicePort注册表值中指定的端口上的所有网络接口。前面注册Wslink服务的组件是未知的。下图描述了接受到该端口的传入连接的代码。
接受传入连接的循环的 Hex-Rays 反编译
Hex-Rays号称最强悍的反编译工具。可以反编译VB VC BCB Delphi等等一切 x86/x64代码为C代码。
接受连接之后是使用硬编码的 2048 位公钥进行 RSA 握手,以安全地交换密钥和 IV,以用于 CBC 模式下的 256 位 AES。加密模块是随后收到一个惟一的标识符——签名以及用于解密的附加密钥。
有趣的是,最近接收到的带有其签名的加密模块是全局存储的,这使得它对所有客户端都可用。这种方式节省流量,如果要加载的模块的签名与前一个匹配,则只传输密钥即可。
接收模块及其签名的 Hex-Rays 反编译
使用MemoryModule库将解密的模块(它是一个常规PE文件)加载到内存中,并最终执行其第一次导出。用于通信、套接字、键和IV的函数以参数的形式传递给导出,使模块能够通过已经建立的连接交换消息。
在内存中执行接收模块的代码的Hex-Rays反编译
客户端实现
研究人员自己的Wslink客户端实现,如下所述,简单地与修改后的 Wslink 服务器建立连接,并发送一个模块,然后解密和执行该模块。由于研究人员的客户端无法知道在任何给定的Wslink服务器实例中与公钥匹配的私钥,因此研究人员生成了自己的密钥对,并使用来自该密钥对的公钥修改服务器可执行文件,并在研究人员的Wslink客户端实现中使用私钥。
该客户端使研究人员能够复制Wslink的通信和搜索独特的模式,这进一步证实了研究人员的发现,因为研究人员可以模仿它的行为。
最初,一些用于发送/接收消息的函数是从原始示例中获得的,且可以立即使用它们进行实现。
从Wslink示例中加载函数的代码
随后,研究人员的客户端从文件中读取要使用的私有RSA密钥,并建立到指定IP和端口的连接。预计Wslink的一个实例已经在提供的地址和端口上侦听。当然,其嵌入的公钥也必须替换为已知私钥的公钥。
研究人员的客户端和Wslink服务器继续执行握手,交换用于AES加密的密钥和IV。如下图所示分为三个步骤,发送客户端hello,接收带有IV的对称密钥,并将它们发送回来以验证成功解密。通过反转 Wslink 二进制文件,研究人员了解到hello消息的唯一约束,除了大小240字节之外,就是第二个字节必须为零,因此研究人员将其全部设置为零。
研究人员客户端的 RSA 握手密码
最后一部分是发送模块。如下图所示,分为以下四个简单步骤:
◼接收到之前加载的模块的签名,研究人员决定在实现中不使用它,因为它对研究人员不重要;
◼发送模块的硬编码签名;
◼从文件中读取模块,加密它并发送;
◼发送模块的加密密钥;
研究人员的客户端发送模块的代码
研究人员客户端用于加载和加密模块的代码
研究人员的客户端的完整源代码可以在WslinkClient GitHub存储库中找到。请注意,代码仍然需要大量的加工才能用于攻击,并且从头开始创建另一个加载程序会更容易。
总结
Wslink是一个小巧灵活的加载程序,与研究人员通常看到的加载程序不同,它作为服务器运行,并在内存中执行接收到的模块。
有趣的是,这些模块在通信、秘钥和套接字方面重用了加载程序的函数;因此,因此他们不必启动新的出站连接,Wslink 还具有完善的加密协议来保护交换的数据。
本文翻译自:https://www.welivesecurity.com/2021/10/27/wslink-unique-undocumented-malicious-loader-runs-server/如若转载,请注明原文地址