GCPBucketBrute
Google Storageバケットを列挙し、それらに対するアクセス権を特定し、権限昇格が可能かどうかを判断するスクリプトです。
- このスクリプトは(オプションで)GCPユーザー/サービスアカウントの認証情報とキーワードを受け取ります。
- そのキーワードから生成された順列のリストを使用して、それらの名前を持つGoogle Storageバケットの存在をスキャンします。
- 認証情報が提供された場合、列挙の大部分は非認証で実行されますが、非認証列挙で発見されたバケットについては、提供された認証情報を使用してTestIamPermissions APIでバケット権限を列挙しようとします。これにより、非認証時にはアクセスできないが、認証時にはアクセス可能なバケットを見つけることができます。
- 認証情報が提供されているかどうかに関わらず、スクリプトは非認証でTestIamPermissions APIを使用してバケット権限を列挙しようとします。つまり、認証情報を入力しない場合は、非認証ユーザーが持つ権限のみが表示されますが、認証情報を入力した場合は、認証ユーザーが非認証ユーザーと比較してどのようなアクセス権を持つかが表示されます。
- 警告: 認証情報が提供された場合、発見したバケットのアクセスログにユーザー名が記録される可能性があります。
TL;DR サマリー
- キーワードを指定して、そのキーワードから生成された複数の順列に基づいてGoogle Storageバケットを列挙します。
- その後、発見されたバケットが出力されます。
- 次に、発見されたバケットに対して(もしあれば)付与されている権限が出力されます。
- その後、スクリプトはそれらの権限で権限昇格(storage.buckets.setIamPolicy)が可能かどうかをチェックし、興味深い内容(公開リスト可能、公開書き込み可能、認証済みリスト可能、権限昇格など)があれば出力します。
必要条件
- Linux/OS X
- Windowsは非認証スキャンのみ動作します。スクリプトがsubprocessモジュールを使用する際に、認証済みGoogleクライアントを使用すると正常に動作しない問題があります。
- Python3
- Pip3
インストール
git clone https://github.com/RhinoSecurityLabs/GCPBucketBrute.git
cd GCPBucketBrute/
pip3 install -r requirements.txt または python3 -m pip install -r requirements.txt
使用方法
まず、ユーザーアカウント、サービスアカウント、または非認証のいずれの認証方式で列挙を行うかを決定します。サービスアカウントを使用する場合は、-f/--service-account-credential-file-path 引数で秘密鍵のファイルパスを指定します。ユーザーアカウントを使用する場合は認証引数を指定せず、GCP APIにアクセスするためのユーザーアカウントのアクセストークンを入力するよう求められます。完全に非認証でスキャンする場合は、-u/--unauthenticated 引数を使用して認証プロンプトを非表示にします。
- 完全に非認証でキーワード "test" を使用してバケットをスキャン:
python3 gcpbucketbrute.py -k test -u
- サービスアカウント(秘密鍵は ../sa-priv-key.pem)で認証し、キーワード "test" を使用してバケットをスキャン、結果をカレントディレクトリの out.txt に出力:
python3 gcpbucketbrute.py -k test -f ../sa-priv-key.pem -o ./out.txt
- ユーザーアカウントアクセストークンを使用し、キーワード "test" でバケットをスキャン、サブプロセス数を10(デフォルトは5)に設定:
python3 gcpbucketbrute.py -k test -s 10
利用可能な引数
-k/--keyword
- この引数は、順列生成に使用するキーワードを指定します。生成された順列がGoogle Storage内で検索されます。
--check
- この引数は
-k/--keyword と相互排他的で、単一の文字列を受け取ります。キーワードに基づく順列リストを生成する代わりに、特定のバケットに対する権限を確認できます。複数回指定して複数のバケットをチェックすることも可能です。クレジット: @BBerastegui
--check-list
- この引数は
-k/--keyword および --check と相互排他的です。ファイル内のバケットリストの権限を確認できます。バケットはテキストファイルに1行につき1つずつ記述します。標準入力から読み込む場合は、ファイル名として - を指定します。
-s/--subprocesses
- この引数はバケット列挙に使用するサブプロセス数を指定します。デフォルトは5で、値を大きくすると列挙が高速になりますが、Googleへのリクエスト数が増加します。実質的にはスレッドのようなものですが、スクリプトでは並列実行にスレッドではなくサブプロセスを使用しています。
- /