APT组织“蔓灵花“RPC”后门武器样本逆向分析
qianlan 发表于 四川 历史精选 3245浏览 · 2024-03-01 01:55

一、前言

此篇是“APT组织“蔓灵花”恶意邮件附件5种手法分析”(https://xz.aliyun.com/t/13789) 的续篇,前文介绍了恶意附件执行的常见手法,包括:

  • 恶意“.chm”文件投放
  • 恶意"DDE"隐藏域代码执行
  • “.ppt”文件PowerPoint单击鼠标事件
  • 恶意宏文档
    -公式编辑器漏洞利用
    本篇继续介绍恶意附件的后续远控武器“ORPCBackdoor”,该武器样本于2023年5月被首次曝光。文章记录分析流程较为详尽,如果你也在分析学习此样本,本文会很有帮助。
    # 二、样本概述
    ## 1.样本执行流程

2.样本特性

  • 使用dll劫持技术。白加黑有一定的免杀效果。

  • 交互初始化和持久化均通过文件是否存在,来判断流程是否重复执行。

  • 系统信息搜集罕见的详尽。

  • 通过多层if-else来完成指定指令功能。而不是switch..case..

  • 通过远程过程调用(RPC)完成通讯。不再使用从前socket、http等。

  • 字符初始化特殊。内置的关键字符以HEX转码形式硬编码于样本中,使用时解码。包括路径、文件名、指令等。
    ## 3.远控指令功能
    功能数量不多,但该有的都有了。

  • ID指令,保存服务端生成ID

  • INF指令,上传系统基本信息

  • RUN指令,文件执行

  • DLY指令,休眠指令

  • CMD指令,执行shell

  • DWN指令,文件下载
    # 三、样本分析
    ## 1.初始化
    “MSOutlookServices.exe”执行会加载和执行包含恶意程序的动态链接库“OLMAPI32.dll”,exe文件本身不包含恶意功能。


从“OLMAPI32.dll”导出函数情况来看,”蔓灵花“组织使用了dll劫持技术,以白加黑的形式,在安全的”version.dll“中封装了恶意程序。

安全的”version.dll“(左)与包含恶意程序“OLMAPI32.dll”(右)导出函数结构对比如图。


恶意程序包含在GetFileVersionInfoByHandleEx()、DllMain()两个函数中。DllMain()运行即会调用GetFileVersionInfoByHandleEx(),主要的恶意功能模块也在其中。

2.持久化

开始执行恶意功能,首先ORPCBackdoor通过当前路径“ts.dat”文件是否存在,防止多次执行持久化操作。

样本内字符硬编码以hex形式存储在文件中,后续字符获取也常见于此方法,包括路径、文件名、远控指令等。


进入功能函数,在当前路径查看文件“ts.dat”是否存在,如果不存在则休眠1分钟。


休眠结束创建任务调度流程,初始化COM组件后调用TaskScheduler CLSID创建计划任务“Microsoft Update”,每日零时执行“MSOutlookServices.exe”。


任务结束后在当前路径创建“ts.dat”

3.详尽的系统信息搜集

样本继续执行,调用CreateToolhelp32Snapshot、Process32First函数获取系统中的进程、线程和模块等详细信息。


动态调试查看获取状态。


后续一个函数调用大量的WindowsApi和注册表读取等形式详尽的搜集了系统基本信息,并格式化和标注了搜集信息类型。


动态调试查看获取状态。

4.远控指令初始化

样本继续执行,初始化服务端远控指令。

5.与服务端通讯初始化

交互初始化也是判断路径"C:\ProgramData\$cache.dat"文件是否存在,防止与服务端同时多进程交互。(同时只存在一个通讯会话)。

如果文件不存在将创建“$cache.dat”并且初始化RPC调用,初始化pct_pi_ncacn、ncacn_ip_tcp两种远程过程调用(RPC)的协议。APT组织使用的域名“outlook-services.ddns.net”硬编码在这里。调用RpcStringBindingComposeA构建RPC绑定字符串。

ncacn_ip_tcp:outlook-services.ddns.net[443]


没有服务端可以简单写一个RPC服务端,改好hosts表,捕获一个简单的初始化通讯。


如果在尝试RPC调用后服务端无数据返回则休眠5分钟后继续尝试,当服务端返回命令后进入交互模块。

6.RPC通讯

通讯采用远程过程调用(RPC)协议,通过rpcrt4.dll中的导出函数NdrClientCall2()完成与服务端的通讯。

7.指令功能模块

7.1 ID指令,获取ID

判断“c:\ProgramData\$tmp.txt”是否存在,若存在则删除,然后重新创建$tmp.txt。


随后在$tmp.txt文件中写入从服务端获取的ID值,此ID值后续在客户端别无他用。

7.2 INF指令,上传系统基本信息

读取此前采集的详细的系统基本信息,并且上传至受控端。


上传的基本信息在内存情况如下。

7.3 DWN指令,文件下载

DWN指令功能为下载文件,根据对代码的分析,DWN功能模块写的十分完善,包括但不限于采集和回传报错详细、下载状态等。

7.4 RUN指令,指定文件执行

调用Windows API WinExecAPI执行文件,返回执行状态。

7.5 DLY指令,休眠指令

从服务端获取一个时长,做sleep操作再运行。

7.6 CMD指令,执行shell

获取从服务端下发的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()API执行,执行完成后将cr.dat的内容发送至服务端,后续删除cr.dat文件。


动态调试查看命令拼接。


动态调试查看调用WinExec()API执行该条执行。

0 条评论
某人
表情
可输入 255

没有评论