GCPバケツブルート
Google ストレージ バケットを列挙し、それらのバケットに対してどのようなアクセス権があるかを判断し、権限を昇格できるかどうかを判断するスクリプト。
- このスクリプトは(オプションで)GCP ユーザー/サービス アカウントの認証情報とキーワードを受け入れます。
- 次に、そのキーワードから順列のリストが生成され、それらの名前を持つ Google ストレージ バケットの存在をスキャンするために使用されます。
- 認証情報が指定された場合、列挙の大部分は認証されていない状態でも実行されますが、非認証の列挙によって検出されたバケットについては、指定された認証情報を使用して TestIamPermissions API を使用してバケットの権限を列挙しようとします。これは、認証されている間はアクセスできるが、認証されていない間はアクセスできないバケットを見つけるのに役立ちます。
- 資格情報が提供されているかどうかに関係なく、スクリプトは認証されていないときに TestIamPermissions API を使用してバケットの権限を列挙しようとします。つまり、資格情報を入力しない場合は、認証されていないユーザーが持つ権限のみが表示されますが、資格情報を入力すると、認証されたユーザーが持つアクセス権が認証されていないユーザーと比較して表示されます。
- 警告:資格情報が提供された場合、検出したバケットのアクセス ログにユーザー名が公開される可能性があります。
TL;DR 概要
- キーワードを指定すると、このスクリプトはキーワードから生成された並べ替えの数に基づいて Google Storage バケットを列挙します。
- その後、検出されたバケットが出力されます。
- 次に、検出されたバケットに対して付与されている権限 (ある場合) が出力されます。
- 次に、スクリプトはそれらの権限の昇格 (storage.buckets.setIamPolicy) をチェックし、興味深いもの (公開一覧可能、公開書き込み可能、認証済み一覧可能、権限昇格など) を出力します。
要件
- Linux/OS X
- Windows は、認証されていないスキャンに対してのみ機能します。認証された Google クライアントを使用すると失敗するという点で、スクリプトによるサブプロセス モジュールの使用方法に問題があります。
- Python3
- ピップ3
インストール
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」を使用してバケットをスキャンし、5 つではなく 10 つのサブプロセスで実行します。
python3 gcpbucketbrute.py -k test -s 10
利用可能な引数
-k
/ --keyword
- この引数は、順列の生成にどのキーワードを使用するかを指定するために使用されます。これらの順列は、Google ストレージで検索されるものです。
-
--check
- この引数は
-k
/ --keyword
と相互に排他的であり、単一の文字列を受け入れます。これにより、キーワードに基づいて順列のリストを生成するのではなく、特定のバケットに対する権限を確認できます。これを繰り返して複数のバケットをチェックすることもできます。クレジット: @BBerastegui
-
--check-list
- この引数は、
-k
/ --keyword
および--check
とは相互に排他的です。ファイル内のバケットのリストの権限を確認できます。これらはテキスト ファイル内で 1 行に 1 つずつリストする必要があります。標準入力から読み取るには、ファイル名として-
を渡します。
-
-s
/ --subprocesses
- この引数は、バケットの列挙に使用されるサブプロセスの数を指定します。デフォルトは 5 で、この値を高く設定すると列挙は速くなりますが、Google への 1 秒あたりのリクエスト数は増加します。これらは本質的にスレッドですが、スクリプトは並列実行のためにスレッドの代わりにサブプロセスを使用します。
-
-f
/ --service-account-credential-file-path
- この引数では、Google Storage への認証に使用する GCP サービス アカウントの秘密キー ファイルへのパスを指定します。これはオプションです。代わりにアクセス トークンを使用する場合は、この引数を省略すると、トークンの入力を求めるプロンプトが表示されるため、トークンはコマンド ライン履歴に保存されません。詳細については、こちら: https://google-auth.readthedocs.io/en/latest/user-guide.html#service-account-private-key-files およびこちら: https://google-auth.readthedocs.io/ en/latest/user-guide.html#user-credentials
-
-u
/ --unauthenticated
- この引数により、認証されていない列挙が強制されます。このフラグを使用すると、資格情報の入力を求められなくなり、有効なバケットの認証されたアクセス許可がチェックされなくなります。
-
-o
/ --out-file
- この引数を使用すると、結果を出力するログ ファイルへの (相対または絶対) ファイル パスを指定できます。ファイルがまだ存在しない場合は作成され、すでに存在する場合は追加されます。
-
-w
/ --wordlist
- この引数を使用すると、ワードリスト入力ファイルを指定できます。