进击的比特币勒索者Locky

这个世界从来不缺少智慧和灵感,尤其在黑产领域,自从比特币勒索鼻祖波格契夫灵机一动,弄出了比特币勒索的招数,才让大众体会到原来网络世界如此的脆弱。有人感叹为何如此粗暴的攻击能肆掠全球,有人感叹为何他们掠财如此简单,今天阿里安全威胁情报中心分享比特币勒索2016年新年最大波Locky攻击分析报告,和大家携手一起应对这场战役。

序幕

2015年年末,基于邮件的比特币勒索(VVV)在中国开始猖獗,尤其以12月最为严重,后续仍然每天都会有此类的攻击邮件被监测到,但均以内嵌JS为主,而且攻击量和范围较小。2016年2月16号爆发的攻击是阿里安全威胁情报中心在中国范围内监测到的最大力度基于邮件的比特币勒索攻击潮,在短短3天,近十万的攻击事件依次到来,而且存在5次大的变种,而这仅仅是一个局部的影像,对于全球来说,遭受的攻击量将更为可怕。

目前范围较大的常规加密勒索有如下七类,本报告将着重分析Locky,其是2016年基于邮件攻击范围最大,量最大,而且体系极为成熟,勒索支付流程清晰,其保持持续攻击和软件更新,在此时此刻,其仍未停歇。

回顾

当你还沉浸在新年的喜悦,情人节的浪漫中时;患着假日病,不甘心的上班时,一场精心准备,席卷全球的攻击已经悄然开始,根据阿里安全威胁情报中心监测数据,从中选取了五波大力度的攻击呈现了整个攻击的过程。

图1Locky二月攻击过程

以上主题,附件名中数字均被攻击者自动编号,每波攻击样本均存在大量的变种,几乎所有反病毒引擎在攻击爆发时无法及时检测到,只能被动更新病毒库,而且后续很容易被绕过。由于其直接发送内嵌宏的办公文档,而且使用了Invoice,Payment等常见字段,对于安全意识薄弱,且涉外事务的人将非常具有欺骗性,很容易被诱导允许宏执行。

在三月的攻击事件发现了携带具有CVE-2015-0097等已知漏洞附件(E89FB70F0A8C00E77D922E9D6DA24692)的邮件,可见其破坏性将进一步加大。

幕后

在2016年1月,我们发布报告解密BBOSS组织:全球超十二万站点的地下掌控者,可以看到BBoss手中掌控了大量的站点型肉鸡,在Locky爆发的背后,同样我们看到其直接利用的如僵尸网络或者间接利用的如在线邮件服务器,个人邮箱等数量也同样惊人。

图2Locky二月中国攻击源示例

根据监测的数据进行统计显示攻击来源(被利用的主机)覆盖175个国家,中国也进入全球前20的名单。

图3Locky二月攻击源全球分布

前20名单:德国,墨西哥,西班牙,阿根廷,印度,美国,巴西,意大利,保加利亚,越南,哥伦比亚,罗马尼亚,韩国,伊朗,波兰,英国,智利,乌拉圭,中国。

金钱

经过跟踪Locky的一些相关比特币地址,发现其会分批从提供给受害者的比特币地址内将受害者汇入的比特币转走,下图为2016-02-1916:20:13发生在荷兰的一次转账交易,可以发现该笔交易中有近80个受害者的比特币被转走,而这仅仅是冰山一角。

图4Locky比特币地址示例

由于中国特殊的语言和网络环境,中国的支付比率相对会很低,而生成的勒索文本也仅仅是繁体中文,勒索者并未完全把中国作为主力战场。但在三月份出现的攻击中,Locky已进一步中文化,并且勒索的比特币也下调为0.5,中国已经成为勒索者的主要目标,其在快速适应中国国情,需要保持高度警惕。

图5Locky三月中文勒索页面

样本分析Locky下载者

基于邮件附件传播的Locky,其主要特点是通过脚本下载可执行程序,运行并加密用户数据。脚本主要基于JS和OfficeVBA宏,由于脚本变形混淆功能强大,很容易绕过反病毒引擎。

Office文档的封装格式繁多,包括RTF,CFB,MHT,ZIP等格式。Locky其中攻击量最大的采用MHT格式,其内部含有未公开格式的MSO对象,在这个对象内部嵌套了一个含宏的CFB对象。宏可谓老生常谈,由于宏的安全隐患,Office最新版本均默认关闭。但由于用户信息安全意识薄弱,很容易被诱导并允许执行。也由于行业需要,会有部分正常文档带有宏,导致用户对此麻痹大意。

