Smoke Loader

分析样品

此分析的主要重点是下面的示例,该示例由Rig EK删除:

bce202c021feb61783563e21fc026767 –原始样本
d363e8356c82a1043bb300c12c6c7603 –已包装(第1阶段)
8932d2eacc4dfc7b2f0a94363a854610 –核心DLL(阶段2)
上面的示例下载:
有效负载:

f60ba6b9d5285b834d844450b4db11fd –(这是一个IRC漫游器,C&C:med-global-fox [DOT] com)
更新的烟雾装载机:

bc305b3260557f2be7f92cbbf9f82975 –原始样本
c8ec8ecc47b05074f5136e79b680fe9e –已包装(第1阶段)
8932d2eacc4dfc7b2f0a94363a854610 –核心DLL(Stage#2)–与先前的示例相同

在分析过程中,它将与2014年9月首次出现 的旧样本进行比较

efa7f95edacec888f39e5ce0ee675a95 –原始样本(通过垃圾邮件分发)
266319c97292842ce554d53806449dda –已包装(第1阶段)
c52f0bf75bebf12a2e7a65b8c8af72d4 –核心DLL(阶段2)

行为分析

部署后,Smoke Loader会将自身注入到explorer.exe中并删除原始可执行文件。我们可以看到它从资源管理器进程内部建立了新的连接。

安装和更新

Smoke Loader不仅安装其原始样本,而且还用从C&C路径:http:// /system32.exe下载的新版本代替它。这个技巧使检测变得更加困难–更新的样本由其他加密器重新打包,可能还会更改其C&C集。

在当前分析中,Smoke Loader的初始样本删除了以下样本:bc305b3260557f2be7f92cbbf9f82975

样本保存在%APPDATA%中的隐藏子文件夹中:

Smoke Loaded将其当前示例和所有其他下载的可执行文件添加到Windows注册表中。键的名称是从现有条目的名称中随机选择的:

这种持久性方法非常简单(与Kovter相比),但是针对检测主模块采取了一些对策。删除的可执行文件的时间戳已更改,因此无法通过搜索最近修改的文件来找到恶意软件。对文件的访问被阻止-无法对其进行读取或写入操作。

加载其他可执行文件

在系统中时,它会继续下载其他模块-“插件”。首先,将下载的模块以随机名称保存在%TEMP%中并运行。然后,将其移至%APPDATA%。在下面,我们可以看到有效负载与其单独的C&C建立了连接:

自动启动中还有一个脚本用于部署有效负载:

网络通讯

为了使对流量的分析更加困难,并且与C&C机器人进行通信会生成大量冗余流量,从而将请求发送到合法域。

当前样本的C&C地址:

  • smoktruefalse.com
  • 波斯王子24.ru

流量已部分加密。

在下面的示例中,我们可以看到Bot如何从C&C其他可执行文件下载。

1 –使用新的Smoke Loader示例更新主机器人:

2 –下载其他有效负载(“插件”):

有效负载流量

Smoke Loader会部署下载的示例,因此一段时间后,我们可以看到有效负载(连接到med-global-fox.com)生成的流量。根据其特征,我们可以得出结论,这次“插件”是IRC机器人:

里面

与大多数恶意软件一样,Smoke Loader由一些加密程序打包分发,该加密程序提供了针对检测的第一层防御。

删除加密器层后,我们可以看到主要的Smoke Loader可执行文件。但是,需要进行更多的拆包操作才能到达恶意核心。为了方便起见,我将解压后的示例的代码部分称为 Stage#1。它的执行始于主要可执行文件的入口点,其作用是提供附加的模糊处理。它还用作最重要部分的加载程序:Stage#2 –这是一个DLL,解压缩到动态分配的内存中并从那里运行。

阶段1

该机器人有趣的功能是其可执行文件通常只有一个部分,没有导入。在下面,您可以看到部分布局的可视化(Entry Point标记为红色):

入口点的代码很模糊,难以遵循。它包含许多冗余跳转,有时会动态计算下一个跳转的地址,这就是为什么静态分析工具无法解决它们的原因。同样,为了使分析更加困难,代码在执行期间会自行修改。

初始例程使用具有硬编码值的XOR解密代码部分的选定部分:

然后它称之为:

这不是Smoke Loader修改自身的唯一方法。在解包部分,我们可以看到更多技巧。此代码使用许多微小的跳转,然后执行XOR和LODS指令,以在每执行几步后修改和替换代码。在这两者之间,添加了垃圾指令以降低其可读性:

机器人会自行加载所有必要的导入。为了实现此目标,它部署了一种流行的方法的变体:通过计算加载的模块名称的校验和并将其与硬编码值进行比较,在加载的模块中搜索函数句柄。首先,借助Process Environment Block(PEB) *来获取已加载模块的句柄:

MOV ESI,FS:[30];复制到ESI句柄到PEB
MOV ESI,DS:[ESI + 0xC];结构_PEB_LDR_DATA * Ldr
MOV ESI,DS:[ESI + 0x1C];ESI = Flink = Ldr-> InLoadOrderModuleList
MOV EBP,DS:[ESI + 0x8];EBP = Flink.DllBaseAddress
*在此处了解更多信息
下面我们可以看到遍历ntdll.dll导出函数的代码片段,以查找该函数的句柄:ZwAllocateVirtualMemory(使用其校验和:0x976055C),然后将找到的句柄保存在变量中:

由于有了这个技巧,Smooth Loader可以在没有任何导入表的情况下运行。(Stage#2使用相同的方法来填充其导入)。

存储的句柄用于进行API调用并分配额外的内存:

在增加的内存空间中,将解压缩Stage#2。这个新模块是删除了标头的PE文件(这是一种常见的反倾销技术)。在下面,您可以看到在文件开头删除的部分(标记为红色):

如果添加缺少的部分,我们可以将其解析为典型的PE文件。事实证明这是一个DLL导出一个函数。以前的Dofoil版本使用了完全相同的技术。过去,模块的名称为Stub.dll,导出的函数为Works。现在,这些名称已被垃圾替换。

这是由Stage#1内部的专用功能加载的,该功能负责Windows Loader通常执行的所有操作。

首先,解压缩后的内容为原始格式(标题大小:0x400,文件对齐:0x200):

然后,将相同的内容重新对齐为虚拟格式(单位大小:0x1000):

另一个子例程解析并应用重定位。如下所示,这是从PE格式已知的典型重定位表。条目存储为WORD的连续数组:

加载程序一一处理。首先,它检查条目类型是否为“ 32位字段”(通过TEST EAX,0x3000)–这是这种情况下唯一支持的格式。然后,它获取重定位偏移量(AND EAX,0xFFF),获取指向的地址并执行计算-通过删除旧的ImageBase(其值是硬编码的)并应用新的基址-偏移量到动态分配的内存中,在该内存中复制了解压缩的代码)。

最后,执行流程可以重定向到新代码。Stage#1使用三个参数从Stage#2 DLL调用导出的函数。第一个是字符串,每个样本都不同(这次是“ 00018”):

Stage#2的执行从动态分配的部分开始:

在此阶段,我们可以看到以前版本的Smoke Loader中已知的一些字符串。字符串“ 2015”可能表明此版本已于2015年编写(但是,示例的编译时间戳是最近的日期:2016年6月10日)。

第二阶段

尽管上一阶段只是准备工作,但在阶段2部署了恶意功能。它的条目位于具有以下标头的导出函数中:

int __stdcall Work(char * sample_id,bool do_injection,char * file_path);
基于这些参数,可执行文件可以识别其当前状态和要遵循的执行路径。

在执行实际任务之前,该机器人会进行伪装-将其代码注入合法进程-explorer.exe(有关更多信息,将在后面进行解释)。是否要部署此路径,由第二个参数(表示为do_injection)指定。

  • 如果在设置了do_injection标志的情况下调用Stage#2,它将把代码注入explorer.exe。在此之前,请检查环境中是否存在用于恶意软件分析的工具。如果检测到任何症状表明样品在受控环境中运行,则应用程序进入无限睡眠循环。
  • 如果在清除了do_injection标志的情况下调用了Stage#2 ,它将开始进入执行的主要路径,包括连接到C&C和下载恶意模块。

如果已选择执行的主要路径,则机器人将继续与其C&C服务器通信。众所周知的事实是,在与真实的C&C建立连接之前,它首先检查网络是否可访问。为了进行测试,它使用了一些非恶意地址-在本例中为msn.com。只要没有响应,它就会一直等待并重试:

一旦发现连接正常工作,下一步将验证应用程序是否已在运行(使用互斥锁,其名称对于特定计算机而言是唯一的)

  • 如果互斥存在,则程序将报告发送到C&C服务器并退出
  • 如果互斥锁不存在(程序尚未运行),它将自动安装并启动主要操作。

注入其他过程

较旧的版本将代码替换注入explorer.exe或svchost.exe。注入explorer.exe使用了一个有趣的技巧,引起了研究人员的极大关注。它基于PowerLoader注入技术(Shell_TrayWnd / NtQueueApcThread)。

注入 svchost.exe只是一种故障保护,它遵循的经典方式与此类似。使用的功能:

CreateProcessInternalA
NtCreateSection
NtMapViewOfSection
RtlMoveMemory
NtUnmapViewOfSection
NtQueueApcThread
恢复线程
当前版本放弃了该想法,转而使用另一种方法(类似于此方法)–在远程进程中添加一个新部分,并在其中复制自己的代码。使用的功能:

CreateProcessInternalA
NtQueryInformationProcess
ReadProcessMemory
NtCreateSection
NtMapViewOfSection
RtlMoveMemory
NtUnmapViewOfSection
恢复线程
现在,注入的唯一目标是explorer.exe。

它修补了资源管理器的入口点,并在其中添加了重定向到新添加部分的代码。该部分包含注入的Stage#2 DLL和一个小型加载程序(类似于Stage#1的加载程序)。再次,加载器准备Stage#2并部署它-这次使用不同的参数:

通讯协议

旧版本的Smoke Loader使用的是描述性很强的协议,命令直接指向该功能。以下是旧版本使用的参数:

cmd = getload&login =
&file =
&run = ok
&run =失败
&sel =
&ver =
&bits =
&doubles = 1
&personal = ok
&removed = ok
&admin =
&hash =
在当前版本中,发送的信标看起来不同–参数由定界符分隔,而不是遵循典型的,较长的键值格式:

“ 2015#D2C0431D4351DCD46E75D663AA9911B1448D3B2B#00018#6.1#0#0#10001#0#”

阅读信标,我们可以确认当前分析的版本高于上一个。机器人还发送其ID,该ID是基于特定系统的GUID和特定样本的典型参数(即“ 00018”)生成的。

该程序还会向C&C报告是否曾多次尝试运行它(互斥锁已锁定):

“ 2015#D2C0431D4351DCD46E75D663AA9911B1448D3B2B#00018#6.1#0#0#10001#13#0”

结论

过去,Smoke Loader通过垃圾邮件进行广泛分发。现在我们遇到了一个漏洞利用工具包携带的工具。

多年来,该机器人的许多部分都没有更改,因此易于识别该恶意软件。它仍然使用相同的环境检查集进行防御。此外,它还会等待旧式的网络可访问性。现在,与C&C进行通信所使用的协议具有较少的描述性-它没有太多的关键字来标识其已执行的操作。像以前一样,流量被加密。核心功能也保持不变,该恶意软件的主要作用是下载和部署其他模块。

附录

  • http://stopmalvertising.com/rootkits/analysis-of-smoke-loader.html

  • https://blog.fortinet.com/2014/11/12/the-rebirth-of-dofoil

赞(0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址