概述
笔者的yara命中了OceanLotus的如下样本:
样本6月3日首次上传到VT,意味着该样本有一定的可能是新的样本。
海莲花一般会抹去样本的时间戳,无法从时间戳获取有效的信息:
不过有意思的是,vt厂商大多数检出为CobaltStrike相关的样本:
理论上来说,CobaltStrike也是OceanLotus常用的攻击框架,这个并不冲突,但是为了验证是否误报,笔者还是决定对该样本进行深入分析。
样本分析
外层加载器分析
比较遗憾的是此次并未捕获到诱饵文件,原始样本为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标签