情报背景

FormBook 是具有信息盗窃与命令控制功能的商业恶意软件家族,自 16 年起在黑客论坛被公开售卖。在多年的演进中,FormBook 不断利用新技术更新迭代其隐匿技术。

MalwareBytes 以 FormBook 近期的样本为例,对基于 NSIS 安装引擎分发恶意代码的方法进行了分析,并对该样本中的后续攻击中涉及的技术进行了简要介绍。

本文将基于此报告对 NSIS 安装程序的利用方式进行介绍,并对整个攻击流程中所涉及的亮点技术进行深度解析。

组织名称

FormBook

相关工具

NSIS

战术标签

初始访问 执行 防御规避

技术标签

NSIS、syscall

情报来源

https://blog.malwarebytes.com/threat-analysis/2021/05/revisiting-the-nsis-based-crypter/

01 攻击技术分析

亮点一:Crypter-模块化的商业恶意代码执行器

随着攻防博弈的不断发展,现代恶意软件除了自身实现恶意代码的加密混淆等常规工具外,还会借助加壳等手段保护核心代码,增加分析成本。Crypter(加密器)的概念则超出了加密恶意代码这个表层含义,包含更多的隐匿、对抗和反分析技术,为核心恶意代码的执行创造更加安全的执行层。

在网络黑市中售卖的商业的 crypter 以对抗系统安全机制、终端安全产品和分析工具为卖点。它们的存在降低了攻击的门槛,不需要掌握艰深的攻防对抗技术便可具有一定的防御规避能力,为此深受小型网络攻击组织的青睐。

亮点二:初始访问-利用 NSIS 安装程序执行恶意代码

NSIS(Nullsoft Scriptable Install System)是 Windows 平台开源免费的安装程序生成引擎,它支持将安装所需的所有文件打包到单个安装文件中,并且以 NSIS 脚本灵活地设计安装程序的执行流程,因其便利与灵活受到许多软件开发商的青睐。合法软件分发中的广泛使用使导致利用 NSIS 引擎生成的恶意程序逐渐增加。

NSIS 的功能主要由 NSIS 脚本完成,在脚本中能够完成文件操作、注册表操作、进程创建等敏感操作,甚至直接调用系统 API,这些强大而灵活的特性为恶意代码的执行创造了条件。

在编译过程中,NSIS 脚本以及依赖文件会由引擎打包为单个 exe 文件。依赖文件在执行过程中会解压到指定的文件夹中,NSIS 脚本则可利用旧版本 7z 压缩工具进行提取分析。

下图为该样本中执行 shellcode 的 NSIS 脚本片段,利用自带接口与 Win32 函数读取安装目录中的 shellcode 在内存中加载执行。

亮点三:精巧设计的直接系统调用流程

为了达到更佳的隐匿效果,Crypter 利用 ProcessHollowing 技术创建新的挂起的进程,映射恶意代码节区,修改入口点,在其中执行恶意代码。

在完成该攻击操作的过程中以直接系统调用的方式调用底层 API 函数,躲避安全产品在用户态的 Hook 检测。

• NtUnmapViewOfSection

• NtCreateSection

• NtMapViewOfSection

• NtWriteVirtualMemory

• NtResumeThread

因 crypter 特殊的性质,攻击者综合考虑到了利用直接系统调用时可能遇到的三种情况。

程序

操作系统架构

执行环境

x64

x64

纯 x64

x86

x64

Wow64

x86

x86

纯 x86

利用包括 Heaven’s gate 在内的若干高级技术巧妙构造调用流程,在使得该 crypter 在绝大多数的系统环境中均能成功完成直接系统调用。

亮点四:Hell’s Gate-由 NTDLL.dll 获取进程调用 ID

与用户态 API 一直保持相对稳定向后兼容不同,直接系统调用 ID 作为系统底层实现的一部分并不具有一致性,不同操作系统版本的系统调用 ID 均会发生变化,针对某个特定操作系统版本的调用 ID 开发的程序在其他版本的系统中无法正常工作。

System call

Windows Server 2008

(R2 SP1)

Windows Server

2012 (SP0)

Windows 10

(2004)

NtUnmapViewOfSection

0x0027

0x0028

0x002a

NtWriteVirtualMemory

0x0037

0x0038

0x003a

NtResumeThread

0x004f

0x0050

0x0052

这导致任何想要利用直接系统调用的开发者均要保证程序在不同系统版本中执行时能够获取到正确的系统调用 ID。

直接系统调用武器化发展的第一个阶段,系统版本与系统调用 ID 的对应关系被硬编码在程序当中。程序执行的过程中依据当前系统版本选择正确的系统调用 ID。

区别于在程序中硬编码,”Hell’s Gate“这种技术在执行过程中动态获取系统调用ID,因此执行环境不受限于包含的系统调用 ID 覆盖范围。

首先从磁盘中手动加载新的 NTDLL.dll 到内存中(原有 NTDLL.dll 可能已经被 Hook),然后查找导入表找到需要调用的 NT API 函数在内存中的地址。依据系统调用 ID 在文件中的分布规律(在 MOV 指令 0xb8 的下一个字节),计算偏移即可以提取出真实的系统调用ID。

亮点五:Heaven’s Gate-由 WoW64 切换到 X64

在 x64 系统中,所有 x86 程序均在名为 WoW64 的子系统中运行,该子系统将 x86 的系统 API 进行翻译模拟程序所需的 32 位运行环境。对于 x86 程序而言,这种模拟是相对隔离与无感的,程序只能读取到 x86 类型的 DLL,对于系统文件、注册表的访问也会重定向到SysWoW64文件夹中。

在 WoW64 进程中操作系统通过 code segment 这个特殊寄存器的值来控制 x86 与 x64 的上下文切换,x86 为 0x23,x64 为 0x33。

在实际操作中可以利用“retf”远转移指令,该指令会对 rip 与 code segment 寄存器同时进行修改,以此达到上下文切换的目的,也就是所谓的“Heaven’s Gate”技术。

ret

retf

抽取栈顶修改 RIP

pop rip

抽取栈中的值修改 RIP 与 CS 寄存器

pop rip

pop cs

切换到 x64 上下文后即可执行原生 x64 的直接系统调用,与 x64 进程下无异。执行完成后再通过 retf 指令修改寄存器返回 x86 执行模式。

02 总结

1. 商业化的 crypter 的存在体现了现代恶意软件的模块化特征,往往包含较多的隐匿规避技术。

2. NSIS 安全程序生成引擎本身可编程的灵活性使其具有被滥用执行恶意代码的潜力。

3. 直接系统调用的攻击方式在恶意样本中逐渐多见,动态解析 Windows 系统调用 ID 已经成为当前的主流做法,Hook 等传统检测方案已缺乏检测能力。

4. 利用“Heaven’s Gate”方法可在 Wow64 子系统中进行 x86 与 x64 上下文的切换,从而执行直接系统调用等攻击行为,增加攻击检测与分析的成本。

声明:本文来自M01N Team,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。