8-BitQuest
菜单
[逆向工程]

恶意软件样本分析:RTF 远程模板注入攻击

· 2 分钟阅读 · @admin

恶意软件样本分析:RTF 远程模板注入攻击 像素封面

概述

本文记录了一次面试过程中进行的恶意软件样本分析,该样本利用 RTF 远程模板注入和 CVE-2017-11882 漏洞进行攻击,展示了从初始投递到持久化执行的完整攻击链。

样本基本信息

属性 值
样本名称 Impact of US and NATO Withdrawal from Afghanistan.doc
SHA1 ccc402845b46285d04d1d45db964f3c1a0df51d5
文件类型 RTF 文档
攻击技术 远程模板注入 + CVE-2017-11882 漏洞利用

详细分析流程

第一阶段:RTF 远程模板注入

样本初始文档使用了 RTF 远程模板注入技术,将恶意载荷托管在远程服务器上,以规避静态检测。

模板地址解密

通过分析文档结构,发现模板地址经过编码混淆。使用以下 Python 脚本可解密出远程模板地址:

# RTF 远程模板地址解密脚本
s = r"\u-65432?\u-65420?\u-65420?\u-65424?\u-65478?\u-65489?\u-65489?\u-65436?\u-65435?\u-65421?\u-65431?\u-65433?\u-65426?\u-65435?\u-65422?\u-65414?\u-65435?\u-65438?\u-65422?\u-65439?\u-65490?\u-65437?\u-65425?\u-65427?\u-65489?\u-65421?\u-65435?\u-65422?\u-65418?\u-65431?\u-65437?\u-65435?\u-65421?\u-65489?\u-65437?\u-65432?\u-65435?\u-65437?\u-65429?\u-65487?"
l = list(s[3:-1].split(r"?\u-"))
url = ""
for i in l:
    url += chr(65536 - int(i))
print(url)

解密结果: hxxp://designerzebra.com/services/check1

该地址托管的是一个利用 CVE-2017-11882 漏洞的 RTF 文档。

第二阶段:CVE-2017-11882 漏洞利用分析

调试环境配置

为了动态分析 shellcode 执行流程,通过镜像劫持技术将 WINWORD.EXE 重定向到 OllyDbg 调试器:

<img src=“https://pic.imgdb.cn/item/61909b682ab3f51d91b08ff8.png” title=“” alt=“” width=“831”>

漏洞触发过程

当打开恶意 RTF 文档时,会自动触发调试器。在漏洞触发点地址 0x411658 处设置断点并运行:

<img src=“https://pic.imgdb.cn/item/61909ca22ab3f51d91b0fa1a.png” title=“” alt=“” width=“826”>

关键发现: 返回地址被覆盖为 0x402114

<img src=“https://pic.imgdb.cn/item/61909e632ab3f51d91b18570.png” title=“” alt=“” width=“822”>

地址 0x402114 处为 retn 指令,此时栈顶返回地址为 0x18f354,恰好指向 shellcode 起始位置,实现了控制流劫持。

<img title=“” src=“https://pic.imgdb.cn/item/6190a12b2ab3f51d91b28354.png” alt=“” width=“830”>

第三阶段:Shellcode 下载器分析

第二阶段 Shellcode 下载

初始 shellcode 会从远程服务器下载第二阶段 payload:

下载地址: hxxp://designerzebra.com/update/sync1

<img src=“https://pic.imgdb.cn/item/6190a7d72ab3f51d91b50239.png” title=“” alt=“” width=“999”>

Shellcode 解密过程

下载的 sync1 文件使用 XOR 加密,解密过程持续进行直到匹配到魔术字节 0x0EE2B4C5:

反沙箱检测:杀毒软件识别

shellcode 通过检测特定驱动文件判断系统中安装的安全软件:

检测文件名 对应安全软件
klif.sys Kaspersky
aswsp.sys Avast
ehdrv.sys ESET NOD32
mfehidk.sys McAfee
360AvFlt.sys 360 安全卫士

