of-CORS は、Truffle Security が提供する、タイポスクワッティングを利用してバグバウンティのターゲット内部ネットワーク上のCORS設定ミスを特定・悪用するためのツールスイートです。
詳しくはこちらをご覧ください: https://trufflesecurity.com/blog/of-CORS
of-CORS は、Django と Django Rest Framework 上に構築された Python3 の Web アプリケーションです。セットアップと設定が完了すると、of-CORS は自動的に、アプリケーションにアクセスした被害者のブラウザにブラウザのサービスワーカーを登録します。これらのサービスワーカーは、事前設定された内部ドメインのリストに対して HTTP リクエストを送信し、内部ネットワーク上の CORS 設定ミスを発見しようとします。これらのリクエストの結果(成功・失敗にかかわらず)は、API を介して of-CORS インスタンスに送信されます。
被害者のブラウザにサービスワーカーが登録されると、JavaScript ペイロードによってブラウザは of-CORS が被害者が元々アクセスしようとしていたと判断したページにリダイレクトされます。
収集された結果は、of-CORS アプリケーション上で利用可能なミニマルなダッシュボードで後から確認できます。
以下の手順で、of-CORS を自身の環境にデプロイできます。
of-CORS のセットアップは複雑(特に SSL/TLS、DNS、両方へのワイルドカードリクエストの許可に関する問題)なため、アプリケーションスタックに 2 つのクラウドプロバイダー(Heroku と Cloudflare)を使用し、Terraform でそれらの設定を自動化しています。
まず、対象企業の内部従業員がアクセスしそうなドメインを購入します。内部ドメインのタイポスクワットドメインを購入することをお勧めします。コピーペーストのミスが良い入り口になることが分かっています。
たとえば、テスト対象の企業が内部ドメインに uberinternal.com を使用している場合、berinternal.com を購入し、内部従業員からのブラウザトラフィックを得ることから始めるとよいでしょう。
of-CORS は、ワイルドカード DNS リクエストの受信・ルーティングと SSL/TLS 接続の終端に Cloudflare を使用します。
of-CORS で DNS を正しく動作させるには、アクティブな Cloudflare アカウントが必要です。Cloudflare アカウントを取得したら、API キーを作成してください(ダッシュボードはこちら)。
API キーには、ゾーンや DNS レコードの追加、削除、設定を行うための十分な権限が必要です。これは、API トークン作成ページで以下の権限を選択することで実現できます。

