Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-10-23 15:00:36 +00:00
parent 89019a3a65
commit f1d7e0a79b
12 changed files with 865 additions and 367 deletions

View File

@@ -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へのアクセスを付与することが可能です:
<figure><img src="../../../../images/image (255).png" alt=""><figcaption></figcaption></figure>
### 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** を実行してステルスを保つことができます。
<figure><img src="../../../../images/image (120).png" alt=""><figcaption></figcaption></figure>
### 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:<acc_id>:function:<func_name>: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:<acc_id>:function:<func_name>: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 設定を組み合わせて、EventBridgecron などの外部 scheduler なしで関数を継続的に再呼び出しさせることを悪用します。デフォルトでは Lambda は再帰ループを終了させますが、recursion config を Allow に設定すると再有効になります。Destinations は async invoke に対してサービス側で配信されるため、単一の seed invoke がステルスコード不要の heartbeat/backdoor チャネルを作成します。オプションで reserved concurrency を使ってノイズを抑えることができます。
Lambda asynchronous destinations と Recursion 設定を組み合わせて、外部のスケジューラ(EventBridgecron などなしで関数を継続的に自己再呼び出しさせることを悪用します。デフォルトでは 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}}