社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 869阅读
  • 2回复

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

楼层直达
z3960 
级别: 茶馆馆主
发帖
770867
飞翔币
207694
威望
215657
飞扬币
2511641
信誉值
8


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+1Fj002FFB9A   call  ds:memset002FFBA0   call  sub_2F1250      ;;;CreateDirectoryW002FFBA5   push  1Eh002FFBA7   lea   eax, [ebp-20h]002FFBAA   push  edi002FFBAB   push  eax002FFBAC   call  ds:memset002FFBB2   add   esp, 18h002FFBB5   mov   dword ptr [ebp-1Ch], 1  ;; FO_MOVE002FFBBC   lea   eax, [ebp-20h]         ; SHFILEOPSTRUCTA structure002FFBBF   mov   dword ptr [ebp-18h], offset unk_3083F8 ;; current file path in %temp% folder.002FFBC6   mov   esi, 0E14h002FFBCB   mov   dword ptr [ebp-14h], offset word_307EE0 ;  %LocalAppData%culturesourceculturesource.exe.002FFBD2   mov   [ebp-10h], si002FFBD6   push  eax002FFBD7   call  ds:SHFileOperationW002FFBDD   test  eax, eax002FFBDF   jnz   short loc_2FFBEA002FFBE1   cmp   [ebp-0Eh], edi002FFBE4   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服务器接收数据时,它在系统注册表的 HKCUSoftwareMicrosoftWindowsCurrentVersionRun 子键下创建一个名为 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 : 2170.164.196.211 : 995175.101.79.120 : 80187.233.136.39 : 1435.107.250.192 : 99550.224.156.190 : 80805.107.161.71 : 993186.179.243.7 : 99571.240.202.13 : 443190.215.53.85 : 80133.242.164.31 : 7080115.71.233.127 : 44369.136.227.134 : 22216.49.114.172 : 443153.121.36.202 : 7080181.119.30.27 : 99570.164.196.211 : 2098.157.215.153 : 8062.75.187.192 : 8080189.234.165.149 : 8080154.72.75.82 : 2045.123.3.54 : 443217.13.106.160 : 708075.99.13.124 : 7080198.74.58.47 : 44369.195.223.154 : 7080172.114.175.156 : 808073.124.73.90 : 2074.80.16.10 : 8024.11.67.222 : 443181.143.53.227 : 21173.76.44.152 : 20208.78.100.202 : 808047.44.164.107 : 99345.63.17.206 : 808050.31.0.160 : 808062.75.191.231 : 808098.142.208.27 : 44378.187.172.138 : 708067.205.149.117 : 44398.186.90.192 : 4435.230.147.179 : 808050.240.162.242 : 99594.76.200.114 : 8080178.62.37.188 : 44383.222.124.62 : 808070.184.83.93 : 20173.255.196.209 : 8080208.107.230.235 : 20186.179.80.102 : 44372.95.118.97 : 21162.250.19.59 : 80134.129.126.86 : 44369.198.17.7 : 80808.17.46.42 : 5370.90.183.249 : 708047.149.54.132 : 8080200.116.160.31 : 80175.143.84.108 : 50000178.254.31.162 : 8080175.110.104.150 : 20211.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
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 超级版主
发帖
834398
飞翔币
226666
威望
224648
飞扬币
2446569
信誉值
0

只看该作者 1 发表于: 2019-03-09
来看一看了
级别: 超级版主
发帖
834398
飞翔币
226666
威望
224648
飞扬币
2446569
信誉值
0

只看该作者 2 发表于: 2019-03-09
不错,了解了