適切な権限を持つ API トークンを作成したら、次の手順に進みます。
of-CORS は、アプリケーションの簡単なデプロイとホスティングに Heroku を使用します。
of-CORS アプリケーションスタックを立ち上げるには、アクティブな Heroku アカウントが必要です。アカウントを取得したら、Heroku コマンドラインインターフェース(CLI)ツールをインストールします。CLI がインストールされていれば、以下のコマンドで認証済みの CLI セッションを開始できます。
heroku login
その後、次のコマンドを実行して、CLI が正常に認証されていることを確認できます。
heroku whoami
Terraform で使用するための Heroku CLI の認証に関する詳細なドキュメントはこちらにあります。
インフラストラクチャに必要な API キーが準備できたので、of-CORS をデプロイ用に設定します。以下のサンプル YAML 設定ファイルの内容をご確認ください(このファイルはリポジトリ内にあります)。
terraform:
# この値を Heroku アプリ名として有効な一意の文字列に変更する必要があります
heroku_app_name: best-of-cors
# ここに Cloudflare API トークンを入力します
cloudflare_api_token: this-is-my-api-token
hosts:
# 任意の文字列を使用できますが、hosts の直下で一意である必要があります
testing:
host_domain: 127.0.0.1:8080
redirect_domain: google.com
targets:
- enable-cors.org
- example.com
デプロイ用に、この形式の新しい設定 YAML ファイルを作成する必要があります。
terraform セクションでは、heroku_app_name を Heroku 準拠のアプリ名で、あなたのアカウントで一意になるように設定します。また、前のセクションで生成した Cloudflare API キーを cloudflare_api_token ディレクティブに追加します。
hosts セクションでは、of-CORS がトラフィックを受信するドメインと、Web 訪問者が来たときの動作を定義します。たとえば、対象とする企業に 2 つの内部ドメイン(myinternalcorp1.com と myinternalcorp2.com)があるとします。従業員が誤ってアクセスすることを期待して、yinternalcorp1.com というドメインを購入したとします。この場合、hosts は次のように設定します。
hosts:
testing_1:
host_domain: yinternalcorp1.com
redirect_domain: myinternalcorp1.com
targets:
- myinternalcorp1.com
- myinternalcorp2.com
ここで host_domain は、トラフィックを受信するドメイン(購入したドメイン)です。redirect_domain は、ペイロードが起動された後に被害者がリダイレクトされるドメインを定義します。targets は、被害者が of-CORS にアクセスしたときにペイロードを起動する対象のドメインを指定します。
さらに yinternalcorp2.com も購入し、アクセス時に攻撃を起動するように設定したい場合、hosts セクションは次のように更新できます。
hosts:
testing_1:
host_domain: yinternalcorp1.com
redirect_domain: myinternalcorp1.com
targets:
- myinternalcorp1.com
- myinternalcorp2.com
testing_2:
host_domain: yinternalcorp2.com
redirect_domain: myinternalcorp2.com
targets:
- myinternalcorp1.com
- myinternalcorp2.com
これで、被害者が誤って yinternalcorp1.com または yinternalcorp2.com にアクセスすると、myinternalcorp1.com と myinternalcorp2.com の CORS 設定ミスを列挙するペイロードが起動され、被害者のブラウザはその後正しいドメインにリダイレクトされます。
Docker オプションを使用する場合、Terraform、Heroku、Python をインストールする必要はありません。YAML ファイルの正しいパスを指定して、以下のコマンドを実行するだけです。
docker run -v $PWD/config.yml:/config.yml -it --rm trufflesecurity/of-cors
of-CORS のデプロイには Terraform が必要です。Terraform のインストール手順はこちらに従ってください。インストール後、terraform バイナリがシステムの PATH に存在している必要があります。
of-CORS のデプロイには Python3 も必要です。インストールされ、システムの PATH で利用可能であることを確認してください。
クラウドプロバイダーへの認証と of-CORS 設定ファイルの準備が整ったので、デプロイに進みます。
まず、Terraform を初期化する必要があります。このコマンドはソースコードのルートディレクトリから実行します。
cd terraform && terraform init && cd ../
設定ファイルが /tmp/of_cors_config.yml にあるとします。以下のコマンドを実行して、すべての of-CORS インフラストラクチャを立ち上げます(このコマンドは bash で実行することを想定しています)。このコマンドは 5〜10 分かかることがあるので、しばらくお待ちください。
また、大規模な列挙では、Heroku のリソースが不足することがよくあります。これは既知の問題であり、修正へのご協力をお待ちしています。将来の修正としては、列挙結果を自分でアップロードできるようにする、Heroku の Dyn サイズを大きくする、Sublist3r などの別の列挙ツールに切り替えるなどが考えられます。
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
CONFIG_FILE=/tmp/of_cors_config.yml make deploy_and_configure
注意 - Heroku インフラストラクチャが起動され、その中ですぐにコンソールにアクセスした場合にレースコンディションが発生することがあります。この最後の make deploy_and_configure コマンドが失敗した場合は、数分待ってから再度実行してみてください。
deploy_and_configure コマンドの実行が完了すると、次のものが用意されます。
of-CORSof-CORS のデプロイがトラフィックを受信できるようにするための最後のステップは、購入したドメイン名の権威 DNS サーバーとして Cloudflare を使用するように設定することです。Cloudflare には、これを行うための詳細なガイドがこちらにあります。
以下の手順で、ソフトウェアが正しく動作していることを確認します。このセクションでは、hackersofhollywood.com というドメインで設定された of-CORS のインスタンスを使用します。
まず、ドメインの SOA レコードが Cloudflare を指していることを確認します。
dig soa <domain>
下の図のように、hackersofhollywood.com の SOA レコードは正しく Cloudflare のネームサーバーを指しています。

次に、Cloudflare アカウントを確認し、hackersofhollywood.com と *.hackersofhollywood.com の両方に対して、Heroku ドメインを指す CNAME コンテンツを持つ DNS レコードが設定されていることを確認します。これは、Cloudflare Web UI の DNS セクションで行います。

次のステップは、Heroku がこれら 2 つの CNAME レコードを介してトラフィックを受信するように設定されていることを確認することです。これは、Heroku Web UI の Settings -> Domains で確認できます。

2 つのドメイン名が Heroku に適切な DNS ターゲットとともに設定され、これらのターゲットが Cloudflare の CNAME レコードに正しく反映されていることがわかります。
次に、以下のコマンドを実行して、of-CORS の結果表示ページへの認証済みブラウザセッションを開きます。
CONFIG_FILE=<path_to_config_file> make open_heroku_console
これで、ブラウザに空のダッシュボードが表示されるはずです。

最後に、CORS 設定ミスのプローブが正常に起動されることをテストします。ブラウザで設定のベースドメイン(この例では https://hackersofhollywood.com)を開き、数秒後にページがリダイレクトされることを確認します。

次に、ダッシュボードページに戻り、Success フィルターを Unknown に変更して、Submit Query ボタンをクリックします。結果が多数表示されるはずです。

これであなたの罠は設置されました!あとはリラックスして、被害者があなたの美味しい小さなドメインに出くわすのを待つだけです。
以下のコマンドを使用して、認証済みブラウザセッションですべての結果を表示およびクエリできます。
CONFIG_FILE=<path_to_config_file> make open_heroku_console
of-CORS 設定ファイルは、攻撃を仕掛けるドメインの柔軟な追加および削除をサポートしています。設定ファイルの hosts セクションの内容を更新し、プロビジョニングスクリプトを再実行するだけです。
source venv/bin/activate
CONFIG_FILE=/tmp/of_cors_config.yml make deploy_and_configure