CobaltStrike4.0 远控分析

1.    概述
C++obalt Strike是渗透测试神器,其功能简介就不用多说了,其4.0版本更新已有一段时间了,这里献丑分析一下,若有错误的地方望大伙指出,谢谢。
2.    样本信息
样本名              artifact4.exe
样本大小       14,336 字节
MD5       9ff9170e001f5619a0be11516051f538
SHA1       b824ed85d7dbe14f193f70d328d061e90c760736
3.    实验环境
服务端:kali 2020 ip:192.168.202.131
客户端:windows 7 ip:192.168.202.139
受控端:windows 7 ip:192.168.202.132
4.    简单查壳

210526szl0lanld5t450q4-1

5.    具体分析5.1后门主体部分:
进入主函数,主要看sub_401840里面的主要功能
210752wnfo3hhb33oukx3f-1

进入sub_401840函数,先获取系统时间戳,然后拼接字符串和创建线程通过管道读取Shellcode,最后执行shellcode。
210812ev4366b4cebccb6y-1

拼接的管道名.pipeMSSE-5296-server:
210849ddldvjdv12d1tdrn-1

跟进创建线程执行的函数:
211828egj8vggnvlh8n2mv-1

继续跟进函数WriteShellcodeInPipe_401648,其主逻辑首先创建命名管道,再把加密过的大小为0x320h的shellcode写入管道:
211132e8cbi6zbwvbx186c-1

Shellcode内容:
211029ufbizc5d6t667i66-1

写入shellcode:
211223yzijyt7g7gg757yk-1
跟进接收shellcode函数RevShellcode_4017e2:其主体逻辑是先申请内存存放读取出来的shellcode,然后解密并执行。
211745a6vkq77vwb4kl6sq-1

从管道读取shellcode到内存中:
211652lyy1u1y9w1ydbzfu-1
211413pl54esskxncxcec8-1

将读取出来的Shellcode在DecyptAndrRunShellcode_40158E函数执行解密,该函数的主体逻辑,申请内存存放解密后shellcode,然后修改内存属性并跳转执行:
211915zp6a757utvaxbgii-1

其解密算法如下,解密算法比价简单,首先遍历shellcode,遍历次数与4求模,得到的值作为403008数组的下标得到一字节,用该字节与shellcode对应遍历时的字节异或,最终得到解密后的字节:
212054kphz8ghpg8ps24f8-1
解密所需的数组:
212106lrzh1fg5ppjjygbt-1

解密后的数据:
212227dq3atutnv9gck6n9-1

紧接着跳转到shellcode并执行:
212248c4379y7gmebx939o-1

5.2 Shellcode部分:
先加载wininet.dll:
212418ms1l607o0l15o1y1-1

再调用函数InternetOpen函数创建一个HINTERNET根句柄:
212453esg1lxndsx3a7g1s-1

连接控制端192.168.202.131:8081
212532tr67pz3r34d6nz6b-1

创建请求句柄,并把数据发送到服务器:
212615uhwzh0y009kn4twn-1

212628rv49xyhmfu9ppfw7-1

申请0x400000大小的内存:
075611b007ttx8ft78brtz-1

212721im6ee0yieplwgell-1

不断调用InternetReadFile读0x2000大小的数据到申请的内存中:
212734fqeq2kb6zekb3eww-1

读入数据后:
212802yydn3ndb3jiv94y9-1

然后跳转执行到所申请的内存:
212825mer8cnnxj1zch1pf-1

这里在内存0x026a0037c处需要解密出一个dll,具体的解密算法如下:
075855u2ylktyel3heyn2p-1

解密后的数据:
075923cgmttmta0ctfchft-1

5.3 反射注入DLL:
先查看解密出来的DLL,0x026A0030jmp ebp 跳转到0x026A003F,也就是DLL的Dos头部分,这个Dos是被修改过的,0x026A003Fdec ebp和 0x026A00A0 pop edx 没特殊含义,接下来call 026A0046 和pop ebx 主要用作保存当前eip到ebx,然后ebx加上0x7cb2,也就是导出函数ReflectiveLoader函数的偏移量 :
075949cnnkccheqf3ttnde-1

ReflectiveLoader中会调用virtualalloc()函数,申请大小为0x3D000的内存,用于存放DLL:
075951fw714fzrfw42o295-1

在内存中反射注入dll,存放在0x0690000,
075953lfr07g90m7chr0mc-1

然后压入3个参数执行dll的dllmAIn函数:
075955nemerkzra4gajej4-1

27.png (66.5 KB, 下载次数: 0)

下载附件  保存到相册

2020-12-22 07:59 上传
075957w7qq64ai5w68c85j-1
谢谢观看。

标签