四叶参

首页 » 常识 » 预防 » 蔓灵花下载器样本分析
TUhjnbcbe - 2021/1/26 3:31:00

更多全球网络安全资讯尽在邑安全

初始载荷信息

攻击的初始载荷是一个文件名为双后缀名的文件“开证装期邮件.pdf.exe”,这是一种常见的文件伪装方式,利用Windows的扩展名显示设置(“隐藏已知文件类型的扩展名”)伪装真实的.exe后缀,再选择高级自解压选项中自定义自解压文件图标,选择让exe文件看起来像PDF文档,诱骗用户打开。

不过由于自解压格式的图标来源于文件,而不是系统自带的图标:

时常出现画风不同的C位出道场面(一看就是自带剧本的):

VT搜索该文件MD5可以看到有52/69的高检测率,匹配的YARA规则名可以解释为隐藏为PDF的SFX自解压文件:

SFX自解压文件,是一种压缩软件生成的exe文件,拥有执行后可以解压释放文件并执行的特性,通常被病*文件用来捆绑掩饰文档或其他白文件进行伪装。可将文件后缀改为rar,使用压缩软件打开,查看其中的文件和相关代码和解压,或者在文件属性的注释中也可以看到。如本文中的样本运行后会在“C:\intel\logs”路径下释放“dlhost.exe”并执行:

直接双击运行exe使初始载荷在指定路径下释放文件也行,多一个步骤要找一下文件。一般来说解压比较方便,但是有些样本会检测是否在设置的目录下运行,不是则退出,分析时需注意这一点(本文样本无此检测)。

有效载荷dlhost.exe

结论先行,带入结论看内容比较容易看进去。

“dlhost.exe”经过分析后发现为APT组织蔓灵花常用的下载器,用来收集受害者计算机信息和创建套接字通信,从远程服务器下载插件完成其他功能的操作。

在分析之前,建议先做一些准备工作,磨刀不误砍柴工~

去除随机基址

由于PE的特性,程序有基址随机化的问题,那么在分析前,需要查看并修改为不随机的情况,便于下断点分析后调试的配置文件(.udd)在重新运行后还能生效。

方式有多种,比较简单的是使用Editor查看PE文件,将在PE结构中有字段“(NtHeader→OptionalHeader→DllCharacteristics→)IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE”,如果数值为1,即开启了“基址重定位”(动态随机基址),现将其修改为0后保存文件:

也可以自己写脚本或者可执行程序将其修改。

查看断点

如果没有特地隐藏或者处理要使用的函数的情况(可“一般”是有的),查看IDA的导入表窗口中显示的函数,可以推测出一些功能,发现有:

1.套接字通信的函数,那么存在套接字通信(好绕):

2.文件操作函数,包括创建/打开、读取和写入等。可以推测有创建文件、读取文件、移动文件等操作:

3.获取信息操作:

那么此时可以通过导入表有个初步的判断,这是一个有获取计算机和用户信息,并且有文件操作的联网恶意软件——基本上已经可以推测出这是下载器或文件窃取器了。

反调试

一般来说恶意软件都会有反调试功能,反调试的方向也分多类,如:探测Windows调试器、识别调试器行为、干扰调试器的功能等。在《恶意代码分析实战》第16章反调试技术、《逆向工程核心原理》第51章静态反调试技术第52章动态反调试技术都有详细介绍,一般工作中遇到“Sleep”和“IsDebuggerPresent”比较多。

本样本虽无干扰调试的“Sleep”,但有检测调试环境的“IsDebuggerPresent”,问题不大,“15PBOD”的插件大礼包中“HideDebugger”已将该函数的返回值HOOK,即反反调试(狗头):

对API下断并检查

将样本拖入OD后,对敏感API函数下断,如:

套接字通信中发送数据的“send”;文件操作的“CreateFileW”、“ReadFile”和“WriteFile”;用于执行恶意载荷或命令的“ShellExecuteA”等。

接着可以“Alt+B”或菜单栏下的“B”(Break,断点之意),查看已下的断点,想取消断点时从这里也可以快速的找到:

查看后“Alt+C”或菜单栏下的“C”,可返回反汇编窗口。

查看函数调用

返回后可以使用右键“查找”功能中的“所有模块间的调用”,查看有无异常情况(那当然是有的):

大事不妙!异常就是大量调用动态获取函数地址的“GetModuleHandleW”+“GetProcAddress”,这是一种常见的规避检测的方式,并且也是一种反静态分析手段:

在IDA处找到对应的函数或代码后,使用IDA的脚本功能(Shift+F2):

使用IDA的重命名函数“MakeNameEX”编写的命令“MakeNameEx(longea,stringname,longflags);”。可以用Notepad++/Excel等编辑工具或Python/BAT脚本,将命令批量化处理后如下,复制粘贴后RUN:

将地址进行重命名,便于静态分析:

出现个别因为已有该名称所以冲突不能重命名的,单独重命名(N键)一下即可:

调试运行

IDA导出表可以查看到主函数“Start”地址,下断后F9可直接运行到断点处,进行调试分析。

解密操作

在IDA界面还可以发现比较重要的功能代码在函数C80处,其中有大量的if+DoWhile循环解密(解密方式-=0xD),问题不大,在解密函数完成后的那行代码下断:

此处建议看看解密出的内存都是什么数据,如果发现特殊的字符串或数据需要特地跟踪一下。比如此样本中解密的部分数据就很明显包括注册表路径、外连的URL字符串、和一串疑似指令的字符串“Yesfile”。这其实就是解密出了配置文件:

环境检测

如上上图所示,解密后就调用“CreateSemaphoreA”创建信号量“7t56yr54r”,接着调用“GetLastError”检测信号量是否创建成功,如果错误码为定义“ERROR_ALREADY_EXISTS”的(0xB7),即代表内存中已存在运行中的该进程,那么其后续的函数40C必然是退出进程函数(或者有可能进入扰乱分析或者伪装功能的代码):

通常恶意的可执行文件会通过CreateMutex创建互斥体或CreateSemaphore创建信号量(蔓灵花该下载器都是用信号量)+“GetLastError”获取错误码的方式让恶意进程在内存中保持唯一运行的状态,避免互相干扰。那么由此可以逆推,其实主要的功能代码,一般是在判断完互斥体或信号量后的部分(或者其他检测行为后)。时间比较紧迫的情况,可以考虑定位到检测+“GetLastError”后,“if”判断不成立的逻辑条件进行分析。

由于本人调试分析时,常利用火绒剑等监测工具监测后台运行的该进程,故“GetLastError”的返回值为0xB7,此步可以通过修改寄存器的ZF标志位跳过此步跳转:

网络行为

初始化操作和解密操作等非恶意功能代码比较多,先用IDA找比较重要的函数分析,再用OD按F4到CALL行查看其传入的参数,如外连“

1
查看完整版本: 蔓灵花下载器样本分析