深入分析恶意软件 Emotet 的最新变种

文章翻译自:https://www.fortinet.com/blog/threat-research/analysis-of-a-fresh-variant-of-the-emotet-malware.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+fortinet%2Fblogs+%28Fortinet+All+Blogs%29

Emotet 并不是一个新的恶意软件家族。事实上,它已经存在好几年了。我们在 2017 年捕获了一个传播 Emotet 的 JS 文件,我对其进行了分析,并发表了两篇关于它的研究(Part1, Part2)。

然而,就在最近, FortiGuard 实验室捕获了一种新的 Emotet 变种。这一次,它被嵌入到 Microsoft Word 文档中。我对它进行了详细分析,在这个博客中,我将向您展示它如何在受害者的机器上运行的。

Word 文件样本

图1 打开文件时会有安全提示

这个受感染的文档名字为 PAY09735746167553.doc,它的宏中包含了一些恶意 VBA 代码。图 1 是它在打开时显示的内容。一旦用户点击了 Enable Content 按钮,文件中的恶意的 VBA 代码就会自动运行。经过一段时间后,它会生成并执行一个很大的 PowerShell 文件。生成的 PowerShell 代码会从几个动态生成的 url 下载真正的 Emotet 文件,如图2所示。

图2 下载并执行 Emotet 的 PowerShell 代码

Emotet 文件的下载与拷贝

下载的文件就是 Emotet 恶意软件。它的文件名是随机字符串,位于%temp%文件夹中。当它运行时,它会判断自身的文件路径,如果它不在 %LocalAppData%\culturesource\ 中,则会将原来的 exe 文件从 %temp% 文件夹移动到 %LocalAppData%\culturesource 路径下(如果文件夹还不存在,它甚至会创建文件夹),并将其重命名为 culturesource.exe。而且,单词 culturesource 是从其内存中解密出来的常量字符串。

下面是相关的 ASM 代码片段。它调用了 SHFileOperationW 来执行文件重定位,并且在 Timer 回调函数中被调用,稍后我将详细讨论这个函数。

[.....]
002FFB9A   loc_2FFB9A:                             ; CODE XREF: sub_311D78+1Fj
002FFB9A   call  ds:memset
002FFBA0   call  sub_2F1250      ;;;CreateDirectoryW
002FFBA5   push  1Eh
002FFBA7   lea   eax, [ebp-20h]
002FFBAA   push  edi
002FFBAB   push  eax
002FFBAC   call  ds:memset
002FFBB2   add   esp, 18h
002FFBB5   mov   dword ptr [ebp-1Ch], 1  ;; FO_MOVE
002FFBBC   lea   eax, [ebp-20h]         ; SHFILEOPSTRUCTA structure
002FFBBF   mov   dword ptr [ebp-18h], offset unk_3083F8 ;; current file path in %temp% folder.
002FFBC6   mov   esi, 0E14h
002FFBCB   mov   dword ptr [ebp-14h], offset word_307EE0 ;  %LocalAppData%\culturesource\culturesource.exe.
002FFBD2   mov   [ebp-10h], si
002FFBD6   push  eax
002FFBD7   call  ds:SHFileOperationW
002FFBDD   test  eax, eax
002FFBDF   jnz   short loc_2FFBEA
002FFBE1   cmp   [ebp-0Eh], edi
002FFBE4   jz    loc_2FFCA0
[.....]

最后,它调用 CreateProcessW 来运行 culturesource.exe 文件,然后退出当前进程。

Emotet 中的抗分析技术

接下来,Emotet 启动了第二个 culturesource.exe,用来保存和执行 Emotet 主要功能。一旦第二个 culturesource.exe 正常启动,第一个进程将退出。然后,Emotet 会动态地将代码和数据释放到许多内存块中,这些内存块随后会执行 Emotet 的后续任务。

大多数的函数都被分成了多个部分。下面我选其中一个来描述它是如何使用这个技巧的。图 3 显示了一个普通的函数被分割成七个部分,这些部分都使用 jmp 指令进行连接,从而增加了代码分析的难度。

图3 一个函数被分成了七个部分

所有字符串都经过加密,然后在使用它们之前进行解密。所有导入的API也都是加密的,并且在调用之前进行解密。图 4 描述了一个将字符串 "unk_3031F0" 解密成字符串 "user32.dll" 的过程。它在解密完成后,Emotet 会调用 LoadLibraryW 来加载 "user32.dll"。然后使用解密后的API信息在模块 "user32.dll" 中找到导出的API。

图4 解密字符串并从 user32.dll 加载API

Emotet 的启动器-Timer 函数

