AWS - Lambda Enum

Support HackTricks

Lambda

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

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

Lambda の コード/var/task に保存されます。

Lambda Aliases Weights

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

Resource Policies

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

また、API Gateway がそれを呼び出すことを許可するポリシーは次のとおりです:

Lambda Database Proxies

数百同時 Lambda リクエスト がある場合、それぞれが データベースに接続して接続を閉じる 必要があると、うまく機能しません(Lambda はステートレスであり、接続を維持できません)。 そのため、Lambda 関数がデータベースインスタンスではなく RDS Proxy と対話する 場合、多くの同時接続をスケーリングするために必要な接続プーリングを処理します。これにより、Lambda アプリケーションは 既存の接続を再利用 でき、新しい接続を作成する必要がなくなります。

Lambda EFS Filesystems

データを保存および共有するために、Lambda は EFS にアクセスしてマウント することができ、Lambda はそれを読み書きすることができます。

Lambda Layers

Lambda レイヤー は、追加のコード やその他のコンテンツを含むことができる .zip ファイルアーカイブです。レイヤーにはライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。

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

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

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

Lambda Extensions

Lambda 拡張機能は、さまざまな 監視、可観測性、セキュリティ、およびガバナンスツール と統合することで関数を強化します。これらの拡張機能は、Lambda レイヤーを使用して .zip アーカイブとして追加 するか、コンテナイメージデプロイメントに含める ことで動作します。拡張機能は 内部外部 の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

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>

Invoke a lambda

Manual

Lambda関数を手動で呼び出すには、aws-cliを使用します。以下のコマンドを実行してください。

aws lambda invoke --function-name <function_name> output.txt

このコマンドは、指定したLambda関数を呼び出し、その出力をoutput.txtファイルに保存します。

# 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関数がAPI GatewayまたはApplication Load Balancerを介して公開されている場合、URLを通じて関数を呼び出すことができます。これにより、関数のエンドポイントが外部に露出し、潜在的な攻撃ベクトルとなります。

Via AWS CLI

AWS CLIを使用してLambda関数を列挙することができます。以下のコマンドを使用して、Lambda関数のリストを取得します。

aws lambda list-functions --region <region>

Via AWS SDK

AWS SDKを使用してLambda関数を列挙することも可能です。以下はPythonを使用した例です。

import boto3

client = boto3.client('lambda', region_name='<region>')
response = client.list_functions()

for function in response['Functions']:
    print(function['FunctionName'])

Permissions

Lambda関数の列挙には適切な権限が必要です。以下のIAMポリシーを持つユーザーまたはロールが必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:ListFunctions",
            "Resource": "*"
        }
    ]
}

Summary

Lambda関数の列挙は、公開されたURL、AWS CLI、またはAWS SDKを使用して実行できます。適切な権限が必要であり、関数のエンドポイントが外部に露出している場合は注意が必要です。

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

Call Lambda function via URL

次に、実行可能なlambda関数を見つける時が来ました:

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

"Level6" という名前の lambda 関数が利用可能です。これを呼び出す方法を見つけましょう:

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

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

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

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

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

他のトリガー

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

Privesc

次のページで、Lambdaの権限を悪用して特権をエスカレートする方法を確認できます:

AWS - Lambda Privesc

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

AWS - Lambda Unauthenticated Access

ポストエクスプロイト

AWS - Lambda Post Exploitation

永続性

AWS - Lambda Persistence

参考文献

HackTricksをサポートする

Last updated