AWS - Lambda Enum

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Lambda

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

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

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

Lambdaエイリアスの重み

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

リソースポリシー

Lambdaリソースポリシーを使用すると、他のサービス/アカウントがLambdaを呼び出すためのアクセス権を与えることができます。 たとえば、これはURLを介して公開されたLambdaにアクセス権を与えるポリシーです:

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

Lambdaデータベースプロキシ

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

Lambda EFSファイルシステム

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

Lambdaレイヤー

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

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

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

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

Lambda拡張機能

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、およびカスタムランタイムなどのさまざまなランタイムと互換性があります。

列挙

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 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関数を呼び出す

これから実行可能なLambda関数を見つける時が来ました。

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

以下は、AWS Lambda関数「Level6」が利用可能です。どのように呼び出すかを見つけてみましょう:

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、名前、関数名が表示されていることに注意してください): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

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

その他のトリガー

Lambdaをトリガーするための他のソースがたくさんあります

特権昇格

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

pageAWS - Lambda Privesc

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

pageAWS - Lambda Unauthenticated Access

攻撃後の処理

pageAWS - Lambda Post Exploitation

永続性

pageAWS - Lambda Persistence

参考文献

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)!

HackTricksをサポートする他の方法:

最終更新