IPSpinner 是一个本地代理,可用于将收到的所有请求通过不同的选定提供商进行重定向。其目的是创建一个透传代理,为每个请求轮换源 IP 地址。例如,通过 IPSpinner 运行暴力破解操作有助于避免被检测,因为服务器将从数百个不同的 IP 地址收到请求。
IPSpinner 目前支持 AWS(API Gateway)、Azure(Cloud Shell)和 GitHub(GitHub Actions)。
图 1:IPSpinner - 总体架构图
IPSpinner 作为本地代理运行,通过外部服务重定向请求。为此,IPSpinner 利用了提供商和启动器。
提供商(provider)指云提供商或在线服务提供商(AWS、Azure、GitHub 等),它们提供不同的服务,即所谓的启动器(launcher),可用于中继用户的请求(AWS API Gateway、GitHub Actions、Azure Cloud Shell 等)。
因此,要启动 IPSpinner,用户必须为要使用的提供商提供凭据,并为启动器提供额外配置。可以同时使用多种启动器类型,IPSpinner 会为每个请求随机选择其中一个可用的启动器。
此外,IPSpinner 实现了预加载功能。某些启动器可以预先加载,以避免代理发现新主机时的重新配置延迟。对于这些启动器,预加载过程是推荐的但不是强制的。对于其他启动器,则无需预加载。
IPSpinner 可以利用 AWS API Gateway 发送请求。此实现基于 FireProx,它创建一个 REST API Gateway 来重定向传入请求。因此,我们对 FireProx 进行了改造,使其能够为每个 API Gateway 处理多个主机,并实现了新功能。总而言之,当 IPSpinner 收到请求时,它会选择或创建合适的 API Gateway 实例并发送请求。然后,它收集响应并返回给用户。因此,目标服务器收到的是来自 API Gateway 的请求,而不是直接来自用户。由于 API Gateway 会为每个请求轮换其出口 IP,IPSpinner 利用此功能实现 IP 地址轮换。
图 2:AWS API Gateway - 总体架构图
下图制作于 2024 年 10 月,展示了每个 AWS 区域根据发送请求数量可用的唯一 IP 地址数量。大多数区域提供超过 100 个 IP 地址,并且可以同时使用多个区域,使用户能够通过全球数千个地址代理其请求。
图 3:AWS API Gateway - 各区域可用 IP 地址
最后,图 4 以对数绿色色阶展示了每个国家可用的地址数量。这表明用户可以伪造其源 IP 地址,使用任何大陆的地址。
图 4:AWS API Gateway - 各国 IP 地址
IPSpinner 实现了轮换功能,会定期删除并重新创建 FireProx 实例。如下图所示,轮换 FireProx 实例可能会提供新的 IP 子集。但每个 AWS 区域的 IP 集合有限,因此在某个时刻,轮换将不再提供新的 IP。
图 5:AWS API Gateway - 轮换过程
该启动器实现了预加载过程。如前所述,这不是强制性的,但可以避免重新配置后最初几秒内出现的一些重新配置延迟或同步错误。
此外,API Gateway 默认会设置 X-Forwarded-For 头,该头无法删除但可以被覆盖。因此,用户可以在 IPSpinner 配置中指定一个 IP 地址范围,系统将为每个请求从中随机选择一个 IP(IPv4 或 IPv6 范围)。
IPSpinner 利用 Azure Cloud Shell 发送请求。Azure Cloud Shell 是一个交互式、经过身份验证、可通过浏览器访问的终端,用于管理 Azure 资源。Cloud Shell 在按会话、按用户提供的临时主机上运行。
因此,IPSpinner 使用多个 Azure 用户,并为这些用户准备 Cloud Shell 会话。然后,每个请求将被重定向到已初始化的 Cloud Shell,之后会对其进行续期以重置其 IP 地址。
图 6:Azure Cloud Shell - 总体架构图
如下图所示,可用于部署 Cloud Shell 会话的不同区域各自提供数十个 IP 地址。用户可以同时配置多个区域以扩大其 IP 池。
图 7:Azure Cloud Shell - 各区域可用 IP 地址
然而,IP 地址比 AWS API Gateway 更集中。如下图所示,大多数 IP 地址位于美国、欧洲和印度。
图 8:Azure Cloud Shell - 各国 IP 地址
由于 Cloud Shell 续期过程的延迟,我们建议限制请求速率。更多信息请参阅启动器对比小节。
IPSpinner 也可以利用 GitHub Actions 发送请求。此实现的灵感来自 git-rotate,但已被完全修改和调整,以摆脱 catcher 服务器。
它创建一个包含预定义工作流模板的仓库。然后,对于每个请求,它通过环境变量传递请求信息来运行工作流。所有数据均经过加密,外部用户无法读取。IPSpinner 最终从工作流日志中收集响应数据。
图 9:GitHub Actions - 总体架构图
下图显示 GitHub Actions 提供数千个不同的 IP 地址。
图 10:GitHub Actions - 各区域可用 IP 地址
然而,下图显示 GitHub Actions 仅提供美国 IP 地址。经分析,其 worker 似乎部署在 Azure 基础设施上。
图 11:GitHub Actions - 各国 IP 地址
⚠️ 此外,“GitHub 严肃对待 Actions 的滥用和垃圾信息行为,并设有专门团队追踪‘垃圾用户’。” 因此,用户绝不能使用自己的账户或公司账户使用此提供商,以避免账户被关闭的问题。
由于 GitHub REST API 的每小时限制,必须限制最大请求速率以避免中断。更多信息请参阅启动器对比小节。
本项目已在 go 版本 >= 1.21 下测试,但在更低版本下也可能正常工作。
参见 Go 安装文档
安装后,请确保默认的 go 二进制文件是正确的:
$ go version
go version go1.21.1 linux/amd64
$ git clone https://github.com/synacktiv/IPSpinner.git
$ cd IPSpinner
$ go mod tidy
$ make build-linux # For Linux AMD64 arch
$ make build-windows # For Windows AMD64 arch
在 Linux 上,可执行文件默认名为 “ipspinner”,在 Windows 上则为 “ipspinner.exe”。
使用结束后,可以通过运行以下命令清理构建:
$ make clean
要获取使用 IPSpinner 的帮助,可以不带任何参数运行该命令:
$ ./ipspinner -h
Help will be displayed
所有信息(不包括请求重定向)都会记录到 ipspinner.log 文件中。
一些常用选项可以作为命令行参数提供,其他配置信息则必须在 INI 配置文件中提供。
用户可以指定以下命令行参数:
一些全局参数和提供商参数必须在 INI 配置文件中指定。配置文件必须在运行 IPSpinner 之前准备好。其内容将在接下来的小节中说明。默认情况下,IPSpinner 会查找名为 config.ini 的配置文件。
为了处理 HTTPS 请求,IPSpinner 需要证书颁发机构(CA)证书和密钥。如果用户不提供证书,IPSpinner 将生成自己的自签名证书和密钥。用户可以使用 --export-ca-cert 获取生成的证书(例如,用于导入浏览器)。否则,用户可以在配置文件中提供自己的 CA 证书和密钥(参见后续部分)。
用户可以通过 --host 和 --port 指定监听主机和端口。
最后,有三种详细模式可供使用:
项目仓库中提供了 INI 配置文件 的模板。
在 proxy 部分,用户可以指定以下参数:
所有其他部分将在相应的提供商章节中描述。
需要注意的是,用户可以同时启用多个提供商和启动器。IPSpinner 随后会为每个请求在所有可用的启动器中随机选择一个。
在 aws 部分中的 AWS 配置参数:
在 aws 部分中的 API Gateway 配置参数:
在 azure 部分中的 Azure 配置参数:
在 azure 部分中的 Azure Cloud Shell 配置参数:
在 github 部分中的 GitHub 配置参数:
| 参数 | 必填 | 默认值 | 描述 |
|---|---|---|---|
| username | ✅ | GitHub 用户名 | |
| token | ✅ | 与所提供用户名关联的 GitHub token |
在 github 部分中的 GitHub Actions 配置参数:
| 参数 | 必填 (如果 ga_enabled=true) | 默认值 | 描述 |
|---|---|---|---|
| ga_enabled | / | 启用 GitHub Actions 启动器 |
IPSpinner 不支持 HTTP/2 协议。由于代理会终止第一个 TLS 连接,协议的优势会丢失,表现为基本的 HTTP/1.1 连接。
因此,为了避免在将 IPSpinner 与 Burp Suite 一起使用时出现 HTTP/2 问题,请取消 HTTP/2 客户端支持:Settings > Network > HTTP > HTTP/2,取消选中 HTTP/2 复选框。
| AWS API Gateway | Azure Cloud Shell | GitHub Actions |
|---|
| 可用 IP 地址 | ≈ 12,418 | ≈ 276 | > 6,000 |
| 平均响应时间 | 0.46s | 13.04s | 21.42s |
| 平均重新配置时间 | 无 | 20s | 无 |
| 最大理论请求速率 | 4,000 到 16,000 req/h | 107 req/h/Cloud Shell 实例 | 1,000 req/h |
| 可否/需要预加载? | ✅ | ❌ | ❌ |
| 用途:浏览 | ✅ | ❌ | ❌ |
| 用途:密码喷洒 | ✅ | ✅ | ✅ |
| 参数 | 必填 | 默认值 |
|---|
| --config | ❌ | config.ini |
| --export-ca-cert | ❌ | |
| --host | ❌ | |
| --port | ❌ | 8080 |
| --v, --vv, --vvv | ❌ |
| 参数 | 必填 | 默认值 | 描述 |
|---|
| preload_hosts_file | ❌ | 需要预加载的 URL/主机列表,适用于可以预加载主机的提供商 | |
| whitelist_hosts_file | ❌ | 被列入白名单的 URL/主机列表(默认情况下所有其他主机将被列入黑名单) | |
| blacklist_hosts_file | ❌ | 被列入黑名单的 URL/主机列表(如果设置了白名单,则忽略此列表) | |
| ca_cert_file & ca_cert_key_file | ❌ | 用户提供的 CA 证书(如果用户想替换默认生成的证书) | |
| user_agents_file | ❌ | 将从列表中随机选择用于请求的用户代理列表 | |
| debug_response_headers | ❌ | false | 在代理响应中添加两个调试头:X-IPSpinner-Provider 和 X-IPSpinner-Provider-NbTotalReqSent |
| wait_for_launcher_available_timeout | ❌ | 60 | 如果没有启动器可用,在请求超时前等待的秒数 |
| 参数 | 必填 | 默认值 | 描述 |
|---|
| regions | ✅ | 资源可部署的区域列表,以逗号分隔 | |
| profile | ❌ | 要使用的 AWS CLI 配置文件 | |
| access_key | ✅ (或 profile) | AWS 用户访问密钥 | |
| secret_key | ✅ (或 profile) | AWS 用户秘密访问密钥 | |
| session_token | ❌ | AWS 用户会话令牌 |
| 参数 | 必填 (如果 ag_enabled=true) | 默认值 | 描述 |
|---|
| ag_enabled | / | 启用 API Gateway 启动器 | |
| ag_max_instances | ❌ | 5 | 可部署的最大 API Gateway 实例数(全局最大值,而非每区域) |
| ag_rotate_nb_requests | ❌ | 5,000 | 轮换 API Gateway 之前的请求数 |
| ag_forwarded_for_range | ❌ | 35.180.0.0/16 | X-Forwarded-For 头的 IP 地址范围(IPv4 或 IPv6 范围) |
| ag_instance_title_prefix | ❌ | fpr | API Gateway 信息自定义 |
| ag_instance_deployment_description | ❌ | IPSpinner FireProx Prod | API Gateway 信息自定义 |
| ag_instance_deployment_stage_description | ❌ | IPSpinner FireProx Prod Stage | API Gateway 信息自定义 |
| ag_instance_deployment_stage_name | ❌ | 3 个随机英文单词 | API Gateway 信息自定义 |
| 参数 | 必填 | 默认值 | 描述 |
|---|
| admin_email | ✅ (或 accounts_file) | Azure 管理员电子邮件 | |
| admin_password | ✅ (或 accounts_file) | Azure 管理员密码 | |
| tenant_id | ✅ | 租户 ID | |
| subscription_id | ✅ | 订阅 ID | |
| accounts_file | ❌ | 预创建账户列表(邮箱和密码,每行一项),用于覆盖 admin_email 和 admin_password |
| 参数 | 必填 (如果 cs_enabled=true) | 默认值 | 描述 |
|---|
| cs_enabled | / | 启用 Cloud Shell 启动器 | |
| cs_preferred_locations | ✅ | 部署 Cloud Shell 实例的位置 | |
| cs_nb_instances | ❌ | 5 | 要部署的 Cloud Shell 实例数量 |