样本简介
随着前段时间大火的WannaRen勒索出现,导致又有一批人开始蠢蠢欲动,想借此在火热的勒索市场里分一杯羹。近日深信服安全团队捕获了一个伪装成激活工具的勒索软件,界面全部采用中文提示,如果之前有使用过相关“激活工具”的话, 应该对下面的界面不会陌生,看起来是个中规中矩感觉很正常的工具。经分析,该“工具”是一款基于开源勒索项目“hidden-tear”而二次开发的勒索软件,目前还处于调试开发阶段,至于处于开发阶段的勒索为啥会被直接公开,目前还无法探知来源。不过随着以前被广大用户使用的也会暗地里附带后门等的相关常用工具近期也逐步转移到了勒索的阵营,在此深信服安全团队提醒后期对于使用该类“工具”的用户还是需高度警惕,谨防中招。
样本分析
第一个样本是采用.net编写的恶意文件,如下。
时间戳为2065-11-14 22:44:14,存在的调试路径,C:\Users\wzl21\Documents\CyberThanos\obj\Debug\CyberThanos.pdb,可以发现目前还处于开发调试阶段。由于处于开发阶段,无任何的反分析手段,直接反编译找到入口点如下。
勒索的流程主要是从startAction方法开始,如下。
会加密以下四个目录(取当前用户目录与用户名路径拼接),分别是Desktop、Downloads、Pictures、Documents。
目录加密一开始就会产生随机的字符串(16个字节)作为加密密钥,如下。
其中会被加密的文件后缀如下;”.txt”, “.doc”, “.docx”, “.xls”, “.xlsx”,”.ppt”, “.pptx”, “.odt”,”.jpg”,”.png”,”.csv”,”.sql”,”.mdb”,”.sln”, “.php”,”.asp”,”.aspx”, “.html”,”.xml”, “.psd”,”.cpp”, “.c”, “.cs”, “.cpp”, “.ini”,”.json”,”.js”,”.resx”,”.js”,总共29个文件类型。
在随机产生密钥的流程里,存在使用随机数取对应固定字符串位置进而拼接产生密钥的过程。
最后进入核心加密流程,如下。
之前产生的16字节字符串经过SHA256计算得到32个字节的密钥,采用AES算法进行加密,如下。
采用的AES-256算法,使用CBC加密模式,固定了salt值。
如果每次输入的密钥一致,则Key与IV也输出一致,测试如下。
加密完后,会产生勒索信,由于处于开发调试阶段,勒索信的内容还未更改,如下。
最后会退出进程
第二个捕获的相似样本也是无界面,异常时间戳为2102-04-11 11:26:03,调试路径依然为C:\Users\wzl21\Documents\CyberThanos\obj\Debug\CyberThanos.pdb,还是同一个作者。经分析,改动不大,更改了加密后缀名以及勒索新内容,当前版本相比于上述版本更原始,只判断“.testfile”后缀,估计是前期代码逻辑测试。
溯源分析
由于提供了pdb目录,值得注意的是提供了用户名“wzl21”,通过搜索,发现也没用任何有用的信息,值得注意的是文件名“CyberThanos”是一个国外的安全公司。在程序层面,该勒索基于开源项目进行了二次开发,是一个五年前的项目,由此也可以看出,最近几年在勒索软件发展进度非常快,短短几年就涌现了许多高级的勒索软件。
缺陷分析
作为安全研究人员,我们要回答的常见问题是勒索软件是否可以解密?这意味着,如果勒索软件存在弱点或缺陷就很有可能让用户不支付昂贵的勒索费用来恢复文件。
由于采用了.net编写,经分析后,发现密钥的生成过程中存在一定的缺陷,具体为调用Random无参的构造函数其实调用的是有参的构造函数,传递的默认值为Environment.TickCount,System.Environment.TickCount是获取系统启动后经过的毫秒数。
这里举例下Win7系统查看“系统启动后经过的毫秒数”,可右击“任务栏”,选择“启动任务管理器”在资源管理器界面中,点击“性能”选项卡,就能看到“开机时间”,转换为毫秒数即可。
随机数种子取的就是这个值,它的返回值是int,4个字节大小为32位长度,最大值为2的32次方,4,294,967,296,也就是说种子值的范围为0-4,294,967,296,既然种子范围确定了,可以根据密钥生成流程自行模拟生成所有全部可能的密钥值。
普通PC预计跑49天可跑完所有可能的密钥,如下粗略的计算结果,理论上加上解密过程比对的时间会稍长很多。
解密脚本演示
在枚举密钥的过程中需要比对是否为正确的密钥,所以可以选取有代表性的文件,比如图片文件的头几个字节,因为一般情况下是一致的。
jpg文件头
字节序列:FF D8 FF E0 00 10 4A 46
十进制序列:2552162552240167470
png文件头
字节序列:89 50 4E 47 0D 0A 1A 0A
十进制序列:13780787113102610
using System; using System.IO; using System.Text; using System.Security.Cryptography; namespace Decrypt { class Program { public static string randomStringGenerator(uint stringLength, int i) { StringBuilder stringBuilder = new StringBuilder(); Random random = new Random(i); while (stringLength-- > 0u) { stringBuilder.Append("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&*()"[random.Next("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890!@#$%^&*()".Length)]); } return stringBuilder.ToString(); } public static bool IsAllowedExtension(string filePath) { FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(stream); string fileclass = ""; try { for (int i = 0; i < 8; i++) { fileclass += reader.ReadByte().ToString(); } } catch (Exception) { throw; } if (fileclass == "13780787113102610") //png 13780787113102610 //jpg 2552162552240167470 { stream.Close(); reader.Close(); return true; } else { stream.Close(); reader.Close(); return false; } } static void Main(string[] args) { byte[] targetByte = File.ReadAllBytes(System.Environment.CurrentDirectory + "\\test.png.encrypted"); for (int i = 0; i < 1200000; i++) { byte[] result = null; Console.WriteLine(i.ToString()); string password = randomStringGenerator(16u, i); //VKB0N6bLxq&rcF@7 byte[] array = Encoding.UTF8.GetBytes(password); byte[] array_hash = SHA256.Create().ComputeHash(array); using (StreamWriter sw = new StreamWriter(System.Environment.CurrentDirectory + "\\AES-KEY.txt", true)) { byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; using (MemoryStream memoryStream = new MemoryStream()) { using (RijndaelManaged aesManaged = new RijndaelManaged()) { aesManaged.KeySize = 256; aesManaged.BlockSize = 128; Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(array_hash, salt, 1024); aesManaged.Key = rfc2898DeriveBytes.GetBytes(aesManaged.KeySize / 8); aesManaged.IV = rfc2898DeriveBytes.GetBytes(aesManaged.BlockSize / 8); aesManaged.Mode = CipherMode.CBC; using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aesManaged.CreateDecryptor(), CryptoStreamMode.Write)) { cryptoStream.Write(targetByte, 0, targetByte.Length); cryptoStream.Close(); } result = memoryStream.ToArray(); File.WriteAllBytes(System.Environment.CurrentDirectory + "\\test.png", result); bool flag = IsAllowedExtension(System.Environment.CurrentDirectory + "\\test.png"); if (flag) { Console.WriteLine("解密成功"); sw.WriteLine(BitConverter.ToString(array).Replace("-", "") + " 找到正确的密钥"); break; } else { sw.WriteLine(password); sw.WriteLine(BitConverter.ToString(array_hash).Replace("-", "")); Console.WriteLine(BitConverter.ToString(array).Replace("-", "") + " 不是正确的密钥"); } } } } } } } }
最终获取的正确密钥结果(SHA256)(最后会被使用作为AES的密钥)
威胁情报
74a63c91d5711c9f47815f60023cc634
ed0f4174a47cd3cd0e1bcf0e373594a5
解决方案
深信服下一代防火墙AF、终端检测响应平台EDR、安全感知平台SIP等安全产品均能有效检测防御此恶意软件,已经部署相关产品的用户可以进行安全扫描,检测清除此恶意软件,如图所示:
来源:freebuf.com 2020-09-07 14:32:33 by: 深信服千里目安全实验室
请登录后发表评论
注册