Write Ransomware in Rust——用Rust写勒索软件: (一)结构篇

免责声明

本文仅作为计算机/网络安全相关专业学生学习了解勒索软件的性质特点使用,作者不会使用其进行任何违法行为。任何人不应将之应用于教学目的以外的任何用途。学习者需严格遵守中华人民共和国大陆地区和香港特别行政区的法律法规,以及学习者本人所属/所在的国家/地区的法律法规。


相关阅读

勒索软件的基本结构

勒索软件的结构是基本一致的。从开源的 Hidden Tear 勒索软件开始,几乎所有的勒索软件都遵循着大致的结构。原因是勒索软件的目的和手段没有发生大的变化,且勒索软件的核心技术结构也没有大的变化。因此,想要编写一个勒索软件,首先需要按照几乎既定的模式进行结构组织。我将勒索软件的技术结构分为:交互层、逻辑层、加密层、传输层。下面我将对其分别进行解析。

分层解析

交互层

这一层的核心就一个词:欺骗。无论如何,勒索者都希望这一层能够具有更多的迷惑性,以此来说服用户和杀毒软件不要阻碍其实现真实目的。当然,正规软件渠道很少能够作为发布勒索软件的场所,因此,盗版软件和破解软件等软件的交互界面就成为了主要的模仿对象。

此外,这一层还需要集成勒索软件运行之后索要赎金的界面,用以后续与目标用户的交互。

由于这一层并非核心技术,所以我们不实现这一部分,也避免他人直接盗用我们的软件危害社会。

逻辑层

逻辑层的目的是调度。它可以在合适的时候调用其他模块的功能,以此完整地实现勒索软件的功能。因此,我也称之为勒索软件的主体。一般来讲,我们会在这里集成一些操作系统环境监测、文件检测等相关功能。

逻辑层需要进行一定的混淆,在保证加密过程性能调度的同时,也要让软件的行为尽可能接近正常的软件。这样才能有效避免杀软主动防御的查杀。

加密层

勒索软件的主要攻击形式至今仍然是加密用户文件并迫使用户支付赎金。那么,我们对加密模块有什么需求呢?我认为应当有以下几点:

  • 速度要快:我们希望用户对加密过程的感知尽量弱化,让用户缺少必要的反应时间;
  • 强度要高:勒索软件显然不希望自己被无密钥解密;
  • 实现方便:黑客们也会考虑成本。

综上所述,AES 显然是勒索软件的不二之选。原因有:

  • 速度快:绝大部分通用 CPU 具有对 AES 算法的硬件级/指令集级的优化(如:AES-NI),速度远超同理论时间复杂度的算法;
  • 强度高:作为美国和全世界的通用对称加密标准算法,久经考验,具备理论上和统计学上的强度证明;
  • 实现易:绝大多数编程语言和平台都有完备的 AES 实现。

但是 AES 同样带来了一个问题——作为一种分组对称加密算法,AES 的加密与解密采用的是相同的密钥,这使得勒索软件所传递的密钥很有可能在传输时被操作系统缓存或者直接被截获。于是有人想到:我们也许可以用非对称加密算法,比如 RSA 或 ECC 来进行加密。但是这样的问题是明显的:部分非对称加密算法(如 RSA)不能加密过大的数据;且非对称加密算法的速度远远慢于具有底层优化的 AES。

因此,出于这样的考虑,我们可以设计这样一个流程:首先生成一对 RSA 密钥,将公钥直接写死在程序上;之后在加密时随机生成一个 AES 密钥进行加密;再后在传输时直接用 RSA 公钥加密 AES 密钥,并发给攻击者;攻击者收到赎金后,用 RSA 私钥解密并将 AES 密钥发给用户进行解密。

传输层

由于在加密层,AES 密钥已经被 RSA 公钥加密了,因此此部分可以随意选择明文/加密传输。

在此处,我们只采用一个简单的 HTTP 实现,并用 Rocket 搭建勒索软件的服务器后端。


在下一篇,我们将分部分开始技术实现。

发表评论