此外,Emotet 还使用 Windows 的 Timer 事件来执行其代码。在我之前的两篇分析中,它使用 WindowProc 函数捕获 Timer 消息并执行恶意行为。然而,这个版本有点不同。在这里,它直接使用了 Timer 的回调函数。当它调用 SetTimer 时,它会设置间隔时间为 1000。这意味着回调函数会每隔 1000 执行一次。下面是这个回调函数的伪代码:

void __stdcall Timer_fun(int a1, int a2, int a3, int a4)
{
  unsigned int v4; // esi@6
  int v5; // eax@6
  unsigned int v6; // esi@15
  int v7; // eax@15
  int v8; // esi@16
  int v9; // eax@16
  if ( qword_307C94 <= (unsigned __int64)(unsigned int)GetTickCount() )
  {
    switch ( HIDWORD(qword_307C94) )
    {
      case 1:
        HIDWORD(qword_307C94) = 0;
        if ( !sub_2F6BA0() || !sub_2F7170() || check_if_process_is_in_correct_path() )
          goto LABEL_7;
        v4 = GetTickCount() % 0xBB8u;
        v5 = GetTickCount();
        HIDWORD(qword_307C94) = 2;
        LODWORD(qword_307C94) = v4 + v5 + 3000;
        break;
      case 2:
        HIDWORD(qword_307C94) = 0;
        if ( sub_2F8300()
          && sub_2F8430()
          && sub_2F8B20()
          && sub_2F95B0()
          && sub_2FA320()
          && sub_2FB750()
          && sub_2F68D0() )
        {
          dword_307CC4 = (int)&unk_3080E8;
          dword_307CC8 = (int)&unk_303430;
          dword_307CCC = 106;
          v6 = GetTickCount() % 0xBB8u;
          v7 = GetTickCount();
          HIDWORD(qword_307C94) = 3;
          LODWORD(qword_307C94) = v6 + v7 + 3000;
        }
        else
        {

LABEL_7:
          HIDWORD(qword_307C94) = 4;
        }
        break;
      case 3:
        HIDWORD(qword_307C94) = 0;
        v8 = GetTickCount();
        v9 = sub_2FCB20();
        HIDWORD(qword_307C94) = 3;
        LODWORD(qword_307C94) = v9 + v8;
        break;
      case 4:
        SetEvent(dword_304C0C);
        break;
      default:
        return;
    }
  }
}

Case 1

在 Case 1 中,它的一个功能将自身的文件移动到指定位置。此外,它还通过调用 GetComputerNameW 和 GetVolumeInformationW 来收集计算机名称、文件系统和卷信息。它将这些数据一起保存在一个全局变量中,该变量在 C&C 服务器中用作受害者的ID。然后,Emotet计算EXE文件的CRC32,并将其保存在另一个全局变量中,该变量在将第一个包发送到C&C服务器时使用。

Case 2

Case 2功能是通过 OpenSCManagerW 打开系统的服务管理器(Service Control Manager), 并设置一个名为 culturesource 的 Windows 系统服务,用于在Windows启动时运行Emotet。
与此同时,“culturesource.exe”被移动到文件夹“%windir%\system32”。图 5显示了已安装的服务“culturesource”的屏幕截图,它的启动类型是“Automatic”。

图5 culturesource 服务截图

Case 3

Case 3 的功能是初始化 DLL 模块并解密 Emotet 会用到的所有 API 函数,包括"urlmon.dll", "userenv.dll", "wininet.dll"等等。

Case 4

Case 4 是用来设置程序主要功能回调的分支。它收集受害者的系统数据,并将这些数据发送到其C&C服务器,以及执行从C&C服务器接收的指令。

译者注:这里的case 1234分支的功能与原文不同,译者认为原文出现了错误,如果大家感兴趣,可以再去原文比较一下

C&C 服务器通信

Emotet 会调用一些 API 函数来收集信息。比如,它调用 RtlGetVersion 来 Windows 版本信息,调用 GetNativeSystemInfo 来获取系统和 CPU 的信息。此外,他还会在 PEB 偏移 0x1D4 的位置选择一个 DWORD,用来作为其 Session ID。

Emotet 通过调用 CreateToolhelp32Snapshot、Process32FirstW 和 Process32NextW 持续收集正在运行的进程的名称。然后,Emotet 将所有收集到的数据放到一个数据结构中,对整个数据结构进行加密。图 6显示了 Emote 如何将这些数据拷贝到一个数据结构中。红色矩形中的值是用来表示后面数据的类型,带有蓝色下划线的值表示后面数据的长度,使用了 UTF-8 编码。

红色矩形中:
12 后面的字符串是计算机名。
18 后面的数据是本机系统信息。
20 后面的字节是生成自 PEB 的 Session ID。
2D 后面的 DWORD 值是 Emotet 文件的CRC32值。
32 后面的字符串是所收集的进程列表,

