海莲花的CobaltStrike加载器

robots

 

概述

海莲花(OceanLotus)APT团伙是一个高度组织化的、专业化的境外国家级黑客组织,其最早由红雨滴团队发现并披露。该组织至少自2012年4月起便针对中国政府、科研院所、海事机构、海域建设、航运企业等相关重要领域展开了有组织、有计划、有针对性的长时间不间断攻击。

最近几个月又是海莲花活动的高峰期,在对样本一一分析之后,笔者发现大多数样本都会层层解密,最后加载CobaltStrike的Beacon。

 

样本分析

样本基本信息

样本md5:edf7dc76776cd05ecf1bc190ae591654
样本于6月3日首次上传到VT,由于海莲花的样本一般情况下都会修改文件时间戳,所以无法从CreateTime获取有用的信息:

有意思的是,vt厂商大多数检出为CobaltStrike相关的样本:

外层加载器分析

比较遗憾的是此次并未捕获到诱饵文件,原始样本为32位dll,dll恶意代码执行入口为DllMain,由于dll中暂无其他的信息,暂时无法推测加载模式是白利用还是非PE直接加载。

样本外层是一个loader,功能非常简单:读取名为W5X8T4的资源表项并为其分配内存空间,最后call edi执行资源中的代码:

如下所示:

资源shellcode分析

资源的shellcode加载之后,有大量的混淆代码,和海莲花之前的样本类似

第一个call中主要是调用CreateThread启动一个新线程:

该线程主要用于启动服务:

线程创建完成之后,程序将会加载所需dll,并依次获取函数的的地址。
加载动态库:

获取API地址:

这部分代码都不用管,直接跳过即可,所有API地址获取完成之后,程序将会设置异常处理

接着处理svchost.exe的路径,方便之后启动并注入该进程:

继续加载动态库:

获取api地址:

创建svchost进程

创建成功之后,通过GetProcessID获取目标进程ID:

通过VirtualAllocEx在目标进程中开辟内存空间

第二段内存空间:

分配完成之后,通过WriteProcessMemory先向第二次分配的内存空间写入指定的shellcode:

写入完成之后如下:

接着创建进程快照,查找被注入的4B4进程,找到之后OpenThread打开线程对象

暂停目标线程

接着向D0000写入代码,代码关键是:
mov eax,0xe0000
call eax
执行e0000处的代码

通过结构体设置新线程执行的目标函数:

最后ResumeThread,成功调用shellcode

要调试shellcode,可以附加目标进程调试该段shellcode,不过该样本的shellcode比较简单,可以不用那么麻烦,直接设置eip也可以成功调试。

该段shellcode主要只有两个call,第一个call ebx会解密出cs的Beacon后门并加载,加载之后将Beacon的DllEntryPoint地址赋值给eax通过call eax再次调用。

第一个call首先会VirtualAlloc分配内存空间,然后将shellcode拷贝到该地址处:

通过VirtualProtect更改shellcode的可执行属性:

接着call 到指定的地址执行,call过来的shellcode地址就是dll entrypoint
call调用之后,程序还会将该地址([ebp-0x34])赋值给eax,等下call eax再次调用

将该段内存dump出来,跳转到01f75cb0这个入口点,笔者使用了IDA7.5的拉取符号功能,这里自动识别出了DllEntryPoint函数

从通过参数序列,很容易就找到具体的DllMain函数

根据DllMain的代码,感觉很像是CobaltStrike的远控模块,于是笔者找到了之前分析过的cs模块,对比之后可以确认该样本为CobaltStrike生成:

解密请求C2

解密请求头:

通过InternetOpen请求C2:185[.]225[.]19[.]22

该ip关联域名:impeplaism.info
该域名已经有OceanLotus标签

(完)