# 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 を送信できます。
.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
```
.png>)
「Level6」というlambda functionが利用可能です。呼び出し方を確認しましょう:
```bash
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
```
.png>)
これで、名前と ID がわかったので、Name を取得できます:
```bash
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
```
.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}}