APT组织“蔓灵花“RPC”后门武器样本逆向分析
字数 2450 2025-08-05 12:50:33

APT组织"蔓灵花"RPC后门武器样本逆向分析教学文档

一、样本概述

1. 样本执行流程

  • "MSOutlookServices.exe"执行会加载和执行包含恶意程序的动态链接库"OLMAPI32.dll"
  • exe文件本身不包含恶意功能,使用DLL劫持技术实现白加黑攻击

2. 样本特性

  • DLL劫持技术:利用"OLMAPI32.dll"伪装成合法"version.dll"
  • 持久化检查:通过"ts.dat"文件存在性判断是否重复执行
  • 系统信息搜集:极其详尽地收集系统信息
  • 指令结构:使用多层if-else而非switch-case实现指令功能
  • 通讯方式:采用远程过程调用(RPC)而非传统socket/http
  • 字符串处理:关键字符以HEX转码形式硬编码,使用时解码

3. 远控指令功能

指令 功能描述
ID 保存服务端生成ID
INF 上传系统基本信息
RUN 文件执行
DLY 休眠指令
CMD 执行shell命令
DWN 文件下载

二、技术细节分析

1. 初始化与DLL劫持

  • 恶意代码位于GetFileVersionInfoByHandleEx()DllMain()函数中
  • DllMain()运行即调用GetFileVersionInfoByHandleEx()
  • 导出函数结构与合法version.dll对比有明显差异

2. 持久化机制

  1. 检查当前路径"ts.dat"文件是否存在
  2. 若不存在则休眠1分钟
  3. 初始化COM组件调用TaskScheduler CLSID
  4. 创建计划任务"Microsoft Update",每日零时执行"MSOutlookServices.exe"
  5. 任务创建后在当前路径创建"ts.dat"

3. 系统信息搜集

  • 使用CreateToolhelp32SnapshotProcess32First获取进程/线程/模块信息
  • 调用大量Windows API和注册表读取收集信息,包括:
    • 系统配置
    • 硬件信息
    • 网络配置
    • 用户账户
    • 已安装软件
  • 信息格式化并标注类型后存储

4. 远控指令初始化

  • 指令以特定结构初始化
  • 指令代码与功能对应关系硬编码在样本中

5. RPC通讯机制

  1. 检查"C:\ProgramData$cache.dat"文件存在性防止多进程交互
  2. 若不存在则创建文件并初始化RPC调用
  3. 使用两种协议:
    • pct_pi_ncacn
    • ncacn_ip_tcp
  4. 硬编码C2域名:"outlook-services.ddns.net"
  5. 使用RpcStringBindingComposeA构建RPC绑定字符串:
    ncacn_ip_tcp:outlook-services.ddns.net[443]
  6. 无响应时休眠5分钟后重试

6. RPC通讯实现

  • 通过rpcrt4.dll中的NdrClientCall2()函数实现通讯
  • 通讯数据采用特定结构封装

三、指令功能模块详解

1. ID指令

  • 功能:获取并保存服务端生成的ID
  • 实现:
    1. 检查"c:\ProgramData$tmp.txt"是否存在,存在则删除
    2. 创建新$tmp.txt
    3. 写入从服务端获取的ID值

2. INF指令

  • 功能:上传系统基本信息
  • 实现:
    1. 读取之前收集的系统信息
    2. 通过RPC通道上传
    3. 信息在内存中以结构化格式存储

3. DWN指令

  • 功能:文件下载
  • 特点:
    • 实现完善,包含错误处理和状态报告
    • 支持断点续传
    • 可报告下载进度和状态

4. RUN指令

  • 功能:执行指定文件
  • 实现:
    • 调用WinExec API执行文件
    • 返回执行状态给服务端

5. DLY指令

  • 功能:休眠指定时间
  • 实现:
    1. 从服务端获取休眠时长
    2. 调用Sleep函数
    3. 休眠结束后继续运行

6. CMD指令

  • 功能:执行shell命令并返回结果
  • 实现:
    1. 拼接命令格式:cmd.exe /c |命令| >> c:\Users\Public\cr.dat
    2. 示例:
      • cmd.exe /c systeminfo >> c:\Users\Public\cr.dat
      • cmd.exe /c whoami >> c:\Users\Public\cr.dat
    3. 调用WinExec()执行
    4. 读取cr.dat内容发送至服务端
    5. 删除cr.dat文件

四、防御建议

  1. 检测DLL劫持

    • 监控非常规DLL加载行为
    • 对比DLL导出函数表与合法版本
  2. RPC通讯监控

    • 监控异常RPC连接
    • 特别关注对rpcrt4.dllNdrClientCall2()的调用
  3. 持久化检测

    • 监控计划任务创建,特别是名称类似"Microsoft Update"的任务
    • 检查"ts.dat"、"$cache.dat"等标志文件
  4. 行为检测

    • 监控大规模系统信息收集行为
    • 检测异常CMD命令执行及结果回传
  5. 网络检测

    • 拦截对"outlook-services.ddns.net"等可疑域名的连接
    • 分析RPC通讯内容特征

五、分析工具推荐

  1. 静态分析:

    • IDA Pro
    • Ghidra
    • Binary Ninja
  2. 动态分析:

    • x64dbg/WinDbg
    • Process Monitor
    • Process Explorer
  3. 网络分析:

    • Wireshark
    • RPC专用分析工具
  4. 行为分析:

    • Cuckoo Sandbox
    • FireEye Labs