Locky加密程序

Locky下载者会下载一个可执行程序并使之运行,该程序专门用于加密用户数据。加密程序变种繁多,我们重点对其中2种程序做了逆向分析,为了便于描述,这里把其中一种称为Locky-Feb,另一种称为Locky-Mar,Locky-Mar为三月最新出现。

Locky-Mar非常有趣,它首先检查当前系统区域和语言是否为俄语,如果是则不进行加密,直接退出程序。这不得不令人有所遐想,难道勒索者是俄罗斯的,亦或是勒索者想嫁祸给俄罗斯?

图6Locky-Mar检测语言环境

如上所示,0x19h是俄语编码。

Locky在运行后将在系统注册表创建项:HKCU\Software\Locky。

在此项中查找如下键值:

üid:此处存放用户唯一id,通过md5哈希算法计算磁盘root卷的guid值,得到一个32字节md5字符串,取该串前16字节作为用户唯一id。

üpubkey:此处存放从CC服务器上传回来的响应数据,其中包含的是加密用的RSApubkey。

ücompleted:存放一个非空DWORD,用于表示已经加密完毕,如果查到此值非空,将跳过加密过程,直接修改系统桌面背景,弹出一个对话框画面告知用户已经被加密以及如何前往支付赎金的网页。此键值在程序结束时创建。

以上注册键值起一个cache的作用,在首次运行时将依次填充,下次运行时如果查到非空并校验通过的话将直接进行下一步。

图7创建注册表项代码

下图是Locky运行完毕后最终在HKCU\Software\Locky下创建的注册键值截图:

图8注册表键值

图中pubkey是从服务器获取的公钥(稍后我们会展示从网络数据封包获取到的pubkey),其中包含了RSA1字样,这说明Locky应该采用了RSA加密算法。

Locky下一步判断当前进程是否在当前用户临时目录下运行,否则将拷贝自己到用户临时目录下运行,同时退出当前进程。如果是在临时目录运行,将继续执行。(Locky-Mar无此步骤)。

图9判断临时目录

然后从服务器获取公钥pubkey。在分析获取公钥之前,需要先分析Locky的网络通信方式。

Locky网络通信方式

Locky和服务器通信采用HTTP协议,POST方式提交数据,提交格式共有4种,通过一个act字段表示请求的类型,比如获取公钥时的提交格式举例如下:

id=E99626F790EF410Bact=getkeyaffid=1lang=zhcorp=0serv=0os=Windows+7sp=1×64=0

act有如下几种类型:

ügetkey:表示从服务器获取公钥,请求次数为1

ügettext:表示从服务器获取支付赎金的信息,请求次数为1

üstats:每次加密完一个磁盘时都会向服务器报告是否加密成功的消息,请求次数等于加密的磁盘个数或共享文件夹的个数

üreport:向服务器报告一些加密关文件的信息,请求次数不固定,同个人文件大小类型有关

服务器的主机名称可通过ip或动态生成的域名访问。ip硬编码在可执行文件里,可含有多个IP地址,域名动态生成,分两级域名,算法如下:

ü生成次级域名,这部分是随机生成的8-18个小写英文字母组成;

ü生成一级域名,这部分是根据固定算法生成,共2个字符,

一级域名生成算法描述如下:

图10域名动态生成

seed采用特定算法随机生成。

Locky的网络通信数据会加密,未加密的明文数据由两部分组成:

ü第1部分,是一个16字节的MD5二进制哈希值。

ü第2部分,是真正要传输的数据,这部分数据的MD5哈希值等于第1部分的哈希值。

在发送数据前,先计算要发送数据的MD5值,然后把这个MD5值和要发送的数据拼接成新数据块并加密发送。接收过程则与之相反,分为数据接收,解密,校验三步。

接下来看看Locky的网络加密解密算法,然后结合一个实际的Locky网络包进行演示。

图11网络通信发送数据加密伪代码

图12网络通信接收数据解密伪代码

为了解密网络数据包,根据以上收发加、解密代码,对于发送数据需要写出其对应的解密代码,接收数据只要写出其对应的C代码即可。

以下是根据Locky发送数据的加密伪代码写出的对应解密代码:

图13网络通信数据加密代码实现

以下是根据Locky接收数据的解密伪代码重写的C代码:

图14网络通信数据解密代码实现

然后分析真正的Locky网络传输网络包。以下是getkey获取公钥时的HTTP请求数据包截图:

图15网络通信数据包

其中发送的数据共100个字节且已加密。Dump出该数据,用上文提到的解密代码进行解密:

图16网络通信数据解密

