概述

笔者的yara命中了OceanLotus的如下样本:
image.png

样本6月3日首次上传到VT,意味着该样本有一定的可能是新的样本。

海莲花一般会抹去样本的时间戳,无法从时间戳获取有效的信息:
image.png

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

理论上来说,CobaltStrike也是OceanLotus常用的攻击框架,这个并不冲突,但是为了验证是否误报,笔者还是决定对该样本进行深入分析。

样本分析

外层加载器分析

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

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

如下所示:
image.png

资源shellcode分析

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

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

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

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

获取API地址:
image.png

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

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

继续加载动态库:
image.png

获取api地址:
image.png

创建svchost进程
image.png

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

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

第二段内存空间:
image.png

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

写入完成之后如下:
image.png

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

暂停目标线程
image.png

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

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

最后ResumeThread,成功调用shellcode
image.png

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

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

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

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

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

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

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

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

解密请求C2
image.png

解密请求头:
image.png

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

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