
IPSpinnerはローカルプロキシとして動作し、外部サービス経由でリクエストをリダイレクトします。
IPSpinner は、選択したさまざまなプロバイダーにすべての受信リクエストをリダイレクトできるローカルプロキシです。目的は、各リクエストの送信元 IP アドレスをローテーションするパススループロキシを作成することです。例えば、IPSpinner を介してブルートフォース攻撃を実行すると、サーバーは何百もの異なる IP アドレスからリクエストを受信するため、検知を回避するのに役立ちます。
IPSpinner は現在、AWS (API Gateway)、Azure (Cloud Shell)、GitHub (GitHub Actions) に対応しています。
図 1: IPSpinner - 全体図
IPSpinner は、外部サービスを介してリクエストをリダイレクトするローカルプロキシとして動作します。このために、IPSpinner はプロバイダーとランチャーを利用します。
プロバイダーとは、クラウドプロバイダーまたはオンラインサービスプロバイダー (AWS、Azure、GitHub など) に相当し、ユーザーのリクエストを中継できるさまざまなサービス、いわゆるランチャー (AWS API Gateway、GitHub Actions、Azure Cloud Shell など) を提供します。
そのため、IPSpinner を起動するには、ユーザーは使用したいプロバイダーの認証情報と、ランチャーの追加設定を提供する必要があります。複数のランチャータイプを同時に使用でき、IPSpinner は各リクエストに対して利用可能なランチャーの中からランダムに 1 つを選択します。
さらに、IPSpinner はプリロード機能を実装しています。一部のランチャーは、プロキシが新しいホストを検出した場合の再設定遅延を避けるためにプリロードできます。これらのランチャーでは、プリロード手順は推奨されますが必須ではありません。その他のランチャーでは、プリロードは不要です。
IPSpinner は、リクエストの送信に AWS API Gateway を利用できます。この実装は、受信リクエストをリダイレクトする REST API Gateway を作成する FireProx に基づいています。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 は、Cloud Shell セッションが準備された複数の Azure ユーザーを使用します。その後、各リクエストは初期化された Cloud Shell にリダイレクトされ、IP アドレスをリセットするために更新されます。
図 6: Azure Cloud Shell - 全体図
次のグラフが示すように、Cloud Shell セッションを展開できるさまざまなリージョンは、それぞれ数十の IP アドレスを提供します。ユーザーは複数のリージョンを同時に設定して、IP プールを増やすことができます。
図 7: Azure Cloud Shell - リージョンごとの利用可能な IP アドレス
ただし、IP アドレスは AWS API Gateway よりも集中しています。次の地図が示すように、そのほとんどは米国、ヨーロッパ、インドにあります。
図 8: Azure Cloud Shell - 国ごとの IP アドレス
Cloud Shell の更新プロセスの遅延のため、リクエストのフローレートを制限することをお勧めします。詳細はランチャーの比較のサブセクションを参照してください。
IPSpinner は、リクエストの送信に GitHub Actions を利用することもできます。この実装は git-rotate に触発されていますが、キャッチャーサーバーを排除するために完全に変更および適合されています。
IPSpinner は、事前定義されたワークフローテンプレートを持つリポジトリを作成します。次に、各リクエストについて、環境変数を介してリクエスト情報を渡し、ワークフローを実行します。すべてのデータは暗号化され、外部ユーザーが読み取れないようにします。最後に、IPSpinner はワークフローログからレスポンスデータを収集します。
図 9: GitHub Actions - 全体図
次の図は、GitHub Actions が何千もの異なる IP アドレスを提供することを示しています。
図 10: GitHub Actions - リージョンごとの利用可能な IP アドレス
ただし、次の地図は GitHub Actions が米国の IP アドレスのみを提供することを示しています。分析の結果、それらのワーカーは Azure インフラストラクチャ上に展開されているようです。
図 11: GitHub Actions - 国ごとの IP アドレス
⚠️ さらに、「GitHub は Actions の悪用とスパムを深刻に受け止めており、『スパムユーザー』を追跡する専任チームがいます。」 したがって、アカウント停止の問題を避けるために、ユーザーは自分のアカウントや会社のアカウントでこのプロバイダーを使用してはなりません。
GitHub REST API の 1 時間あたりの制限により、障害を避けるために最大リクエストフローレートを制限する必要があります。詳細はランチャーの比較のサブセクションを参照してください。
このプロジェクトは go バージョン >= 1.21 でテストされていますが、それより低い go バージョンでも動作する可能性があります。
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 でリスニングホストとポートを指定できます。
最後に、3 つの verbose モードが利用可能です:
次に、INI 設定ファイル のテンプレートがプロジェクトリポジトリで利用可能です。
proxy セクションでは、ユーザーは次のパラメータを指定できます:
その他すべてのセクションは、対応するプロバイダーの章で説明します。
ユーザーは複数のプロバイダーとランチャーを同時に有効にできることに注意することが重要です。IPSpinner は、各リクエストに対して、利用可能なすべてのランチャーの中からランダムに 1 つを選択します。
AWS の設定パラメータ (aws セクション):
API Gateway の設定パラメータ (aws セクション):
Azure の設定パラメータ (azure セクション):
Azure Cloud Shell の設定パラメータ (azure セクション):
GitHub の設定パラメータ (github セクション):
| パラメータ | 必須 | デフォルト値 | 説明 |
|---|---|---|---|
| username | ✅ | GitHub ユーザー名 | |
| token | ✅ | 指定されたユーザー名に関連付けられた GitHub トークン |
GitHub Actions の設定パラメータ (github セクション):
| パラメータ | 必須 (ga_enabled=true の場合) | デフォルト値 | 説明 |
|---|---|---|---|
| ga_enabled | / | GitHub Actions ランチャーを有効にします |
IPSpinner は HTTP/2 プロトコルをサポートしていません。プロキシが最初の TLS 接続を終端するため、プロトコルの利点は失われ、基本的な HTTP/1.1 接続として見えます。
したがって、IPSpinner を Burp Suite と一緒に使用する際に HTTP/2 の問題を避けるには、HTTP/2 クライアントサポートを無効にしてください: 設定 > ネットワーク > 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 | プロキシ応答に 2 つのデバッグヘッダー (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 を上書きする、事前作成されたアカウントのリスト (メールとパスワードを 1 行に 1 つずつ) |
| パラメータ | 必須 (cs_enabled=true の場合) | デフォルト値 | 説明 |
|---|
| cs_enabled | / | Cloud Shell ランチャーを有効にします | |
| cs_preferred_locations | ✅ | Cloud Shell インスタンスをデプロイする場所 | |
| cs_nb_instances | ❌ | 5 | デプロイする Cloud Shell インスタンスの数 |