# AWS - Lambda Enum

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

## Lambda

Amazon Web Services (AWS) Lambdaは、**サーバーの提供や管理を必要とせずにコードを実行できる** **コンピュートサービス**として説明されています。これは、コード実行に必要な**リソースの割り当てを自動的に処理する**能力によって特徴付けられ、高可用性、スケーラビリティ、およびセキュリティなどの機能を保証します。Lambdaの重要な側面は、その価格モデルであり、**料金は使用されたコンピュート時間のみに基づいています**。これにより、初期投資や長期的な義務が不要になります。

Lambdaを呼び出すには、**好きなだけ頻繁に**（Cloudwatchを使用して）呼び出すことができ、**URL**エンドポイントを**公開**して呼び出したり、**API Gateway**経由で呼び出したり、**S3**バケット内のデータの**変更**や**DynamoDB**テーブルの更新などの**イベント**に基づいて呼び出すことができます。

Lambdaの**コード**は**`/var/task`**に保存されています。

### Lambda Aliases Weights

Lambdaは**複数のバージョン**を持つことができます。\
また、**エイリアス**を介して**1つ以上の**バージョンを公開することができます。エイリアス内で公開されている**各**バージョンの**重み**は、**どのエイリアスが呼び出しを受けるか**を決定します（例えば90%-10%など）。\
**1つ**のエイリアスのコードが**脆弱**である場合、**脆弱な**バージョンがエクスプロイトを受け取るまで**リクエストを送信**できます。

![](<../../../images/image (223).png>)

### Resource Policies

Lambdaリソースポリシーは、他のサービス/アカウントにLambdaを呼び出す**アクセスを与える**ことを可能にします。\
例えば、これは**URLを介して公開されたLambdaに誰でもアクセスを許可する**ポリシーです：

<figure><img src="https://lh4.googleusercontent.com/4PNFKBdzr3nMrPqeKkTslgwWDKxkXMdQ1SNdv7NPHykj3GX8wODrQyXOFbjk4fxHfZ8pDm5ijWgk2Vq2EGXiPRT3TQfZf1fHycvdEKBuDxJDYos1CJeMHXSeg86ZB-Ol7CNtten6xkVFQj6AhDUEWNQJrQ=s2048" alt=""><figcaption></figcaption></figure>

また、これはAPI Gatewayが呼び出すことを許可するものです：

<figure><img src="https://lh3.googleusercontent.com/Su0JlR0wBqb-99Z4N_2-_kMlX0Xzx2n_GpZuOPW5IeXR3FYbm8OHFDM3Ora1BpXiSjHpDVUlq4yEyXwaI3nBuze6DJ-wRf2ATsCuWbq0wuBCd34E9uIpqwheE6Cc_PopviI_93O_j2ZKXc1-AJtsBoLVUw=s2048" alt=""><figcaption></figcaption></figure>

### Lambda Database Proxies

**数百**の**同時Lambdaリクエスト**がある場合、各リクエストが**データベースに接続して接続を閉じる**必要があると、うまくいきません（Lambdaはステートレスで、接続をオープンに保つことができません）。\
そのため、**Lambda関数がRDS Proxyと対話する**場合、データベースインスタンスの代わりに、同時Lambda関数によって作成された多くの接続をスケーリングするために必要な接続プーリングを処理します。これにより、Lambdaアプリケーションは**既存の接続を再利用**でき、新しい接続を各関数呼び出しのために作成する必要がなくなります。

### Lambda EFS Filesystems

データを保持し、さらには共有するために、**LambdasはEFSにアクセスしてマウントすることができ**、Lambdaはそこから読み書きできるようになります。

### Lambda Layers

Lambdaの**レイヤー**は、**追加のコード**や他のコンテンツを含むことができる.zipファイルアーカイブです。レイヤーにはライブラリ、[カスタムランタイム](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html)、データ、または設定ファイルを含めることができます。

**関数ごとに最大5つのレイヤーを含める**ことが可能です。関数にレイヤーを含めると、**内容は実行環境の`/opt`**ディレクトリに抽出されます。

**デフォルト**では、作成した**レイヤー**は**あなたのAWSアカウントにプライベート**です。レイヤーを他のアカウントと**共有**したり、レイヤーを**公開**することを選択できます。異なるアカウントが公開したレイヤーを関数が使用する場合、関数は**レイヤーが削除された後や、レイヤーへのアクセス権が取り消された後もレイヤーのバージョンを使用し続けることができます**。ただし、削除されたレイヤーバージョンを使用して新しい関数を作成したり、関数を更新したりすることはできません。

コンテナイメージとしてデプロイされた関数はレイヤーを使用しません。代わりに、イメージをビルドする際に、好みのランタイム、ライブラリ、および他の依存関係をコンテナイメージにパッケージ化します。

### Lambda Extensions

Lambda拡張は、さまざまな**監視、可視性、セキュリティ、およびガバナンスツール**と統合することによって関数を強化します。これらの拡張は、[Lambdaレイヤーを使用した.zipアーカイブ](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)または[コンテナイメージデプロイメントに含まれる](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/)形で追加され、**内部**および**外部**の2つのモードで動作します。

- **内部拡張**は、ランタイムプロセスと統合し、**言語固有の環境変数**や**ラッパースクリプト**を使用してその起動を操作します。このカスタマイズは、**Java Correto 8および11、Node.js 10および12、.NET Core 3.1**などのさまざまなランタイムに適用されます。
- **外部拡張**は、別のプロセスとして実行され、Lambda関数のライフサイクルに合わせて動作を維持します。これらは、**Node.js 10および12、Python 3.7および3.8、Ruby 2.5および2.7、Java Corretto 8および11、.NET Core 3.1**、および**カスタムランタイム**などのさまざまなランタイムと互換性があります。

### Enumeration
```bash
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>
```
### ラムダを呼び出す

#### 手動
```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 <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 <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL
```
#### URL経由でLambda関数を呼び出す

さて、実行可能なLambda関数を見つける時が来ました:
```
aws --region us-west-2 --profile level6 lambda list-functions
```
![](<../../../images/image (262).png>)

「Level6」と呼ばれるラムダ関数が利用可能です。呼び出し方を見てみましょう:
```bash
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
```
![](<../../../images/image (102).png>)

名前とIDがわかったので、名前を取得できます:
```bash
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
```
![](<../../../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://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>`**

#### その他のトリガー

他にも多くのソースがlambdaをトリガーできます。

<figure><img src="../../../images/image (167).png" alt=""><figcaption></figcaption></figure>

### プライバシー昇格

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

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

### 認証されていないアクセス

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

### ポストエクスプロイテーション

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

### 永続性

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

## 参考文献

- [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}}
