这次分析的royal randomeware是一个勒索软件。他最近非常活跃(最后一次报告就是今天早上)。其实原理还是挺简单的。总共分析起来也不算特别复杂。
royal ransomeware分析
给的样本是一个x86-64架构的ELF文件。
命令行参数分析
id参数
该软件是一个64位,没有经过加壳的可执行文件。在main()函数中,首先,他将从命令行获取参数。包括”-id”,“-ep”,”-stopvm”,”-fork”,”-logs”
其中”-id”从命令行接受一个32byte的字符,这个ID在后面被用来输出到加密后生成的readme中。
上述id将会被输入到的网址部分如下所示。是受害者需要联系的一个网址
同时,在样本中追溯socket函数调用,发现并不存在上述说明中所说的,文件被转移到一个安全的服务器上。并没有调用任何socket函数。
ep参数
ep参数指代了需要加密的起始文件夹。读取时会递归查找指定文件夹下面的子文件夹。判断如果后缀没有已经加密过的标记则将其加入待加密队列中。
stopvm参数
stopvm参数将会停止所有运行中的esxcli虚拟机。通过以下命令。相关汇编和伪代码如下所示。
1 | esxcli vm process list > list # 读取所有运行中的虚拟机,获取其ID |
加密部分
在解析上述命令行参数之后,进入加密阶段。加密函数主要在0x40B641的线程函数中。程序会根据sysconf获取CPU核数,从而计算开启多少加密线程。
加密阶段首先会导入KEY。这个KEY是一个RSA的公钥,被硬编码在文件中。
接着程序申请了一个堆块用来保存作为加密中文件以及加密结果的临时储存空间。堆块大小为0xfa000字节。
接下来就开始不断地从上述从ep参数中获取的起始文件夹下面的所有文件的队列中取出文件,并打开。
打开之后进入真正的加密函数encrypt
中,位置如下所示。这里会将文件内容加密,并重新储存。在后文会分析encrypt的具体内容。
在加密完之后,会重命名文件。
encrypt()
接下来着重看是如何做到加密的。首先,生成两个大小分别为0x20以及0x10的随机数,生成方法首选是从openssl中RAND_get_rand_method
中获取一种随机数生成方法来生成。如果不成功,则从/dev/urandom
中读取并生成。
接下来,使用上面load过的RSA公钥来加密上述0x20大小的随机字串,用来作为后续AES加密的密钥。使用的是openssl的RSA_public_encrypt
函数。
接着开始计算文件需要加密的轮数。这里计算是根据文件大小进行的。
接下来设置AES的密钥为上述RSA加密的结果,并调用openssl的AES加密函数进行加密。一次加密至多1024000字节,也就是1MB。超出1MB的需要多轮加密。轮数就是上面计算的内容。可以发现勒索文件直接把加密之后的内容写回了文件,没有保存备份。
对应的汇编文件位置如下所示。
在加密之后,勒索软件把使用RSA加密之前的随机数、文件原始大小、轮数信息写到了文件的末尾。应该是后续用来恢复使用。
经过上述过程,就算是加密完了一个文件,之后的内容就是修改名字,然后继续在队列中找到下一个可以加密的文件进行加密。
总结
上述勒索软件识别所有的被顶目录下的文件(readdir返回的文件类型为DT_REG
的文件,也就是regular file
)。采用的加密算法是首先读取随机数(通过openssl或者/dev/urandom),并将其用RSA公钥加密得到的内容作为AES-CBC加密的密钥,使用OPENSSL的AES-CBC加密方式加密。钱包地址信息也非常聪明的没有直接显示在ELF文件中,而是需要命令函数输入,格式化字符串的方式显示给用户,如下所示。
该勒索软件没有地区豁免功能。
通过谷歌查找上述网址对应组织,可以查到以下内容
以下网址包含了对该组织的介绍。
https://ransomwatch.telemetry.ltd/#/profiles?id=royal
该勒索软件会把源文件加密后的内容,RSA加密之前的随机数,加密轮数,文件大小放在源文件结尾,并将加密之后的文件重命名。加密过程中会识别文件后缀名中是否存在.royal_u
,royal_w
,.sf
,.v00
,.b00
,.royal_log_
,’readme’字符串,如果有则不进行加密。
样本不存在反调试或者反沙箱手段。可以在IDA_PRO中正常反编译,可以在Ubuntu22.04虚拟机中正常运行(vmware)。