2020年,新冠病毒遍布全球,由于企业的远程办公加快了办公数字化,给勒索病毒打开新的攻击面。在日常的威胁情报狩猎中,我留意到NetWalker勒索软件在网络攻击活动中十分活跃。
NetWalker又名Mailto,是一款十分较新的勒索病毒,于2019年九月出现,曾先后攻击过西班牙的医院、澳洲TollGroup公司、加拿大电力公司、加州大学、阿根廷官方移民局等机构。在疫情爆发期间,许多勒索病毒都不再攻击医疗机构,而NetWalker勒索软件确是例外,其在2020年多次攻击活动中,有数次攻击医疗机构,这让它迅速引起人们的重视。
由于网络上对该病毒加密流程甚少,因此在这里本人仅对该病毒的加密流程进行分析,更多的详情可浏览参考链接中的报告。
与传统勒索病毒传播方式一样,NetWalker传播途径主要有RDP、VNC、鱼叉网路钓鱼、网页挂马等方式。NetWalker采用了RAAS(勒索即服务)的方式,使得他们可以更大规模地运营,针对更多组织进行勒索攻击。
和大部分勒索病毒不一样的是,NetWalker采用了curve25519+ChaCha的方式加密文件。
(以下知识内容均来自网络)
curve25519是一条椭圆曲线,并设计用于椭圆曲线Diffie-Hellman(ECDH)密钥协商方案。它是最快的ECC曲线之一,任何已知专利均为涵盖。
其有以下两条重要的公式:
计算公钥
为了生成和32字节密钥一致的32字节公钥PublicKey[0], PublicKey[1], ……,PublicKey[31],调用以下函数:
其中BasePoint为:
const unsigned char BasePoint[32] = {9};
生成共享密钥
给定另一用户的Curve25519公共秘钥hispublic[0], hispublic[1], …, hispublic[31], 调用以下函数:
生成32-byte共享秘钥shared[0], shared[1], …, shared[31]. 另一个人可以根据自己的私钥以及你的公钥生成相同的共享秘钥。
下图来自于网络,仅用于方便大家理解。

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

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

更多的知识可以在维基百科上查阅。
NetWalker的配置信息被使用RC4算法加密后存放于资源段,该资源的前四个字节为密钥的长度,后面的n个字节为解密密钥,剩下的内容为需要解密的配置信息密文。

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

NetWalker的第一步就是生成私钥1。在NetWalker中,都是以ZwQuerySystemTime获取到当前系统时间作为种子,使用RtlRandomEx来生成的随机数作为私钥。

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

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

在获取到共享密钥1后,NetWalker会对共享密钥1使用SHA256得到摘要,并且取其前八个字节作为后续ChaCha加密的向量1。
在NetWalker中的SHA256为一个变形的SHA256,其会对产生的摘要中第一个字节进行自加1。

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

算法如下:
综上所述,加密文件的流程如下:

但是,在文件中只保存了密文1是无法进行解密的,为了后续的解密,NetWalker还采取了以下操作。
NetWalker使用私钥2通过curve25519算法来生成公钥2并且保存到文件中,算法如下:
由于curve25519算法的特性,公钥1和私钥2产生的共享密钥1同样也可以使用私钥1和公钥2产生,算法如下:
由于黑客选择了保存公钥2而没有保存公钥1 ,因此,黑客接下来不对私钥2进行操作而是对私钥1进行操作,想方设法来保存其密文并通过手上的私钥进行解密。
NetWalker会产生一个新的随机数作为私钥3,并使用NetWalker中硬编码的公钥mpk(base64解码mpk字段即可得到)通过Curve25519算法得到共享密钥3,算法如下:
在获取到共享密钥3后,NetWalker会对共享密钥3使用SHA256得到摘要,并且取其前八个字节作为后续ChaCha加密的向量3。然后NetWalker会使用该共享密钥3和向量3对私钥1进行ChaCha加密,得到密文2并且保存到文件中,算法如下:
最后,将私钥3通过curve25519算法,得到公钥3并且保存到文件中,算法如下:
因此,完整的一个加密流程图如下:

在上述提到的mpk是由黑客手上的私钥通过curve25519算法得到的,算法如下:
由于curve25519的特性,黑客也同样可以使用自己手中的私钥和公钥3得到共享密钥3,从而进行解密,算法如下:
在得到共享密钥3后,黑客便可以对密文2进行解密,从而得到私钥1。私钥1和公钥2通过curve25519算法,能够得到共享密钥1,最后通过共享密钥1对密文1进行解密,则能够还原文件内容了。
NetWalker是一款十分活跃的勒索软件,其核心的加密思路实际上和其他勒索软件并无太大差异,只是算法上进行了变化。由于大部分勒索病毒加密后都无法解密,只能乖乖向黑客投降,因此这里建议大家做好日常的防护措施,开启勒索病毒诱捕防护等功能。
e77K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8r3!0#2k6q4)9J5k6i4c8W2L8X3y4W2L8Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6V1k6i4k6W2L8r3!0H3k6i4u0Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3x3e0M7$3x3K6M7#2x3b7`.`.
6beK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2L8W2)9J5k6i4N6A6K9$3W2H3k6h3c8A6j5g2)9J5k6h3!0J5k6#2)9J5c8Y4N6A6K9$3W2Q4x3V1k6o6N6i4u0$3k6e0t1#2y4e0p5&6
327K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8V1W2W2g2q4A6e0c8r3S2j5y4@1g2Q4y4h3k6D9x3X3y4&6g2o6g2c8d9X3N6c8b7b7`.`.
5f1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2E0j5$3q4X3k6h3g2Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8r3!0Y4M7#2)9J5c8X3!0@1K9r3g2J5i4K6u0V1j5X3I4G2k6%4y4Q4x3V1k6E0j5$3q4X3k6h3g2Q4x3X3c8D9j5h3u0K6i4K6u0r3N6r3q4C8k6g2)9J5k6r3q4Q4x3X3c8F1k6i4c8%4j5h3I4C8i4K6u0V1L8$3&6Q4x3X3c8@1K9r3g2Q4x3X3c8%4K9h3I4V1i4K6u0V1M7$3W2V1k6g2)9J5c8R3`.`.
395K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8X3#2#2N6r3!0#2M7X3g2F1k6q4)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3V1k6V1k6i4c8S2K9h3I4K6i4K6u0r3z5e0b7@1x3K6f1%4y4U0p5`.
657K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4f1H3x3e0p5^5z5e0M7H3y4U0u0Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0R3&6y4U0x3K6x3e0V1K6
8ddK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8X3g2*7e0Y4W2Q4x3X3c8C8K9V1V1$3L8@1#2U0k6g2j5@1c8U0u0r3f1Y4N6F1k6H3`.`.
d59K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8U0u0w2g2W2N6W2L8h3g2y4M7V1k6u0K9%4A6u0d9o6N6T1i4K6u0V1c8Y4c8r3k6H3`.`.
curve25519(PublicKey, SecretKey, BasePoint)
curve25519(PublicKey, SecretKey, BasePoint)
curve25519(SharedKey,SecretKey,hispublic);
curve25519(SharedKey,SecretKey,hispublic);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-1-19 10:50
被lracker编辑
,原因: 标题修改