JSWorm勒索软件的演变过程(上)

  • A+
所属分类:逆向工程

JSWorm勒索软件的演变过程(上)

JSWorm勒索软件的演变过程(上)

在过去的几年中,勒索软件的攻击态势已逐渐发生变化。从2017年的大规模爆发(如WannaCry,NotPetya和Bad Rabbit)起,许多勒索软件攻击者已转向隐秘但利润丰厚的“高回报攻击”策略。勒索软件导致某些全球性公司的服务中断的新闻现在变得司空见惯。

在某些情况下,这种全球趋势只是攻击持续生命周期的反映:旧的勒索软件家族关闭而新的勒索软件家族出现并追求新的目标。但是,有时一个勒索软件家族已从大规模运营演变为针对性很强的攻击,而这一切都发生在两年之内。在这篇文章中,我们想谈谈一个名为JSWorm的勒索软件家庭的演变。

JSWorm勒索软件于2019年被发现,从那以后,出现了诸如Nemty、nefilem、Offwhite等不同的变种。

每个“重命名”变种的一部分都发布了多个版本,这些变种更改了代码、重命名的文件扩展名、加密方案和加密密钥等。

在下图中,我们介绍了该木马使用的一些名称,以及相应的变种在野外(ITW)主动传播的日期(不是它第一次遇到的日期)。我们应该注意,该列表并不全面,但代表了JSWorm演进的主要节点。

JSWorm勒索软件的演变过程(上)

除了名称更改外,该勒索软件的开发人员还一直在重新编写代码,并尝试使用不同的传播方法。

在2020年的某个时候,开发人员甚至将编程语言从C ++更改为Golang,从头开始完全重写代码。但是,加密方案、赎金通知和使用相同的数据泄漏网站地址的相似性使我们相信这是同一活动。

该恶意软件的原始版本以及随后的某些“更名”,例如Nemty,是由地下论坛上的用户使用jsworm用户名发布的。

JSWorm勒索软件的演变过程(上)

早期JSWorm变种的论坛广告

JSWorm勒索软件的演变过程(上)
传播方式

从2019年创建到2020年上半年,JSWorm作为公共RaaS提供,并通过以下方式传播:

JSWorm勒索软件的演变过程(上)

RIG开发套件;

Trik僵尸网络;

伪造支付网站;

垃圾邮件活动;

JSWorm勒索软件的演变过程(上)

2020年上半年开始,公共RaaS已关闭,运营商开始对攻击目标进行了调整,有迹象表明,最初通过利用易受攻击的服务器端软件(Citrix ADC)和不安全的RDP访问发起的第一次攻击。

JSWorm勒索软件的演变过程(上)
技术细节

我们将描述该恶意软件历史发展中遇到的JSWorm家族的一些著名变种。我们不会尝试涵盖所有发现的这种恶意软件变种,因为它们太多了。这些日期表示观察到ITW相应变种的大概时间。

JSWorm勒索软件的演变过程(上)
2019年5月:JSWorm

MD5:a20156344fc4832ecc1b914f7de1a922

该样本是JSWorm勒索软件最早发现的变种之一,与后续版本不同的是,它不包含内部版本号。该样本使用C ++开发,并在MS Visual Studio中进行编译。

除文件加密外,它还执行诸如停止大量正在运行的进程和服务之类的操作,以最大化可用于加密的文件数量。此外,它删除所有系统备份、卷影副本、禁用系统恢复模式并清除事件日志。

JSWorm勒索软件的演变过程(上)
加密方案

使用带有256位密钥的Blowfish密码的自定义修改对文件进行加密。密钥是在程序执行开始时根据字符串的串联生成的:用户名,设备MAC地址和卷序列号(注释中的样本值)。

JSWorm勒索软件的演变过程(上)

密钥生成过程

然后,生成由赎金通知称为“JSWORM PUBLIC KEY”的字符串。实际上,这里不使用非对称密码学,在这种情况下,使用“public”一词是没有意义的。勒索软件开发人员所谓的“ JSWORM PUBLIC KEY”实际上是上述的Blowfish密钥与字符串“KCQKCQKCQKCQ”进行XOR运算,并以Base64编码。

JSWorm勒索软件的演变过程(上)

与“KCQKCQKCQKCQ”键进行异或

以下是密钥计算的样本,其中选择了序列号和MAC地址值用于说明目的:

