Files
hacktricks-cloud/src/pentesting-cloud/aws-security/aws-services/aws-lambda-enum.md
T

11 KiB
Raw Blame History

AWS - Lambda Enum

{{#include ../../../banners/hacktricks-training.md}}

Lambda

Amazon Web Services (AWS) Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードの実行を可能にする compute service として説明されます。これは、コード実行に必要な resource allocation を自動的に処理 できることを特徴としており、高可用性、scalability、security などの機能を確保します。Lambda の重要な点は pricing model で、料金は使用した compute time のみに基づく ため、初期投資や長期的な拘束が不要です。

lambda を呼び出すには、何度でも好きなだけCloudwatch を使って)呼び出したり、URL endpoint を 公開 してそれを呼び出したり、API Gateway 経由で呼び出したり、S3 bucket 内のデータの changesDynamoDB table の更新などの events に基づいて呼び出したりできます。

lambda の code/var/task に保存されます。

Lambda Aliases Weights

Lambda は 複数の versions を持つことができます。
また、aliases 経由で公開された 1つ以上 の version を持つこともできます。alias 内で公開された version の weights によって、どの alias が invocation を受けるか が決まります(たとえば 90%-10% など)。
どれか1つ の alias の code が vulnerable なら、vulnerable な version が exploit を受けるまで request を送信できます。

AWS Lambda aliases page showing release alias traffic split between version 2 and version 1

Resource Policies

Lambda resource policies を使うと、たとえば他の services/accounts に lambda の invoke 権限を 付与 できます。
たとえば、URL 経由で公開された lambda に誰でもアクセスできる ようにする policy は次のとおりです:

または、API Gateway に invoke させるためのものは次のとおりです:

Lambda Database Proxies

数百concurrent lambda requests がある場合、それぞれが database に接続して切断する 必要があると、うまく動作しません(lambda は stateless なので、connection を開いたまま維持できません)。
そのため、Lambda functions が database instance の代わりに RDS Proxy と連携するようにします。RDS Proxy は、concurrent Lambda functions によって作成される多数の同時 connection をスケールさせるために必要な connection pooling を処理します。これにより、Lambda applications は function invocation ごとに新しい connection を作るのではなく、既存の connections を再利用 できます。

Lambda EFS Filesystems

データを保持し、さらに共有するために、Lambdas は EFS にアクセスして mount できます。そのため Lambda はそこから read と write が可能になります。

Lambda Layers

Lambda layer は、追加の code やその他の content を含めることができる .zip file archive です。layer には libraries、custom runtime、data、configuration files を含めることができます。

function あたり最大 five layers まで含めることができます。function に layer を含めると、contents は execution environment の /opt directory に extract されます。

default では、作成した layers は AWS account 内で private です。layer を他の accounts と 共有 するか、layer を public にするかを選べます。別の account が公開した layer を functions が消費している場合、functions は その layer version が削除された後でも、または layer への access 権限が取り消された後でも、その layer version を使い続けることができます。ただし、削除された layer version を使って新しい function を作成したり、functions を更新したりすることはできません。

container image として deployed された functions は layers を使用しません。代わりに、image を build する際に、希望する runtime、libraries、その他の dependencies を container image にまとめます。

Lambda Extensions

Lambda extensions は、さまざまな monitoring、observability、security、governance tools と統合することで functions を拡張します。これらの extensions は .zip archives using Lambda layers 経由で追加されるか、container image deployments に含められ、internalexternal の 2 つの mode で動作します。

  • Internal extensions は runtime process に統合され、language-specific environment variableswrapper scripts を使って起動時の挙動を操作します。このカスタマイズは、Java Correto 8 and 11, Node.js 10 and 12, and .NET Core 3.1 を含むさまざまな runtimes に適用されます。
  • External extensions は別プロセスとして実行され、Lambda function の lifecycle に合わせて動作します。Node.js 10 and 12, Python 3.7 and 3.8, Ruby 2.5 and 2.7, Java Corretto 8 and 11, .NET Core 3.1、および custom runtimes など、さまざまな runtimes と互換性があります。

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

lambda を invoke する

Manual

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

公開されたURL経由

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

URL 経由で Lambda function を呼び出す

次は、実行できる可能性のある lambda functions を見つける番です:

aws --region us-west-2 --profile level6 lambda list-functions

AWS Lambda function configuration JSON including function name, runtime, role, handler, and URL config

「Level6」というlambda functionが利用可能です。呼び出し方を確認しましょう:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Terminal output for aws lambda add-permission granting public function URL invocation

これで、名前と ID がわかったので、Name を取得できます:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

AWS API Gateway get-stages output showing a stage with method settings and deployment ID

そして最後に、関数へアクセスして呼び出します(ID、Name、function-name が URL に表示されていることに注意してください): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Other Triggers

lambda をトリガーできる他のソースは多数あります

Privesc

次のページでは、Lambda permissions を悪用して権限昇格する方法を確認できます:

{{#ref}} ../aws-privilege-escalation/aws-lambda-privesc/README.md {{#endref}}

Unauthenticated Access

{{#ref}} ../aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md {{#endref}}

Post Exploitation

{{#ref}} ../aws-post-exploitation/aws-lambda-post-exploitation/ {{#endref}}

Persistence

{{#ref}} ../aws-persistence/aws-lambda-persistence/ {{#endref}}

References

{{#include ../../../banners/hacktricks-training.md}}