Cobalt Strike是渗透测试神器,其功能简介就不用多说了,其4.0版本更新已有一段时间了,这里分析一下,若有错误的地方望大伙指出,谢谢。
样本名 artifact4.exe
样本大小 14,336 字节
MD5 9ff9170e001f5619a0be11516051f538
SHA1 b824ed85d7dbe14f193f70d328d061e90c760736
服务端:kali 2020 ip:192.168.202.131
客户端:windows 7 ip:192.168.202.139
受控端:windows 7 ip:192.168.202.132
![](upload/attach/202012/718877_XHVMCUVY8ANNG3E.png)
进入主函数,主要看sub_401840里面的主要功能
![](upload/attach/202012/718877_WKX8PHMJJ7R7G3K.png)
进入sub_401840函数,先获取系统时间戳,然后拼接字符串和创建线程通过管道读取shellcode,最后执行shellcode。
![](upload/attach/202012/718877_T2JS7Y8ZY9DH66E.png)
拼接的管道名\.\pipe\MSSE-5296-server:
![](upload/attach/202012/718877_5W3ND828Z3UXNPW.png)
跟进创建线程执行的函数:
![图片描述](upload/attach/202012/718877_4NJAR96Q44AF8JR.png)
继续跟进函数WriteShellcodeInPipe_401648,其主逻辑首先创建命名管道,再把加密过的大小为0x320h的shellcode写入管道:
![](upload/attach/202012/718877_SRHJVNHR2JC6ZRN.png)
其shellcode内容如下:
![](upload/attach/202012/718877_D6KKD5SVCCTAQRG.png)
写入shellcode:
![](upload/attach/202012/718877_7RSXJ75AJHCSTSR.png)
跟进接收shellcode函数RevShellcode_4017e2:其主体逻辑是先申请内存存放读取出来的shellcode,然后解密并执行。
![图片描述](upload/attach/202012/718877_KNGMDS7NGYBNM8V.png)
从管道读取shellcode到内存中:
![图片描述](upload/attach/202012/718877_23DKHYCGB8G7JRV.png)
![](upload/attach/202012/718877_2HAM6KRT7J26H9V.png)
将读取出来的Shellcode在DecyptAndrRunShellcode_40158E函数执行解密,该函数的主体逻辑,申请内存存放解密后shellcode,然后修改内存属性并跳转执行:
![图片描述](upload/attach/202012/718877_WXAS9UV66V8XFUH.png)
其解密算法如下,解密算法比价简单,首先遍历shellcode,遍历次数与4求模,得到的值作为403008数组的下标得到一字节,用该字节与shellcode对应遍历时的字节异或,最终得到解密后的字节:
![图片描述](upload/attach/202012/718877_KCSB9WJ3ZAQA9WZ.png)
解密所需的数组:
![图片描述](upload/attach/202012/718877_BQHECM4JERAY76V.png)
解密后的数据:
![](upload/attach/202012/718877_K587KSH9HRE8FGU.png)
紧接着跳转到shellcode并执行:
![](upload/attach/202012/718877_4S3D8K94WKNJV6T.png)
先加载wininet.dll:
![](upload/attach/202012/718877_JXGR22DKVW82NQ7.png)
再调用函数InternetOpen函数创建一个HINTERNET根句柄:
![](upload/attach/202012/718877_MGQF2N7DSX27WEE.png)
连接控制端192.168.202.131:8081
![](upload/attach/202012/718877_CYGGW4V25Q4SZU4.png)
创建请求句柄,并把数据发送到服务器。
![](upload/attach/202012/718877_SE75UD5UWKA9QPK.png)
![](upload/attach/202012/718877_27U4QXHWYDHUT22.png)
申请0x400000大小的内存:
![](upload/attach/202012/718877_8A5PPEFECWG8HNS.png)
![](upload/attach/202012/718877_9WMTWHTKW34NFA3.png)
不断调用InternetReadFile读0x2000大小的数据到申请的内存中:
![](upload/attach/202012/718877_EG7J4QXMM2ZMCXV.png)
读入数据后:
![](upload/attach/202012/718877_BSHJDGHBFDJMFHH.png)
然后跳转执行到所申请的0x400000大小的内存:
![](upload/attach/202012/718877_TNS8VX2RX5HWYG4.png)
在内存0x026a0037处解密出一个Dll,具体的解密算法如下:
![](upload/attach/202012/718877_866838M4MHHRT9H.png)
解密后的数据如下,并将其dump出:
![](upload/attach/202012/718877_3XYWDSG238FFS2F.png)
这个Dll比较有意思,先查看解密出来的DLL,0x026A0030 jmp ebp 跳转到0x026A003F,也就是DLL的Dos头部分,这个Dos是被修改过的,0x026A003F dec ebp和 0x026A00A0 pop edx 没特殊含义,接下来call 026A0046 和pop ebx 主要用作保存当前eip到ebx,然后ebx加上0x7cb2,也就是导出函数ReflectiveLoader函数的偏移量 :
![](upload/attach/202012/718877_3HGFXCWAN4TNWK9.png)
ReflectiveLoader中会调用virtualalloc()函数,申请大小为0x3D000的内存,用于存放DLL:
![](upload/attach/202012/718877_EBD2D2J84SNKEJG.png)
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课