Blowfish秘钥: “53385773534FE:ED:00:DE:AF:00user”;

异或后的公钥: “5xpi~tfxvbx05x14qx06x15qsaqx07x14qx02x17qsa>049”;

转换为Base64后的公钥: “NXhwaX50Znh2Yn8FFHEGFXFzYXEHFHECF3FzYT4wNDk=”;

自定义版本的Blowfish用于加密每个受害者文件的内容,最多可以加密100000个字节,这可能会加快大文件的加密速度,加密的数据将覆盖原始数据。

开发人员更改了Blowfish密码的内部实现,这导致它与标准实现不兼容,可能是为了使研究人员更难解密。

在对文件的内容进行加密后,程序会对其进行重命名。一个附加扩展名" .[ID-…][[email protected]]. jsworm "被添加到文件名中。

JSWorm勒索软件的演变过程(上)
加密缺陷

该恶意软件实质上将可用于解密的密钥保存在赎金通知中。使用Base64解码和解除异或处理非常简单,受害者的数据可以在不支付赎金的情况下保存。即使赎金通知单由于某种原因丢失了,密钥也可以很容易地在受感染的设备上重新生成。

JSWorm勒索软件的演变过程(上)
2019年7月:JSWorm 4.0.3

MD5:5444336139b1b9df54e390b73349a168

JSWorm的改进和更新版本,试图修复以前版本中发现的漏洞。

此样本包含对受感染设备的语言检查。这很可能是为了防止使用以下语言的系统上的数据加密:RU(俄语),BE(白俄罗斯语),UZ(乌兹别克语),KY(吉尔吉斯语),TG(塔吉克语),TK(土库曼语),KK(哈萨克斯坦语),UK(乌克兰语)。

JSWorm勒索软件的演变过程(上)

确定用户的语言

然而,可能是由于开发时出现的错误,此版本的勒索软件仅在系统语言为俄语时才加密文件。如果我们仔细观察上述条件,可以看到第一个条件是“!=”(“不等于”)。这使木马执行的代码分支在语言不是俄语的系统系统上无需加密即可退出。如果条件为“==”,则将采用另一个分支,从而导致可能是该木马最初预期的行为。

此变种中的赎金通知被实现为一个名为< ID > -DECRYPT.hta的HTA文件,其中< ID >是恶意软件传播的唯一受害者ID。HTA文件在文件加密完成后启动,并通过注册表添加到自动运行中:

reg添加HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun /v “zapiska” /d “C:UsersuserJSWRM-DECRYPT.hta”;

JSWorm勒索软件的演变过程(上)

JSWorm 4.0.3的赎金说明

JSWorm勒索软件的演变过程(上)
加密方案

此版本的JSWorm使用RSA的WinAPI实现和AES的自定义实现来加密文件。JSWorm生成两个128位(IV)和256位(密钥)的随机值,这些值仅限于以下字符:a…z,A…Z和0…9。RSA公钥被嵌入到勒索软件中:

JSWorm勒索软件的演变过程(上)

JSWorm 4.0.3中使用的RSA公钥

使用此密钥,JSWorm加密AES密钥和初始化向量(IV)并将其编码为Base64:

JSWorm勒索软件的演变过程(上)

JSWorm 4.0.3中的WinAPI RSA加密

然后,该值被添加到勒索软件注释 < ID > -DECRYPT.hta中,但是该值本身并未以视觉方式显示,因为它作为HTML注释位于文件内部。

JSWorm勒索软件的演变过程(上)

.hta赎金通知文件中的值

为了使解密尝试对研究人员更加困难,恶意软件开发者实现了一个自定义的AES分组密码的变种,它与标准算法不兼容。受害者的文件内容通过上述密钥和IV的密码进行加密。

与以前一样,为了进行优化,只有前160000个字节在大文件中被加密。加密后,文件名将附加一个扩展名,这与我们在前面的样本中所看到的很相似:" .[ID-NQH1J49][[email protected]]. jswrm "。

JSWorm勒索软件的演变过程(上)
加密缺陷

在JSWorm的这个变种中,开发人员试图修复研究人员在以前版本中发现的缺陷。然而,仍然可以进行不付费的解密。用于生成密钥和IV的伪随机数生成器在密码上并不安全,它允许研究人员通过攻击生成算法来恢复密钥和IV。知道了这些值,他们就可以解密受害者的数据。

JSWorm勒索软件的演变过程(上)
2019年8月:Nemty 1.4

