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]. 另一个人可以根据自己的私钥以及你的公钥生成相同的共享秘钥。

下图来自于网络,仅用于方便大家理解。

870330_G5SB5N7426G9SP8.png

(2) ChaCha流加密
在介绍ChaCha加密之前,我们首先得要了解一下其前身Salsa20,Salsa20是一种流加密算法,它创建在基于add-rotate-xor(ARX)操作的伪随机函数之上——32位模加、异或(XOR)和循环移位操作。

其密钥流布局如下:

870330_P5GJCART4PAZ8UP.png

而ChaCha是Salsa20的修改版本,也同样是流加密算法。其目的是在提高每轮扩散的同时实现相同或稍好的性能。

其密钥流布局如下:

870330_8H7WS53HESEYXYJ.png

更多的知识可以在维基百科上查阅。

四、样本分析
(1) 获取配置信息

样本名 457.exe
样本家族 NetWalker
样本Hash 1b033111b8923c12f1d84e09769806f5
第一次上传至VT时间 2021-01-19 23:31:43

NetWalker的配置信息被使用RC4算法加密后存放于资源段,该资源的前四个字节为密钥的长度,后面的n个字节为解密密钥,剩下的内容为需要解密的配置信息密文。

870330_ASCAU7ZM69UDX59.png

在成功解密后将得到NetWalker的配置信息,包括一些白名单,洋葱地址,杀死进程列表。在这里我们需要留意的是黑客的公钥mpk(base64编码)。

870330_XR8SSS7QW6YNCJ2.png

(2) 加密感染者文件
NetWalker的第一步就是生成私钥1。在NetWalker中,都是以ZwQuerySystemTime获取到当前系统时间作为种子,使用RtlRandomEx来生成的随机数作为私钥。

870330_AU49VGG67RM93DW.png

第二步,NetWalker会使用上面随机生成的私钥1(32个字节的随机数)通过curve25519算法来生成公钥1,算法如下:


curve25519(公钥1, 私钥1, 9)

870330_RK9JGQE6VH6XUDC.png

第三步,NetWalker使用第一步同样的方式来生成私钥2,并使用私钥2和公钥1通过curve25519算法来生成共享密钥1,算法如下:

curve25519(共享密钥1, 私钥2, 公钥1)

870330_9ACW2QHURWB9D55.png

在获取到共享密钥1后,NetWalker会对共享密钥1使用SHA256得到摘要,并且取其前八个字节作为后续ChaCha加密的向量1。

在NetWalker中的SHA256为一个变形的SHA256,其会对产生的摘要中第一个字节进行自加1。

870330_3NDVNM2NDUH2NTQ.png

第四步,NetWalker将会使用共享密钥1作为密钥key,使用向量1作为向量iv对文件内容进行ChaCha加密得到密文1,加密成功后将会把密文1写入到文件中。密钥流布局如图所示。

870330_U2A97KFPBMRK56Q.png

算法如下:

keystream = (共享密钥1, 向量1)
chacha(keystream, 文件内容, 密文1, len)

综上所述,加密文件的流程如下
870330_7R2HU2YXG3T6FWX.png

(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)

因此,完整的一个加密流程图如下:

870330_4XFHWSVPXJDS7S4.png

在上述提到的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是一款十分活跃的勒索软件,其核心的加密思路实际上和其他勒索软件并无太大差异,只是算法上进行了变化。由于大部分勒索病毒加密后都无法解密,只能乖乖向黑客头像,因此这里建议大家做好日常的防护措施,开启勒索病毒诱捕防护等功能。