该100字节,第一部分如上图红框中的数据就是MD5头,后面是获取公钥getkey时的请求串:

id=E99626F790EF410Bact=getkeyaffid=1lang=zhcorp=0serv=0os=Windows+7sp=1x64=0

getkey获取公钥请求后,服务器回传的原始数据包,如下图所示:

图17getkey回传网络数据

该数据共292字节,将其dump并解密出回传公钥:

图18回传公钥

从上图分析,解密出来的数据共292字节,第一部分是16字节的MD5,后面的276字节就是真正的公钥,这个公钥将被缓存在注册表中。公钥数据里明显看到有RSA1字样,应该是采用了RSA加密算法。

网络通信的其它类型除了act请求有差异,加密校验交互过程均一样,不再赘述,现在回到主流程上,分析获取公钥pubkey的过程。

图19获取公钥pubkey校验代码

以上是从服务器获取公钥pubkey后进行Hash校验的过程。此后会把公钥,用户ID写入注册表项中。

其后是获取paytext,act=gettext,会从服务器获取交赎金时需要输入的网页链接地址,通信交互过程和获取公钥类似,都会从服务器获取数据,校验数据,然后缓存在相应的注册表项中,这里不再赘述。

磁盘文件加密方式

Ø首先是本地磁盘数据的加密,磁盘类型必须是本地硬盘、移动硬盘和内存盘,为每个磁盘创建一个独立的线程进行加密工作

Ø然后是网络共享文件夹的加密,为每个文件夹创建一个线程进行加密工作

以上两部分加密过程差不多,所以主要分析本地数据的加密过程。

先导入前面通过网络或者注册表Cache里获取的RSA公钥:

图20获取RSA公钥加密

图21SubImpPubKeyIntl代码

加密程序同时为每个磁盘开一个线程扫描,每个线程先遍历磁盘根目录路径:

然后遍历该数组对每个文件进行加密,每个文件的加密主要过程描述如下:

Ø首先生成一个32字节的随机文件名,名称格式为:

16字节的用户ID+16字节的随机16进制字符.locky

例如:ED4C0D6DC0FFFA4FB7E1.locky

Ø加密每个文件,这是Locky加密程序的核心部分,下面结合加密后的文件存放格式做详细讲解。加密后的文件存放格式如下:

图22_locky结构体

如上图所示,逐一讲述每个字段功能如下:

ülocked_data存放原始文件内容加密后的数据,长度为512K的整数倍,里面可能包含了PADDING数据,解密时先全部解密,然后用后面的FileSizeLow,FileSizeHigh长度字段去掉多余的PADDING数据即可还原原始长度。此部分采用伪RC4算法加密,加密流初始化数据采用AES128加密生成,每个文件加密时都随机生一个新的AES128密钥,该密钥最终用RSA公钥加密存放在后面的AesKey128字段中

ümagic此处明文存放固定整数0x8956FE93,作为locky的标记,在文件尾偏移-0x344H处

üuserID明文存放前面讲过的就是用户唯一id,共16个字节

üAesKey128长度为256的字节数组,存放原始AES128用RSA加密后的密文

üFileMetaHead此部分存放文件标记头,采用伪RC4加密,应该是在解密时校验使用,解密后的明文固定为0xD41BA12A

üFileName存放加密后的原始文件名,采用伪RC4加密

üFileAttributes存放加密后的文件属性,采用伪RC4加密

üCreationTime,LastAccessTime,LastWriteTime存放加密后的原始文件时间戳,采用伪RC4加密

üFileSizeHigh,FileSizeLow存放加密后的原始文件大小,采用伪RC4加密

如果理解了以上格式,对加密方式基本已清晰。

下面分析AES128密钥的生成过程:

调用CryptGenRandom产生一个随机16字节二进制数据,每次加密一个新的文件时,就调用如下代码一次,产生一个新的随机数,这个将作为新的AES128密钥。

仅凭此还不能说是AES128算法,请看下图代码:

以上代码定义了这个新的16字节随机数将作为AES128密钥,其中被调函数subImpPubkeyIntl的代码请参见上文图21。subImpPubkeyIntl是在CryptGenRandom调用后,把前面产生的16字节随机二进制数据和数据格式参数传给CryptImportKey,该API的pbData的数据头为一个PUBLICKEYSTRUC格式,其后面的接一个长度字段定义接下来的Key长度,此处是16,接下来就是前面产生的16字节二进制随机数,PUBLICKEYSTRUC数据内容如下:

BYTEbType;//0×08

BYTEbVersion;//0×02

WORDreserved;//0×00

ALG_IDaiKeyAlg;//0x660E