MD5:1780f3a86beceb242aa81afecf6d1c01

JSWorm和Nemty之间的代码更改非常重要。根据我们的分析,恶意软件开发人员可能已经从头开始重写了他们的木马程序,可能是为了防止成功的解密尝试,该尝试使JSWorm的多个早期变种的受害者可以不支付任何费用来恢复其数据。

该样本也用C ++开发,并在MS Visual Studio中编译。它实现了一个由字符串混淆算法组成的较小的反分析技巧。字符串(例如,赎金通知名称和内容,RSA公钥,付款URL等)由RC4流密码使用硬编码的密钥“fuckav”进行加密,并在Base64中进行编码。

JSWorm勒索软件的演变过程(上)

Nemty 1.4赎金通知

启动后,该样本将收集有关连接到受感染计算机的存储设备的信息,通过对http://api.ipify.org的HTTP请求获取其外部IP地址,并通过从http://api.db-ip.com/v2/free/请求数据生成一对RSA-2048会话加密密钥,并将所有收集的信息合并为JSON结构,来确定受害人所在的国家/地区。然后,该结构通过攻击者的公共RSA密钥进行加密,并在赎金通知的末尾以“NEMTY DECRYPTION KEY”结尾。

JSWorm勒索软件的演变过程(上)

在通过RSA加密之前收集的信息

此结构中有一些特别之处需要注意:

isRU:指定由外部IP地址确定的受害国是否为以下国家之一:俄罗斯,白俄罗斯,哈萨克斯坦,塔吉克斯坦,乌克兰;

版本:木马的内部版本;

CompID:受感染设备的唯一ID;

FileID:每次恶意软件启动时生成的感染ID;

UserID:附属机构的ID,在木马样本中进行硬编码;

密钥:用于文件加密的base64编码密钥(稍后将讨论);

pr_key:base64编码的私有会话RSA-2048密钥(稍后将讨论);

JSWorm勒索软件的演变过程(上)
加密方案

该木马样本包含攻击执行者的硬编码RSA-8192公钥,我们将其称为主RSA公钥。

在受害者计算机上执行该木马程序后,它还会生成一对会话RSA-2048密钥,并将上面提到的私钥称为pr_key。除此之外,它还会生成一个256位密钥,该密钥将与基于AES的自定义分组密码一起使用。

256位密钥和pr_key由主RSA公钥加密,并保存在赎金说明中。

在对每个受害者的文件进行加密时,Nemty 1.4将生成一个128位的IV,并使用带有该IV的256位密钥通过基于AES的自定义密码对文件内容进行加密。IV由会话公共RSA密钥加密,,并附加在加密后的文件中。

每个加密的文件都会被重命名,从而获得一个额外的扩展名”。_NEMTY_< … >_ ",其中被跳过的部分是上面提到的感染ID FileID。

JSWorm勒索软件的演变过程(上)
加密缺陷

像JSWorm的某些早期变种一样,Nemty 1.4中加密方案的实现也不是完美无缺的。利用两个漏洞就可以对受害者的文件进行解密:

1.密钥生成的PRNG是不安全的;

2.RSA会话密钥没有从系统存储中删除;

通过使用第一个漏洞,可以恢复256位密钥,而使用第二个漏洞可以恢复pr_key。知道pr_key后,受害者就可以解密IV,然后使用256位密钥和IV解密受害者的文件内容。

JSWorm勒索软件的演变过程(上)
C&C沟通

该样本从https://dist.torproject.org/torbrowser/8.5.4/tor-win32-0.4.0.5.zip下载TOR客户端,将其提取并在受感染的计算机上启动。等待30秒(恶意软件开发人员显然认为足够长的时间才能连接到TOR网络)后,木马将有关感染的信息发送到样本中经过硬编码的C&C服务器:

zjoxyw5mkacojk5ptn2iprkivg5clow72mjkyk5ttubzxprjjnwapkad.onion

使用含有 URI /public/gate?data=的HTTP GET发送到服务器的信息与每个赎金通知中保存的信息相同,本质上是上述JSON结构的加密版本。

参考及来源:https://securelist.com/evolution-of-jsworm-ransomware/102428/

JSWorm勒索软件的演变过程(上)

JSWorm勒索软件的演变过程(上)

本文始发于微信公众号(嘶吼专业版):JSWorm勒索软件的演变过程(上)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: