海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

 

样本来源:https://x.threatbook.cn/ 搜索MD5:edf7dc76776cd05ecf1bc190ae591654

 

流程图:

海莲花OceanLotus的CobaltStrike加载器

 

 

释放资源中的代码

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

参考:https://www.cnblogs.com/gakusei/articles/1352922.html

释放后,CALL进去

里面有混淆代码,主要有两个CALL

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

 

第一个CALL创建了线程,但是一直处理挂起状态

海莲花OceanLotus的CobaltStrike加载器

 

第二个CALL:遍历链表获取函数地址;设置不弹窗;挂起的方式创建svchost.exe进程;往它里面申请两段内存,第一段放跳板代码,第二段放代码;挂起线程设置线程Eip为第一段跳板代码,恢复线程跑起来。

 

(1)函数地址 : 加载DLL、获取函数地址

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

(2)设置不弹窗

海莲花OceanLotus的CobaltStrike加载器

参考 https://www.cnblogs.com/QKSword/p/10739142.html

 

接着继续LoadLibraryA 、GetProcAddress 加载模块,取函数地址

海莲花OceanLotus的CobaltStrike加载器

 

(3)接着挂起的方式创建进程svchost.exe

海莲花OceanLotus的CobaltStrike加载器

 

(4)在svchost.exe进程申请第一段可读写可执行的内存(0x12字节大小,做跳板代码,地址为0x00080000

海莲花OceanLotus的CobaltStrike加载器

 

(5)再申请第二段可读写可执行的内存 0x0003420D字节大小,保存代码,地址为0x00090000

海莲花OceanLotus的CobaltStrike加载器

 

(6)WriteProcessMemory把代码写入第二段内存

海莲花OceanLotus的CobaltStrike加载器

 

(7)遍历进程快照找到刚创建的svchost.exe进程,找到后打开它的线程

 海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

 

 

(8)挂起这个线程,获取上下文,把跳板代码拷贝进去后,再设置线程Eip为跳板代码头部

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

(9)ResumeThread线程挂起次数-1,再一次ResumeThread让线程跑起来

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

【svchost.exe进程】

预先附加了svchost.exe进程,在第一段跳板代码下了断点,恢复线程时断下来了;

海莲花OceanLotus的CobaltStrike加载器

 

CALL到第二段代码

海莲花OceanLotus的CobaltStrike加载器

底下两个CALL是关键CALL;

第一个call ebx:获取关键函数;申请内存;拷贝4段内存;修复导入表;修复重定位;改内存为可执行;获取DLL入口点AddressOfEntryPoint,执行DLL入口点;

第二个call eax:再一次执行DLL入口点;

 

 

 

第一个call

海莲花OceanLotus的CobaltStrike加载器

 

(1)获取关键函数:

海莲花OceanLotus的CobaltStrike加载器

 

(2)申请内存:随机申请0x45000大小的,只读写属性,申请出来的地址为0x00280000,做完一系列操作再添加可执行属性。

 

海莲花OceanLotus的CobaltStrike加载器

 

(3)拷贝4段内存:

(3.1)拷贝第一段内存(包含代码) 地址0x00280000 ,大小0x25A00

海莲花OceanLotus的CobaltStrike加载器

 

(3.2)拷贝第二段内存(包含需要修复的导入表) 地址0x002A6000 ,大小0xA200

海莲花OceanLotus的CobaltStrike加载器

 

(3.3)拷贝第三段内存(中间包含异或0x69加密的IP地址字符串) 地址0x002B1000 ,大小0x 2200

海莲花OceanLotus的CobaltStrike加载器

 

(3.4)拷贝第四段内存(包含需要修复的重定位) 地址0x00 2C2000 ,大小0x 2000

海莲花OceanLotus的CobaltStrike加载器

 

(4)修复导入表:解密字符串;LoadLibraryA加载模块;解密字符串;GetProcAddress获取函数地址,修复导入表;

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

 

(5)修复导入表

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 

(6)修复重定位:

海莲花OceanLotus的CobaltStrike加载器

 

(7)改第一段内存(代码)为可执行

海莲花OceanLotus的CobaltStrike加载器

 

(8)获取DLL入口点AddressOfEntryPoint,执行DLL入口点

海莲花OceanLotus的CobaltStrike加载器

 

=====================================================================

AddressOfEntryPoint (DllEntryPoint):

海莲花OceanLotus的CobaltStrike加载器

 

通过比较普通的DLL,三个参数,多次调用的就是DllMain函数了

 

海莲花OceanLotus的CobaltStrike加载器

 海莲花OceanLotus的CobaltStrike加载器

解密出IP地址

海莲花OceanLotus的CobaltStrike加载器

 

第二个call eax:再一次执行DLL入口点

海莲花OceanLotus的CobaltStrike加载器

 

释放掉上面执行DLL入口点的代码

海莲花OceanLotus的CobaltStrike加载器

 

主要函数,连接远程主机

海莲花OceanLotus的CobaltStrike加载器

 

访问185.225.19.22

海莲花OceanLotus的CobaltStrike加载器

海莲花OceanLotus的CobaltStrike加载器

 海莲花OceanLotus的CobaltStrike加载器

此IP已经被标记为远控、APT、OceanLotus

 

 

本文参照jux1a原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/246158

安全客 - 有思想的安全新媒体

 

海莲花OceanLotus的CobaltStrike加载器

上一篇:ListToTree 列表转树 简单方案,


下一篇:点赞和取消点赞实现Redis缓存(只思路)