我在之前的博客中提到过,它的C&C服务器可以检查受害者的机器上是否运行着分析工具(如wireshark、调试器等)。如果检测到,它将不会用明文进行回复。

图6 culturesource 服务截图

数据加密后,它使用Base64对其进行编码。此外,它还将Base64代码伪装成HTTP报头的cookie值。在图7中可以看到Base64代码。

图7 culturesource 服务截图

在图 7 中,同样可以看到 C&C 服务器返回了一些数据。当受害者的机器第一次从C&C服务器接收数据时,它在系统注册表的 HKCU\Software\Microsoft\Windows\CurrentVersion\Run 子键下创建一个名为 cultruesource 的自动运行条目。现在他有两种启动 Emotet 的方法了,即系统服务和系统注册表中的自动运行。在图 8 和图 9 中,您可以看到关于向注册中添加自动运行条目的更多信息。

图8 添加新的自动运行条目

图9 注册表编辑器中添加的自动运行条目 culturesource 的屏幕截图

通过解密接收到的数据,我得到了一个PE文件,如图10所示。通过分析,我发现解密的 PE 文件是另一个 Emotet。它只是用来升级自己的。

图 10 从 C&C 服务器解密的数据

到目前为止,这是我对这个新变种的分析。我将继续关注这个Emotet活动,以获得更多的功能和变化。和以前的版本一样,C&C 服务器的 IP 列表被硬编码到它的内存中,并保存在一个全局变量中。每个 IP 和端口对使用 8 字节,总共有 62 个 C&C 服务器。以下是硬编码在这个版本的 IP 和端口列表:

71.91.161.118 : 21
70.164.196.211 : 995
175.101.79.120 : 80
187.233.136.39 : 143
5.107.250.192 : 995
50.224.156.190 : 8080
5.107.161.71 : 993
186.179.243.7 : 995
71.240.202.13 : 443
190.215.53.85 : 80
133.242.164.31 : 7080
115.71.233.127 : 443
69.136.227.134 : 22
216.49.114.172 : 443
153.121.36.202 : 7080
181.119.30.27 : 995
70.164.196.211 : 20
98.157.215.153 : 80
62.75.187.192 : 8080
189.234.165.149 : 8080
154.72.75.82 : 20
45.123.3.54 : 443
217.13.106.160 : 7080
75.99.13.124 : 7080
198.74.58.47 : 443
69.195.223.154 : 7080
172.114.175.156 : 8080
73.124.73.90 : 20
74.80.16.10 : 80
24.11.67.222 : 443
181.143.53.227 : 21
173.76.44.152 : 20
208.78.100.202 : 8080
47.44.164.107 : 993
45.63.17.206 : 8080
50.31.0.160 : 8080
62.75.191.231 : 8080
98.142.208.27 : 443
78.187.172.138 : 7080
67.205.149.117 : 443
98.186.90.192 : 443
5.230.147.179 : 8080
50.240.162.242 : 995
94.76.200.114 : 8080
178.62.37.188 : 443
83.222.124.62 : 8080
70.184.83.93 : 20
173.255.196.209 : 8080
208.107.230.235 : 20
186.179.80.102 : 443
72.95.118.97 : 21
162.250.19.59 : 80
134.129.126.86 : 443
69.198.17.7 : 8080
8.17.46.42 : 53
70.90.183.249 : 7080
47.149.54.132 : 8080
200.116.160.31 : 80
175.143.84.108 : 50000
178.254.31.162 : 8080
175.110.104.150 : 20
211.115.111.19 : 443

解决方案:

现在,FortiGuard 反病毒服务已经将此恶意 Word 文档标记为 “VBA/Agent.AFD!tr.dldr”,原始的 Emotet 文件也已检测为“W32/Kryptik.GBUH!tr”。我们还发布了一个名为 Emotet.Botnet 的 IPS 特征,用来检测 C&C 服务器和受害者之间的流量。下载 Emotet 的 URL 也已经被FortiGuard WebFilter评为恶意网站。

IoC

URL:

"hxxp://muathangnhom.com/6DOpkmOL9_yfO"
"hxxp://gmcvietnam.vn/abMbIaTzHSDkAq"
"hxxp://hugoclub.sk/yCq4xkYzeqAJK_v"
"hxxp://foreprojects.webedge.com.ng/Lc3UYXyQixr_Dp"
"hxxp://evonline.liceoriosdechile.com/NpDgofVhpankbq_I8AaJbzQj"

Sample SHA256:

PAY09735746167553.doc:

1194bab2c4a8e63e59ef01220ebe8e4d3511b12a16da30e713c2fbee6c2cb520

Downloaded Emotet/Original Exe file:

7C5CDC5B738F5D7B40140F2CC0A73DB61845B45CBC2A297BEE2D950657CAB658

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