EMOTET深度分析

2019-06-20 约 280 字 预计阅读 2 分钟

声明:本文 【EMOTET深度分析】 由作者 angel010 于 2019-06-20 08:39:00 首发 先知社区 曾经 浏览数 119 次

感谢 angel010 的辛苦付出!

导语:​FortiGuard研究人员对5月份发现的Emotet恶意软件样本进行了分析。


FortiGuard研究人员就持续关注Emotet恶意软件的发展,本文对5月初发现的Emotet样本进行深度分析,具体包括解包persistent payload、与C2服务器的通信、识别硬编码在可执行文件中的C2服务器列表和RSA密钥、以及如何加密收集的数据。

恶意word文档

该样本是一个word文档文件。打开word并启用宏后,恶意软件就会开始执行。

图1. 执行PowerShell脚本

可以看出恶意word文档中的VB脚本可以用PowerShell创建新进程。PowerShell的-e选项表明接收base64编码的字符串版本的命令。

解码的PowerShell脚本如图2所示:

图2. 调试解码的PowerShell脚本

变量$YBAAU_D是一个含有5个URL的列表,可以用来从远程服务器下载payload并执行。下表列出了每个恶意URL、以及从对应URL下载的payload名、md5值和payload大小。

研究人员分析5月初的样本时发现,前2个URL已经无法访问了,剩下3个URL仍然可以访问,这3个payload都是PE文件。

然后,研究人员对其中一个payload进行深入文件。本文的分析是基于payloadp4xl0bbb85.exe(md5: a97cbbd774ca6e61cf9447d713f7cf5d)的。

第一层payload

payloadp4xl0bbb85.exe是用定制的packer打包的。执行后,会创建三个进程,如下图所示:

图3. payload p4xl0bbb85.exe执行后的进程树

首先用命令行–f02b3a38启动进程(pid:2784),然后将PE文件itsportal.exe写入文件夹C:\Users\[XXX]\AppData\Local\itsportal\中。然后,执行itsportal.exeitsportal.exe执行后就可以用命令行–c6857361启动进程pid:1980。最后,退出前3个创建的进程,并将PE文件p4xl0bbb85.exe从硬盘中删除。PE文件itsportal.exe就是persistent payload。

图4. persistent payload

Persistent Payload分析

Payload itsportal.exe有一个定制的packer。研究人员追踪了入口点的几个步骤,发现程序进入了函数sub_4012E0()

图5. 函数sub_4012E0()

下面是函数sub_4012E0()的C语言伪代码表示:

图6. 函数sub_4012E0()的C语言伪代码表示

在该函数中,恶意软件会调用函数sub_401440()来用VirtualAllocEx()分配新的内存区域(0x1D0000),设置内存的开始地址加0x102f0作为trampoline address。

然后,在循环中,首先复制0xf080f8的数据的0x7B字节到新的内存区域,然后继续复制数据。当字节达到0x37时,就不会在复制到新的内存区域。复制到内存区域的数据大小为0x10600

然后,用函数sub_401560()来解密新的内存区域中的数据,此时trampoline代码就被解密了。然后,就看到程序会跳转到trampoline code。最后,程序跳转到0x00401260来执行指令。

图7. 跳转到0x00401260

如图8所示,程序会跳转到0x1E02F0来执行 trampoline代码。

图8. 跳转到trampoline code

trampoline code的主要作用是:

  1. 分配大小为0x10000的心的内存区域(0x1F0000),并命名为region A;

  2. 复制0x1D0124的数据的0xf600字节到region A;

  3. 解密内存region A的数据,解密算法如下:

  1. 分配大小为0x14000的新的内存区域(0x200000),并命名为region B;

  2. 复制region A的数据的前0x400字节到内存region B的开始;

  3. 复制region A的所有数据段到内存region B;

  4. 通过调用进程的地址空间来调用函数UnmapViewofFile(0x400000)来解除其与文件的映射;

  5. 调用函数VirtualAlloc(0x400000,0x14000,MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)来执行、读写内存区域;

  6. 复制内存区域region B数据的0x14000字节到0x400000;

  7. 从trampoline代码的真实入口点(0x4CA90)跳转到执行指令。此时,解包工作就完成了。

下图是内存图,其中标明了分配的内存区域和解包的程序。

图9. 3个分配的内存区域和解包的程序

最后,程序会跳转到真实的入口点0x4C9A0。

图10. 跳转到真实的入口点

这就是如何解包Emotet恶意软件。在解包的程序中,C2服务器列表硬编码在offset0x40F710处,公钥硬编码在offset 0x40FBF0处。

与C2服务器通信

为了调查与C2服务器的通信,研究人员首先获取C2服务器列表。C2服务器是硬编码在可执行文件中的,解包后,研究人员看到了offset0x40F710处保存的C2服务器列表,如图11所示。

