CobaltSrike Shellcode分析
首先我们来看一张流程图

首先打开IDA进行查看
进入主函数,主要看sub_401840()函数进行查看

进入函数发现,首先获取系统时间戳,然后拼接字符串和创建线程通过管道读取shellcode,最后执行shellcode

拼接的管道名
004053F0=artifact.004053F0 (ASCII "\\.\pipe\MSSE-5866-server") |

跟进线程创建线程执行的函数,首先创建命名管道,再把加密过的shellcode写入管道

Shellcode内容

写入shellcode

跟进接收shellcode函数RevShellcode_40172:其主题逻辑是先申请内存存放读取出来的shellcode,然后再解密执行

从管道中读取shellcode到内存中


将读取出来的Shellcode在DecyptandrRunShellcode_40158E函数中执行解密,该函数的主题逻辑,申请内存存放解密后的shellcode,然后修改内存属性并跳转运行

解密算法如下,首先遍历shellcode,遍历次数与4求模,得到的值作为403008数组的下标得到一字节,用该字节与shellcode对应遍历时的字节异或,最终得到解密后的字节

解密所需的数组

解密后的数据

之后跳转并执行

Shellcode部分
先加载wininet.dll

之后调用InternetOpen函数

连接控制端192.168.202.131

请求Beacon URL: /FXhV

发送HTTP请求

获取桌面窗口句柄

处理前面对话窗口遇到的错误

申请内存

多次调用InternetReadFile读取文件

读取完成后跳转执行到所申请的内存

这里需要解密出一个dll,具体的解密算法如下:

解密后的数据:

反射注入DLL:
查看解密出来的DLL

0x36c0032 -> 0x36c0041 也就是DLL的Dos头部分,下面ebx+0x8150,也是导出函数ReflectiveLoader函数的偏移

在导出函数ReflectiveLoader函数中解析DLL,ReflectiveLoader中会调用virtualalloc()函数,申请大小为0x30000的内存,用于存放DLL:

在内存中反射注入dll,存放在eax中0x3D15DA8

然后开始执行dll,此时也可以到自己的c2还没有主机上线

执行dll中

获取对应的系统信息拼接

获取cookie

获取配置信息

调用,wininet.HttpSendRequestA请求上线

上线回连


对默认生成的shellcode分析发现存在大量的特征信息,导入配置文件后再次对shellcode进行分析,发现对应的关键信息已经修改




