royal_randomeware analysis

这次分析的royal randomeware是一个勒索软件。他最近非常活跃(最后一次报告就是今天早上)。其实原理还是挺简单的。总共分析起来也不算特别复杂。

royal ransomeware分析

给的样本是一个x86-64架构的ELF文件。

image-20230207130025265

命令行参数分析

id参数

该软件是一个64位,没有经过加壳的可执行文件。在main()函数中,首先,他将从命令行获取参数。包括”-id”,“-ep”,”-stopvm”,”-fork”,”-logs”

image-20230207155025850

其中”-id”从命令行接受一个32byte的字符,这个ID在后面被用来输出到加密后生成的readme中。

image-20230207130739054

image-20230207130625464

上述id将会被输入到的网址部分如下所示。是受害者需要联系的一个网址

image-20230207151328797

同时,在样本中追溯socket函数调用,发现并不存在上述说明中所说的,文件被转移到一个安全的服务器上。并没有调用任何socket函数。

image-20230207150821110

ep参数

ep参数指代了需要加密的起始文件夹。读取时会递归查找指定文件夹下面的子文件夹。判断如果后缀没有已经加密过的标记则将其加入待加密队列中。

image-20230207151822702

image-20230207151911065

stopvm参数

stopvm参数将会停止所有运行中的esxcli虚拟机。通过以下命令。相关汇编和伪代码如下所示。

1
2
esxcli vm process list > list # 读取所有运行中的虚拟机,获取其ID
esxcli vm process kill --type=hard --world-id=%s # 强行关闭所有上述获得到的虚拟机

image-20230207152311397

image-20230207152327739

加密部分

在解析上述命令行参数之后,进入加密阶段。加密函数主要在0x40B641的线程函数中。程序会根据sysconf获取CPU核数,从而计算开启多少加密线程。

image-20230207152556225

加密阶段首先会导入KEY。这个KEY是一个RSA的公钥,被硬编码在文件中。

image-20230207152754582

接着程序申请了一个堆块用来保存作为加密中文件以及加密结果的临时储存空间。堆块大小为0xfa000字节。

image-20230207152900972

接下来就开始不断地从上述从ep参数中获取的起始文件夹下面的所有文件的队列中取出文件,并打开。

image-20230207153121658

打开之后进入真正的加密函数encrypt中,位置如下所示。这里会将文件内容加密,并重新储存。在后文会分析encrypt的具体内容。

image-20230207153237044

在加密完之后,会重命名文件。

image-20230207153438591

encrypt()

接下来着重看是如何做到加密的。首先,生成两个大小分别为0x20以及0x10的随机数,生成方法首选是从openssl中RAND_get_rand_method中获取一种随机数生成方法来生成。如果不成功,则从/dev/urandom中读取并生成。

image-20230207153818620

接下来,使用上面load过的RSA公钥来加密上述0x20大小的随机字串,用来作为后续AES加密的密钥。使用的是openssl的RSA_public_encrypt函数。

image-20230207154011719

接着开始计算文件需要加密的轮数。这里计算是根据文件大小进行的。

image-20230207154216190

接下来设置AES的密钥为上述RSA加密的结果,并调用openssl的AES加密函数进行加密。一次加密至多1024000字节,也就是1MB。超出1MB的需要多轮加密。轮数就是上面计算的内容。可以发现勒索文件直接把加密之后的内容写回了文件,没有保存备份。

image-20230207154501311

对应的汇编文件位置如下所示。

image-20230207154649552

在加密之后,勒索软件把使用RSA加密之前的随机数、文件原始大小、轮数信息写到了文件的末尾。应该是后续用来恢复使用。

image-20230207154913229

经过上述过程,就算是加密完了一个文件,之后的内容就是修改名字,然后继续在队列中找到下一个可以加密的文件进行加密。

总结

上述勒索软件识别所有的被顶目录下的文件(readdir返回的文件类型为DT_REG的文件,也就是regular file)。采用的加密算法是首先读取随机数(通过openssl或者/dev/urandom),并将其用RSA公钥加密得到的内容作为AES-CBC加密的密钥,使用OPENSSL的AES-CBC加密方式加密。钱包地址信息也非常聪明的没有直接显示在ELF文件中,而是需要命令函数输入,格式化字符串的方式显示给用户,如下所示。

image-20230207151328797

该勒索软件没有地区豁免功能。

通过谷歌查找上述网址对应组织,可以查到以下内容

img

以下网址包含了对该组织的介绍。

https://ransomwatch.telemetry.ltd/#/profiles?id=royal

该勒索软件会把源文件加密后的内容,RSA加密之前的随机数,加密轮数,文件大小放在源文件结尾,并将加密之后的文件重命名。加密过程中会识别文件后缀名中是否存在.royal_u,royal_w,.sf,.v00,.b00,.royal_log_,’readme’字符串,如果有则不进行加密。

样本不存在反调试或者反沙箱手段。可以在IDA_PRO中正常反编译,可以在Ubuntu22.04虚拟机中正常运行(vmware)。

文章目录
  1. 1. royal ransomeware分析
    1. 1.1. 命令行参数分析
      1. 1.1.1. id参数
      2. 1.1.2. ep参数
      3. 1.1.3. stopvm参数
    2. 1.2. 加密部分
      1. 1.2.1. encrypt()
  2. 2. 总结
|