C2云函数防御¶
云函数返回包特征¶
X-Request-Id: 请求的id
X-Api-FuncName: 函数名,比如我在云函数里面设置的就是 test,这个是会被看出来的,所以建议红队伪装一个业务名字
X-Api-AppId: 对应账号但是不是账号,后面说明
X-Api-ServiceId: 服务id
X-Api-HttpHost: 就是把appid 账号id 还有腾讯云函数的域名放一起
X-Api-Status: 200 返回值
X-Api-UpstreamStatus: 200 返回值
但凡看到有这个格式,基本可以判断是云函数了(但具体是不是业务需要和甲方业务组沟通)

profile文件分析¶
红队对cs魔改大部分是profile文件,这是一个比较常见的云函数的profile文件
set sample_name "t";
set sleeptime "3000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";
http-get {
set uri "/api/x";
client {
header "Accept" "*/*";
metadata {
base64;
prepend "SESSIONID=";
header "Cookie";
}
}
server {
header "Content-Type" "application/ocsp-response";
header "content-transfer-encoding" "binary";
header "Server" "Nodejs";
output {
base64;
print;
}
}
}
http-stager {
set uri_x86 "/vue.min.js";
set uri_x64 "/bootstrap-2.min.js";
}
http-post {
set uri "/api/y";
client {
header "Accept" "*/*";
id {
base64;
prepend "JSESSION=";
header "Cookie";
}
output {
base64;
print;
}
}
server {
header "Content-Type" "application/ocsp-response";
header "content-transfer-encoding" "binary";
header "Connection" "keep-alive";
output {
base64;
print;
}
}
}
您可以通过配置文件配置 Beacon 的默认值。有两种类型的选项:全局选项和局部选项。全局选项更改全局的信标设置。
本地选项是特定于事务的 (这句话的翻译自cs的官方手册,原文是 Local options are transaction specific 在我看来,在这里的意思是专注于方式的配置,比如对于http协议应该如何配置,对于https又应该选择如何配置)
全局选项¶
1 set sleeptime¶
是设置默认的睡眠时间,注意此处是以毫秒为单位的
2 set jitter¶
这个是设置数据抖动
官方给出的解释是
Append random-length string (up to data_jitter value) to http-get and http-post server output.
就是让返回包的大小在一定范围内随机抖动,单位是百分比
在一些文章中,会通过它cs流量包的默认大小来溯源,建议修改
3 set maxdns¶
通过 DNS 上传数据时主机名的最大长度 (0-255)
详情见于
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/malleable-c2_dns-beacons.htm?Highlight=maxdns
4 set useragent¶
这个显而易见 设置UA
如果你对这个感兴趣,可以参考
https://hstechdocs.helpsystems.com/manuals/cobaltstrike/current/userguide/content/topics/malleable-c2_profile-language.htm#_Toc65482842
局部选项¶
首先它会有一个模板
# this is a comment
http-get {
set uri "/api/x";
client {
header "Accept" "*/*";
metadata {
base64;
prepend "SESSIONID=";
header "Cookie";
}
}
server {
header "Content-Type" "application/ocsp-response";
header "content-transfer-encoding" "binary";
header "Server" "Nodejs";
output {
base64;
print;
}
}
}
这是一个对get请求方式的局部选项配置
set uri¶
set uri 分配客户端和服务器在此事务期间将引用的 URI, set 语句需要出现在客户端和服务器代码块之外,因为它适用于它们两者。
client¶
header 添加header
是代表metadata先经过一次base64编码,再在编码后的数据前面添加"SESSIONID=",最后在修改过的数据后添加 header头 "Cookie";
server¶
输出的metadata进行base64编码,再打印
CS流量解密¶
可以参考:https://github.com/WBGlIl/CS_Decrypt
分析与反制思路¶
所以 综上所述 有几个分析与反制的思路
- 判断流量特征
- 如果是stage,会有一个payload下载阶段,大小约为210kb,payload未解密之前间隔有大批量重复字符串(cs本身特征)
- 未经魔改的云函数配置在stage下载阶段访问/bootstrap-2.min.js (配置文件特征),同时返回包有很大一串加密数据,且路径的ascii之和与256取余计算值等于92(cs本身特征)
- 未经魔改的云函数会访问/api/getit这样类似api的模式,可以重点关注(配置文件特征)
- 云函数的host是
service-173y3w0z-xxxxxxxxxx.sh.apigw.tencentcs.com这样的格式,有点类似域前置,host为白域名,可以着重注意host为apigw.tencentcs.com格式的流量,如果业务部门没有这样的业务,特殊时期,可以直接封禁这个域名apigw.tencentcs.com(云函数特征) - 请求头中会有云函数的特有特征,如
- X-Request-Id: 请求的id X-Api-FuncName: 函数名 X-Api-AppId: 对应账号但是不是账号 X-Api-ServiceId: 服务id X-Api-HttpHost: 就是把appid 账号id 还有腾讯云函数的域名放一起 X-Api-Status: 200 返回值 X-Api-UpstreamStatus: 200 返回值
- 抓包看流量,通信的IP是腾讯云的CDN服务器IP
- 反制手段
- 批量上线钓鱼马
- 从cs客户端可以看出,上线后的ip过一会就会自动变一次(云函数特性),一次性上线大量ip会让红队直接无法分辨(直接放同一个虚拟机都行,因为每次云函数的特性,所以每个心跳包都是一个新的请求,都会分配一个新ip)
- 消耗云函数额度
- 云函数隐藏C2 和 cdn很像,都有同一个弱点,就是访问是需要计费的,所以可以使用脚本把红队的额度跑掉就好,这样红队的所有马都无法上线
- 工具 https://github.com/a1phaboy/MenoyGone
- 虚假上线
- 重放心跳包进行上线,但是红队无法执行任何命令
- 截图举报
- 收集好证据,主要是 host名 X-Api-FuncName X-Api-AppId 这些带有明显云函数的特征的证据,(X-Api-AppId这个很重要)说明该人正在使用云函数对我司进行恶意攻击,请求对其暂时封禁.