图11. 硬编码的C2服务器列表

全局变量保存在0x004124A0处,结构如下所示:

struct g_ip_port_list
{
                  DWORD *c2_list;
                  DWORD *current_c2;
                  DWORD size;
                  DWORD current_c2_index;
}

成员变量c2_list指向硬编码的C2服务器列表缓存,列表中的每一项都包含IP地址和端口对。大小为8字节,前4个字节表示IP地址,之后的2个字节表示端口。成员变量current_c2指向当前选择的C2服务器。成员变量size表示C2服务器列表的大小,成员变量current_c2_index表示C2服务器列表中当前选定的C2服务器的索引。

样本中共含有61个C2服务器,分别是:

· 200.58.171.51:80

· 189.196.140.187:80

· 222.104.222.145:443

· 115.132.227.247:443

· 190.85.206.228:80

· 216.98.148.136:4143

· 111.67.12.221:8080

· 185.94.252.27:443

· 139.59.19.157:80

· 159.69.211.211:8080

· 107.159.94.183:8080

· 72.47.248.48:8080

· 24.150.44.53:80

· 176.58.93.123:8080

· 186.139.160.193:8080

· 217.199.175.216:8080

· 181.199.151.19:80

· 85.132.96.242:80

· 51.255.50.164:8080

· 103.213.212.42:443

· 192.155.90.90:7080

· 66.209.69.165:443

· 109.104.79.48:8080

· 181.142.29.90:80

· 77.82.85.35:8080

· 190.171.230.41:80

· 144.76.117.247:8080

· 187.188.166.192:80

· 201.203.99.129:8080

· 200.114.142.40:8080

· 43.229.62.186:8080

· 189.213.208.168:21

· 181.37.126.2:80

· 109.73.52.242:8080

· 181.29.101.13:80

· 190.180.52.146:20

· 82.226.163.9:80

· 200.28.131.215:443

· 213.172.88.13:80

· 185.86.148.222:8080

· 190.117.206.153:443

· 192.163.199.254:8080

· 103.201.150.209:80

· 181.30.126.66:80

· 200.107.105.16:465

· 165.227.213.173:8080

· 81.3.6.78:7080

· 5.9.128.163:8080

· 69.163.33.82:8080

· 196.6.112.70:443

· 37.59.1.74:8080

· 23.254.203.51:8080

· 190.147.116.32:21

· 200.45.57.96:143

· 91.205.215.57:7080

· 189.205.185.71:465

· 219.94.254.93:8080

· 186.71.54.77:20

· 175.107.200.27:443

· 66.228.45.129:8080

· 62.75.143.100:7080

然后,分析发送到C2服务器的流量。在样本中,发送给C2服务器的数据是以HTTP POST请求的方式发送的。

图12. 抓取的发给C2服务器的流量

HTTP session如下图所示。HTTP body数据是用URL编码算法编码的:

图13. HTTP session数据

在执行URL解码后,可以看出数据是用base64编码的。经过base64解码后,可以看到真实的数据是经过加密的。下一部分介绍HTTP body数据使用的解密算法。

图14. 解码的HTTP body数据使用URL解码和base64解码

加密算法

Emotet恶意软件可以收集诸如host name、运行在受感染的机器上的进程列表等信息。下面是收集的数据集:

图15. 收集的数据的结构

然后,将收集的数据用Deflate算法压缩:

图16. 用Deflate算法压缩数据

然后,恶意软件会用session key将图16中的压缩数据进行加密,并用AES和session key、哈希值和加密的数据打包,session key是用RSA公钥算法加密的。

图17. 打包后的数据结构

用RSA公钥加密的Session key大小为0x60字节,哈希值的大小为0x14

将这3部分数据打包后,恶意软件会继续用base64来编码打包的数据,然后用URL编码算法进行编码。最后就组成了要发送给C2服务器的http body数据。

图18. HTTP body data

从通信的角度来看,程序必须要处理来自C2服务器的响应数据,首先解密HTTP响应数据,然后用Deflate算法解码对应的数据。

RSA密钥硬编码在解包的程序的offset0x0040FBF0处,大小为0x6A字节。

图19. 硬编码的RSA密钥

结论

Emotet是一款复杂的恶意软件,其中使用了高级的定制packer和复杂的加密算法来与C2服务器进行通信,并含有其他高级功能。它会从C2服务器提取出攻击payload和其他相关的恶意软件payload。这些攻击payload的目的都是从受害者处窃取敏感信息。

预告:下一篇关于Emotet的文章将介绍如何解包Emotet可执行文件并从可执行文件中提取出硬编码的C2服务器列表和RSA密钥。

本文翻译自:https://www.fortinet.com/blog/threat-research/deep-dive-into-emotet-malware.html

关键词:[‘安全技术’, ‘技术讨论’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now