NetWalker加密流程的分析
NetWalker加密流程的分析
一、概述
2020年,新冠病毒遍布全球,由于企业的远程办公加快了办公数字化,给勒索病毒打开新的攻击面。在日常的威胁情报狩猎中,我留意到NetWalker勒索软件在网络攻击活动中十分活跃。
NetWalker又名Mailto,是一款十分较新的勒索病毒,于2019年九月出现,曾先后攻击过西班牙的医院、澳洲TollGroup公司、加拿大电力公司、加州大学、阿根廷官方移民局等机构。在疫情爆发期间,许多勒索病毒都不再攻击医疗机构,而NetWalker勒索软件确是例外,其在2020年多次攻击活动中,有数次攻击医疗机构,这让它迅速引起人们的重视。
由于网络上对该病毒加密流程甚少,因此在这里本人仅对该病毒的加密流程进行分析,更多的详情可浏览参考链接中的报告。
二、病毒传播
与传统勒索病毒传播方式一样,NetWalker传播途径主要有RDP、VNC、鱼叉网路钓鱼、网页挂马等方式。NetWalker采用了RAAS(勒索即服务)的方式,使得他们可以更大规模地运营,针对更多组织进行勒索攻击。
三、基础知识
和大部分勒索病毒不一样的是,NetWalker采用了curve25519+ChaCha的方式加密文件。
(以下知识内容均来自网络)
(1) curve25519椭圆曲线
curve25519是一条椭圆曲线,并设计用于椭圆曲线Diffie-Hellman(ECDH)密钥协商方案。它是最快的ECC曲线之一,任何已知专利均为涵盖。
其有以下两条重要的公式:
计算公钥
为了生成和32字节密钥一致的32字节公钥PublicKey[0], PublicKey[1], ……,PublicKey[31],调用以下函数:
curve25519(PublicKey, SecretKey, BasePoint)
其中BasePoint为:
const unsigned char BasePoint[32] = {9};
生成共享密钥
给定另一用户的Curve25519公共秘钥hispublic[0], hispublic[1], …, hispublic[31], 调用以下函数:
curve25519(SharedKey,SecretKey,hispublic);
生成32-byte共享秘钥shared[0], shared[1], …, shared[31]. 另一个人可以根据自己的私钥以及你的公钥生成相同的共享秘钥。
下图来自于网络,仅用于方便大家理解。
(2) ChaCha流加密
在介绍ChaCha加密之前,我们首先得要了解一下其前身Salsa20,Salsa20是一种流加密算法,它创建在基于add-rotate-xor(ARX)操作的伪随机函数之上——32位模加、异或(XOR)和循环移位操作。
其密钥流布局如下:
而ChaCha是Salsa20的修改版本,也同样是流加密算法。其目的是在提高每轮扩散的同时实现相同或稍好的性能。
其密钥流布局如下:
更多的知识可以在维基百科上查阅。
四、样本分析
(1) 获取配置信息
样本名 457.exe
样本家族 NetWalker
样本Hash 1b033111b8923c12f1d84e09769806f5
第一次上传至VT时间 2021-01-19 23:31:43
NetWalker的配置信息被使用RC4算法加密后存放于资源段,该资源的前四个字节为密钥的长度,后面的n个字节为解密密钥,剩下的内容为需要解密的配置信息密文。
在成功解密后将得到NetWalker的配置信息,包括一些白名单,洋葱地址,杀死进程列表。在这里我们需要留意的是黑客的公钥mpk(base64编码)。
(2) 加密感染者文件
NetWalker的第一步就是生成私钥1。在NetWalker中,都是以ZwQuerySystemTime获取到当前系统时间作为种子,使用RtlRandomEx来生成的随机数作为私钥。
第二步,NetWalker会使用上面随机生成的私钥1(32个字节的随机数)通过curve25519算法来生成公钥1,算法如下:
curve25519(公钥1, 私钥1, 9)
第三步,NetWalker使用第一步同样的方式来生成私钥2,并使用私钥2和公钥1通过curve25519算法来生成共享密钥1,算法如下:
curve25519(共享密钥1, 私钥2, 公钥1)
在获取到共享密钥1后,NetWalker会对共享密钥1使用SHA256得到摘要,并且取其前八个字节作为后续ChaCha加密的向量1。
在NetWalker中的SHA256为一个变形的SHA256,其会对产生的摘要中第一个字节进行自加1。
第四步,NetWalker将会使用共享密钥1作为密钥key,使用向量1作为向量iv对文件内容进行ChaCha加密得到密文1,加密成功后将会把密文1写入到文件中。密钥流布局如图所示。
算法如下:
keystream = (共享密钥1, 向量1)
chacha(keystream, 文件内容, 密文1, len)
综上所述,加密文件的流程如下
(3) 后续处理
但是,在文件中只保存了密文1是无法进行解密的,为了后续的解密,NetWalker还采取了以下操作。
NetWalker使用私钥2通过curve25519算法来生成公钥2并且保存到文件中,算法如下:
curve25519(公钥2, 私钥2, 9)
由于curve25519算法的特性,公钥1和私钥2产生的共享密钥1同样也可以使用私钥1和公钥2产生,算法如下:
curve25519(共享密钥1, 私钥2, 公钥1)
curve25519(共享密钥2, 私钥1, 公钥2)
共享密钥1 == 共享密钥2
由于黑客选择了保存公钥2而没有保存公钥1 ,因此,黑客接下来不对私钥2进行操作而是对私钥1进行操作,想方设法来保存其密文并通过手上的私钥进行解密。
NetWalker会产生一个新的随机数作为私钥3,并使用NetWalker中硬编码的公钥mpk(base64解码mpk字段即可得到)通过Curve25519算法得到共享密钥3,算法如下:
curve25519(共享密钥3, 私钥3, mpk)
在获取到共享密钥3后,NetWalker会对共享密钥3使用SHA256得到摘要,并且取其前八个字节作为后续ChaCha加密的向量3。然后NetWalker会使用该共享密钥3和向量3对私钥1进行ChaCha加密,得到密文2并且保存到文件中,算法如下:
keystream = (共享密钥3, 向量)
chacha(keystream, 私钥1, 密文2, len)
最后,将私钥3通过curve25519算法,得到公钥3并且保存到文件中,算法如下:
curve25519(公钥3, 私钥3, 9)
因此,完整的一个加密流程图如下:
在上述提到的mpk是由黑客手上的私钥通过curve25519算法得到的,算法如下:
curve25519(mpk, 黑客私钥, 9)
由于curve25519的特性,黑客也同样可以使用自己手中的私钥和公钥3得到共享密钥3,从而进行解密,算法如下:
curve25519(共享密钥3, 私钥3, mpk)
curve25519(共享密钥4, 黑客私钥, 公钥3)
共享密钥3 == 共享密钥4
在得到共享密钥3后,黑客便可以对密文2进行解密,从而得到私钥1。私钥1和公钥2通过curve25519算法,能够得到共享密钥1,最后通过共享密钥1对密文1进行解密,则能够还原文件内容了。
五、总结
NetWalker是一款十分活跃的勒索软件,其核心的加密思路实际上和其他勒索软件并无太大差异,只是算法上进行了变化。由于大部分勒索病毒加密后都无法解密,只能乖乖向黑客头像,因此这里建议大家做好日常的防护措施,开启勒索病毒诱捕防护等功能。