概述
海莲花(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标签