如何不交赎金就解开被LooCipher加密的文件
LooCipher是一种新型的分布式勒索软件,之前已有文章讨论过其主要行为、传播方式和与C2的通信机制,而本文将专注于LooCipher的文件加密机制和在不支付赎金的情况下看看解密的可能性。
LooCipher看上去是相当直接的,它没有使用任何混淆,不过却使用了如Crypto++之类的高级库来实现加密功能,与那些使用低级Windows api的勒索软件相比,逆向工程反而要要更困难一些。
文件加密机制
我们的FortiGuard Labs团队在恶意软件中发现了几类加密算法,例如DES(数据加密标准),AES(高级加密标准)和ECC / ECDSA(椭圆曲线密码或椭圆曲线数字签名算法)——但在我们的测试中只有AES-128 ECB(电码本)模式用于加密文件,不过考虑到LooCipher是最近才发现的,可能仍处于初始开发阶段,加密算法代码可能是留给以后使用的。
LooCipher使用当前系统时间作为种子,从以下预定义字符中随机选择字符,生成一个16字节的数据块,从而开始其加密例程。
图1.用于生成随机16字节数据块的预定义字符
随后数据块会被打乱以生成16字节密钥,该密钥在AES-ECB算法加密文件时使用,用于所有文件加密,这点与大多数勒索软件不同,后者一般是为每个加密文件生成不同的密钥。
图2.16字节AES密钥
以下目录被排除在文件加密例程之外,以防止破坏Windows操作系统启动和正常工作时使用的关键文件。
图3.免除加密的目录
之后LooCipher会搜索所有驱动器来加密具有以下扩展名的文件。
图4.查找特定的扩展名分文件加密
找到目标文件后,LooCipher会创建一个文件,其中包含要加密文件的原始名称,然后在名称中添加.lcphr扩展名,并使用生成的16字节随机密钥通过AES-128 ECB算法加密目标文件内容,再将其写入新创建的文件中,并将原始文件保存为0字节文件。
图5.加密文件的扩展名是.lcphr
我们可以在Python中创建一个简单的AES-128 EBC模式解密代码,来验证解密文件是否可行。
图6.解密AES-128 ECB模式下的加密文件
图7.成功解密了加密文件
能否恢复加密文件?
我们分析的LooCipher版本仅使用AES-128 ECB模式来加密文件,且由于是在ECB模式下执行的,因此它不需要IV(初始向量),只需要16字节密钥,该密钥是从以下74个字符中随机生成的:
图8.预定义的74个字符,从中生成随机密钥
AES是对称密钥算法,意味着加密和解密数据都用相同的密钥,因此恢复文件只需要加密密钥就可以了。
这也不同于其他同时使用对称和非对称加密的勒索软件,在那些情况下,只有获得了攻击者私钥才能解密文件。
由于LooCipher在加密所有文件时只生成单个密钥,并且是从上图的74个字符中选择生成的,因此看上去好像比其他勒索软件更容易破解加密文件,但事实证明并非如此。
要暴力恢复密钥,我们首先需要将原始文件与解密文件进行比较,然后需要测试这74个字符组成的所有可能的组合——即最多执行74的16次方 = 808,551,180,810,136,214,718,004,658,176 (808千的十六次方)次AES-128 ECB操作,即使在超级计算机上也会花费非常长的时间。
AES-128 ECB模式下有类明文攻击,能在不破坏密钥的情况下解密密文,但这需要一个始终运行的加密oracle(在这种情况下应该是LooCipher进程),而LooCipher只执行其加密例程的单次运行,因此这是不可实现的。此外,此方法通过迭代所有可能的值并将结果与参考值进行比较也将花费大量时间。
从C2通信流量中恢复密钥
捕获勒索软件攻击期间的网络流量确实非常有用,尤其是像LooCipher这样的勒索软件,会将加密密钥发送到C2(命令和控制)服务器,再保存在C2服务器的数据库中,发送内容包括:受害者ID (u)、已编码的AES密钥(k)和计算机的IP地址(i)。
图9.发送到C2服务器的数据
由于AES是一种对称密钥算法,我们只需要解码k的值,幸运的是,k只是用某种位置编码进行编码的。键中的每个字符都由一个值表示,该值取决于字符在数组/字符串中的位置。
图10.使用位置编码的键表示
下面的python代码显示了如何解码k的值。
图11.解码LooCipher AES密钥的脚本
网络捕获的k值是“69604607186414680318386143262470”,它是原始AES密钥“X?+evRC1%v_hIc4G”的表示。
图12.显示解码的AES密钥的输出
接着我们可以使用以下脚本解密加密文件。
(免责声明:请注意,虽然此处的所有脚本都是为了帮助用户恢复加密文件而编写的,但您须自行承担使用它们的风险。)
图13.解密加密文件
但是,我们不可能一直在捕获流量,因此这种方法可能并不总是有用。
从正在运行的LooCipher进程的内存中恢复密钥
要使用此方法,那么LooCipher的第一个实例应该仍在运行。如果有AV工具已将LooCipher删除,并且其进程已终止,则密钥将无法从内存中恢复,因为LooCipher使用的是当前时间作为生成密钥的种子;但如果LooCipher仍在运行,我们可以从其进程内存中提取密钥。
我们首先使用Sysinternals ProcessExplorer创建LooCipher进程内存的完整转储。LooCipher使用随机生成的进程名。
图14.创建LooCipher进程内存的完整转储
转储内存后,我们可以使用PowerShell搜索生成的URL。只需输入以下命令:
Select-String –Encoding Unicode –Path <memory dump file> -Pattern ‘(ttps?://.*/k.php.*o=[0-9])’ –AllMatches | %{$_.Matches} | %{$_.Value}
注意:如果Unicode编码不起作用,请使用BigEndianUnicode。
图15.用PowerShell搜索生成的URL
从上面可以看出,该命令为我们提供了一堆对编码密钥的引用。
Sysinternals Strings和findstr命令也可以为这些字符串提供对编码键的引用。
图16.使用Strings和FINDSTR搜索生成的URL
获取URL后,我们现在可以使用图13中提供的脚本解码密钥并解密文件了。
查看感染时间戳以生成密钥
虽然我们认为可以根据感染时间戳生成密钥,但还没有完成任何概念验证,目前我们还在研究这个问题,希望不久后能发布一些关于其勒索软件家族使用当前时间作为种子产生随机密钥的研究。
结论
LooCipher目前仅使用了AES-128 ECB模式,考虑到我们在代码中可看到了很多封装的加密算法,说明它可能仍处于初始开发阶段,将来可能会在机制上做出改变。
但是,在此发生变化之前,我们已经证明仍有机会恢复LooCipher加密文件。AES对称密钥算法以及感染期间的流量捕获,都能让熟练的分析师从发送传送的数据中提取密钥;如果无法捕获网络流量但LooCipher仍在运行,则可以从内存中提取密钥,然后通过该密钥和AES-128 ECB的机制来恢复文件。
我们将对LooCipher后续的变化做密切关注。
IOCs
Sha256
924cc338d5d03f8914fe54f184596415563c4172679a950245ac94c80c023c7d – W32/Filecoder.NWG!tr
C2
hxxps://hcwyo5rfapkytajg.onion.pet
hxxps://hcwyo5rfapkytajg.darknet.t
hxxps://hcwyo5rfapkytajg.onion.sh
hxxps://hcwyo5rfapkytajg.onion.ws
hxxps://hcwyo5rfapkytajg.tor2web.xyz