前言
上接前文,“APT组织“蔓灵花”近期活动分析–恶意邮件附件”介绍了恶意附件执行的常见手法,包括:
-
恶意“.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值后续在客户端别无他用。
6.2 INF指令,上传系统基本信息
读取此前采集的详细的系统基本信息,并且上传至受控端。
上传的基本信息在内存情况如下。
6.3 DWN指令,文件下载
DWN指令功能为下载文件,根据对代码的分析,DWN功能模块写的十分完善,包括但不限于采集和回传报错详细、下载状态等。
6.4 RUN指令,指定文件执行
调用Windows API WinExecAPI执行文件,返回执行状态。
6.5 DLY指令,休眠指令
从服务端获取一个时长,做sleep操作再运行。
6.6 CMD指令,执行shell
获取从服务端下发的Shell指令后进行指令拼接,拼接格式为cmd.exe /c |服务端下发的指令|>> c:UsersPubliccr.dat。
cmd.exe /c systeminfo >> c:UsersPubliccr.dat
cmd.exe /c whoami >> c:UsersPubliccr.dat
随后调用WinExec()API执行,执行完成后将cr.dat的内容发送至服务端,后续删除cr.dat文件。
动态调试查看命令拼接。
动态调试查看调用WinExec()API执行该条执行。
原文始发于微信公众号(帅仔回忆录):APT组织“蔓灵花”近期活动分析–“ORPCBackdoor”武器逆向分析