# 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 を送信できます。 ![AWS Lambda aliases page showing release alias traffic split between version 2 and version 1](<../../../images/image (223).png>) ### 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](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html)、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](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) 経由で追加されるか、[container image deployments](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/) に含められ、**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 ```bash aws lambda get-account-settings # List functions and get extra config info aws lambda list-functions aws lambda get-function --function-name aws lambda get-function-configuration --function-name aws lambda list-function-event-invoke-configs --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 "" --query 'Code.Location' wget -O lambda-function.zip # Get Lambda URL (if any) aws lambda list-function-url-configs --function-name aws lambda get-function-url-config --function-name # Get who has permissions to invoke the Lambda aws lambda get-policy --function-name # Versions and Aliases aws lambda list-versions-by-function --function-name aws lambda list-aliases --function-name # List layers aws lambda list-layers aws lambda list-layer-versions --layer-name aws lambda get-layer-version --layer-name --version-number aws lambda get-layer-version-by-arn --arn #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 ``` ### lambda を invoke する #### Manual ```bash # 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 --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt ``` #### 公開されたURL経由 ```bash aws lambda list-function-url-configs --function-name #Get lambda URL aws lambda get-function-url-config --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](<../../../images/image (262).png>) 「Level6」というlambda functionが利用可能です。呼び出し方を確認しましょう: ```bash 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](<../../../images/image (102).png>) これで、名前と ID がわかったので、Name を取得できます: ```bash 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](<../../../images/image (237).png>) そして最後に、関数へアクセスして呼び出します(ID、Name、function-name が URL に表示されていることに注意してください): [https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6](https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6) `URL:`**`https://.execute-api..amazonaws.com//`** #### 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://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/](https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/) {{#include ../../../banners/hacktricks-training.md}}