近日,360天眼实验室发现,敲诈者病毒Locky家族出现新变种thor,被病毒加密后的文件后缀为.thor。
Locky最早出现于2016年年初【敲诈者病毒Locky编年史】,此后经历多次变种,包括6月27日的zepto变种,9月28日的Odin变种,本次的新变种为thor主要通过包含JS、VBS的钓鱼邮件进行传播,JS/VBS脚本从网络上下载勒索软件,通过rundll32.exe带指定启动参数进行加载。样本执行后在内存中解密执行,解密后才是真正的恶意功能代码。勒索软件会对系统中的文件进行扫描,对指定扩展名的文件进行加密操作,加密后的文件后缀被改为.thor,加密完成后电脑桌面图片上显示勒索信息提示用户交解密赎金。
具体的攻击流程是:攻击者使用带有恶意附件的邮件进行钓鱼攻击,用户在点击了附件中的VBS脚本文件后,VBS脚本文件负责从网络上下载敲诈者病毒,通过rundll32.exe并带指定启动参数进行加载。样本执行后在内存中解密执行,解密后才是真正的功能代码。敲诈者病毒会对系统中的文件进行扫描,对磁盘上指定类型的文件进行加密,被样本加密后的文件后缀为.thor。样本加密文件所使用的密钥为随机生成,加密算法为AES-CBC-256,用样本内置的RSA公钥,通过RSA-1024算法对随机生成的AES加密密钥进行加密处理。
显示的勒索信息如下:
Locky新变种攻击细节分析
1、钓鱼邮件
用户首先会收到一封钓鱼邮件,邮件信息如下所示,附件中的ZIP文件解压后为一个VBS脚本。
2、VBS脚本分析
第二步,我们对VBS脚本进行分析发现,VBS脚本加入了一些无关的注释:
去掉无用的注释后,通过动态调试,可以看到脚本会从4个不同的地址中下载文件。
对上面的4个地址逐个尝试下载,并保存在%temp%目录下,并保持为2XXCTvF37Mu5S[序号].dll。
随后,通过下面的命令加载下载回来的dll。注:必须带mssecurity 117参数加载该DLL文件,否则DLL无法正常加载,这也是恶意软件常用的技俩,用于对抗一些自动化分析的沙箱和干扰样本分析,因为在仅仅拿到DLL文件,而没有与之对应的vbs脚本时,就无法获取其启动参数,此时样本的真正功能并不会被执行。
Rundll32.exe “C:Documents and SettingsAdministratorLocal SettingsTemp2XXCTvF37Mu5S4.dll”,mssecurity 117
3、Locky新变种样本分析
(1)样本概述
对Locky新变种进行样本分析发现,样本运行后首先会进行自解密,得到解密后的代码,然后执行解密后的代码。样本首先会判断系统语言,如果是俄语直接退出,否则继续。接下来,样本会获取系统盘所在的硬盘的GUID,然后对该GUID进行Hash运算,得到一个32位的字符串,取其前16为作为个人ID,即后文的UID。然后打开一个互斥变量,防止多个样本实例同时运行。接着,搜集主机信息,包括(系统版本、系统位数、是否是域网络、服务器系统版本、系统语言、个人ID等信息)将这些信息用内置的RSA公钥加密,发送至远程服务器,远程服务器地址为加密存在样本中,使用时需先解密出来。如果发送成功则返回一个新的加密密钥,替换掉原来内置的RSA公钥,并且会根据当前系统语言与内置的勒索信语言是否相符,如果不相符,则会从远程服务器下载对应的勒索信。如果语言相符,或者下载失败,则用内置的公钥和勒索信。接着,开始遍历磁盘文件,及网络共享文件,根据文件大小,文件类型的不同进行排序,然后按照顺序加密文件。具体排序看下文。加密完成后,弹出勒索信,提示用户交赎金获取解密密钥。解密文件。
(2)样本详情
此dll文件会在内存中动态解码,通过RtlDecompressBuffer函数解压缩后解码出一个PE文件,直接在内存中加载执行,我们将loader在内存中解密出的文件 dump出来,保存后进行后续的分析。
样本运行后首先会判断当前系统所使用的语言,如果系统语言是俄语,样本不会对当前系统的文件进行加密,否则继续运行样本。
接下来,样本会获取系统盘所在磁盘的GUID,并对该GUID进行hash,取hash的前16位作为个人ID。
并用UID作为互斥事件的部分字段,打开一个互斥变量,保证当前系统仅有一个实例在运行。
同时样本会根据GlobalFindAtomA()和FindAtomA()函数查找特征字符串(UID),判断当前系统是否已经被加密过,如果已经加密过则直接退出。否则继续。
接下来,样本会判断当前系统的语言与内置勒索信是否相符,如果是则使用内置的勒索信,否则会先联网下载与当前系统语言相符的勒索信。然后开始加密磁盘文件。
下面是联网下载新勒索信的代码:
以下是语言不符时的执行流:
51.255.107.20
194.28.87.26
93.170.123.119
91.239.232.171
85.143.215.209
解密得到C&C:
如果能成功获取新的勒索信,则使用新的勒索信,否则用默认的勒索信,开始加密磁盘文件。下面是使用默认勒索信的代码:
下面是开始加密文件的代码:
敲诈者病毒会对系统的每个盘符开启一个线程遍历文件,得到符合加密条件的文件列表,根据文件扩展名和文件大小,优先加密特定文件。此外,勒索者软件还会删除备份镜像,加密共享目录中的文件等。
遍历系统,得到符合加密条件的文件列表:
敲诈者病毒获得系统中的磁盘信息后,通过对每个盘符开启一个线程,加密文件列表的查找速度。而且,对于受害者系统中的网络共享目录中的文件,也列入了文件查找的视野之中。
敲诈者病毒为了确保自己加密后不会破坏系统的可用性,采用了排除指定目录的方法,对下面目录中的文件都做了”免疫”,也就是说,敲诈者病毒不会对这些目录的文件进行加密:
随后,敲诈者病毒会根据文件的后缀名进行加密顺序的优先级排列。
根据文件扩展名与文件大小确定加密顺序:
■通过样本可以看到勒索者对.key,.crt,.csr,.p12,.pem等几类扩展名的文件偏爱有加。对这几类的扩展名,勒索者软件会优先加密。
而对应的.wallet后缀的文件,勒索者并没有给太高的优先级。
根据文件体积大小,对于体积越小的文件,优先进行加密。
(3)加密算法分析
对系统中满足条件的文件,依照优先值顺序进行加密。具体的加密过程为:
▌获取程序中硬编码部分的RSA-1024公钥;
▌随机生成16字节的AES密钥,用AES-256-CBC算法加密文件内容;
▌将加密后的文件内容保存到加密后的文件首部;
▌生成解密结构体,将该结构体保持到加密后文件的尾部。
解密结构体由下面4部分内容组成:
▌解密结构体标志位8956FE93H,勒索者解密文件时,通过这个标志位来定位解密结构体的在的位置
▌用户ID:用来标识受害人的用户信息,大小为16字节
▌使用RSA公钥加密的AES密钥,大小为0x100。
▌AES加密(原始文件名标志位0D41BA12AH + 原始文件名)
其对应的反汇编代码如下:RSA公钥采用硬编码,在下面的代码中解密出RSA公钥,解析一下可以知道,这个一个RSA-1024的公钥。aiKeyAlg=> CALG_RSA_KEYX ; keyLength=> 0x400L = 1024 bit
将解密出的RSA密钥导入到密钥容器中
使用RSA公钥加密生成的AES密钥
使用AES算法加密文件名标志和文件名
在文件中写入解密块标志位(8956FE93H)和用户标识
调用AES加密原始文件内容,并将加密后的内容写入到文件中
显示勒索信息的html文件
总结
通过对文件加密过程的分析我们可以知道,在文档的加密中,Locky新变种同时使用了非对称加密算法RSA和对称加密算法AES,使用AES算法是为了加快加密过程,使用非对称RSA算法是为了保证只有勒索者本人可以通过RSA私钥解密样本中被RSA公钥加密的内容(样本中RSA公钥加密的内容为随机生成的AES的密钥)。
文件内容和文件原始名信息是通过随机生成的AES密钥进行的加密,而这个随机生成的AES密钥被RSA公钥加密后保存在文件之中。只有勒索者拥有RSA私钥,这也就意味着只有勒索者可以通过私钥解密出这个随机生成的AES密钥,继而用这个AES密钥解密出原始的文件内容和原始的文件名。
加密过的文件内容可以分为下面五部分的内容:
所以,目前唯一可行的解密文件的方法就就是拿到勒索者拥有RSA的私钥。在拥有RSA私钥的情况下的解密文档的方法为:
读取加密过的文档,根据 8956FE93H标志位定位到解密体结构,跳过16字节的用户标识,可以定位到0x100大小的加密过的AES密钥,此时使用得到的RSA私钥解密出AES的密钥,随后AES密钥解密文档的前面部分就得到原始文件内容,使用AES密钥解密文档的尾部就得到原始的文件名,根据原始文件名和原始文件内容恢复文件。而在没有RSA私钥的情况下,很难解密出被加密文件的内容。
另外,通过分析发现,该DLL于前段时间我们分析过的一个Zepto家族样本十分相似。通过Bindiff比较发现,核心功能相似度达99%。而且样本整体相似度也有90%以上。可以看出,Zepto家族和Locky家族的更新基本保持同步。
为了增强政企用户对抗敲诈者病毒的信心,360企业安全集团基于对敲诈者病毒的实时追踪与快速防御响应能力的绝对自信,在9月初就宣布在企业市场独家免费推出敲诈先赔服务,并郑重承诺:对于所有360天擎政企用户,如果在开启360天擎敲诈先赔功能后仍然感染敲诈者病毒,360企业安全将负责赔付赎金,为政企用户提供百万先赔保障。
文章原文链接:https://www.anquanke.com/post/id/84950