
クラウド認証情報からブルートフォーステストによって権限を特定する。
認証情報を手に入れた、さてどうする?
CloudPrivs は、Boto3 などの SDK の既存の機能を活用して、すべてのクラウドサービスの権限をブルートフォースで調べ、特定の認証情報にどの権限が存在するかを判断するツールです。
このツールは、ペネトレーションテスター、レッドチーマー、その他のセキュリティ専門家にとって有用です。クラウドサービスは通常、特定の認証情報がどのような権限を持っているかを調べる方法を提供しておらず、サービスの数と操作の多さから手動で確認するのは困難な作業です。そのため、ある認証情報から権限昇格が可能かもしれないのに、単にその AWS 認証情報が Lambda を実行できることを知らないために気づかない、ということが起こり得ます。
現在 PyPi では利用できませんが、対応中です
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
これは仮想環境を使わない方法で、多くの Python プログラムを実行する場合には推奨されません。
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # Windows の場合は activate.ps1
python -m pip install -e .
Pyenv+virtualenv が利用可能な場合は以下のようにもできます:
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [プロバイダ] [引数]
現在利用可能なプロバイダは AWS のみですが、GCP にも対応中です。協力していただける場合は、#カスタマイズ を参照してください。
オプション:
-v, --verbose 出力に失敗およびエラーとなったテストを表示する
-s, --services TEXT 利用可能な全サービスではなく、指定されたサービスのみテストする
-p, --profile TEXT スキャンする AWS プロファイル名。指定しない場合は環境変数が使用される
-t, --custom-tests FILENAME カスタムテストの YAML ファイルの場所。詳細はドキュメントを参照
-r, --regions TEXT リージョンに一致させるフィルターのリスト。例: "us", "eu-west", "ap-north-1"
--help このメッセージを表示して終了する
--region と --service には複数の引数を指定できますが、その都度フラグを付ける必要があります。例: cloudprivs aws -r us -r eu -s ec2 -s lambda。私もこの仕様は好きではありませんが、Click の制限であり、まだ回避策が見つかっていません。
regionフラグは部分一致をサポートしていることに注意してください。一般的な引数としては、一般的なリージョンのみをカバーするために-r us -r euのようにします。
結果はリージョンごとにグループ化されて表示され、各行にテストケースとその結果が含まれます。
テスト中に予期しないエラーが発生した場合、それらは発生時に stderr に出力されます。そのため、出力の流れが中断される可能性があります。表示したくない場合は、stderr をリダイレクトできます。
WeirdAAL のように各テストケースを手動で記述する他のツールとは異なり、CloudPrivs は Boto3 SDK に直接クエリを実行し、利用可能なすべてのサービスと、各サービスの利用可能なすべてのリージョンを動的に生成します。
完全なリストが生成されると、各関数がデフォルトで引数なしで呼び出されます(ただし、操作ごとにカスタム引数を追加するオプションもあります。詳細は #カスタマイズ を参照)。
注意: 一部の AWS 関数は呼び出し時にコストが発生する可能性があります。私は誤ってコストが発生するのを防ぐために、
get_、list_、describe_で始まる操作のみを許可しています。これは私自身のテストでは安全であるように見えますが、注意して使用してください。enumerate-iam のような他のツールでも安全であるように見えますが、すべての関数を(たとえ引数なしで)呼び出したときに誤ってコストが発生しないことを保証するものではありません。
CloudPrivs は以下の 2 つの領域で簡単な拡張/カスタマイズをサポートしています:
新しいプロバイダ(例: GCP)を実装するのは簡単です。
CloudPrivs/providers フォルダの下に、新しいプロバイダ用のフォルダを作成します(例: 'gcp')。CloudPrivs/providers/__init__.py ファイルで、__all__ 変数にプロバイダを追加します。フォルダ名と一致している必要があります。cli.py というファイルを作成します。cli にします(参考として AWS プロバイダを参照してください)。cloudprivs <プロバイダ> を実行すると、作成した CLI が表示されるはずです。AWS プロバイダは、AWS 関数を呼び出す際の引数の注入をサポートしています。この機能は、AWS 関数を呼び出すために引数が必要であり、場合によってはこれらの引数が固定変数であることがあるため提供されています。つまり、ダミー変数を提供できればテストのカバレッジを向上させることができます。また、dryrun=true のような引数を注入して呼び出しを高速化することもできます。
カスタムテストは、cloudprivs/providers/aws/CustomTests.yaml にある YAML ファイルに保存されます。
YAML の構造は次のとおりです:
---
<サービス名>:
- <関数名>:
args:
- <引数1>
- <引数2>
kwargs:
arg1: val1
arg2: val2
注意: 関数名は部分一致で機能します。つまり、「describe_」のような関数名を使用すると、指定された引数が「describe_」を含むすべての関数に注入されます。ルールは「最初に見つかったもの」ベースでマッチングされるため、汎用ルールをオーバーライドしたい場合は、より具体的なルールを汎用ルールの上に配置してください。例:
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
新しいルールは、既存の CustomTests.yaml ファイルを変更するか、新しい YAML ファイルを作成して --custom-tests フラグで指定することで追加できます。新しいファイルは既存のテストファイルとマージされ、重複する値は指定されたファイルが優先されて上書きされます。
AWS プロバイダは、他のツールに統合するためのライブラリとして記述されています。次のように使用できます:
import boto3
from cloudprivs.providers.aws import service
from concurrent.futures import ThreadPoolExecutor
session = boto3.Session('default')
with ThreadPoolExecutor(15) as executor:
iam = service.Service('iam', session, executor=executor)
scan_results = iam.scan() # エグゼキュータにリストされたすべてのリージョンをカバー(デフォルトでは利用可能なすべてのリージョン)
formatted_results = iam.pretty_print_scan(scan_results)
print(formatted_results)
すべてコード内で完全にドキュメント化されているので、簡単に解析できるはずです。
このツールは機能していますが、完成にはほど遠いです。私は積極的に新機能に取り組んでおり、貢献を受け付けています。お気軽に Issue/機能リクエストを開き、PR を送ってください。
計画中の機能