bType=0x08表示PLAINTEXTKEYBLOB,后面的Key本身未加密,就是真正的Key

aiKeyAlg=0x660E表示采用CALG_AES_128算法

由此可见,在前面生成的随机16字节二进制数据,就将被用来作为AES128密钥!

该密钥被加密后将存储在AesKey128字段,加密时采用的密钥就是上文提到的RSA公钥。以下是设置AES128加密参数以及加密AesKey128的代码:

以上调用CryptEncrypt函数时,使用的就是从服务器传回来的RSA公钥进行的加密,也就是说,RSA只是用来把一个AES128共16字节的数据加了密,加密后的密文共256字节,这部分密文将最终存储在加密后的文件中,供解密时使用!

接下来我们看看本文的重中之重,文件加密算法。

文件加密算法

文件加密算法采用了类似RC4算法思想,将其称作Pseudo-RC4,即伪RC4算法。

其大致流程描述如下:

设置一个长度为2048字节的表,使用一个简单的算法初始化这张表,然后用AES128对称算法加密这张表,加密后的数据也是2048字节,存放在这同一张表中,然后使用这张表来对原始文件内容进行每4字节的异或加密操作。如果文件很长超过2048字节时,需要重新对这张表做一次初始化(注意这里每次初始化的内容和前次初始化是不一样的,所以加密流并不重复)然后再把该表进行AES128加密,最后用表里的数据加密原始文件数据,每超过2048字节就重复上述过程。由此可见,其思想同RC4很类似,在加密的过程中,只是简单的字节异或操作,并按一定规律不断变换加密流来完成加密过程。

下面来分析初始化2048字节长度表以及用AES128算法加密这张表的伪代码,如下图所示:

文件内容加密的伪代码:

以上代码就是每4字节的异或操作,共4次也就是16个字节一组进行循环。解密时只要拿到AES128密钥,使用完全相同的算法,就可解密被加密的文件。

通过以上分析,可以发现关键在于这个AES128的密钥是否能拿到,这个是解密的关键点。很遗憾,这个点使用了RSA算法进行了保护,所以要想破解几乎无望。

总结下Locky的加密算法:

ü从CC服务器拿到RSA公钥

ü生成一个随机AES128密钥

ü用AES128初始化用于加密的一张表

ü用伪RC4算法加密原始文件

ü用RSA加密AES128密钥并存放在前面加密后的文件中

至此有关Locky的加密要点基本分析完成,文件内容加密完成后,还要把文件属性比如原始文件名、时间戳等属性一同保存下来(可看看上文所诉加密后的文件存储格格式),这部分过程比较简单,在加密前先获取这部分数据,然后使用完全相同的伪RC4算法把这部分数据一起加密并按上文所述格式存储,该数据供还原文件时使用。

接下来回到主流程里面来,看看加密后Locky接着又干了哪些事?

Ø把加密后的文件命名成前面随机生成的文件名

Ø原始文件内容全部擦掉。具体是把原始文件内容每个字节都写85(85是英文字符’U’的ASCII码),文件名称重命名为一个随机化名称,并删除之,防止恢复数据:

Ø执行“vssadmin.exeDeleteShadows/All/Quiet”删除备份数据,防止恢复数据

至此加密流程全部结束。

最后会弹出文件被加密的提示窗口,全部流程结束。

防御

对于普通用户,有如下小贴士作为参考:

1.不要随意公开邮箱地址,邮箱密码不要使用弱密码,尽量定期修改;

2.不要轻易打开陌生人的邮件,尤其是其中的链接和携带的附件;

3.对于需要输入用户名,密码等个人信息的网站需要校验是否可信;

4.禁止Office宏功能,需要开启宏时,需要确认文件来源是否可信;

5.开启系统防火墙,反病毒软件,降低病毒侵入的风险;

6.保持系统和软件更新到最新状态,防止已知漏洞攻击;

7.及时备份重要资料,防止意外损失。

对于邮件服务或网站管理者:

1.加强反垃圾反病毒和风险监控能力;

2.及时更新服务器软件,防止被已知漏洞利用;

3.定期检测后台日志,查看是否有弱密码爆破记录,被利用发送垃圾邮件等异常行为;

4.查看网站后台是否被植入发送垃圾邮件的WEBSHELL;

5.提醒用户关注并进行自我防范。

*作者:阿里安全威胁情报中心,转载请注明来自FreeBuf黑客与极客

OKEX下载,欧易下载,OKX下载

okex交易平台app下载

原创文章,作者:币圈百科,如若转载,请注明出处:https://6684456.com/8253.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注