攻击事件介绍
近期,鹰眼情报中心(https://ti.duba.net)监测到Emotet僵尸网络活跃增加,已有多家企业单位中招。Emotet曾是自2014年至今全球规模最大的僵尸网络之一,经常针对企业、权威机构等用户的计算机进行攻击,除了凭证窃取、电子邮件窃取、发送垃圾邮件模块之外,它还会不断下载分发其他恶意程序,在过去的7年时间里,给社会带来了极大的损失和影响。2021年1月,Emotet僵尸网络被执法部门取缔,并于4月25日下发“自毁模块”后被彻底捣毁,C2服务器一度接近瘫痪。好景不长,在同年11月,它带着新版本卷土重来,与以往不同的是它利用混淆和加密的对抗手段又有了进一步提升。
鹰眼情报中心显示,在Emotet复苏后的三个月迎来了一波传播高峰, 它目前的活动量相较被打击之前已恢复至近50%的水平。如图1.1所示:
图1.1 Emotet家族近一年趋势图
流程概要
为了规避安全软件的监测,Emotet传播渠道主要是通过电子邮件受密码保护的zip附件或者包含宏的钓鱼文档,文档中通常包含VBA宏或Excel4.0宏。攻击者通过社工手段将钓鱼邮件伪装成合法的电子邮件回复,诱导用户打开恶意文档。当用户按照邮件或文档的内容提示启动宏脚本之后,由LOLBin下载、调用具有后门的DLL文件,再经过内存解密加载执行真正的Emotet木马模块,其中主要包含自身持久化、用户数据窃取、恶意软件分发等操作。
图1.2 Emotet流程图
详细分析
Emotet钓鱼文档名称都具有一定主题,通常以时事、通知、广告等相关内容伪装命名,如下所示:
- “Invoice-XXXXXXXXxlsm”
- “datos facture.doc”
- “AD-XXXX report.xls”
- “Delivery confirmation from XXX.xls”
- “Withdrawal: Russia-Ukraine Military Conflict: Welfare of Our Ukrainian personnel.doc”
在引诱用户按照邮件、文档操作执行之后病毒开始执行,接下来主要介绍其脚本运行、内存解密加载和恶意代码下载执行的详细过程。
1. 初始执行
此文档通过图文诱骗用户开启执行宏选项,在表格中包含多个隐藏工作表和Auto_Open宏功能用于执行宏脚本。
图1.3 Emotet文档显示开启宏提示,隐藏工作表列表
攻击者将字符散布在各个隐藏的表格中,使用白底白字的障眼法和引用混淆手段进行隐匿。通过深入调试后我们发现动态拼接完的宏代码真正目的是:通过本机API函数从服务器下载具有Emotet有效载荷的OCX文件并利用rundll32.exe加载。
图1.4 XLM宏实现利用本机API函数下载执行Payload
该恶意模块在本地复制了自己的副本为 < random name > ,这个文件充当了此次感染的主要临时文件夹,并且调用DllRegisterServer函数执行恶意行为,最后进行自删除。
图1.5 Emotet钓鱼文档执行流程树
2. 对抗手段
(1) 参数隐藏
宏脚本中利用rundll32首次调起Payload时传参是当前的时间戳,隐藏调用的目标函数字符串。校验参数时如果是随机值则创建进程并重新调起Payload,并修正参数为“DllRegisterServer”。
图2.1 修正传参调起Payload
(2) 内存装载
实际的Emotet木马模块被加密处理后回写到原始位置,当程序运行时就会将此处的内容动态的进行解密,向对应的内存中远程写入解密内存DLL的部分,修复重定位和导入表,从而实现反射式DLL注入。整个过程中无文件落地,注入完成后立刻调用木马模块的DllEntryPoint函数执行初始化动作。
图2.2 内存自加载模块,加载Emotet木马模块并初始化
图 2.3 在申请的内存空间复制已解密的内存DLL
此时,可以转储解密的内存 DLL,查看其导出函数及内部行为。
图 2.4 内存DLL的调用及导出函数
(3) 字符串、接口加密
DLL中的字符串均被加密,所有的模块基址和API都是通过计算对比hash值进行动态地获取,加大了逆向分析的难度。
图 2.5 加密字符串、接口
(4) 控制流程平坦化混淆
此Emotet样本使用控制流程平坦化的方式对全模块进行了代码混淆,其工作原理如下:
- 把一个函数分割成多个小的代码块;
- 给每个代码块分配一个特定编号;
- 在代码块的末端根据原有逻辑顺序,提供需要执行的下一个代码块编号;
- 将所有代码块包含在一个大的循环体中,通过switch语句对流程的控制,执行时根据块号正确地跳转,直至结束。
其代码结构和具体实现如图2.6所示:可以看到大量的跳转被反编译转换为嵌套的 while 循环,混淆了每个模块之间的联系。
图2.6 控制流结构图及反编译while嵌套
3. 持久化和更新模块
由于Emotet会不断地从远程服务器自动更新下载执行自身模块或者恶意模块,所以它通过自我备份到其他目录、创建自启注册表项、设置自启服务的方式实现长期驻留在用户计算机中。从服务器下载的恶意模块会根据通讯数据中的控制选择不同的方式运行exe或者dll文件。
图2.7 持久性和更新模块部分实现
4. 网络通讯模块
C2配置是加密存储在DLL的数据节区中。在通讯的过程中会进行IP解密、加密流量和验证数据的一系列操作,获取服务器的返回结果后就会根据结果继续执行流程。
Emotet在此版本中的网络流量保护和验证使用了椭圆曲线加密算法(ECC),较以往的RSA加密方式来看,如果想解密通信内容变得更加困难。
图2.8加密C2列表和ECC密钥
图2.9 C2配置解密模块
图2.10 网络通讯模块
5. 关联同源样本
登录鹰眼情报中心(https://ti.duba.net),搜索或者上传样本后查看分析出的C2配置(图2.11),通过IP地址查看所属家族和地区等详细信息,在“关联情报”里点击相关通信文件等选项即可获取关联的同源家族样本(图2.12)。
图2.11 鹰眼威胁情报中的通信IP
图2.12 鹰眼威胁情报样本溯源
获取更多同类家族的样本则是通过高级搜索功能查找指定时间范围内的Emotet样本集:
图2.13 鹰眼情报中心高级搜索功能
6. Emotet变化趋势
(1) 代码混淆
作为多态病毒,在每次版本升级的时候,代码混淆方式都会有所变化,从最初的垃圾指令植入到局部shellcode ollvm,再到现在的全模块ollvm,对抗性不断加强,基于特征的检查也越来越困难。
(2) 模块结构
当前的Emotet木马尚未部署任何新模块,但是其中枚举进程列表的行为转移到单独的模块中,从而减小初始加载程序的体积,也使得代码特征的检测提升了难度。
(3) 加密方式
在2020年之前Emotet僵尸网络使用的C2服务器使用 RSA 公钥来加密动态生成的 AES 加密密钥,攻击者认为这次清剿成功的部分原因是密钥泄露造成,在更新后的版本中改成了椭圆曲线加密 (ECC)。
总结
通过上述对样本的分析和鹰眼情报中心关联的样本来看,此次Emotet与复活后的样本在技术上没有重大的变化,但在攻击源上有一些差异,此次攻击中使用的C2和Epoch4,Epoch5僵尸网络有同源性,攻击应该由Epoch4和Epoch5僵尸网络节点发起,而在取缔之前通常由Epoch1,Epoch2,Epoch3僵尸网络发起。虽然本次分析中未有其他模块下发,但从外部分析看已有捕获到Qbot、Cobalt Strike等恶意模块的部署,在未来的进化中非常有可能将勒索软件或其他恶意软件家族部署到其控制的受感染机器,传播速度和风险危害仍然不容小觑,需要做好检测及防范措施。
建议
Emotet的攻击目标主要针对企业、权威机构或者特定用户、组织。为避免您的计算机遭受Emotet的侵害,我们建议您:
- 在打开文档前请检查发件人的邮件地址是否真实,不要轻易打开附件或单击链接。
- Emotet通常隐藏在Microsoft Office文件中,需要允许宏的运行才能执行,未必要时建议不要开启执行宏的选项,在必须使用宏的场景下可以仅允许已签名的宏运行。
- 定期更新操作系统,并安装杀毒软件最新版本做好防御工作。
- 定期备份重要数据文件。
- 如果是公司网络应该对访问进行持续监控,发现异常及时响应,防止进一步传播。
IOCs
MD5
c3f6a8daa9d582a7c8f29e2616a6b0e0
18b1c41dbe435ae7433ee782a9717603
73e1e8a0103746aa5a8ed84a1f7ac189
c872bec63374278b71f8dfb080f44899
823be72f4f7e88540b21daa9ee44b2f2
a82d1fc11496c01a2bd437adab970bdf
C&C(部分)
172.104.227.98:443
31.207.89.74:8080
46.55.222.11:443
41.76.108.46:8080
103.8.26.103:8080
185.184.25.237:8080
103.8.26.102:8080
203.114.109.124:443
45.118.115.99:8080
178.79.147.66:8080
58.227.42.236:80
45.118.135.203:7080
103.75.201.2:443
195.154.133.20:443
192.254.71.210:443
45.142.114.231:8080
212.237.5.209:443
207.38.84.195:8080
104.251.214.46:8080
212.237.17.99:8080
212.237.56.116:7080
216.158.226.206:443
110.232.117.186:8080
158.69.222.101:443
107.182.225.142:8080
176.104.106.96:8080
81.0.236.90:443
50.116.54.215:443
138.185.72.26:8080
51.68.175.8:8080
210.57.217.132:8080