11 KiB
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 内のデータの changes や DynamoDB 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 を送信できます。
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 に含められ、internal と external の 2 つの mode で動作します。
- Internal extensions は runtime process に統合され、language-specific environment variables と wrapper 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
「Level6」というlambda functionが利用可能です。呼び出し方を確認しましょう:
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
これで、名前と ID がわかったので、Name を取得できます:
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
そして最後に、関数へアクセスして呼び出します(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
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
{{#include ../../../banners/hacktricks-training.md}}
.png)
.png)
.png)
.png)