六、IoC指标

  1. 文件相关:

    • MSOutlookServices.exe
    • OLMAPI32.dll
    • ts.dat
    • $cache.dat
    • $tmp.txt
    • cr.dat
  2. 网络相关:

    • outlook-services.ddns.net
    • RPC端口443
  3. 注册表相关:

    • 计划任务"Microsoft Update"
  4. 行为特征:

    • 特定格式的RPC调用
    • 系统信息收集后上传
    • CMD命令执行结果回传
APT组织"蔓灵花"RPC后门武器样本逆向分析教学文档 一、样本概述 1. 样本执行流程 "MSOutlookServices.exe"执行会加载和执行包含恶意程序的动态链接库"OLMAPI32.dll" exe文件本身不包含恶意功能,使用DLL劫持技术实现白加黑攻击 2. 样本特性 DLL劫持技术 :利用"OLMAPI32.dll"伪装成合法"version.dll" 持久化检查 :通过"ts.dat"文件存在性判断是否重复执行 系统信息搜集 :极其详尽地收集系统信息 指令结构 :使用多层if-else而非switch-case实现指令功能 通讯方式 :采用远程过程调用(RPC)而非传统socket/http 字符串处理 :关键字符以HEX转码形式硬编码,使用时解码 3. 远控指令功能 | 指令 | 功能描述 | |------|----------| | ID | 保存服务端生成ID | | INF | 上传系统基本信息 | | RUN | 文件执行 | | DLY | 休眠指令 | | CMD | 执行shell命令 | | DWN | 文件下载 | 二、技术细节分析 1. 初始化与DLL劫持 恶意代码位于 GetFileVersionInfoByHandleEx() 和 DllMain() 函数中 DllMain() 运行即调用 GetFileVersionInfoByHandleEx() 导出函数结构与合法version.dll对比有明显差异 2. 持久化机制 检查当前路径"ts.dat"文件是否存在 若不存在则休眠1分钟 初始化COM组件调用TaskScheduler CLSID 创建计划任务"Microsoft Update",每日零时执行"MSOutlookServices.exe" 任务创建后在当前路径创建"ts.dat" 3. 系统信息搜集 使用 CreateToolhelp32Snapshot 、 Process32First 获取进程/线程/模块信息 调用大量Windows API和注册表读取收集信息,包括: 系统配置 硬件信息 网络配置 用户账户 已安装软件 信息格式化并标注类型后存储 4. 远控指令初始化 指令以特定结构初始化 指令代码与功能对应关系硬编码在样本中 5. RPC通讯机制 检查"C:\ProgramData\$cache.dat"文件存在性防止多进程交互 若不存在则创建文件并初始化RPC调用 使用两种协议: pct_pi_ncacn ncacn_ip_tcp 硬编码C2域名:"outlook-services.ddns.net" 使用 RpcStringBindingComposeA 构建RPC绑定字符串: ncacn_ip_tcp:outlook-services.ddns.net[443] 无响应时休眠5分钟后重试 6. RPC通讯实现 通过 rpcrt4.dll 中的 NdrClientCall2() 函数实现通讯 通讯数据采用特定结构封装 三、指令功能模块详解 1. ID指令 功能:获取并保存服务端生成的ID 实现: 检查"c:\ProgramData\$tmp.txt"是否存在,存在则删除 创建新$tmp.txt 写入从服务端获取的ID值 2. INF指令 功能:上传系统基本信息 实现: 读取之前收集的系统信息 通过RPC通道上传 信息在内存中以结构化格式存储 3. DWN指令 功能:文件下载 特点: 实现完善,包含错误处理和状态报告 支持断点续传 可报告下载进度和状态 4. RUN指令 功能:执行指定文件 实现: 调用 WinExec API执行文件 返回执行状态给服务端 5. DLY指令 功能:休眠指定时间 实现: 从服务端获取休眠时长 调用Sleep函数 休眠结束后继续运行 6. CMD指令 功能:执行shell命令并返回结果 实现: 拼接命令格式: cmd.exe /c |命令| >> c:\Users\Public\cr.dat 示例: cmd.exe /c systeminfo >> c:\Users\Public\cr.dat cmd.exe /c whoami >> c:\Users\Public\cr.dat 调用 WinExec() 执行 读取cr.dat内容发送至服务端 删除cr.dat文件 四、防御建议 检测DLL劫持 : 监控非常规DLL加载行为 对比DLL导出函数表与合法版本 RPC通讯监控 : 监控异常RPC连接 特别关注对 rpcrt4.dll 中 NdrClientCall2() 的调用 持久化检测 : 监控计划任务创建,特别是名称类似"Microsoft Update"的任务 检查"ts.dat"、"$cache.dat"等标志文件 行为检测 : 监控大规模系统信息收集行为 检测异常CMD命令执行及结果回传 网络检测 : 拦截对"outlook-services.ddns.net"等可疑域名的连接 分析RPC通讯内容特征 五、分析工具推荐 静态分析: IDA Pro Ghidra Binary Ninja 动态分析: x64dbg/WinDbg Process Monitor Process Explorer 网络分析: Wireshark RPC专用分析工具 行为分析: Cuckoo Sandbox FireEye Labs 六、IoC指标 文件相关: MSOutlookServices.exe OLMAPI32.dll ts.dat $cache.dat $tmp.txt cr.dat 网络相关: outlook-services.ddns.net RPC端口443 注册表相关: 计划任务"Microsoft Update" 行为特征: 特定格式的RPC调用 系统信息收集后上传 CMD命令执行结果回传