Spartacus勒索软件是一个新的样本,已于2018年发行。原始样本是用C#编写的,经过模糊处理,我们将在提取到可读状态时对其进行检查。

斯巴达克斯相对来说比较直白ransomware示例,并使用一些类似的技术和代码,其他我们已经看到在过去,如ShiOne, Blackheart和Satyr。然而,这些样本和参与者之间并没有确定的关系。我提到它主要是为了说明它们共享相似的功能,并且在形式上是基本的。

在Satyr和Blackheart的案例中,代码几乎相同,Spartacus遵循几乎相同的代码流,并进行了一些修改。如果我做一个假设,我会说他们要么是同一个参与者,要么是使用相同代码的参与者。但是,到目前为止,没有事实证明这一点。

一般来说,我们注意到的是,会弹出一串。net勒索软件,它们或多或少都是相同或相似的。这只是犯罪分子正在创造的一种简单的勒索软件形式,因为它显然不需要太多的时间或想法来制作。

他们一点也不令人印象深刻,事实上恰恰相反。我只能说它们很无聊。那我们为什么要写其中一个呢?《斯巴达克斯》的分析基本上可以作为基础知识和参考,供任何分析这些基础的。net勒索软件变体的人使用,他们将来可能会遇到这些软件。

本文的两个要点是详细理解代码,以及理解如何使一个受混淆的. net示例处于可读状态。

斯巴达克斯

在我们开始之前,我想提一下斯巴达克斯加密方法的一个特点。Spartacus首先生成一个用于加密的唯一密钥分组密码算法。(分组密码algorithm是AES的一个版本。)

此密钥被保存并用于加密每个文件,这意味着两个相同的文件将具有相同的密码文本。AES密钥使用文件中嵌入的RSA密钥进行加密。密码文本经过编码,并在赎金通知中显示给用户。

RSA密钥是静态嵌入勒索软件的事实意味着私钥存在于勒索软件作者系统的服务器端。因此,如果这个密钥被泄露,那么来自这个特定菌株的所有受害者的所有AES密钥都可以使用这个密钥解密。

由于这个勒索软件并不十分复杂,我们将直接进行深入的技术分析和代码演练。

拆包

当我们第一次在ILSpy中打开斯巴达克斯的样本时,我们看到:

函数的代码是不可见的,正如您所看到的,一切都是模糊的。在这些场景中,我喜欢使用一个名为de4dot.它将处理文件并输出一个清晰可读的版本。-r标志是您设置目录的地方,其中包含了混淆的. net示例。

这给了我们一个清晰的版本,我们将在接下来的分析中使用它。

分析

让我们从下面显示的主函数开始。

它首先要确保这个恶意软件在系统上只运行一个实例。它是这样做的checkrun程序函数,该函数创建一个互斥锁并确保它是唯一的。

此检查完成后,将执行斯密方法3在一个线程。

在smethod_3开始之前,这个类的构造函数现在会被自动调用,并设置所有的私有成员(变量),其中包括所有要搜索和加密的特殊文件夹。它还生成AES密钥,这是唯一的受害者,使用KeyGenerator.GetUniqueKey (133)函数。特殊文件夹可以在下面查看,并将在整个勒索软件中引用,开始文件夹遍历。

我提到的keygen函数GetUniqueKey (),详情如下。本质上,它只是使用RNGCryptoServiceProvider。GetNonZeroBytesAPI函数。然后它使用这一系列随机数作为字符集的索引
array=“abcdefghijklmnopqrstuvwxyzabefghijklmnopqrstuvxyz1234567890”创建一个唯一的字符串。这是AES密钥,它将加密所有文件。

现在类的构造函数已经启动,让我们看看斯密方法3被调用的函数。

函数迭代在构造函数中生成的特殊文件夹列表,并开始递归遍历,对文件夹中的每个文件使用斯梅多夫6函数。这里我要注意的一点是,加密循环不会区分文件类型或特殊文件。它会对所有信息进行加密。同时,你可以看到斯梅托德1被召唤。这可能是程序员的一个遗留错误,因为它的输出没有在程序中的任何地方使用,并且在稍后向用户显示加密密钥时调用。

正如我提到的斯梅多夫6函数负责所有的加密,但是斯梅多夫5函数是一个递归函数,它会深入到它开始的位置的每个子文件夹,调用斯梅多夫6在每次迭代中加密该子文件夹中的文件。