恶意载荷释放

从 hxxp://designerzebra.com/confirm/file1 下载主要恶意程序并保存到 %AppData%\wingui.exe。

关键技术点: 为规避检测,PE 文件头被清除,通过 WriteFile API 写入修改后的 DOS 头标识 0x905A4D。

<img src=“https://pic.imgdb.cn/item/6190b2ec2ab3f51d91b8d580.png”>

诱饵文档投递

从 hxxp://designerzebra.com/mscheck/hello.doc1 下载诱饵文档,在后台执行恶意操作的同时向用户展示正常文档内容。

持久化机制

创建计划任务实现持久化,每 3 分钟执行一次 wingui.exe:

schtasks.exe /create /tn MsUpdate /tr "C:\Users\Administrator\AppData\Roaming\wingui.exe" /f /sc minute /mo 3

最后结束 WINWORD.EXE 进程并打开诱饵文档,以降低用户警觉性。

第四阶段:wingui.exe 分析

沙箱检测机制

通过比较不同时间段前台窗口标题是否相同来检测沙箱环境。若窗口标题长时间不变,判断为自动化分析环境:

Avast 沙箱对抗

检测 Avast 沙箱特征文件 snxhk.dll,若存在则设置定时器每 120 秒执行一次,并进入消息循环。仅当接收到 WM_QUIT 或 WM_TIMER 消息时退出循环:

核心载荷下载

从 hxxp://realworld.sytes.net/free/pics/hi-jump.jpg 下载伪装为图片的 shellcode 并创建线程执行:

该 shellcode 的主要功能是解密嵌入的 core.dll 文件并执行其 DllMain 函数。

第五阶段:core.dll 深入分析

多阶段释放机制

如果 core.dll 由 rundll32.exe 启动,会将 .code 区段数据提取并保存为 %AppData%\Driver\opendriver64.dll,然后创建 LNK 快捷方式执行其导出函数 IntRun:

防重复执行

创建互斥量 dacd53bbf745acbefaf254a6dd32aede 防止多实例运行:

信息收集模块

收集系统信息并保存为临时文件 nnp[4位随机数].tmp:

收集的信息内容示例:

数据回传机制

读取临时文件内容后立即删除,在数据头部添加标识信息后准备发送:

C2 通信协议分析

通信格式: 使用 multipart/form-data POST 请求

数据加密: POST 数据使用 Base64 编码

数据字段说明:

字段名 说明
m 操作类型:p1 为上传数据,p2 为执行指令
id 机器标识符:机器名_用户名 的 Base64 编码
data 实际传输的数据内容

C2 指令功能

恶意软件根据接收到的不同指令执行相应操作:

指令代码 功能描述
103 下载文件保存为 %temp%\jv[4位随机数].tmp 并通过 cmd.exe /q /c start 执行
105 下载 shellcode 映射到内存,使用 CreateThread 执行
115 执行任意 CMD 命令
117 删除持久化文件 OneDriveUpdate.lnk
120 下载并执行文件,然后删除 OneDriveUpdate.lnk

各功能模块实现细节

指令 103 - 文件下载执行:

指令 105 - Shellcode 注入:

指令 117 和 120 - 清理与执行:

指令 115 - 远程命令执行:

总结

该恶意样本展示了一个完整的多阶段攻击链:

  1. 初始投递: 使用社会工程学主题的 RTF 文档作为诱饵
  2. 远程加载: 通过远程模板注入技术加载漏洞利用文档
  3. 漏洞利用: 利用 CVE-2017-11882 执行 shellcode
  4. 分阶段下载: 逐步下载并解密多层载荷
  5. 反检测技术: 检测杀软和沙箱环境
  6. 持久化驻留: 使用计划任务保持长期执行
  7. C2 通信: 建立远程控制通道接收指令

这种分阶段、模块化的攻击方式有效增加了检测和分析的难度,体现了现代 APT 攻击的典型特征。

更多文章