如你所见,它调用自己,这样它最终会覆盖每一个子文件夹。然后它调用斯梅多夫6要进行实际的加密,请遍历该文件夹中的每个文件。

此方法迭代当前文件夹中的所有文件。唯一的规定是该文件尚未加密。这是这里的一部分,它只是确保扩展还没有完成.Spartacus:

if (Path.GetExtension(text) == "斯巴达克斯"){return;}

如果这个检查通过,它就会调用斯梅多夫7,它使用加密版本重写文件内容。

的函数调用斯梅托德0,它对原始文件数据进行加密,然后接下来的两行将加密的数据写入文件并使用斯巴达克斯先生扩展。一个简单的提示:每个文件都用相同的密钥加密的另一个标志是,这个勒索软件不会将加密的AES密钥写入文件,而我们在其他执行独特的文件加密的勒索软件中看到了这一点。

正如您在这里看到的,它使用Rijndael方法- aes使用ECB模式。构造函数中生成的键是用MD5散列的,它实际上是作为键本身使用的。

现在我们已经完成了在主文件系统上进行文件加密的整个过程,包括父函数中调用的所有子函数斯密方法3。

让我们回到main函数到下一行,它调用smethod_4():

斯密方法4基本上执行与我们在中看到的完全相同的递归函数调用集斯密方法3,但是,它现在不是遍历特殊的文件夹,而是遍历连接到系统的所有逻辑驱动器。因此,所有外部或映射驱动器也将被加密。

我们现在不需要讨论所有这些细节,因为我们已经介绍了它们的功能,因为它们与前面的函数调用是相同的。我唯一要说的是斯梅多夫6被称为两次。这样做最有可能是通过让加密在两个线程上运行来加快加密速度。

回到main:下一个也是最后一个重要的函数调用是:

应用程序。运行中(新Form1 ());

这将向用户显示赎金通知,并在赎金通知中显示加密的AES密钥。

它从调用smethod_1 (). 正如我前面提到的,这只需要获取AES密钥,该密钥在开始时生成,并使用硬编码的RSA公钥对其进行加密。

public static string smethod_1() {return return . tobase64string (Class1. class . class);smethod_2(“< RSAKeyValue > <模量> xA4fTMirLDPi4rnQUX1GNvHC41PZUR / fDIbHnNBtpY0w2Qc4H2HPaBsKepU33RPXN5EnwGqQ5lhFaNnLGnwYjo7w6OCkU + q0dRev14ndx44k1QACTEz4JmP9VGSia6SwHPbD2TdGJsqSulPkK7YHPGlvLKk4IYF59fUfhSPiWleURYiD50Ll2YxkGxwqEYVSrkrr7DMnNRId502NbxrLWlAVk / XE2KLvi0g9B1q2Uu wu9815ia8dsgybmftxky427ouoecc4jfqwjejlune8rvqzo5kllcvpdrevhd42nxiblulvz8 / PVrUgcxX + 4aiv4b7NabWH1zcd2buYHHyGLQ = = < /模量> <指数> AQAB指数< / > < / RSAKeyValue >”,Encoding.UTF8.GetBytes (Class2.smethod_0 ())));}

RSA密钥经过硬编码并嵌入到勒索软件中,这意味着作者已经提前生成了私钥。

然后它迭代所有驱动器,并在那里写勒索信。最后,它打开赎金说明,显示消息和rsa加密的AES密钥,受害者将使用该密钥进行解密。

在所有这些之后,它做的最后一件事就是调用斯梅托德0删除阴影卷,以防止用户将其用作Windows的还原点。

这个勒索软件是完全脱机的,因为没有网络通信回给作者或任何C2服务器。勒索软件的作者不知道他感染了谁,直到他们用自己的个人ID (AES密钥)给他发送电子邮件。这也意味着作者将发送的解密工具很可能嵌入了AES密钥,不幸的是,这对特定的受害者来说是唯一的。

这个样品没有什么特别或创新之处,但这并不意味着它不危险。它仍然可以完成它的工作——目前还没有针对它的解密器。如果你意识到你正在被这个恶意软件攻击,唯一的挽救你自己的可能性是执行一个进程内存转储,在这种情况下,有从内存中提取密钥的微小可能性。

通常,在杀死进程之前,在系统上执行一个内存转储总是一个好主意,因为有些密钥可能会被恢复。